Modx не работает fenom

fenom не работает

Если tv пустое, то чанк не должен выводиться:
[[$[[*tags:!empty=`article`]]]]
Но на форуме почитал что есть fenom, который и быстрее работает и лучше, и вообще он идеален.
В настройках pdoTools включил: Использовать Fenom в чанках, Использовать Fenom на страницах, Кэширование скомпилированных чанков.

Заменяю [[*pagetitle]] на <$_modx->resource.pagetitle> и в title не выводится текстовый title.

В журнале ошибок:
[2017-07-20 16:35:20] (ERROR @ core/components/pdotools/model/pdotools/pdotools.class.php: 942) Unexpected tag ‘lat’ in 576d495e0bb182fbe08545f65f92bd8c line 159, near ‘

Комментарии (4)

«И сильно выиграю в производительности используя fenom на небольшом сайте?»
Почитайте тесты:

Если у вас там пять страниц, то может и нет смысла заморачиваться. А так феном и удобней и гибче.

Феном считает всё что идёт в фигурных скобках своими переменными.

В консоле ошибок вот такое:
/core/components/pdotools/model/pdotools/pdotools.class.php: 942) Unexpected tag ‘lat’ in 576d495e0bb182fbe08545f65f92bd8c line 159, near ‘, остальные выводятся через *
может всё нужно заменить?
Прикрепленный код файла core/components/pdotools/model/pdotools/pdotools.class.php
начинается со 158 строки по 170

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

Для добавления комментариев вы должны авторизоваться или зарегистрироваться.

Источник

Не работает тег ignore — что делать

Избавляемся от ошибок Fenom при использовании фигурных скобок или почему не работает тег ignore.

Оглавление

Почему не работает тег ignore

Переписывая родные теги MODx на Fenom или при работе с pdoParser, разработчики часто встречаются с ошибкой, которую генерирует шаблонизатор Fenom. Сергей Шлоков в своей статье — [Fenom] Почему не работает тег ignore, подробно расписал механику работы pdo парсера и объяснил, что именно вызывает ошибку.

Если front-end вашего сайта лег (белая страница или ошибка 500), а в логах вы встречаете подобные ошибки:

это значит что вы либо не использовали тег ignore, либо он не работает, не производится игнорирование тегов, которые заключены в фигурные скобки.

Варианты решения проблемы:

Есть несколько вариантов как избавиться от этой ошибки:

Обрамляем код в тег ignore

Первый вариант решения проблемы — заключить ваш код в тег фенома ignore .

Решение от автора сайта modzone

Если первый вариант не помог, то в статье по ссылке выше, есть два варианта решения.

  1. Указать в шаблоне кэшируемый тег [[*content]] вместо <$_modx->resource.content> .
  2. Перенести блок с тегом в ресурс (зачастую такие теги размещают в чанках).

#

Пробелы между фигурными скобками

На случай если два варианта выше не помогли или не подошли, есть еще один. Он немного костыльный, но по большому счету ничего ужасного в нем нет. Необходимо поставить пробелы между фигурными скобками:

В этом случае тег ignore не нужен.

Встроенные модификаторы

Одним из решений которые я обнаружил, оказалось использование встроенных в pdoTools модификаторов. Это удобно когда вы подключаете JS-код. Например можно воспользоваться модификатором jsToBottom:

Источник

[Fenom] Почему не работает тег ignore

Это достаточно частый вопрос. И даже мне из-за этого приходилось переделывать вёрстку. Ответ в понимании механизма парсинга. В предыдущей статье я уже описывал последовательность подготовки ответа пользователю. Давайте её вспомним. Сначала MODX получает контент шаблона и передаёт его парсеру (мы говорим о pdoParser). Если шаблона нет, то берётся контент ресурса. Далее:

  1. Парсер обрабатывает кэшируемые элементы в контенте, если ресурс не из кэша. На этом этапе Fenom не работает.
  2. Парсятся некэшируемые элементы. Нераспарсенные не удаляются. Здесь Fenom уже запускается, причём обрабатывает контент до парсера MODX. Т.е. сначала обработаются теги Fenom, а только потом теги MODX. При условии, что включена настройка обработки тегов Fenom на страницах.
  3. Парсятся некэшируемые элементы. Нераспарсенные удаляются. Fenom работает как на предыдущем шаге.

