Modx Revolution — Пара Костылей Для Нестандартных Ситуаций

MODX, безусловно, классный CMF, но иногда вы застреваете в мелочах, которые раздражают. Я не буду плакать в этой теме о том, какие все вокруг плохие, но я такая хорошая.

Возьмем, к примеру, ветку Революции и разберем ее.

И чтобы вы не потеряли интерес к этой статье, вот небольшой план статьи:

  1. Бэкэнд-анализ
  2. Погружение в настройки
  3. Работа с вложенными фрагментами
  4. Наблюдаем за работой парсера
  5. Мощный кэш


Удаление параметра из набора параметров

Создаем набор параметров.

Мы добавляем к нему X параметров, а затем понимаем, что у нас не получается.

Пытаемся найти кнопку удаления.



MODX Revolution — пара костылей для нестандартных ситуаций

В общем, у меня ничего не получилось.

Пришлось искать другой способ удаления параметра.

Решение : открываем на редактирование ненужный параметр и полностью копируем все данные другого необходимого параметра (якобы пытаясь перезаписать старый параметр новыми данными).

Последствие: Мы можем перезаписать значение нужного параметра.



Ключевые значения в настройках контекста

Смоделируем следующую ситуацию: несколько контекстов, к каждому контексту привязаны свои настройки.

Если в админке несколько сайтов, то, как правило, ключ типа site_name переопределяется в настройках контекста.

А теперь представьте, ваша компания всегда позиционировала свое название как Cool {Peppers}.



MODX Revolution — пара костылей для нестандартных ситуаций

Как вы думаете, какие результаты мы увидим во фронтенде? Правильно, просто Круто.

Решение : используйте специальные символы вместо круглых скобок.

Что делать тем, кто использует 1 шаблон в нескольких контекстах и хочет указать в качестве ключа определенный набор параметров для JS-кода? Там спецсимволы не помогут и одним чанком не обойтись.

Здесь уже есть два решения

  • Первое решение: создать свой сниппет и в зависимости от контекста предоставить нужный чанк с помощью getChunk.
  • Второе решение: для каждого контекста создайте свой собственный чанк и напишите в шаблоне [[$name_[[*context_key]]]] вместо ключа.

    Но как бы то ни было, эта запись выглядит сногсшибательно.

    Спасибо Артдевю за это решение .



Работа с вложенными фрагментами

В MODX уже давно есть такая функция: getChunk (например, от этого зависит parseChunk).

  
  
  
  
  
  
   

public function getChunk($chunkName, array $properties= array ()) { $output= ''; if (array_key_exists($chunkName, $this->sourceCache['modChunk'])) { $chunk = $this->newObject('modChunk'); $chunk->fromArray($this->sourceCache['modChunk'][$chunkName]['fields'], '', true, true); $chunk->setPolicies($this->sourceCache['modChunk'][$chunkName]['policies']); } else { $chunk= $this->getObject('modChunk', array ('name' => $chunkName), true); if (!empty($chunk) || $chunk === '0') { $this->sourceCache['modChunk'][$chunkName]= array ( 'fields' => $chunk->toArray(), 'policies' => $chunk->getPolicies() ); } } if (!empty($chunk) || $chunk === '0') { $chunk->setCacheable(false); $output= $chunk->process($properties); } return $output; }

Теперь давайте создадим простой фрагмент

<Эphp ini_set("display_errors",1); $data=''; $phs=isset($phs)Эexplode(",",$phs):array(); if(isset($tpl,$phs) && $tpl!='' && count($phs)>0){ foreach($phs as $item){ $data.=$modx->parseChunk($tpl,array('item'=>$item,'time'=>time())); } } return $data;

установите phpthumbof и создайте кусок

<p><b>[[+time]]</b>: [[+item]] - [[!phpthumbof? &input=`[[+item]]` &options=`&h=150&f=jpg`]]</p>

Назовем все это на странице примерно так:

[[!test? &tpl=`test` &phs=`/assets/1.jpg,/assets/2.jpg`]]

Но вот незадача, первый вызов сниппета phpthumbof приходит со строкой [[+item]] и только при всех последующих вызовах уже разбирается заполнитель

