Igor Ivanov

Igor Ivanov

С нами с 19 марта 2013; Место в рейтинге пользователей: #344
Aleksandr Huz
12 мая 2018, 14:41
3
+3
Кто знает, подскажите, почему так много запросов
Если распечатать содержимое ресурса, то можно увидеть, что к массиву добавляются все привязанные TV
{$_modx->resource | print}
Вот поэтому и разница в запросах.

можно ли что-то с этим сделать?
Можно заменить вот эту строчку:
$this->resource[$k] = $modx->resource->getTVValue($k)
на эту:
$this->resource[$k] = $v[1]
Сергей Шлоков
25 апреля 2018, 08:54
3
+5
стандартный парсер запускается раньше, чем парсер фенома, из за чего сначала обработаются стандартные теги
Не путай человека.
Парсер MODX запускается перед феномом только для обработки кэшируемых тегов. Вообще парсинг выглядит так:
1. Запускается парсер MODX и обрабатывает кэшируемые теги. Феном теги остаются необработанные.
2. Запускается парсер фенома, если есть теги Fenom.
3. Запускается парсер MODX и обрабатывает некэшируемые теги пока они есть. Нераспарсенные не удаляются.
Пункты 2 и 3 могут выполняться в цикле до 10 раз, если есть нераспарсенные теги.
// В сниппет попадёт распарсенный тег феном
[[!snippet? param=`{$value}`]]
4. Запускается парсер фенома, если есть теги Fenom.
5. Запускается парсер MODX и обрабатывает некэшируемые теги пока они есть. Нераспарсенные теги удаляются.
Пункты 4 и 5 пункт могут выполняться в цикле до 10 раз, если есть нераспарсенные теги.
Многие, наверно, обращали внимание на тормоза, если указан несуществующий плейсхолдер.

Выглядит эта конструкция, мягко говоря, как вид жопы сбоку. У этих парсеров разный принцип работы. По хорошему, разработчикам MODX нужно или вообще отказываться от парсера и просто дать возможность пользователям самим выбирать (я сделал маленький шажок в эту сторону) или дорабатывать его до более-менее функционального уровня (я это тоже пробовал).

Я бы посоветовал использовать оба парсера так:
— юзать только кэшируемые теги MODX ([[*tag]], [[$chunk]], [[++system]], [[snippet]]). Хорошо для оптимизации.
— для остального использовать феном.
В этих режимах парсеры не пересекаются.
Алексей Ерохин
03 ноября 2017, 14:12
2
0
Вызов jGrowl
$.jGrowl("Stick this!", { sticky: true });
mngatoff
25 октября 2017, 01:58
1
+1
пользуйтесь на здоровье
case 'OnHandleRequest':
        // Приведение к нижнему регистру
        $request = $_REQUEST;
        $url = $request['q'];
        if (!empty($url)) {
            unset($_GET['q']);
            $params = http_build_query($_GET);
            if (strlen($params)) {
                $params = '?' . $params;
            }
            if (preg_match('/[A-Z]/', $url)) {
                $modx->sendRedirect(strtolower($url).$params);
            }
        }
        break;
Сергей
Сергей
01 сентября 2017, 00:14
9
0
Тщательно пережевав это modx.pro/help/7693/#comment-53831, решил свой вопрос — Как вывести два фото к каждому товару на странице категории:
в шаблоне категории вызываю список товаров так:
[[!pdoPage?
	&element=`msProducts`
	&loadModels=`gallery`
	&leftJoin=`{
		"360x270": {"class":"msProductFile","alias":"360x270", "on": "360x270.product_id = msProduct.id AND 360x270.path LIKE '%/360x270/' AND 360x270.rank=0"}
		,"360x270x1": {"class":"msProductFile","alias":"360x270x1", "on": "360x270x1.product_id = msProduct.id AND 360x270x1.path LIKE '%/360x270/' AND 360x270x1.rank=1"}
	}`
	&select=`{
		"msProduct":"*"
		,"360x270":"360x270.url as 360x270"
		,"360x270x1":"360x270x1.url as 360x270x1"
	}`
]]
и в чанке tpl.msProducts.row.php вывожу ДВА фото товара так:
<img src="[[+360x270:default=`[[++assets_url]]components/minishop2/img/web/ms2_small.png`]]">
<img src="[[+360x270x1:default=`[[++assets_url]]components/minishop2/img/web/ms2_small.png`]]">
Количество запросов снизилось вдвое, время загрузки страницы упало в полтора раза.
Извините, если кому наступил на мозоль, разжевав досконально, я знаю, что тут это не приветствуется...)))
Alexey Medvedev
11 августа 2017, 16:56
6
0
Знаю, что прошло три года, но может кому пригодится. Это кусок моего плагина. (там ещё RTE подключается для определенные категорий ресуров)

создаем плагин, событие на «OnDocFormRender» с кодом:
$script = '';
$resource = ($resource instanceof modResource) 
            ? 
            $modx->getObject('modResource',$resource->get('id')) 
            : $modx->getObject('modResource',(int)$resource);

// ACE
// Настройка под определенный тв-параметр в шаблоне
$templates_enable = array( // [id-шаблона] => array('tv[id-тв]')
    '3' => array('tv14'),
    '4' =>  array('tv14')
);