На каждом этапе MODX парсит контент на глубину до 10-го уровня. Т.е. распарсил тег, и если результат содержит ещё теги MODX, то запускается новый цикл парсинга. И так 10 раз.

Теперь давайте возьмём пример из первой ссылки. В шаблоне пишем теги Fenom:

И в ресурсе тоже вызываем сниппет через Fenom:

Теперь посмотрим как это будет парсится по шагам.

Шаг 1. Обработка кэшируемых элементов

На этом шаге в парсер попадет контент шаблона (см. код выше). Теги Fenom на этом этапе не парсятся. MODX ищет кэшируемые теги. Таких, как мы видим, нет. Обработка закончена.

Шаг 2. Обработка некэшируемых элементов без удаления нераспарсенных тегов

На этом этапе Fenom уже запускается (только если есть теги Fenom). Он получает первоначальный контент и парсит его. Результат будет такой:

Тег <$_modx->resource.content> заменён на контент ресурса, а тег исчез. Но он исчез не по ошибке, он отработал согласно указанной ему задаче — вернул завёрнутый в него код без обработки. Дальше запускается парсер MODX и ищет стандартные некэшируемые теги со знаком ! . Их в контенте нет, поэтому обработка завершается.

Шаг 3. Обработка некэшируемых элементов с удалением нераспарсенных тегов

Вот теперь самое интересное. На этом шаге в контенте всё ещё присутствуют теги Fenom. Поэтому он, имея полное право, парсит их. А своими тегами Fenom считает всё, что обернуто фигурными скобками, но за одним исключением (и это исключение добавил Василий) — теги должны начинаться с $ , ‘ , ( , строки с пробела (вот тут я об этом писал). А так как тега уже нет, то Fenom обрабатывает все фигурные скобки и в том числе <3>.

Примечание

Если в контенте есть только теги типа <3>, Fenom их пропускает, так как они не подходят под регулярку (если только вы не правили её, удалив, например, \s ). Он просто не запустится. Но если на странице есть правильные теги, то он обработает все фигурные скобки без исключений. Т.е. вместе с «правильными» тегами Fenom обработает и те, которые изначально игнорирует.

Надеюсь, теперь понятно, почему «не работает» тег . Теперь давайте рассмотрим вариант решения.

Вариант 1

Самый просто вариант — указать в шаблоне кэшируемый тег [[*content]] вместо <$_modx->resource.content> :

Тогда MODX уже на первом шаге подготовит для Fenom такой контент:

Здесь уже и контент ресурса и тег . Fenom его учтёт и вернёт уже такой результат (это второй шаг):

На третьем шаге Fenom пропустит этот контент, так как теги <цифра>не соответствуют регулярному выражению (если вы его не правили).

В итоге вы получите ожидаемый результат.

Вариант 2

Перенести блок с тегом в ресурс. Тогда Fenom только на третьем (последнем) шаге получит контент из блока кода №5 и Fenom пропустит всё что указанно в .

Заключение

В общем идея должна быть понятна — тег должен присутствовать в итерации, после которой больше не будет тегов Fenom. К сожалению, добиться этого не всегда получается. Специфика MODX.

Update 07.12.2017

В новой версии pdoTools эта проблема устранена. Решение простое — содержимое тега перед запуском парсера вырезается и возвращается обратно перед выводом ответа пользователю. Правда, как выяснилось, не работает если код шаблона или чанка находится в файле.

Источник

Как сделать так, чтобы Fenom не ломал сайт на MODX? #308

Comments

sergx commented Nov 11, 2019

The text was updated successfully, but these errors were encountered:

pafnuty commented Nov 12, 2019

@sergx
Надо бы побольше контекста, т.к. не совсем понятно какой код парсится, но мне кажется, что можно посмотреть в сторону https://github.com/fenom-template/fenom/blob/master/docs/ru/ext/extend.md#Расширение-тестового-оператора
либо, если есть возможность, после открывающей скобки ставить новую строку.

touol commented Nov 12, 2019

Больше контекста в обсуждении здесь https://modx.pro/help/19203

pafnuty commented Nov 12, 2019

Из темы на сайте я понял, что есть две проблемы:

  1. Данные, которые приезжают в контенте.
  2. Код, который добавляется в шаблон.

В первом случае точно стоит убрать весь контент сайта в т.к. контент в принципе не должен обрабатываться шаблонизатором ну и никто не мешает вставить валидный тег, который положит сайт.

Во втором — стоит контролировать тот код, который добавляется в шаблон и сделать инструкцию для контент-редакторов или тех людей, которые пользуются такой возможностью. Тут так же никто не запретит вставить валидный тег, который будет ронять производительность сайта например.

Для меня, как человека далёкого от MODX (бэкграунд bitrix и dle и к обоим системам я прикручивал fenom) в целом понятна проблема, я бы тоже очень хотел защитить сайт от поломок со стороны контент-редакторов и «программистов-менеджеров», но как для владельца сайта — я бы сильно надавал по рукам тем контент-редакторам, которые не понимают с какой системой работают и сразу бы выдал нужные инструкции, а ещё лучше записал бы демо как можно и как не стоит делать :))

