Григорий Коленько

Григорий Коленько

Был в сети 13 ноября 2020, 14:10
Заказы не принимаю
Сергей Шлоков
Сергей Шлоков
На вскидку.
...
// Я бы заменил getCollection() на newQuery(). Быстрее и меньше памяти жрет.
$rows = $pdo->getCollection('modResource', $q);
$output = '';
// Нужно указать название чанка
$chunk= $modx->getChunk('чанк');
foreach ($rows as $row) {
	// В чанке плейсхолдеры должны совпадать с именами ключей массива $row
	$modx->setPlaceholders($row);
	$modx->getParser()->processElementTags('', $chunk, false, false, '[[', ']]', array(), 10);
	$modx->getParser()->processElementTags('', $chunk, true, true, '[[', ']]', array(), 10);
	$output .= $chunk;
	$modx->unsetPlaceholders($row);
}
На 30 объектах время сократится раза в 2.
Василий Наумкин
Василий Наумкин
Сергей Шлоков
Сергей Шлоков
Правильно Иван пишет. Нужно перехватывать через javascript. Самый просто вариант, переопределить эти функции дерева. Создаешь js файл.
Ext.onReady(function () {
   var tree = Ext.getCmp('modx-tree-resource');
  // Это стандартная функция из файла modx.tree.resource.js
   tree.quickUpdate = function(itm,e,cls){
   MODx.Ajax.request({
            url: MODx.config.connector_url
            ,params: {
                action: 'resource/get'
                ,id: this.cm.activeNode.attributes.pk
            }
            ,listeners: {
                'success': {fn:function® {
                    var pr = r.object;
                    pr.class_key = cls;

                    var w = MODx.load({
                        xtype: 'modx-window-quick-update-modResource'
                        ,record: pr
                        ,listeners: {
                            'success':{fn:function® {
                                this.refreshNode(this.cm.activeNode.id);
                                var newTitle = '<span dir="ltr">' + r.f.findField('pagetitle').getValue() + ' (' + w.record.id + ')</span>';
                                w.setTitle(w.title.replace(/<span.*\/span>/, newTitle));
                            },scope:this}
                            ,'hide':{fn:function() {this.destroy();}}
                        }
                    });
                    w.title += ': <span dir="ltr">' + w.record.pagetitle + ' ('+ w.record.id + ')</span>';
                    w.setValues(r.object);
                    w.show(e.target,function() {
                        Ext.isSafari ? w.setPosition(null,30) : w.center();
                    },this);
                },scope:this}
            }
        });
}
Подключаешь его в плагине на событие OnManagerPageBeforeRender. Тут же и быстрое создание переопределить.
Добавляй сюда нужный код. Например, можно переопределить процессор на свой и там делай что надо. Все зависит от задачи.
Сергей Шлоков
Сергей Шлоков
Со времен Evolution в любом сниппете можно сделать
include 'file.php';
В сниппете да, а в ресурсе, чанке, шаблоне? И без фильтров и других примочек MODX.
Есть статические элементы, есть Gitify, есть установочные пакеты
Статические элементы, как мы знаем от Евгения Борисова, на продакшене нужно отключать.
Gitify для меня как высшая математика. Для простых пользователей очень сложно. Установочные пакеты — мейби.
Короче, без серьёзного профита в удобстве или скорости это просто любопытный эксперимент, не более.
Мне кажется так удобнее и практичнее для разработки. Раз, создал файл. Два, в ресурсе его просто вызываешь как обычно. Все как и было, только файл не в базе, а на диске. Отредактировал, нажал F5 и все сразу обновилось. Используя статические элементы, например, нужно сначала кэш почистить.
По скорости, допустим, сниппеты кэшируются, а чанки нет. За ними нужно лезть в базу.
С этого нужно было начинать. Без серьёзного улучшения производительности говорить не о чем.
Согласен, но у меня нет больших и сложных компонентов. А мне кажется, на маленьких данных преимуществ не будет видно. Но попробую ради интереса.
П.С. Даже просто ради эксперимента, мне понравилось.