[pdoTools] 2.0.0-beta c шаблонизатором Fenom
Представляю вам новую версию pdoTools со встроенным шаблонизатором Fenom.
Это очередная попытка решить вопрос с очень бедным MODX шаблонизатором, который умеет очень мало. Первая «велосипедная» попытка была представлена здесь, а сейчас всё гораздо серьёзнее.
Если вы не знакомы с Fenom, то советую прочитать вот эту заметку на Хабре, а потом пробежаться по документации на GitHub.
Для включения шаблонизатора в вызове любого сниппета pdoTools нужно указать
Все ошибки компиляции пишутся в системный журнал. Если видите сырые теги — смотрите там, в чем беда.
У вас есть доступ к объектам $modx и $pdoTools, а также всем их свойствам и методам. Теперь вы можете делать разные проверки переменных и оформлять вывод как вам захочется без фильтров вывода и прочих сложных конструкций.
Шаблоны компилируюся и сохраняются в директорию /cache/fenom/. При очистке кэша сайта они удаляются.
Строковые плейсхолдеры [[+section.pagetitle]] превращаются в {$section_pagetitle}, так как Fenom ожидает через точку ключ массива. То есть {$section.pagetitle} — это для него $section['pagetitle'].
Лично я уже переписал основные чанки modx.pro на синтаксис Fenom — багов пока не замечено. Даже на моих старых полностью оптимизированных чанках, максимально разогнанных в pdoTools, я заметил прирост от 20% до 50% при более удобном синтаксисе.
Например, наша самая большая тема с 437 комментариями раньше открывалась за 1.3-1.5 сек, теперь за 0.7-0.9 сек.
Синтетический тест из этой темы показывает небольшой перевес чистого pdoTools над Fenom, если в чанке нет ни одного фильтра вывода (то есть, работает только str_replace(), без парсера MODX).
pdoTools
А вот если добавить всего один плейсхолдер, который должен быть разобран парсером MODX
То результат будет совсем иной:
pdoTools
Fenom может работать с объектом MODX напрямую, и ему не нужно парсить его плейсхолдеры — отсюда практически полное отсутствие тормозов при проверках переменных и вызове системных методов.
Скомпилированный шаблон выглядит вот так:
Замена плейсхолдеров:
Вот какой был старый чанк tpl.Tickets.comment.wrapper блока комментариев.
А вот как я переписал его на Fenom:
Еще пример старого чанка tpl.Tickets.comment.list.row.
И новая Fenom-версия:
А вот вообще отмороженный пример:
pdoResources тут нужен только для запуска шаблона с Fenom.
Вот так легко и просто у нас появился настоящий шаблонизатор в pdoTools, который вы можете включить по желанию, а можете и не включать — дело ваше.
Технически в pdoTools изменений немного, но по факту — это огромный тектонический сдвиг в разработке сайтов с использованием библиотеки. Поэтому версия теперь 2.0.0-beta.
Наверное, будут вопросы, а почему именно Fenom, а не Twig, Smarty или кто-то еще? Вот мой список причин:
Выложил в репозиторий версию 2.0.0-rc, в которой pdoParser уже использует Fenom. Теперь новый синтакис можно использовать прямо в контенте документов и шаблонах.
В отличии от MODX, этот парсер не рекурсивный, а компилирующий. Разбирать вложенные теги ему не нужно (они разбираются при компиляции, один раз) — так что разница в скорости должна быть приличной, особенно там, где много фильтров вывода и сложных шаблонов.
Итак, после долгих размышлений и тестов я переписал работу с Fenom так, чтобы скомпилированные шаблоны кэшировались только в ОЗУ.
Выходит, что в случае MODX, где данных хранятся в сравнительно небольших чанках, время на компиляцию шаблонов нивелируется постоянными обращениями к жесткому диску. В тестовых условиях отказ от кэширования файлов на HDD только увеличил скорость.
Чанки MODX не пишутся на диск, а Fenom не кэширует компилированные шаблоны рядом. Никакого мусора, всё быстро и красиво. Теперь Fenom показывает небольшой отрыв даже на простейших чанках без фильтров.
Ошибки компиляции, как и прежде, пишутся в журнал MODX. Так как исходники вам теперь посмотреть негде, на уровне INFO в лог отправляется и сам шаблон. Просто переключите системную настройку MODX log_level, чтобы это увидеть.
Так как Fenom предъявляет требования к именам переменных такие же, как и PHP, наши привычные плейхолдеры просто ломают компиляцию. Поэтому в новой версии все переданные плейсхолдеры можно найти в {$_pls}.
Например, плейсхолдеры превьюшек галереи получаем вот так:
Свежепоявившийся плагин pdoTools можно удалить. Он был нужен исключительно для очистки директории с кэшем, которой теперь нет.
Новая версия pdoTools 2.0.0-rc2 уже доступна в репозитории, обновляйтесь!
Анонс стабильной версии с множеством дополнительных настроек.
Это очередная попытка решить вопрос с очень бедным MODX шаблонизатором, который умеет очень мало. Первая «велосипедная» попытка была представлена здесь, а сейчас всё гораздо серьёзнее.
Если вы не знакомы с Fenom, то советую прочитать вот эту заметку на Хабре, а потом пробежаться по документации на GitHub.
Возможности
- Включение поддержки Fenom раздельно для каждого сниппета pdoTools.
- Можно использовать плейсхолдеры MODX и теги Fenom одновременно. Но быстрее будет использовать что-то одно.
- Если в чанке нет плейсхолдеров MODX, то парсер MODX не запускается
- Если в чанке нет тегов Fenom, то он тоже не запускается.
- @INLINE чанки работают
Особенности
Для включения шаблонизатора в вызове любого сниппета pdoTools нужно указать
&useFenom=`1`
Все ошибки компиляции пишутся в системный журнал. Если видите сырые теги — смотрите там, в чем беда.
У вас есть доступ к объектам $modx и $pdoTools, а также всем их свойствам и методам. Теперь вы можете делать разные проверки переменных и оформлять вывод как вам захочется без фильтров вывода и прочих сложных конструкций.
Адрес сайта: {$modx->config.site_url}
{if $modx->user->isAuthenticated($modx->context->key)}
Юзер авторизован в контексте
{else}
Это гость
{/if}
Шаблоны компилируюся и сохраняются в директорию /cache/fenom/. При очистке кэша сайта они удаляются.
Строковые плейсхолдеры [[+section.pagetitle]] превращаются в {$section_pagetitle}, так как Fenom ожидает через точку ключ массива. То есть {$section.pagetitle} — это для него $section['pagetitle'].
Тестирование
Лично я уже переписал основные чанки modx.pro на синтаксис Fenom — багов пока не замечено. Даже на моих старых полностью оптимизированных чанках, максимально разогнанных в pdoTools, я заметил прирост от 20% до 50% при более удобном синтаксисе.
Например, наша самая большая тема с 437 комментариями раньше открывалась за 1.3-1.5 сек, теперь за 0.7-0.9 сек.
Синтетический тест из этой темы показывает небольшой перевес чистого pdoTools над Fenom, если в чанке нет ни одного фильтра вывода (то есть, работает только str_replace(), без парсера MODX).
pdoTools
0.0005119: Created inline chunk 0.1967380: Total time 3 670 016: Memory usageFenom
0.0004470: Created inline chunk 0.2136431: Total time 3 407 872: Memory usage
А вот если добавить всего один плейсхолдер, который должен быть разобран парсером MODX
// pdoTools
$tpl1 = '@INLINE <p>[[++site_name]] [[+val1]] - [[+val2]] - [[+val3]]</p>';
// Fenom
$tpl2 = '@INLINE <p>{$modx->config.site_name} {$val1} - {$val2} - {$val3}</p>';
То результат будет совсем иной:
pdoTools
0.0003500: Created inline chunk 1.8580759: Total time 3 670 016: Memory usageFenom
0.0004060: Created inline chunk 0.2227199: Total time 3 932 160: Memory usageДа-да, это не ошибка!
Fenom может работать с объектом MODX напрямую, и ему не нужно парсить его плейсхолдеры — отсюда практически полное отсутствие тормозов при проверках переменных и вызове системных методов.
Скомпилированный шаблон выглядит вот так:
<?php
/** Fenom template 'cd20f5e1f2f6add74ba06c086f8b8242.fenom.tpl' compiled at 2015-05-18 21:44:23 */
return new Fenom\Render($fenom, function ($var, $tpl) {
?><p><?php
/* cd20f5e1f2f6add74ba06c086f8b8242.fenom.tpl:1: {$modx->config.site_name} */
echo $var["modx"]->config["site_name"]; ?> <?php
/* cd20f5e1f2f6add74ba06c086f8b8242.fenom.tpl:1: {$val1} */
echo $var["val1"]; ?> - <?php
/* cd20f5e1f2f6add74ba06c086f8b8242.fenom.tpl:1: {$val2} */
echo $var["val2"]; ?> - <?php
/* cd20f5e1f2f6add74ba06c086f8b8242.fenom.tpl:1: {$val3} */
echo $var["val3"]; ?></p><?php
}, array(
'options' => 0,
'provider' => false,
'name' => 'cd20f5e1f2f6add74ba06c086f8b8242.fenom.tpl',
'base_name' => 'cd20f5e1f2f6add74ba06c086f8b8242.fenom.tpl',
'time' => 1431974663,
'depends' => array (
0 =>
array (
'cd20f5e1f2f6add74ba06c086f8b8242.fenom.tpl' => 1431974663,
),
),
'macros' => array(),
));
Ну и напоследок несколько примеров для гладкого переезда.Примеры
Замена плейсхолдеров:
[[+pagetitle]] - {$pagetitle}
[[*pagetitle]] - {$modx->resource->pagetitle}
[[%lexicon]] - {$modx->lexicon('lexicon')}
[[~[[+id]]]] - {$modx->makeUrl($id)}
Вот какой был старый чанк tpl.Tickets.comment.wrapper блока комментариев.
А вот как я переписал его на Fenom:
<div class="comments">
{if $modx->user->isAuthenticated($modx->context->key)}
<span class="comments-subscribe pull-right">
<label for="comments-subscribe" class="checkbox">
<input type="checkbox" name="" id="comments-subscribe" value="1" {$subscribed != '' ? 'checked' : ''} /> {$modx->lexicon('ticket_comment_notify')}
</label>
</span>
{/if}
<h4 class="title">{$modx->lexicon('comments')} (<span id="comment-total">{$total}</span>)</h4>
<div id="comments-wrapper">
<ol class="comment-list" id="comments">{$comments}</ol>
</div>
<div id="comments-tpanel">
<div id="tpanel-refresh"></div>
<div id="tpanel-new"></div>
</div>
</div>
Еще пример старого чанка tpl.Tickets.comment.list.row.
И новая Fenom-версия:
<div class="ticket-comment-row ticket-comment" id="comment-{$id}" data-id="{$id}">
<div class="ticket-comment-body {$guest ? 'ticket-comment-guest' : ''}">
<div class="ticket-comment-header">
<div class="user-avatar-wrapper">
<img src="{$avatar}" class="ticket-avatar" alt="" />
</div>
<span class="ticket-comment-author">{$fullname}</span>
<span class="ticket-comment-createdon">{$date_ago}</span>
<span class="ticket-comment-link"><a href="{$url}#comment-{$id}">#</a></span>
<span class="ticket-comment-star {$can_star ? 'active' : ''}">
<i class="glyphicon glyphicon-star {$stared ? 'stared' : 'unstared'} star"></i>
</span>
<span class="ticket-comment-rating {$can_vote ? 'active' : 'inactive'}">
<span class="rating {$rating_positive ? 'positive' : ''}{$rating_negative ? 'negative' : ''}" title="Всего: {$rating_total}: ↑{$rating_plus} и ↓{$rating_minus}">{$rating}</span>
<span class="vote plus {$voted_plus ? 'voted' : ''}" title="Нравится"><i class="glyphicon glyphicon-arrow-up"></i></span>
<span class="vote minus {$voted_minus ? 'voted' : ''}" title="Не нравится"><i class="glyphicon glyphicon-arrow-down"></i></span>
</span>
</div>
<div class="ticket-comment-text">
{$text}
</div>
</div>
<div class="ticket-comment-meta">
<a href="{$modx->makeUrl($section_id)}" class="ticket-comment-section"><i class="glyphicon glyphicon-folder-open"></i> {$section_pagetitle}</a> →
<a href="{$modx->makeUrl($ticket_id)}" class="ticket-comment-ticket">{$ticket_pagetitle}</a>
<span class="ticket-comment-comments">
<small><i class="glyphicon glyphicon-comment"></i> {$comments}</small>
</span>
</div>
</div>
Обратите внимание на свободный вызов {$modx->makeUrl()} и другие интересные конструкции.А вот вообще отмороженный пример:
[[!pdoResources?
&useFenom=`1`
&parents=`999999`
&wrapIfEmpty=`1`
&tplWrapper=`@INLINE
{set $collection = $pdoTools->getCollection('modResource', null, ['parents' => 0, 'limit' => 10])}
{foreach $collection as $idx => $res}
<p>{$res.id} - {$res.pagetitle}</p>
{$pdoTools->addTime('Строка ' ~ $idx)}
{/foreach}
<pre>{$pdoTools->getTime()}</pre>
`
]]
Вызов метода pdoTools с присвоением его результата переменной и разбор её в цикле. pdoResources тут нужен только для запуска шаблона с Fenom.
Заключение
Вот так легко и просто у нас появился настоящий шаблонизатор в pdoTools, который вы можете включить по желанию, а можете и не включать — дело ваше.
Технически в pdoTools изменений немного, но по факту — это огромный тектонический сдвиг в разработке сайтов с использованием библиотеки. Поэтому версия теперь 2.0.0-beta.
Наверное, будут вопросы, а почему именно Fenom, а не Twig, Smarty или кто-то еще? Вот мой список причин:
- Использование токенайзера вместо регулярок — выше скорость и ниже расход ОЗУ
- Автор — русскоговорящий и пишет документацию на родном языке
- Приятный php-подобный синтаксис, особенно что касается работы с массивами и объектами.
- Приятный исходный код.
- Судя по активности на GitHub, впереди у проекта светлое будущее
- Ну и наконец, я уже использовал его для работы на одном крупном кинопортале и остался доволен.
Обновлено 20.05.2015
Выложил в репозиторий версию 2.0.0-rc, в которой pdoParser уже использует Fenom. Теперь новый синтакис можно использовать прямо в контенте документов и шаблонах.
В отличии от MODX, этот парсер не рекурсивный, а компилирующий. Разбирать вложенные теги ему не нужно (они разбираются при компиляции, один раз) — так что разница в скорости должна быть приличной, особенно там, где много фильтров вывода и сложных шаблонов.
Обновлено 21.05.2015
Итак, после долгих размышлений и тестов я переписал работу с Fenom так, чтобы скомпилированные шаблоны кэшировались только в ОЗУ.
Выходит, что в случае MODX, где данных хранятся в сравнительно небольших чанках, время на компиляцию шаблонов нивелируется постоянными обращениями к жесткому диску. В тестовых условиях отказ от кэширования файлов на HDD только увеличил скорость.
Чанки MODX не пишутся на диск, а Fenom не кэширует компилированные шаблоны рядом. Никакого мусора, всё быстро и красиво. Теперь Fenom показывает небольшой отрыв даже на простейших чанках без фильтров.
Ошибки компиляции, как и прежде, пишутся в журнал MODX. Так как исходники вам теперь посмотреть негде, на уровне INFO в лог отправляется и сам шаблон. Просто переключите системную настройку MODX log_level, чтобы это увидеть.
Так как Fenom предъявляет требования к именам переменных такие же, как и PHP, наши привычные плейхолдеры просто ломают компиляцию. Поэтому в новой версии все переданные плейсхолдеры можно найти в {$_pls}.
Например, плейсхолдеры превьюшек галереи получаем вот так:
[[!ms2GalleryResources?
&typeOfJoin=`inner`
&parents=`0`
&tpl=`@INLINE
<p><a href="{$uri}"><img src="{$_pls['120x90']}" /></a> {$rank}</p>
`
]]
Точно так же получаем и плейсхолдеры с точкой:{$_pls['section.uri']}
Больше никакой замены точек на подчеркивание в именах переменных — всё ради повышенной скорости работы.Свежепоявившийся плагин pdoTools можно удалить. Он был нужен исключительно для очистки директории с кэшем, которой теперь нет.
Новая версия pdoTools 2.0.0-rc2 уже доступна в репозитории, обновляйтесь!
Анонс стабильной версии с множеством дополнительных настроек.
Комментарии: 175
Василий, такой вопрос: после обновления на 2.0.0 в попытке обновить сайт (очистить кеш) в консоли появилась ошибка
Консоль запущена…
PHP warning: Invalid argument supplied for foreach()
Очистка основного кэша: pdoTools
Этого предупреждения на прошлой версии pdoTools пару минут назад не было.
Это как-то связано с этим обновлением похоже. В логах ошибок сайта пусто.
Консоль запущена…
PHP warning: Invalid argument supplied for foreach()
Очистка основного кэша: pdoTools
Этого предупреждения на прошлой версии pdoTools пару минут назад не было.
Это как-то связано с этим обновлением похоже. В логах ошибок сайта пусто.
Это ерунда.
При очистке кэша происходит удаление скомпилированных шаблонов, а у тебя еще нет этой директории. Просто игнорируй, больше не должно появляться.
При очистке кэша происходит удаление скомпилированных шаблонов, а у тебя еще нет этой директории. Просто игнорируй, больше не должно появляться.
Понимаю, что это не ошибка, а предупреждение. Да и все работает. Только предупреждение это не исчезает и выскакивает при каждой очистке кеша. Проверил на другом сайте — тоже есть. Может стоит добавить проверку на существование папки шаблонов Fenom (для тех, кто пока не использует Fenom), чтобы народ не волновался?
Если не хочешь волноваться — не обновляйся на beta версии.
Конечно я это поправлю, но потом.
Конечно я это поправлю, но потом.
Спасибо.
Уже поправил этот баг и еще такой же мелкий =)
Правда, если ты не планируешь пробовать Fenom, то обновляться вовсе не нужно — там больше нет никаких изменений.
Правда, если ты не планируешь пробовать Fenom, то обновляться вовсе не нужно — там больше нет никаких изменений.
Я так понимаю что наличие этого шаблонизатора в коробке pdoTools позволит создавать более сложную логику? например мат операции и тд и тп? просто никогда не работал со Smarty, а документацию пробежал мельком, я вот чем то задним чувствую что это здорово и надо начать этим пользоваться, только пока не очень пойму как и зачем?
в смысле зачем понятно, не понятно как
Например, вот так:
[[!pdoResources?
&useFenom=`1`
&parents=`0`
&tpl=`@INLINE <p>{$id} - {$menutitle != '' ? $menutitle : $pagetitle}</p>`
]]
Плюс посмотри в заметке примеры, а дальше читать уже в документации Fenom.
ага, т/е получается все стандартные теги modx типа [[*pagetitle]] заменяются тегами шаблонизатора {{$pagetitle}}? в таком случае какой именно pagetitle подгрузится? этот [[*pagetitle]] или этот [[+pagetitle]]?
Включай фантазию!
[[+pagetitle]] - {$pagetitle}
[[*pagetitle]] - {$modx->resource->pagetitle}
[[%lexicon]] - {$modx->lexicon('lexicon')}
[[~[[+id]]]] - {$modx->makeUrl($id)}
ага ясно, более или менее, ответь еще все же пожалуйста поконкретнее про мат операции, меня это часто волнует, а писать мелкие сниппеты или через js делать часто не очень хочется, хочется чтобы вычисление происходило сразу в чанке, с fenom это возможно?
фантазия есть, я пытаюсь понять спектр возможностей, большое спасибо за умные ответы на глупые вопросы, буду разбираться
Это просто Ах… О очень замечательно! Нет слов…
Уже ради одних тернарных операторов хочется пользовать.
Очень порадовало, что в @INLINE чанках нормально отрабатывают сложные логические конструкции.
Спасибо!
Очень порадовало, что в @INLINE чанках нормально отрабатывают сложные логические конструкции.
Спасибо!
Василий, добавь пожалуйста примеры перехода с modx парсера на Fenom при применении фильтра к плейсхолдеру для общего понимания.
К примеру:
А все вижу пример ))
К примеру:
[[+price:default=`ноль`:eq=`5`:then=`пять`]]
Думаю актуално не только для меня.Спасибо!!!А все вижу пример ))
{$id} - {$menutitle != '' ? $menutitle : $pagetitle}
Прочитал статью на хабре. Просто какое-то невероятное решение, состоящее из одних плюсов. Если так, то надо выкидывать парсер мод икса и использовать только феном :)
беда в том что он у нас есть только в pdoTools, интересно насколько возможно полностью перейти на другой шаблонизатор?
интересно, перепишу интернет магазин с 10к+ товарами посмотрим прирост
Можно включить парсер для всего сайта? Например чанки которые не вызываются в pdoTools как парсить?
Парсер работает иначе, так что пока — никак.
Надеюсь в будущем это изменится, филосов modSmarty же двигает, но феном реально по скорости и памятижорству эффективнее. Интересно было бы если бы феном вешался на текущие конструкции modx и парсил их)))
Удачи с парсером, мы все с замиранием сердца наблюдаем за этим ;)
Удачи с парсером, мы все с замиранием сердца наблюдаем за этим ;)
Позже поэксперементирую, а пока давайте осваивать новые чанки.
А с чем связана такая тормознутость родного парсера MODX? Казалось бы, даже не на рекурсивных вызовах тормоза налицо.
И осталась ли возможность использовать специальные плейсхолдеры типа [[#12.pagetitle]]?
P.S. блин, только все чанки в ИМ на 50к товаров переписал на «быстрые плейсхолдеры». Прошла неделя — бам, новый pdoTools)))
И осталась ли возможность использовать специальные плейсхолдеры типа [[#12.pagetitle]]?
P.S. блин, только все чанки в ИМ на 50к товаров переписал на «быстрые плейсхолдеры». Прошла неделя — бам, новый pdoTools)))
Как минимум с тем, что парсер MODX выбирает теги регулярками, создаёт из них объекты и запускает на выполнение.
pdoParser пробует их выполнить без объектов, а если не может — отдаёт в парсер MODX.
Ну а Fenom просто и без затей компилирует шаблон в исполняемый PHP код, который полюбому будет быстрее.
pdoParser пробует их выполнить без объектов, а если не может — отдаёт в парсер MODX.
Ну а Fenom просто и без затей компилирует шаблон в исполняемый PHP код, который полюбому будет быстрее.
И осталась ли возможность использовать специальные плейсхолдеры типа [[#12.pagetitle]]?Конечно. Теперь можно даже так:
{$modx->getObject('modResource', 12)->pagetitle}
Конечно. Теперь можно даже так:Подразумеваю, что это будет практически одно и то же по скорости с [[#12.pagetitle]], а если вызвать в коде ресурса сниппет с кодом:
{$modx->getObject('modResource', 12)->pagetitle}
$res = $modx->getObject('modResource', 12);
return $res->pagetitle;
то это будет дольше из-за выше приведенных причин парсера MODX, правильно понимаю?Василий, ещё такой вопрос. Что будет быстрее работать, если вызвать в коде ресурса с id 10?
[[~[[*id]]]] - долго, рекурсивно
[[~10]] - долго, с makeUrl
[[*uri]] - быстрее
[[#[[*id]].uri]] - долго, рекурсивно с парсером MODX
[[#10.uri]] - быстрее
{$modx->resource->uri} - аналогично верхнему
{$resource->uri} (можно??)
Просто каша в голове от нового синтаксиса шаблонизатора. Надо поспать, чтобы уложилось))
Предлагаю это всё тебе протестировать самостоятельно, когда выспишься.
Василий, на тестовых сайтах modhost у pdoTools по умолчанию отключен pdoParser. Может, стоит включить по дефолту.
При переустановке опции тоже не выбрать. Приходится или сносить и заново ставить пакет или искать и вбивать значения настроек parser_class и parser_class_path.
При переустановке опции тоже не выбрать. Приходится или сносить и заново ставить пакет или искать и вбивать значения настроек parser_class и parser_class_path.
Просто устанавливай пакет вручную.
По умолчанию парсер я не буду включать по многим причинам.
По умолчанию парсер я не буду включать по многим причинам.
Хозяин — барин…
Тогда этот коммент останется для потомков, чтобы знали, что pdoParser на тестовых сайтах при автоустановке по умолчанию выключен.
Значение настроек:
Тогда этот коммент останется для потомков, чтобы знали, что pdoParser на тестовых сайтах при автоустановке по умолчанию выключен.
Значение настроек:
Ключ - Значение
parser_class - pdoParser
parser_class_path - {core_path}components/pdotools/model/pdotools/
А вложенные сниппеты можно как-нибудь вызывать? Например,
{$modx->runSnippet('TicketMeta', array('id' => $id, 'tpl' => 'Project.row.Star', 'getSection'=>0, 'getUser'=>0, 'getFiles'=>0, 'unusedFiles'=>0))}
ругается на Unexpected token 'array' in argument list in 676e9e1966946be21d1ccec95e5b8917.fenom.tpl line 36, near '{$modx->runSnippet('TicketMeta', array' < — there
Вместо array получилось в квадратных скобках, но это получается только для PHP>=5.4. В документации не обнаружил, с какой поддерживается.
А что с кешированием? Получается вложенные будут выполняться каждый раз?
А что с кешированием? Получается вложенные будут выполняться каждый раз?
Это же шаблон, а не чистый php, смотри во что он компилируется:
1. Для долговремнного хранения есть {$modx->cacheManager->get()} и {$modx->cacheManager->set()}
4. Для кэширования во время выполнения {$pdoTools->getStore()} и {$pdoTools->setStore()}.
3. Можно даже сохранять в произвольные файлы через {$.php.file_put_contents()}.
github.com/fenom-template/fenom/blob/master/docs/ru/syntax.md
<?php
/* 24c0b6e2dc0f6d70b87e26de577f6829.fenom.tpl:9: {$modx->runSnippet("TicketMeta", [
"id" => $id,
"tpl" => "Project.row.Star",
"getSection"=>0,
"getUser"=>0,
"getFiles"=>0,
"unusedFiles"=>0
])} */
echo $var["modx"]->runSnippet("TicketMeta", array("id" => $var["id"], "tpl" => "Project.row.Star", "getSection" => 0, "getUser" => 0, "getFiles" => 0, "unusedFiles" => 0));
Fenom требует PHP 5.3.А что с кешированием? Получается вложенные будут выполняться каждый раз?А кэшированием тебе придётся озаботиться самостоятельно.
1. Для долговремнного хранения есть {$modx->cacheManager->get()} и {$modx->cacheManager->set()}
4. Для кэширования во время выполнения {$pdoTools->getStore()} и {$pdoTools->setStore()}.
3. Можно даже сохранять в произвольные файлы через {$.php.file_put_contents()}.
github.com/fenom-template/fenom/blob/master/docs/ru/syntax.md
Fenom позволяет добавлять свои функции и упрощалки синтаксиса, так что в будущем я этим еще займусь.
А пока можно делать вот так:
А пока можно делать вот так:
{$modx->runSnippet("TicketMeta", [
'id' => $id,
'tpl' => 'Project.row.Star',
'getSection' => 0,
'getUser' => 0,
'getFiles' => 0,
'unusedFiles' => 0
])}
не подскажешь как получить pagetitle и uri родителя
[[!pdoResources?
&useFenom=`1`
&parents=`0`
&tpl=`@INLINE
<p>Данные ресурса: {$id} - {$pagetitle}
{if $parent != 0}
{set $doc = $pdoTools->getArray('modResource', $parent, ['select' => 'pagetitle,uri'])}
{if $doc}
<ul>Данные родителя: {$doc.pagetitle} - {$doc.uri}</ul>
{/if}
{/if}
</p>
`
]]
а если надо вывести в шаблоне, без pdoResource. Тогда легче будет [[#[[*parent]].pagetitle]]?
Ну а эта конструкция, по твоему, как-то магически данные получает, без запросов в БД?
Бери плейсхолдер [^t^], делай разные запросы и замеряй производительность.
Бери плейсхолдер [^t^], делай разные запросы и замеряй производительность.
ну я имел виду, что данная конструкция не работает за рпеделами pdoResource, мне неоходимо вывести в шаблоне main и page как пример в хедере
Что-то мне надоело угадывать, что ты имел в виду.
Давай дальше сам.
Давай дальше сам.
Реально большой прорыв. Отличная новость!
Я так понимаю надо переписать дефолтные чанки например у pdoMenu и включить феном чтобы все работало эффективнее?
В родных чанках pdoTools нет никаких фильтров вывода и условий, так что там вряд ли что-то ускорится.
Но попробовать можно, почему бы и нет? Напиши о результатах, если будешь делать.
Но попробовать можно, почему бы и нет? Напиши о результатах, если будешь делать.
Проверил на 200 категориях уровень вложенности 3, разброс на генерацию от 1.7-2.2c с феномом так же, значит разницы нет.
О чем и речь, да.
А вот если ты захочешь понапихать в чанки разных проверок — то Fenom будет гораздо быстрее.
А вот если ты захочешь понапихать в чанки разных проверок — то Fenom будет гораздо быстрее.
Интересно было бы ускорить генерацию меню если это возможно, а то на 900 категориях это 10-12 секунд, и при вызове каждой страницы оно кешируется по новой, хотя наверное если ускорять пропадет универсальность…
попробуй
&cache=`1`
&cacheTime=`0`
&cache_key=`bestMenu`
чтобы менюшка сейвило под 1 ключом для всех страниц, если конечно от этого ничего не поломается
&cache=`1`
&cacheTime=`0`
&cache_key=`bestMenu`
чтобы менюшка сейвило под 1 ключом для всех страниц, если конечно от этого ничего не поломается
ну тогда наверное выделение пунктов меню будет неверным или же оно будет кешироваться для одной страницы только
ну так попробуй, pdoPage идеально работает, же
так не работает, я и пишу что 10-12 секунд когда вызов не кешируем, в итоге после кеширования конечно все норм, но при 10к+ товаров и ежедневном обновлении цен и наличия и возможно картинок с описанием кеш очищается и все по новой
Я написал свой сниппет для генерации меню и теперь меня все устраивает, просто вопрос был именно в том чтобы ускорить pdoMenu, и не писать свои обработчики
Я написал свой сниппет для генерации меню и теперь меня все устраивает, просто вопрос был именно в том чтобы ускорить pdoMenu, и не писать свои обработчики
попробуйте вручную удалять папку с кэшем (минишопа), который требуется обновить. Если это возможно
modx/core/cache/ВАША_ПАПКА_КЭША
modx/core/cache/ВАША_ПАПКА_КЭША
Нет, кэшируются только данные, а не отрендеренные чанки.
Так что попробуй, может сработать.
Так что попробуй, может сработать.
у меня такие настройки были:
&cache=`1`
&cacheTime=`0`
&cache_user=`0`
&cache_key=`left_menu`
Да, я посмотрел исходники. Это хорошо работает для pdoPage, а для pdoMenu — нет.
В первом случае одна страница, а во втором несколько, вот в этом и разница.
В первом случае одна страница, а во втором несколько, вот в этом и разница.
В итоге для категорий товара я пришел к простому решению, в 2 этапа:
1)сниппет с 1 sql запросом и рекурсивной генерацией меню, для большей быстроты генерации на лету вес можно еще хранить
2)js скрипт который пробегается по дереву и проставляет текущий пункт и родителей
Скорость генерации сократилась с 10s до 1s при первом вызове и потом до 0.05s при кешировании
1)сниппет с 1 sql запросом и рекурсивной генерацией меню, для большей быстроты генерации на лету вес можно еще хранить
2)js скрипт который пробегается по дереву и проставляет текущий пункт и родителей
Скорость генерации сократилась с 10s до 1s при первом вызове и потом до 0.05s при кешировании
Я сейчас буду блаженно материться…
ДА. ЭТО. ЖЕ. ПРОСТО. О.УЕННО!!!
Чанки в чанках, грёбанные строки в виде всяких там плейсхолдеров теперь идут НАХЕР!
Циклы! Наконец-то, мать их, циклы!!!
Условия! Наконец-то, мать их, человеческие условия!
Наконец-то есть работа с ДАННЫМИ, а не с какими-то грёбанными строками, которые после обработки всех вложенностей и 10й итерации парсера вылезают хрен пойми где и хрен пойми как, ломая напрочь всю разметку.
Циклы, omfg, да это же ЦИКЛЫ!!! Как мало для счастья надо xD xD
Сколько же я на себе волос повыдирал, когда бодался с этим долбанным парсером. Когда логика фронтенда становится чуть сложнее простого вывода данных, то всё — логика у парсера отключается и активируется режим «Угадай, что получится». Я даже хотел писать статью-ненависти-поток-сознания, в которой хотел по косточкам пройтись по косякам парсера. Теперь всё это идёт НАХЕР! xD
Теперь достаточно написать один простенький сниппет (чтобы не извращаться через tplWrapper pdoResource'а), который подключает pdoTools и с помощью него выводит чанк из параметров сниппета (а в чанке уже можно писать что угодно) и всё, мать его, ВСЁ! xD
p.s. Славься В! Славься В! Славься В!
ДА. ЭТО. ЖЕ. ПРОСТО. О.УЕННО!!!
Чанки в чанках, грёбанные строки в виде всяких там плейсхолдеров теперь идут НАХЕР!
Циклы! Наконец-то, мать их, циклы!!!
Условия! Наконец-то, мать их, человеческие условия!
Наконец-то есть работа с ДАННЫМИ, а не с какими-то грёбанными строками, которые после обработки всех вложенностей и 10й итерации парсера вылезают хрен пойми где и хрен пойми как, ломая напрочь всю разметку.
Циклы, omfg, да это же ЦИКЛЫ!!! Как мало для счастья надо xD xD
Сколько же я на себе волос повыдирал, когда бодался с этим долбанным парсером. Когда логика фронтенда становится чуть сложнее простого вывода данных, то всё — логика у парсера отключается и активируется режим «Угадай, что получится». Я даже хотел писать статью-ненависти-поток-сознания, в которой хотел по косточкам пройтись по косякам парсера. Теперь всё это идёт НАХЕР! xD
Теперь достаточно написать один простенький сниппет (чтобы не извращаться через tplWrapper pdoResource'а), который подключает pdoTools и с помощью него выводит чанк из параметров сниппета (а в чанке уже можно писать что угодно) и всё, мать его, ВСЁ! xD
p.s. Славься В! Славься В! Славься В!
Теперь достаточно написать один простенький сниппет (чтобы не извращаться через tplWrapper pdoResource'а), который подключает pdoTools и с помощью него выводит чанк из параметров сниппета (а в чанке уже можно писать что угодно) и всё, мать его, ВСЁ! xD
Не спеши, скоро будет обновление с улучшенным pdoParser:
А чего там спешить-то?))
Но такая глобальная шаблонизация из коробки — это, конечно, будет просто сказка! Ждём-с :)
if (!function_exists('getArray')) {
function getArray ($input, $separator = ',') {
if (is_array($input)) {
return $input;
} else
if (is_string($input)) {
$trimmedInput = trim($input);
$firstLetter = substr($trimmedInput, 0, 1);
$lastLetter = substr($trimmedInput, mb_strlen($trimmedInput,'UTF-8') - 1, 1);
if (
($firstLetter == '{' && $lastLetter == '}') ||
($firstLetter == '[' && $lastLetter == ']')
) {
$tmp = json_decode($input, 1);
if ($tmp) {
return $tmp;
}
} else
// check for not empty string
if (trim($input)) {
$tmp = array_map('trim', explode($separator, $input));
return $tmp;
}
}
return ($input && !is_object($input)) ? array($input) : array();
}
}
$output = '';
$options = (!empty($scriptProperties['options'])) ? getArray($scriptProperties['options']) : array();
$options = array_merge($options, array('useFenom' => 1));
if (!is_object($modx->pdoTools) || !($modx->pdoTools instanceof pdoTools)) {
$fqn = $modx->getOption('pdoFetch.class', null, 'pdotools.pdofetch', true);
if ($pdoClass = $modx->loadClass($fqn, '', false, true)) {
$pdoTools = new $pdoClass($modx, $options);
}
elseif ($pdoClass = $modx->loadClass($fqn, MODX_CORE_PATH . 'components/pdotools/model/', false, true)) {
$pdoTools = new $pdoClass($modx, $options);
}
else {
$modx->log(modX::LOG_LEVEL_ERROR, 'Could not load pdoFetch from "MODX_CORE_PATH/components/pdotools/model/".');
return $output;
}
} else {
$modx->pdoTools->setConfig($options);
$pdoTools = &$modx->pdoTools;
}
$tpl = (!empty($scriptProperties['tpl'])) ? $scriptProperties['tpl'] : '';
if ($tpl) {
$data = (!empty($scriptProperties['data'])) ? getArray($scriptProperties['data']) : array();
$output = $pdoTools->getChunk($tpl, $data);
}
return $output;
Но такая глобальная шаблонизация из коробки — это, конечно, будет просто сказка! Ждём-с :)
Ну ты и навелосипедил!
Обновляйся на 2.0.0-rc, включай pdoParser при установке, и можно использовать Fenom на страницах сайта и в шаблонах.
Вообще, короче, везде можно.
Обновляйся на 2.0.0-rc, включай pdoParser при установке, и можно использовать Fenom на страницах сайта и в шаблонах.
Вообще, короче, везде можно.
Еее, счас бум тестить!
p.s. а в чём там велосипедность-то?) Небольшая функция, подключение pdoTools'а и вывод чанка, в который можно данные передать — куда ж проще-то?)
p.s. а в чём там велосипедность-то?) Небольшая функция, подключение pdoTools'а и вывод чанка, в который можно данные передать — куда ж проще-то?)
Обрадовался, побежал пробовать и что-то, видимо, упустил. Добавил строку в админке, а вот как она отображается на фронтенде. Файл в кеше был сгенерирован успешно.
pdoParser включен? Лог сайта без ошибок? Кэш почистил?
Включен. [[#13.pagetitle]] работает. Кэш чистил. А в логе следующее:
[2015-05-20 08:16:40] (ERROR @ /index.php) Unexpected tag 'prevText' in web/resources/1/72ff9c7b66dedf43897182eb4a87a8c3.fenom.tpl line 138, near '{prevText:' <- there
блин. это объет javascript на странице прописан между
<script></script>
Надо скрипт будет в файл, значит, выносить)
Просто используй {ignore}
А, ну да.))
Короче, разобрался)
А как выводить твшки? и картинки [[+150x120]]?
{$150x120} ломает парсер.
{$150x120} ломает парсер.
[2015-05-20 11:47:30] (ERROR @ /index.php) Unexpected token '150' in expression, expect '.' in 813a86bbda364c6febcdcf125bfe082d.fenom.tpl line 7, near '{$150' <- there
Наверное, придётся это пока оставить как [[+150x120]] — старые теги тоже должны работать.
Может, как-то получится это экранировать, но я пока не придумал как именно.
Может, как-то получится это экранировать, но я пока не придумал как именно.
В новой версии к ним можно обращаться как {$_pls['150x120']}
Просто хочу выразить благодарность тебе, Василий, за твою работу. Я твой фанат =)
А что сначала выполняется? Fenom или парсер MODX?
Это верная конструкция или сначала будет распарсен чанк, а уже после Fenom решит показывать его или нет?
И про эту конструкцию такой же вопрос
Это верная конструкция или сначала будет распарсен чанк, а уже после Fenom решит показывать его или нет?
{if $modx->resource->id != $modx->getOption('site_start')}
[[$asideLeft]]
{/if}
И про эту конструкцию такой же вопрос
{if $modx->resource->id != $modx->getOption('site_start')}
{$pdoTools->getChunk('asideLeft')}
{/if}
Если это в чанке, то сначала отработает Fenom
Если на странице — то MODX, потому что чанк кэшированный.
Если чанк на странице некэшированный, то первым сработает Fenom.
Если на странице — то MODX, потому что чанк кэшированный.
Если чанк на странице некэшированный, то первым сработает Fenom.
А fenom так же изнутри работает? Т.е. во втором примере выше, мы получим сначала чанк, а потом проверим выводить ли его? Если да, то возможно ли как то оптимизировать это?
Хотя судя по тому что нижние примеры не срабатывают (1-ый ломает парсер, второй ничего не выводит), оно работает внутрь.
Хотя судя по тому что нижние примеры не срабатывают (1-ый ломает парсер, второй ничего не выводит), оно работает внутрь.
{{if true}
$pdoTools->getChunk('header')
{/if}}
{$pdoTools->getChunk('{if true}header{/if}')}
Нет, Fenom работает как PHP. Если условие не срабатывает — ничего внутри не запускается.
Можно смело делать вот так:
А пример у тебя неверный, не знаю, где ты такое вычитал.
Можно смело делать вот так:
{if $.get.test == 1}
[[!pdoResources?
&parents=`0`
]]
{else}
[[!pdoMenu?
&parents=`0`
]]
{/if}
И проверять страницу, передавая параметр ?test=1 или ?test=0А пример у тебя неверный, не знаю, где ты такое вычитал.
Пример это эксперименты с попыткой воссоздать:
Без всего:
Использовано памяти: 4.54 мб., MySQL: 0.0132 s, 88 request(s), PHP: 0.5319 s, total: 0.5451 s, from cache.
[[$[[*id:is=`1`:then=`chunk1`:else=`chunk2`]]]]
Хм.Без всего:
Использовано памяти: 4.54 мб., MySQL: 0.0132 s, 88 request(s), PHP: 0.5319 s, total: 0.5451 s, from cache.
{if $.get.test == 1}
{else}
{/if}
[[!pdoResources?
&parents=`0`
]]
[[!pdoMenu?
&parents=`0`
]]
Использовано памяти: 5.69 мб., MySQL: 0.0195 s, 109 request(s), PHP: 0.7325 s, total: 0.7520 s, from cache. {if $.get.test == 1}
[[!pdoResources?
&parents=`0`
]]
[[!pdoMenu?
&parents=`0`
]]
{/if}
Использовано памяти: 5.69 мб., MySQL: 0.0200 s, 109 request(s), PHP: 0.7373 s, total: 0.7573 s, from cache. {if $.get.test == 1}
[[!pdoResources?
&parents=`0`
]]
{else}
[[!pdoMenu?
&parents=`0`
]]
{/if}
Использовано памяти: 5.69 мб., MySQL: 0.0220 s, 109 request(s), PHP: 0.7495 s, total: 0.7715 s, from cache. {if $.get.test == 1}
[[!pdoResources?
&parents=`0`
]]
{else}
{/if}
Использовано памяти: 5.48 мб., MySQL: 0.0125 s, 92 request(s), PHP: 0.5108 s, total: 0.5233 s, from cache.
а вот
Тут и во всех примерах выше гет запрос пустой.
{if $.get.test == 1}
{$modx->runSnippet("pdoResources", [
'parents' => 0
])}
{$modx->runSnippet("pdoMenu", [
'parents' => 0
])}
{/if}
Использовано памяти: 4.54 мб., MySQL: 0.0121 s, 88 request(s), PHP: 0.5129 s, total: 0.5250 s, from cache. Тут и во всех примерах выше гет запрос пустой.
Нашел в чем дело, в новой версии будет исправлено.
А пока можно просто переписать на Fenom вот так:
А пока можно просто переписать на Fenom вот так:
{$modx->getChunk($modx->resource->id == 1 ? 'chunk1' : 'chunk2')}
Спасибо, я пока просто играюсь с синтаксисом;)
Вот еще особенность, при попытке получить пустой чанк:
Пустой старт: 88 request(s)
Но
И просто для вида:
Чанк существует.
Вот еще особенность, при попытке получить пустой чанк:
Пустой старт: 88 request(s)
{$pdoTools->getChunk()}
88 request(s){$modx->getChunk()}
89 request(s){$modx->getChunk()}
{$modx->getChunk()}
90 request(s)Но
{$modx->getChunk('footer')}
88 request(s){$modx->getChunk('footer')}
{$modx->getChunk('footer')}
88 request(s){$pdoTools->getChunk('footer')}
89 request(s){$pdoTools->getChunk('footer')}
{$pdoTools->getChunk('footer')}
89 request(s)И просто для вида:
[[$footer]]
[[$footer]]
88 request(s)Чанк существует.
Да, похоже парсер MODX где-то успевает подлезть.
Попробую разобраться.
Попробую разобраться.
С Fenom кэш MODX станет ещё больше. На каждое изменение ресурса он генерит в кэше по два новых файла, а старые оставляет.
Это не кэш MODX, это кэш Fenom, и он очищается при очистке системного.
Я имел ввиду общий кэш системы.
Он очищается при ПОЛНОЙ очистке системного, а при обычном сохранении ресурса с очисткой кэша он раздувается.
Он очищается при ПОЛНОЙ очистке системного, а при обычном сохранении ресурса с очисткой кэша он раздувается.
И что?
Каждый раз, как ты что-то меняешь — генерируется новый кэш. Как, по твоему, вообще должен работать шаблонизатор, без компиляции что ли?
Каждый раз, как ты что-то меняешь — генерируется новый кэш. Как, по твоему, вообще должен работать шаблонизатор, без компиляции что ли?
А что в этом хорошего? На 10к+ ресурсах при редактировании в каждом файле будет код целой страницы! Ты считаешь, что это хорошо?
По-моему он должен работать с очисткой предыдущего кэша данной страницы, зачем плодить ненужный кэш?
По-моему он должен работать с очисткой предыдущего кэша данной страницы, зачем плодить ненужный кэш?
Друг, тебя никто не заставлять этого делать. Работай как раньше, не нужно переживать.
Такое происходит только если вызывать новые теги прямо на страницах, а чанки кэшируются по хэшу своего содержимого.
То, что сейчас в кэше MODX точно так же хранится код каждой страницы никого, почему-то, не беспокоит.
Такое происходит только если вызывать новые теги прямо на страницах, а чанки кэшируются по хэшу своего содержимого.
То, что сейчас в кэше MODX точно так же хранится код каждой страницы никого, почему-то, не беспокоит.
Исходный код на GitHub — перепиши сам, как тебе нужно.
Не жди ничего, поработай самостоятельно.
P.S.
Сейчас-то хоть дошло, почему я не включаю эксперементальный парсер по умолчанию?
О да, это просто гениальный ответ, именно такие я всегда жду от тебя.Высказывать своё удивительно важное мнение может каждый, даже ты. А вот сделать что-то всегда проблема.
Не жди ничего, поработай самостоятельно.
P.S.
Сейчас-то хоть дошло, почему я не включаю эксперементальный парсер по умолчанию?
Я не претендую на важность своего мнения. Всего лишь указал на недостаток.
А мне кажется совсем наоборот — ты считаешь своё мнение сверх важным всегда. До этого я высказал своё мнение по поводу rel=canonical — наткнулся на вилы с твоей стороны и предложение сделать самому. Хорошо, я сделал сам. Хотя насчёт rel=next и rel=prev ты кого-то послушал, и сделал.
Вот и теперь также.
P.S. но эти самые rel=next Яндексом даже не поддерживаются. А насчёт rel=canonical ты почему-то полез в документацию именно Яндекса, когда захотел мне возразить.
А мне кажется совсем наоборот — ты считаешь своё мнение сверх важным всегда. До этого я высказал своё мнение по поводу rel=canonical — наткнулся на вилы с твоей стороны и предложение сделать самому. Хорошо, я сделал сам. Хотя насчёт rel=next и rel=prev ты кого-то послушал, и сделал.
Вот и теперь также.
P.S. но эти самые rel=next Яндексом даже не поддерживаются. А насчёт rel=canonical ты почему-то полез в документацию именно Яндекса, когда захотел мне возразить.
ты считаешь своё мнение сверх важным всегдаНаверное потому, что я понимаю, что делаю.
Если бы не понимал, ты бы сейчас давал свои советы кому-то другому.
P.S. но эти самые rel=next Яндексом даже не поддерживаются. А насчёт rel=canonical ты почему-то полез в документацию именно Яндекса, когда захотел мне возразить.Со временем, боль утихнет.
P.S.Слово «дошло» здесь не уместно, так как ты об это и не говорил. Скорее, одну из причин я понял))
Сейчас-то хоть дошло, почему я не включаю эксперементальный парсер по умолчанию?
Каждый разбирается в своём предмете лучше. Если это твой компонент, то логично же, что именно тебе пишут о его недостатках. Пусть даже в чём-то эти недостатки мнимые. Если ты хорошо знаешь свой «предмет», то просто объясни людям, в чём их заблуждение. Не нужно тыкать пальцем и писать ёрнические фразы.
дополнение же бесплатное, очень многие разработчики просто ничего не публикуют, только за скачивание такой удивительной фишки как феном в модикс можно уже смело делать знатный донэйт) критика конечно хорошо, но не в такой мере)
Нет, всё должно быть идеально с первой же версии. А если, вдруг, что-то непонятно — автор должен сразу прибежать и объяснить.
А если плохо объяснил — должен извиниться, и впредь вести себя вежливо и предупредительно.
Пользователь, понятное дело, ничего такого не должен. Это же автору нужно бегать за пользователем, а никак не наоборот.
А если плохо объяснил — должен извиниться, и впредь вести себя вежливо и предупредительно.
Пользователь, понятное дело, ничего такого не должен. Это же автору нужно бегать за пользователем, а никак не наоборот.
Кто сказал, что с первой версии? Правильно тебе уже писал Андрей Чирко, что ты свои фантазии за действительное выдаёшь.
Ты же хочешь, чтобы твой компонент был лучше всех? Хочешь. Ты же хочешь, чтобы искали баги — хочешь? Так в чём проблема? В чье-то критике?
P.S.
А между тем выходит версия 2.0.0-rc2 Но ты же всегда прав…
P.S.S. в логе изменений ошибочка, кстати:
Ты же хочешь, чтобы твой компонент был лучше всех? Хочешь. Ты же хочешь, чтобы искали баги — хочешь? Так в чём проблема? В чье-то критике?
P.S.
А между тем выходит версия 2.0.0-rc2 Но ты же всегда прав…
P.S.S. в логе изменений ошибочка, кстати:
Complied
А между тем выходит версия 2.0.0-rc2 Но ты же всегда прав…Конечно выходит, а потом выйдет и pl, и 2.0.1 — независимо от твоей «критики».
Просто я знаю, что хочу сделать и выкладываю промежуточные версии, чтобы можно было посмотреть как получается.
Или ты думаешь, что я весь день плевал в потолок и только после твоих невероятно ценных замечаний, за 5 часов всё переписал, протестировал и выложил?
Ты себе льстишь, серьёзно.
Конечно, точно так же как и ты себе…
да заткнись ты уже!
Вот на это ты только и способен — заблочил аккаунт. Вообще то позиционируется как «Крупнейшее русскоязычное MODX сообщество».
Ну а что еще делать с занудными дурачками? Где-то раз в неделю обязательно такие находятся.
Удачи тебе в поисках Правды на других ресурсах.
Удачи тебе в поисках Правды на других ресурсах.
Это сообщение было удалено
Это сообщение было удалено
Это сообщение было удалено
Василий! Спасибо тебе за твои идеи, дополнения и новые фишки!
После чтения «критики», в данной ветке особенно, хочется тебя поблагодарить и поддержать.
После чтения «критики», в данной ветке особенно, хочется тебя поблагодарить и поддержать.
На здоровье!
К яростным мстителям я давно привык — не первый год рулю сообществом.
К яростным мстителям я давно привык — не первый год рулю сообществом.
Это сообщение было удалено
Не разбираюсь в шаблонизаторах, но по замерам очень круто! Спасибо, Василий!
Подскажите, кто-нибудь как вывести TV'шку с помощью синтаксиса шаблонизатора ?)
Подскажите, кто-нибудь как вывести TV'шку с помощью синтаксиса шаблонизатора ?)
Вывести, если оно уже получено сниппетом, примерно так же как и раньше:
А получить прямо из шаблона или чанка можно так
Если ресурса с id 15 нет, то будет ошибка. Поэтому, безопаснее вот так:
{$tvname}
А получить прямо из шаблона или чанка можно так
{$modx->getObject('modResource', 15)->getTVValue('tvname')}
Если ресурса с id 15 нет, то будет ошибка. Поэтому, безопаснее вот так:
{set $resource = $modx->getObject('modResource', 15)}
{if $resource}
{$resource->getTVValue('tvname')}
{/if}
[[!pdoResources?
&parents=`378`
&depth=`0`
&tpl=`@INLINE <li><img src="{$modx->runSnippet("phpthumbon", [ 'input' => $modx->getObject('modResource', $id)->getTVValue('image'), 'options' => '&w=340&h=540&zc=1' ])}" /></li>`
&limit=`6`
&includeTVs=`image`
&sortby=`{"publishedon":"DESC"}`
]]
Вот так вывел, через {$tvname} не получилось.
Василий, а не знаешь ли ты, как можно получить категорию, в которой находится TV?
Василий, что все таки надо сделать чтобы можно было писать TV внутри чанков в виде {$name}?
если оно уже получено сниппетомКак это сделать? Например, в pdoResources делаю и &includeTVs со списком tv и подготавливаю и обрабатываю их через &prepareTVs=`1` и &processTVs=`1` и все равно внутри чанка можно получить значение этих переменных только в виде:
{$modx->getObject('modResource', $id)->getTVValue('name')}
а для этого надо включать pdotools_fenom_modx, что не очень хорошо для безопасности. Тот же самый вызов только с $_modx не работает. Из этого следует, что внутри чанков по сути получается использовать в формате {$name} только стандартные поля ресурсов, а для получения значений TV надо писать каждый раз огромный код, что конечно «убивает» все удобство написания кода. Так что же я делаю не так? Или просто я что-то не так понял, такой возможности нет и мне пора бы уже сделать себе хоткей в редакторе для TV? :)
Нашлось решение проблемы? Тоже самое у меня сейчас.
{$_modx->resource.tvname}
Ваш вариант подходит только для получения значений в шаблонах, но не в чанках, про которые и шла речь.
{$_pls['tvname']}
Документацию почитайте, что-ли.
У меня на последней версии modx revo 2.4.2 и pdoTools 2.1.17 ничего не изменилось, также продолжает не работать в чанках $_modx, ошибок в журнале никаких нет, ну и на выходе имеем просто пустую страницу.
Да как обычно, всё работает только у меня и больше нигде.
Между {$modx} и {$_modx} есть очень серьёзная разница, и если ты пытаешься использовать вторую переменную как первую, то и будет fatal error.
Между {$modx} и {$_modx} есть очень серьёзная разница, и если ты пытаешься использовать вторую переменную как первую, то и будет fatal error.
Я ее пытался использовать вот так:
В чем именно тут ошибка использования? для $_modx нет getObject?
{$_modx->getObject('modResource', $id)->getTVValue('name')}
При этом имя TV без тире, точек и т.д.В чем именно тут ошибка использования? для $_modx нет getObject?
В чем именно тут ошибка использования? для $_modx нет getObject?Именно.
Может, прочитаешь уже документацию, а?
В том то ж и дело что я ее читал, видимо пропустил что не все методы $modx доступны для $_modx. Но все равно кроме как:
{$modx->getObject('modResource', $id)->getTVValue('tvName')}
или стандартно
[[+tvName]]
в чанках не выходит получить значение tv. Имена tv не имеют тире, точек, подчеркиваний, поэтому, как я понял, использовать $_pls (куда ведет ваша ссылка) не имеет смысла. Так есть ли возможность как-то по-другому получать значение tv в чанках? Я в документации такого не нашел…
А попробовать получить значение TV так, как написано в документации? Не додумывать, а просто попробовать.
я пробовал такими способами:
Первый вариант как я и говорил он предназначен для вывода значения тв для текущего ресурса. ([[*tvName]] а нужен аналог [[+tvName]])
Ну а с $_pls просто ничего не выдается.
>>>Не додумывать, а просто попробовать.
Я обычно так и делаю, чтобы не быть голословным я сначала пробую, а потом пытаюсь додумать, что не так…
{$_modx->resource.tvName}
{$_pls['tvName']}
{$_modx->getObject('modResource', $id)->getTVValue('name')}
Ну с последним вариантом я уже понял в чем дело…Первый вариант как я и говорил он предназначен для вывода значения тв для текущего ресурса. ([[*tvName]] а нужен аналог [[+tvName]])
Ну а с $_pls просто ничего не выдается.
>>>Не додумывать, а просто попробовать.
Я обычно так и делаю, чтобы не быть голословным я сначала пробую, а потом пытаюсь додумать, что не так…
Ну создай тестовый сайт и покажи нам эту проблему воочию — разберёмся.
Смешно.
&tvPrefix=``
Это вообще очень смешно, особенно если об этом нигде в документации не указано, что для того чтобы tv нормально можно было по имени вызывать в виде
{$tvName}
надо при вызове сниппета, напр. pdoResource, использовать параметр&tvPrefix=``
Ну хотя бы сейчас из этого сообщения люди смогут об этом узнать.
Ну естественно, это мега-тайна, что все ТВ выбираются с префиксом tv. по умолчанию. В документации прям нет этого параметра. includeTVs, prepareTVs, processTVs и дальше пустота.
Можно и не делать пустой &tvPrefix, но тогда, не поверишь, нужно выводить ТВ вот так:
А вообще, можно увидеть все плейсхолдеры, если просто не указывать чанк.
Можно и не делать пустой &tvPrefix, но тогда, не поверишь, нужно выводить ТВ вот так:
[[+tv.name]] - MODX
{$_pls['tv.name']} - Fenom
Про вывод через точку я тебе давал ссылку еще 2 часа назад.А вообще, можно увидеть все плейсхолдеры, если просто не указывать чанк.
Если бы вышеприведенные две строчки были в документации, то этого всего разговора не было бы. Во всяком случае, спасибо, теперь хоть смогу нормально пользоваться tv в чанках! :)
Документация у нас открытая, можно редактировать через GitHub.
Допиши, что считаешь нужным, и пришли pull-request. Тогда эта информация добавится на сайте.
Все сетуют на плохую документацию, но никто, почему-то, не хочет её улучшать.
Допиши, что считаешь нужным, и пришли pull-request. Тогда эта информация добавится на сайте.
Все сетуют на плохую документацию, но никто, почему-то, не хочет её улучшать.
Напиши вызов сниппета, в котором обрабатывается чанк.
Никак лексиконы победить не могу.
Через пространство имён создано новое имя sitetranslations, /core/components/sitetranslations/lexicon/ содержит два языка — русский и английский. Раньше выводил так:
Через пространство имён создано новое имя sitetranslations, /core/components/sitetranslations/lexicon/ содержит два языка — русский и английский. Раньше выводил так:
[[%lexicon_name? &namespace=`sitetranslations`]]
Решил попробовать шаблонизатор, пробую варианты:{$modx->lexicon('lexicon_name', ['namespace' => 'sitetranslations'])}
{$modx->lexicon('lexicon_name', 'sitetranslations')}
{$modx->lexicon('lexicon_name')}
Выводит — lexicon_name. Но ежели в шаблоне оставить хоть один вывод MODX[[%lexicon_name? &namespace=`sitetranslations`]]
То Fenome начинает работать и без указания пакета, выводится так:{$modx->lexicon('lexicon_name_to')}
Лексикон нужно загрузить, для этого есть отдельный метод.
Попробуй так:
Попробуй так:
{$modx->lexicon->load('sitetranslations')}
{$modx->lexicon('lexicon_name')}
Нет, не хочет.
И в документации про load() ничего не вижу. Да я понимаю, что надо загрузить лексикон, только не грузится он у меня без вмешательства MODX.
И в документации про load() ничего не вижу. Да я понимаю, что надо загрузить лексикон, только не грузится он у меня без вмешательства MODX.
У меня работает:
Видимо, тебе тоже нужно указать раздел через двоеточие. По идее:
Кстати говоря, документацию лучше смотреть вот так.
{$modx->lexicon->load('tickets:setting')}
{$modx->lexicon('area_tickets.mail')}
выводит «Почтовые уведомления». Без первой строчки выводит «area_tickets.mail».Видимо, тебе тоже нужно указать раздел через двоеточие. По идее:
{$modx->lexicon->load('sitetranslations:default')}
Кстати говоря, документацию лучше смотреть вот так.
О. Заработало. Отличную вещь ты, Василий, сделал — пошёл дальше осваивать. Спасибо!!!
зы. Отлично.
зы. Отлично.
Не сделал, а прикрутил.
Но да, мне тоже очень нравится =)
Но да, мне тоже очень нравится =)
Ну конечно же, не так выразился — Отличную вещь ты, Василий, сделал, что прикрутил Fenom!
Василий скажите почему может не работать такой вывод?
И ошибка в отчете:
$tpl1 = '@INLINE <p><a href="[[~[[+id]]">[[+pagetitle]]</a></p>'
Не работает именно [[~[[+id]]. Ссылка выходит такая Товар 1. Такая проблема появилась после обновления pdoTools Fenom. Если задать поместить [[+pagetitle]] в чанк то все работает.И ошибка в отчете:
`[[+id]]` is not a valid integer and may not be passed to makeUrl()
Попробуй почитать документацию.
Выходит что такая конструкция [[~[[+id]]]] не будет работать? Но ее можно заменить эти {$modx->makeUrl($id)}?
Можно заменить на [[+uri]], если включены дружественные URL
Спасибо за помощь, невнимательно прочитал.
Все понял, прошу прощения
переменные переданные в чанк не отрабатывает или я что-то не так делаю?
[[$input?
$input_error=`test`
]]
[[+input_error]]
У меня такое ощущение, что вы прям соревнуетесь иногда, кто глупее вопрос задаст.
Трудно внимательно посмотреть на код и подумать, а вдруг там опечатка? Может, заместо $input_error нужно указать &input_error?
Трудно внимательно посмотреть на код и подумать, а вдруг там опечатка? Может, заместо $input_error нужно указать &input_error?
Это я сейчас, когда писал комментарий опечатался. На сайте все как надо
вызов чанка:
вызов чанка:
[[$input?
&input_error=`test`
]]
чанк:{$input_error}
Fenom срабатывает раньше, так что можно делать вот так:
{set $input_error = 'test'}
[[$input]]
Но это попахивает уже каким-то извращением, на мой взгляд.
Да. Действительно, извращение :) Хотелось все привести к единообразию, а то несколько разных синтаксисов режет глаза. Спасибо.
Тут словил вот такую вещь. Сайт падает, когда пользователь не суперадмин. В логах сервера это:
Тут словил вот такую вещь. Сайт падает, когда пользователь не суперадмин. В логах сервера это:
[25-Jun-2015 14:07:45 Europe/Prague] PHP Fatal error: Call to a member function toArray() on null in /core/components/pdotools/model/pdotools/pdotools.class.php on line 493
т.е. на этой строке:$item = array_merge($this->modx->user->Profile->toArray(), $item);
Версия pdoTools 2.0.3-pl, modx 2.3.4.
А блин, это вообще по ошибке попало в релиз. Щас выложу обновление.
Всё, обновляйся.
Всё, обновляйся.
Gracias!
Кто-нибудь подскажет, как вывести Феномом (экранировать) такие вот плэйсхолдеры:
[[!+fi.error.email]]
?
Присоединюсь к вопросу. Не получается в письме для AjaxForm получить плейсхолдеры.
Подскажите, а как можно получить превьюшку произвольного ресурса с помощью Fenom?
Ребят, а кто-то разобрался как тег {use} работает? Я что-то потыкался, не нашел нормального описания.
Вызываем чанк:
Вызываем чанк:
{use 'header'}
А что дальше делать? Или как это работает?
видимо совместно с тегом {paste 'header'}, который не работает в pdoTools
Подскажите пожалуйста. Если, например, меняю в чанках pdoResources
И еще один вопрос. Каким образом можно заменить, например, такую конструкцию
[[+pagetitle]]
на {$pagetitle}
, то они не отрабатываются в кэшированном сниппете, в некэшированном отрабатываются, но так увеличивается время генерации страницы. Каким образом мне получить, например, {$pagetitle}
в кэшированном сниппете?И еще один вопрос. Каким образом можно заменить, например, такую конструкцию
[[+content:ellipsis=`200`]]
в рамках Fenom? И еще один вопрос. Каким образом можно заменить, например, такую конструкцию
[[+content:ellipsis=`200`]] в рамках Fenom?
{$content|truncate:200}
github.com/fenom-template/fenom/blob/master/docs/ru/mods/truncate.md
Руслан, спасибо! Полезная ссылка)
как выводить плэйсхолдер результатов для mFilter2?
dвот так работает
dвот так работает
[[!+my.results]]
а вот так уже нет{$_pls['my.results']}
Возникла такая проблемка. Если на странице используются фигурные скобки, то парсер не работает уже…
Скажем, вызываю на странице pdoResources, в котором есть параметр:
Скажем, вызываю на странице pdoResources, в котором есть параметр:
&where=`{"template":5}`
и парсер перестаёт работать… Что делать, кто знает? Можно ли как-нибудь экранировать скобки?
добавлять пробел (если это не феном)
&where=`{ "template":5 }`
Спасибо за ответы! Теперь всё работает)
Подскажите как выводить Теги fastField с помощью fenom?
с примеру [[#GET.key3]]?
с примеру [[#GET.key3]]?
{$.get.key3}
Супер! Спасибо!
Вот секретная документация. При попытке её достать пропали без вести несколько программистов. Герой, который её достал, провез её через таможню в том же месте, в котором отец Брюса Виллиса в «Криминальном чтиве» хранил 50 лет часы. :)
Спасибо за документацию, а история просто душераздирающая)
подскажите пожалуйста, что-то не соображу, как в феном закомментировать строку. Что-то типа {-- или {/* и выражение в скобках бы не действовало?
{* comment *}
спасибо. Чет не нашел в документации, просмотрел наверное.
Почему-то с if и просто для вывода доступ к массиву гет ($.get.) работает, а вот такие вот вещи — нет
А я б еще и такие вещи вотворил htmlspecialchars(strip_tags(stripslashes(trim($.get.city)))). А то я на смарти-шаблонизаторе часто вызывал процессоры прям на странице и почистить переменную перед вводом тут бы было очень кстати.
{var_dump($.get.city)}
{empty($.get.city)}
Хотел обернуть тернарным оператором !empty($.get.city)? «бла-бла»: «ой!» — и не вышло, облом.А я б еще и такие вещи вотворил htmlspecialchars(strip_tags(stripslashes(trim($.get.city)))). А то я на смарти-шаблонизаторе часто вызывал процессоры прям на странице и почистить переменную перед вводом тут бы было очень кстати.
А подскажите переписывал Tickets на fenom, есть момент, что некоторые плейсхолдеры которые вытаскивают закомментированные строки, например в чанке tpl.Tickets.comment.form.guest, типо [[+captcha]], если менять на {$captcha} не вытаскивает эти строки
<!--tickets_captcha
<div class="form-group">
<label for="comment-captcha" id="comment-captcha">[[+captcha]]</label>
<input type="text" name="captcha" value="" id="comment-captcha" class="wpcf7-text" />
<span class="error"></span>
</div>
-->
он просто их не видит…
пытаюсь включить fenom в настройках, сайт падает, с ошибками вроде
/components/pdotools/model/pdotools/pdotools.class.php : 977) Unexpected token ':' in ccfaa33771ae7e2120f1884ddb5abfce line 144, near '{"resource_id":' <- there
(ERROR @ /home//www/core/components/pdotools/model/pdotools/pdotools.class.php : 977) Unexpected tag 'mode' in b311a938ae7b6fb41a4bd04f6cb860ec line 523, near '{mode:' <- there
[2018-03-20 18:05:34] (ERROR @ /home//www/core/components/pdotools/model/pdotools/pdotools.class.php : 977) Unexpected tag 'mode' in 1207e2b16c0c303c4e34dda876b75a7b line 523, near '{mode:' <- there
[2018-03-20 18:05:36] (ERROR @ /home//www/core/components/pdotools/model/pdotools/pdotools.class.php : 977) Unexpected tag 'mode' in 73f419f93d3ec2357c622826f5e167e9 line 523, near '{mode:' <- there
подскажите, где в этих случаях искать ошибки?
В шаблоне используются конструкции — {«resource_id»:' и {mode:', строки указаны. Нужно добавить пробел после фигурной скобки, т.к. иначе Fenom думает что это его переменная. Тоже самое относится и к js скриптам, типа google analytics и т.п.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.