Ну и в коментах был предложен код, который вполне можно попробовать оформить в виде PR и улучшить шаблонизатор, @bzick насколько я знаю, всегда рад улучшениям. Если сделать настраиваемый (на свой страх и риск) уровень обработки ошибок, вероятно это поможет кому-то жить спокойно.

P.S. JS из тела выносить нужно и это можно сделать в 99,9999% случаев. Есть куча возможностей.

touol commented Nov 13, 2019 •

Ну и в коментах был предложен код, который вполне можно попробовать оформить в виде PR и улучшить шаблонизатор, @bzick насколько я знаю, всегда рад улучшениям.

В коментах я костыль предложил :-(. Вообще по хорошему, чтоб решить эту проблему, надо бы в феноме сделать опцию, при включении которой, феном, вместо выбрасывания исключения, писал ошибку в лог. И можно было использовать феном так
`
$tpl = $fenom->getRawTemplate()->source($name, $content, true);

if($tpl->getError()) <
.
>
`
В, принципе, я могу сделать такую фичу, но, во первых, надо договориться с разработчиками fenom, что такая фича нужна. Просто так тратить время мне, да и никому, не охота. Во вторых, возможно, потребуются консультации.

touol commented Nov 13, 2019 •

P.S. JS из тела выносить нужно и это можно сделать в 99,9999% случаев. Есть куча возможностей.

В MODX в теле активно используется JSON и вынести его из тела нельзя.

pafnuty commented Nov 13, 2019

@touol ну тогда однозначно не стоит обрабатывать контент шаблонизатором. С этим есть сложности?

touol commented Nov 13, 2019 •

@pafnuty У меня лично с контентом особых проблем не возникало.

А вот иногда нужно включить fenom на сайте, который на половину написан другими программистами, и сразу возникают проблемы с JSON и JS. На феноме многие вещи в MODX писать удобнее, чем на его стандартном синтаксисе. То есть, мне удобнее включить феном. А вот синтаксис популярных сниппетов MODX использует JSON. И сайт вылетает.
Мое мнение, что, если fenom, на тех тегах что не может опознать, вместо исключения пропускал их как они есть, то тогда было бы намного удобнее.

Pathologic commented Nov 13, 2019 •

@pafnuty Все дело в том, что в MODX Revo обработка феномом запускается несколько раз, отсюда и все проблемы у пользователей. Сделать однократный запуск возможно, но автор интеграции отказался, так как это ломает подход к разработке, принятый в MODX.

touol commented Nov 13, 2019 •

@Pathologic не вводите в заблуждение. Это не причем. Не корректный тег и феном в любом случае пустую страницу отдаст. Он так устроен.
А. прочитал ссылку. Тут проблема не с ignore. Тут мы тупо хотим, чтоб тег, не правильный с точки зрения феном, тупо иногрировался и сайт не ломался. Раздражает искать включения JS/JSON по по всему сайту и ставить пробелы.

Было бы очень здорово, если бы вместо ошибки, роняющей страницу, работал бы механизм типа ignore, и этот блок не обрабатывался, а выводился бы «как есть». Есть ли в планах внедрить такой механизм? Или может быть уже сейчас есть какая-то настройка типа «soft-mode», позволяющая переключить парсер в щадящий режим?

Pathologic commented Nov 13, 2019

@touol Тег ignore для того и предназначен, чтобы обозначить места, которые не должен обрабатывать шаблонизатор, тогда и ошибок никаких не будет. В общем случае, у вас эта проблема будет с любым шаблонизатором, если использовать их так, как сейчас используется феном в рево. Вообще, не смущает, что с этой проблемой приходят только из рево? Что только там в документации написано пробелы после скобок ставить? 😃

touol commented Nov 13, 2019 •

Вообще, не смущает, что с этой проблемой приходят только из рево?

Не смущает. Для других вылет сайта при ошибке в написании тега — это типа се ля ви. Привыкли и о другом не думают. А в MODX, при ошибке в его тегах, тег просто не срабатывает и все. И хочется чтоб при использовании феном было так же.
В самом феноме без MODX ошибки не куда пихать. Ее надо разрабу сообщить и логично вызвать исключение с выводом на страницу типа
Fatal error: Uncaught exception ‘Fenom\Error\UnexpectedTokenException’ with message ‘Unexpected end of expression’ in D:\OpenServer\domains\modx.loc\modMiniIDE\model\vendor\fenom\src\Fenom\Template.php:789 Stack trace: #0 D:\OpenServer\domains\modx.loc\modMiniIDE\model\vendor\fenom\src\Fenom\Compiler.php(102): Fenom\Template->parseExpr(Object(Fenom\Tokenizer)) #1 [internal function]: Fenom\Compiler::ifOpen(Object(Fenom\Tokenizer), Object(Fenom\Tag)) #2 D:\OpenServer\domains\modx.loc\modMiniIDE\model\vendor\fenom\src\Fenom\Tag.php(146): call_user_func(‘Fenom\\Compiler. ‘, Object(Fenom\Tokenizer), Object(Fenom\Tag)) #3 D:\OpenServer\domains\modx.loc\modMiniIDE\model\vendor\fenom\src\Fenom\Template.php(651): Fenom\Tag->start(Object(Fenom\Tokenizer)) #4 D:\OpenServer\domains\modx.loc\modMiniIDE\model\vendor\fenom\src\Fenom\Template.php(580): Fenom\Template->parseAct(Object(Fenom\Tokenizer)) #5 D:\OpenServer\domains\modx.loc\modMiniIDE\model\vendor\fenom\src\Fenom\Template.php(274): Fenom\Template->parseTag(Object(Fenom\Toke in main.tpl on line 18

А в Modx с феном получаем пустую страницу и не совсем информативное сообщение в логах
pdotools.class.php : 996) Unclosed tag: opened on line 74

Для Modx много удобней чтоб ошибочные теги выводились как есть. Я 6 лет назад сделал сайт на Modx без феном. Тогда его для MODX не было. Сейчас уже к феном привык и хотел бы его использовать на этом сайте. Но стопудово это его сломает :-(. Там куча и JSON и JS. А если бы феном для Modx выводил ошибочные теги как есть, то я бы сразу там феном и включил :-).

Источник

Читайте также:  Рено клио как настроить часы
Оцените статью