if ( $resource instanceof modResource && array_key_exists($resource->get('template'), $templates_enable) ) {
    $script .= 'if (MODx.ux.Ace.replaceTextAreas) {';
    foreach ($templates_enable[$resource->get('template')] as $tv) {
        $script .= 'MODx.ux.Ace.replaceTextAreas(Ext.query("textarea#' . $tv . '"));';
    }
    $script .= '}';
}
$modx->regClientStartupHTMLBlock('<script>Ext.onReady(function(){' . $script . '})</script>');
id шаблонов и тв-параметров находятся в скобках в дереве элементов.

Короткий вариант для всех блоков «Текстовая область»:
$resource = ($resource instanceof modResource) 
            ? 
            $modx->getObject('modResource',$resource->get('id')) 
            : $modx->getObject('modResource',(int)$resource);
if ( $resource instanceof modResource ) {
	$modx->regClientStartupHTMLBlock('
		<script>Ext.onReady(function(){
			if (MODx.ux.Ace.replaceTextAreas) {
				MODx.ux.Ace.replaceTextAreas(Ext.query(".x-form-textarea"));
			}
	');
}
Володя
30 июня 2017, 21:25
4
+2
как недавно выяснилось есть волшебный параметр ra
добавь его, а фон убери, вот так
"catalog":{"w":215,"h":245,"q":65,"zc":"0","bg":"","ra":1}
Igor Ivanov
28 июня 2017, 16:00
1
0
Мне бы просто пример кода для создания нового поля…
Сергей Водолагин
19 июня 2017, 18:43
8
+1
Вот друзья помогли (так как глубина от родителей до нужных ресурсов от 1 до 5 вот решение)
[[pdoResources?
    &parents=`4`
    &limit=`100`
    &sortby=`{ "pm5":"ASC","pm4":"ASC", "pm3":"ASC", "pm2":"ASC", "pm1":"ASC" }`
    &where=`{ "template": 10 }`
    &tpl=`tplSklad`
    &leftJoin=`{
        "p1": {
            "class": "modResource",
            "on": "p1.id = modResource.id"
        },
        "p2": {
            "class": "modResource",
            "on": "p2.id = p1.parent"
        },
        "p3": {
            "class": "modResource",
            "on": "p3.id = p2.parent"
        },
        "p4": {
            "class": "modResource",
            "on": "p4.id = p3.parent"
        },
        "p5": {
            "class": "modResource",
            "on": "p5.id = p4.parent"
        }
    }`
    &select=`{
        "modResource": "*",
        "p1": "COALESCE(p1.menuindex, 999999999) as pm1",
        "p2": "COALESCE(p2.menuindex, 999999999) as pm2",
        "p3": "COALESCE(p3.menuindex, 999999999) as pm3",
        "p4": "COALESCE(p4.menuindex, 999999999) as pm4",
        "p5": "COALESCE(p5.menuindex, 999999999) as pm5"
    }`
]]
Илья Уткин
17 марта 2017, 21:46
3
+2
Если в браузере скрипт отрабатывает нормально, а проблема только в том, чтобы запустить скрипт из консоли, можно поставить дополнение Console и написать для него скрипт для пошагового импорта. Типа такого:

<?php
if (!isset($_SESSION['Console']['galgen'])) {
    $_SESSION['Console']['galgen'] = array(
        'resource' => 0,
        'gallery' => 0
    );
}
$offsets = $_SESSION['Console']['galgen'];
$q = $modx->newQuery('modResource', array('parent' => 0));
$total = $modx->getCount('modResource', $q);
if ($total <= $offsets['resource']) {
    print '<p>Completed</p>';
    $_SESSION['Console']['completed'] = true;
    unset($_SESSION['Console']['galgen']);
    return;
}
$q->limit(1, $offsets['resource']);
$resources = $modx->getCollection('modResource', $q);
foreach ($resources as $resource) {
    print "<p>Processing resource <b>".$resource->get('pagetitle')."</b></p>";
    $catalog = scandir($modx->getOption('base_path') . 'assets/images/resources/' .
                       $resource->get('id'));
    if (count($catalog) <= $offsets['gallery']) {
        $offsets['resource']++;
        $offsets['gallery'] = 0;
    }
    if ($catalog[$offsets['gallery']] != '.' && $catalog[$offsets['gallery']] != '..'
        && !is_dir($modx->getOption('base_path') . 'assets/images/resources/' .
        $resource->get('id') . '/' .  $catalog[$offsets['gallery']])) {
        $res = $modx->runProcessor('gallery/upload', array(
            'file' => $modx->getOption('base_path') . 'assets/images/resources/' .
                      $resource->get('id') . '/' . $catalog[$offsets['gallery']],
            'id' => $resource->get('id')
          ), array(
            'processors_path' => MODX_CORE_PATH . 'components/ms2gallery/processors/mgr/'
          )
        );
        if ($res->isError()) {
            $error = $res->getAllErrors();
            $error['file'] = 'assets/images/resources/' . $resource->get('id') .
                      '/' . $catalog[$offsets['gallery']];
            print_r($error);
        } else {
            print_r($res->getObject());
        }
    } else {
        print '<p>Skip folder <b>' . $catalog[$offsets['gallery']] . '</b></p>';
    }
    $offsets['gallery']++;
    $sucsess = round($offsets['gallery'] / count($catalog), 2) * 100;
    for ($i=0; $i<=100; $i++) {
        if ($i <= $sucsess) {
            print '=';
        } else {
            print '_';
        }
    }
    print '<p>' . $sucsess.'% (remains: '.(count($catalog) - $offsets['gallery']).')</p>';
}
$_SESSION['Console']['completed'] = false;
$_SESSION['Console']['galgen'] = $offsets;
return;