MODX Revolution — пара костылей для нестандартных ситуаций

Решение : Храните такие проблемные фрагменты в файлах.

Те.

установите статический флажок и выберите файл

MODX Revolution — пара костылей для нестандартных ситуаций

Другое решение от безумкин : Замените parseChunk на getChunk.

Наблюдаем за работой парсера

Проведем эксперимент следующим образом: создадим новый документ с пустым шаблоном.

Содержимое и все остальное мы оставим пустыми.

Проверим, что флажок кэша установлен.

Теперь откроем функциюprocessElementTags из файла /core/mode/modx/modparser.class.php.

public function processElementTags($parentTag, & $content, $processUncacheable= false, $removeUnprocessed= false, $prefix= "[[", $suffix= "]]", $tokens= array (), $depth= 0) { $this->_processingTag = true; $this->_processingUncacheable = (boolean) $processUncacheable; $this->_removingUnprocessed = (boolean) $removeUnprocessed; $depth = $depth > 0 ? $depth - 1 : 0; $processed= 0; $tags= array (); /* invoke OnParseDocument event */ $this->modx->documentOutput = $content; $this->modx->invokeEvent('OnParseDocument', array('content' => &$content)); $content = $this->modx->documentOutput; unset($this->modx->documentOutput); if ($collected= $this->collectElementTags($content, $tags, $prefix, $suffix, $tokens)) { $tagMap= array (); foreach ($tags as $tag) { $token= substr($tag[1], 0, 1); if (!$processUncacheable && $token === '!') { if ($removeUnprocessed) { $tagMap[$tag[0]]= ''; } } elseif (!empty ($tokens) && !in_array($token, $tokens)) { $collected--; continue; } if ($tag[0] === $parentTag) { $tagMap[$tag[0]]= ''; $processed++; continue; } $tagOutput= $this->processTag($tag, $processUncacheable); if (($tagOutput === null || $tagOutput === false) && $removeUnprocessed) { $tagMap[$tag[0]]= ''; $processed++; } elseif ($tagOutput !== null && $tagOutput !== false) { $tagMap[$tag[0]]= $tagOutput; if ($tag[0] !== $tagOutput) $processed++; } } $this->mergeTagOutput($tagMap, $content); if ($depth > 0) { $processed+= $this->processElementTags($parentTag, $content, $processUncacheable, $removeUnprocessed, $prefix, $suffix, $tokens, $depth); } } $this->_processingTag = false; return $processed; }

перед линией

$this->_processingTag = true;

давайте добавим

static $test; echo ++$test."<br />";

Что ж, открываем нашу страницу в браузере.

о0! номер 1.2.3 Вопрос в том, какого хрена.

Пустая страница.

Что там разбирать? Давайте внимательно посмотрим на источник

$this->modx->invokeEvent('OnParseDocument', array('content' => &$content));

Таким образом, даже на пустой странице мы запускаем одно и то же событие 3 раза.

Страшно подумать, что будет с теми сайтами, у которых к этому событию еще прикреплен какой-то код. Артдевю Для эксперимента я проверил, сколько раз эта функция будет выполняться при разных условиях.

таким образом, мы имеем следующую пластину.

Состояние Итерации
[[фрагмент]] 2
{{$кусок}} 2
Пустая страница 3
[[numЭinput=`1000`]] 5
[[*заголовок страницы:номер]] 6
[[numЭinput=`[[*pagetitle]]`]] 7
Несуществующий фрагмент 23
Несуществующий кусок 23


Мощный кэш

На одном из своих рабочих мест я открыл папку с тайником и чуть не упал со стула.

1 страница в кеше занимает от 50 до 200 Кб.

Нет, может это и нормально, конечно, но кэш обновляется при каждом изменении документов.

Обновил 1 документ - все кешированные страницы удалились.

А если страниц 100? 1000? Это уже несколько МБ.

Что делать, если новости добавляются каждый день? P.S. Переименовал тему, чтобы она выглядела менее плаксивой и провокационной.

Теги: #ModX #революция #скорость загрузки сайта #костыли #разработка веб-сайтов #php #ModX

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.