Представляю вашему вниманию сниппет catalogView. Создавался он для новой версии Shopkeeper — 1.0 (для MODx Evolution), но уже сейчас его можно использовать вместо Ditto.
Я провел небольшой тест производительности обоих сниппетов. Имеем 200 документов. Кэшировать сниппеты нельзя, т.к. требуется постраничная навигация. Брались примерно средние значения после нескольких обновлений страницы.
Вызовы сниппетов:
catalogView
Ditto
catalogView
Ditto
Как видно, Ditto на каждый документ на странице делает по 2 MySQL-запроса. В чанке catalogRow_chunk.tpl есть один нестандартный PHx-модификатор, который используется для изменения формата числа цены: [+price:num_format+]. Если его убрать значения будут такими (20 документов):
catalogView
Ditto
Странно, Ditto стал делать значительно меньше запросов. На каждый документ теперь по одному запросу. catalogView — меньше на один общий запрос. Уж не знаю что там за запрос и зачем делает PHx, ведь код модификатора находится в файле, а не в БД, но не важно. Мне стало интересно почему на каждый PHx-модификатор (нестандартный) при использовании Ditto делается по одному запросу в БД, ведь PHx кэширует такие модификаторы.
Всё оказалось просто. Ditto (2.1.0) не дает PHx возможности кэшировать модификаторы, т.к. при «рендеринге» каждого документа он создает новый объект класса PHx (функция $ditto->render()). Ну и кроме этого, если не использовать PHx-модификаторы из файлов, по одному запросу на каждый документ это слишком.
catalogView пока протестирован не очень хорошо, возможны ошибки. Пожалуйста, сообщайте о найденных багах.
Скачать catalogView 1.0 RC1
P.S. Конечно, пора подумать о MODx Revo, но я решил «добить» Shopkeeper для MODx Evo, выпустив версию 1.0 (сейчас beta).
Я провел небольшой тест производительности обоих сниппетов. Имеем 200 документов. Кэшировать сниппеты нельзя, т.к. требуется постраничная навигация. Брались примерно средние значения после нескольких обновлений страницы.
Вызовы сниппетов:
[!catalogView?
&dataType=`documents`
&tpl=`@FILE:assets/snippets/catalogView/chunks/catalogRow_chunk.tpl`
&parents=`87`
&paginate=`1`
&display=`10`
&sortBy=`pagetitle`
&sortDir=`asc`!]
[!Ditto?
&tpl=`@FILE:assets/snippets/catalogView/chunks/catalogRow_chunk.tpl`
&parents=`87`
&paginate=`1`
&display=`10`
&sortBy=`pagetitle`
&sortDir=`asc`!]
10 документов на странице
catalogView
MySQL: 0.0722 s, 6 request(s), PHP: 0.2756 s, total: 0.3479 s, document retrieved from cache
Ditto
MySQL: 0.1907 s, 32 request(s), PHP: 0.4672 s, total: 0.6579 s, document retrieved from cache
20 документов на странице
catalogView
MySQL: 0.0735 s, 6 request(s), PHP: 0.2934 s, total: 0.3669 s, document retrieved from cache
Ditto
MySQL: 0.2601 s, 52 request(s), PHP: 0.5081 s, total: 0.7683 s, document retrieved from cache
Как видно, Ditto на каждый документ на странице делает по 2 MySQL-запроса. В чанке catalogRow_chunk.tpl есть один нестандартный PHx-модификатор, который используется для изменения формата числа цены: [+price:num_format+]. Если его убрать значения будут такими (20 документов):
catalogView
MySQL: 0.0754 s, 5 request(s), PHP: 0.2794 s, total: 0.3548 s, document retrieved from cache
Ditto
MySQL: 0.2218 s, 32 request(s), PHP: 0.5411 s, total: 0.7629 s, document retrieved from cache
Странно, Ditto стал делать значительно меньше запросов. На каждый документ теперь по одному запросу. catalogView — меньше на один общий запрос. Уж не знаю что там за запрос и зачем делает PHx, ведь код модификатора находится в файле, а не в БД, но не важно. Мне стало интересно почему на каждый PHx-модификатор (нестандартный) при использовании Ditto делается по одному запросу в БД, ведь PHx кэширует такие модификаторы.
Всё оказалось просто. Ditto (2.1.0) не дает PHx возможности кэшировать модификаторы, т.к. при «рендеринге» каждого документа он создает новый объект класса PHx (функция $ditto->render()). Ну и кроме этого, если не использовать PHx-модификаторы из файлов, по одному запросу на каждый документ это слишком.
catalogView пока протестирован не очень хорошо, возможны ошибки. Пожалуйста, сообщайте о найденных багах.
Скачать catalogView 1.0 RC1
P.S. Конечно, пора подумать о MODx Revo, но я решил «добить» Shopkeeper для MODx Evo, выпустив версию 1.0 (сейчас beta).