MODX, безусловно, классный CMF, но иногда вы застреваете в мелочах, которые раздражают. Я не буду плакать в этой теме о том, какие все вокруг плохие, но я такая хорошая.
Возьмем, к примеру, ветку Революции и разберем ее.
И чтобы вы не потеряли интерес к этой статье, вот небольшой план статьи:
- Бэкэнд-анализ
- Погружение в настройки
- Работа с вложенными фрагментами
- Наблюдаем за работой парсера
- Мощный кэш
Удаление параметра из набора параметров
Создаем набор параметров.Мы добавляем к нему X параметров, а затем понимаем, что у нас не получается.
Пытаемся найти кнопку удаления.
В общем, у меня ничего не получилось.
Пришлось искать другой способ удаления параметра.
Решение : открываем на редактирование ненужный параметр и полностью копируем все данные другого необходимого параметра (якобы пытаясь перезаписать старый параметр новыми данными).
Последствие: Мы можем перезаписать значение нужного параметра.
Ключевые значения в настройках контекста
Смоделируем следующую ситуацию: несколько контекстов, к каждому контексту привязаны свои настройки.Если в админке несколько сайтов, то, как правило, ключ типа site_name переопределяется в настройках контекста.
А теперь представьте, ваша компания всегда позиционировала свое название как Cool {Peppers}.
Как вы думаете, какие результаты мы увидим во фронтенде? Правильно, просто Круто.
Решение : используйте специальные символы вместо круглых скобок.
Что делать тем, кто использует 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]] и только при всех последующих вызовах уже разбирается заполнитель
Решение : Храните такие проблемные фрагменты в файлах.
Те.
установите статический флажок и выберите файл
Другое решение от безумкин : Замените 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
-
Лучшие Принтеры Этикеток 2022 Года
19 Oct, 24 -
23 Минуты. Оправдание Для Тупоголовых Людей
19 Oct, 24 -
О Кризисе И Бартере
19 Oct, 24 -
Магистратура Или Работа?
19 Oct, 24 -
Пиар Упал? Руководство По Восстановлению :-)
19 Oct, 24