[pdoTools] Версия 1.4.0, сниппет pdoResources

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

Однако, есть один неприятный момент: иногда скорость работы этого сниппета бывает недостаточной. Его нельзя назвать прям тормозом, но хотелось бы побыстрее.

Учитывая, что мы уже довольно давно используем pdoTools для разработки быстрых сниппетов в своих компонентах, написание аналога getResources было только вопросом времени.

И вот, наконец-то, новый сниппет pdoResources включен в пакет по умолчанию и является самым главным изменением в новой версии pdoTools. Поэтому, с него и начнем.

Сниппет pdoResources

Это сниппет, написанный на pdoTools и входящий в состав пакета. Он предназначен для получения и вывода документов сайта и, насколько это возможно, повторяет функционал getResources.

Основное отличие - работа с ТВ параметрами: - Нет &processTVs=``

  • Параметр &includeTVs=`` принимает имена ТВ параметров. То есть, нужно указывать, какие ТВ выбирать. Включить сразу все подряд ТВ нельзя.
  • Все возможные дополнительные условия указываются в &where=``. Нет отдельной фильтрации по ТВ, но это можно указать вручную.
  • Нет условий при работе с чанками (conditional chunks). Если будет нужно - добавим.

Особая работа с ТВ обусловливается тем, что все ТВ выбираются в том же запросе, что и ресурсы, то есть, используется &leftJoin=``. Все параметры с описаниями нужно смотреть вот тут.

Ну а теперь - про скорость!

Выборка из БД

Простая выборка из БД, без оформления, без ТВ параметров, чистый тест скорости получения данных. Вызовы сниппетов:

[[!getResources?
    &parents=`2`
    &limit=`n`
]]

[[!pdoResources?
    &parents=`2`
    &limit=`n`
]]

Результаты: | Limit | getResources | pdoResources | |---|---|---| | 10 | 0.1592 s | 0.1304 s | | 50 | 0.3502 s | 0.1495 s | | 100 | 0.5500 s | 0.1762 s | | 500 | 2.1891 s | 0.3045 s |

Благодаря работе через PDO и выборку всего необходимого в один запрос, pdoResources уверенно лидирует, особенно при больших объёмах.

Выборка и оформление

Та же выборка, но с указанием чанка, в котором всего два плейсхолдера:

<p>[[+idx]] - [[+pagetitle]]</p>

Вызовы сниппетов:

[[!getResources?
    &parents=`2`
    &tpl=`tpl.Test.row`
    &limit=`n`
]]

[[!pdoResources?
    &parents=`2`
    &tpl=`tpl.Test.row`
    &limit=`n`
]]

Результаты: | Limit | getResources | pdoResources | |---|---|---| | 10 | 0.1721 s | 0.1384 s | | 50 | 0.3994 s | 0.1687 s | | 100 | 0.6915 s | 0.2047 s | | 500 | 2.7538 s | 0.4851 s |

Тут ситуация никак не меняется.

Выборка и оформление + 2 ТВ параметра

Добавляем 2 ТВ параметра в наш чанк и выборку:

<p>[[+idx]] - [[+pagetitle]].<br/>
[[+tv.meta_description]] [[+tv.meta_keywords]]</p>

Вызовы сниппетов:

[[!getResources?
    &parents=`2`
    &tpl=`tpl.Test.row`
    &includeTVs=`1`
    &includeTVList=`meta_description,meta_keywords`
    &limit=`n`
]]

[[!pdoResources?
    &parents=`2`
    &tpl=`tpl.Test.row`
    &includeTVs=`meta_description,meta_keywords`
    &limit=`n`
]]

Результаты: | Limit | getResources | pdoResources | |---|---|---| | 10 | 0.2029 s | 0.1383 s | | 50 | 0.5014 s | 0.1747 s | | 100 | 0.8860 s | 0.2230 s | | 500 | 4.0989 s | 0.5248 s |

А вот тут pdoResources вообще выбегает за пределы стадиона, благодаря присоединению ТВ к основному запросу, а не отдельной выборке в цикле через xPDO.

Выводы

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

Это достигается благодаря двум основным составляющим: 1. Выборка всего нужно за один запрос, через PDO. 2. Предварительная обработка чанков, когда значения из ресурса заменяются в чанке без парсера MODX.

Есть конечно и еще много разных оптимизаций\улучшений, но эти 2 - принципиальные. Именно они дают такой прирост производительности.

Обращаю ваше внимание, что это работа без fastMode и быстрых плейсхолдеров.

Остальные изменения pdoTools

Внимание, это изменения, которые влияют на работу всех сниппетов pdoTools. То есть, новые свойства можно использовать и у miniShop2 и у Tickets!

Параметр sort теперь принимает массивы в виде JSON строк, например:

[[!msProducts?
    &sortby=`{
        "publishedon":"desc"
        ,"pagetitle":"asc"
    }`
]]

Добавлена автоматическая замена имён ТВ в &where. Тут нужно немного пояснить: из-за того, что ТВ присоединяются к запросу в БД, используются псевдонимы, и при указании

&includeTVs=`test`

в запросе мы получаем

`TVtest`.`value` as `test`

То есть, для работы с присоединённым ТВ нужно было указывать вот такое условие:

&includeTVs=`test`
&where=`{
    "TVtest.value:!=":"0"
}`

С версии 1.4.0 вы можете указать просто:

&includeTVs=`test`
&where=`{
    "test:!=":"0"
}`

и замена в запросе будет произведена автоматически.

Новый метод pdoTools::defineChunk(), который позволяет назначить кучу чанков для вывода результатов, согласно логики getResources. Этот метод выдает имя чанка, используя параметры: &tplFirst - чанк для первой строки результатов &tplLast - чанк для последней строки результатов &tplOdd - чанк для каждой второй строки &tpl_N - чанк для n строки, например для 4й строки будет &tpl_4= &tpl\_nN - чанк для каждой n строки, например для каждой третьей будет &tpl\_n3=

Эта возможность не включится автоматически - для нее сниппеты нужно апгредить. Конечно, новый pdoResources это уже умеет.

В лог менеджеру теперь выводится потребление памяти. Не знаю, пригодится это кому то, или нет - но мне нравится. Для просмотра лога нужно быть авторизованным в админке у вызвать сниппет с параметром

&showLog=`1`

Заключение

С версии 1.4.0, pdoTools стал не только библиотекой для написания быстрых сниппетов, но и гораздо более быстрой заменой getResources.

Текущая версия - бета. Возможны ошибки и недоработки, но уверен, вместе мы их поправим. В дальнейшем я планирую добавить сниппеты pdoMenu и pdoSitemap, которые, надеюсь, будут повторять функционал Wayfinder и GoogleSiteMap, только более быстро.

По GoogleSiteMap, кстати, уже есть наработки.

И всё таки, чего же нет в pdoResources?

Список вещей, которые есть в getResources, но пока не реализованы в pdoResources: - @FILE и @INLINE чанки - не уверен, что кто-то этим пользуется

  • &toSeparatePlaceholders - тоже самое. (Появилось в 1.4.1)

  • &tvFilters - не реализовано, но работает при указании ТВ в &where, например

    [[!pdoResources? &includeTVs=`test` &where=`{"test:!=":""}`]]
    
  • &sortbyTV, &sortdirTV и &sortbyTVType - не реализовано, но работает при указании сортировки в обычном &sortby, например:

    [[!pdoResources? &includeTVs=`test` &sortby=`{"test":"desc"}`]]
    
  • &prepareTVs, &prepareTVList, &processTVs, &processTVList - этого нет, и скорее всего, не будет.

  • &debug - есть гораздо более мощный и удобный &showLog=1

  • &sortbyAlias, &sortbyEscaped - не знаю, зачем они.

  • &tplCondition, &conditionalTpls и $tplOperator - чанки с условием, в документации не описаны, но скорее всего - сделаю. (Появилось в 1.4.1)

Всё остальное в наличии.

← Предыдущая заметка
[Office] Личный кабинет miniShop2
Следующая заметка →
[jsLock] Скрипт блокировки сайта
Комментарии (103)
SadykhSadykh Sadykhov
07.07.2013 14:15

Часто при работе использую tpl_N, tpl_nN — не всё вместе, но всё таки. То есть шаблон для конкретного ресурса, или каждого n-ого ресурса. Добавите? Фильтры работают в чанках?

Если с getPage работает, то результаты очень хорошие! Вы молодец, Василий!

UPD: в магазине не указаны параметры tpl_N и tpl_Nth, в посте есть.

bezumkinВасилий Наумкин
07.07.2013 14:24

А как их указать? Ведь таких параметров нет, а могут быть &tpl_4, &tpl_4th и т.п.

Фильтры и getPage, как и у всех остальные pdoTools сниппетов - работают.

SadykhSadykh Sadykhov
07.07.2013 14:29

Также, как и в посте. По моему мнению, этого вполне достаточно.

&tpl_N — чанк для n строки, например для 4й строки будет &tpl_4= &tpl\_Nth — чанк для каждой n строки, например для каждой третьей будет &tpl\_3th=

Спасибо, что радуете расширениями.

bezumkinВасилий Наумкин
07.07.2013 14:32

Там параметры выводятся прямо из сниппета. Если они в нем не прописаны - их нет и на странице.

Это позволяет не следить за их актуальностью, все обновляется само, вместе с пакетом. Подумаю, как это улучшить, в будущем.

SadykhSadykh Sadykhov
07.07.2013 14:33

А если указать их в сниппете в закомментированном виде?

bezumkinВасилий Наумкин
07.07.2013 14:34

Садых, не выноси мозг.

Если можно было бы так сделать - сделал бы. У getResources они тоже не указаны.

0b6b055d564348cd53129157cВасилий Краковецкий
07.07.2013 14:51

Мне для переезда помню не хватало tvFilters, обошелся вот таким -

if (!empty($tvFilters)) { 
    $tvFilters = explode(',', $tvFilters);
    foreach ($tvFilters as $value) {
        $filter = explode('==', $value);
        $where['TV'.$filter[0].'.value'] = $filter[1];
    }
}

а если прикрутить оригинальные операторы:


    $operators = array(
        '<=>' => '<=>',
        '===' => '=',
        '!==' => '!=',
        '<>' => '<>',
        '==' => 'LIKE',
        '!=' => 'NOT LIKE',
        '<<' => '<',
        '<=' => '<=',
        '=<' => '=<',
        '>>' => '>',
        '>=' => '>=',
        '=>' => '=>'
    );

то будет полноценная замена

bezumkinВасилий Наумкин
07.07.2013 15:01

Зачем, если это можно писать прямо в &where=``?

&includeTVs=`test,test2`
&where=`{
    "test:!=":"0"
    ,"test2":"1"
}`

Просто попробуй, и напиши, что именно не работает. Учитывая, что запрос один, я не вижу смысла делать отдельный параметр для фильтрации по ТВ. Разве что, для более плавного перехода с getResources.

В общем, пока под вопросом.

0b6b055d564348cd53129157cВасилий Краковецкий
07.07.2013 15:05

Да, для более плавного перехода и было сделано, да и проще(привычнее) это чем каждый раз писать все это в where. К тому же не надо лезть в сниппет, достаточно подредактировать вызов.

bezumkinВасилий Наумкин
07.07.2013 15:09

Не нужно лезть в сниппет, &where=`` задается снаружи.

Чуть более сложный пример:

[[!pdoResources?
    &includeTVs=`test,test2`
    &where=`{
        "test:!=":"0"
        ,"OR:test2:=":"1"
    }`
]]

И можно даже так, напрямую:

[[!pdoResources?
    &includeTVs=`test,test2`
    &where=`[
        "TVtest.value NOT LIKE 0 OR TVtest2.value = 1"
    ]`
]]

На мой взгляд, это интереснее, чем &tvFilters.

0b6b055d564348cd53129157cВасилий Краковецкий
07.07.2013 15:15

Аааа, да, согласен, к тому же можно применять CAST, что иногда необходимо, так что единственное преимущество моего вариант именно легкость переезда. К тому же стоит упомянуть что конструкцию 'TV'.$filter[0].'.value' придумал сам, поскольку нигде нет никакой документации о том как делать фильтрацию по тв параметрам через pdoTools.

bezumkinВасилий Наумкин
07.07.2013 15:25

Ну, ты же видишь, что в нашем случае ТВ - это просто поле выборки из приджойненной таблицы. Если это знать - никаких особенных инструкций не нужно, просто фильтруй по этому полю.

В getResources ТВ обрабатываются отдельно, там такой параметр необходим.

ВолодянВолодя
07.07.2013 15:55

Василий проверь сортировку при Asc ... чет чудит помоему/ p.s. пардон это я накосячил)

Руслан-КундиусРуслан Кундиус
07.07.2013 17:35

а в "sortby" автозамены ТВ нету? В mSearch2 работает если просто указать ТВ, а в pdoResources только если "TVtest.value" (ну по крайней мере у меня)

bezumkinВасилий Наумкин
07.07.2013 17:45

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

По нему и сортируем, вот рабочий пример:

[[!pdoResources?
    &parents=`-1`
    &includeTVs=`test,test2`
    &sortby=`test`
    &showLog=`1`
]]
Руслан-КундиусРуслан Кундиус
07.07.2013 18:05

пишу так:


[[!pdoResources? 
&parents=`4` 
&includeTVs=`date` 
&sortby=`date` 
&showLog=`1` ]]

ресурсы не выводятся и в error.log получаю вот что:

(ERROR @ /index.php) [pdoTools] Error 42S22: Unknown column 'date' in 'order clause'

Но если напишу "TVdate.value" то всё ок..

bezumkinВасилий Наумкин
08.07.2013 00:06

Не знаю, почему у меня работает, видимо уже что-то накрутил на сервере. Ну или версии ПО разные.

В любом случае - обновляй пакет, теперь автозамена включена и в сортировке.

shadowВладимир
08.07.2013 08:15

У меня &sortby=TVимятвшкиt.value работает при фильтрации, а &sortby=имятвшки - нет ("пустой лист"), но при этом меня такой вариант очень даже устраивает))

bezumkinВасилий Наумкин
08.07.2013 08:22

В версии 1.4.0 beta1 уже должно работать.

Всегда можно вывести лог (&showLog=1) и там будет видно, какой реальный запрос отправляется в БД. Если в нем ошибка - то она будет в логе сайта.

Ну и можно скопипастить и проверить запрос самостоятельно, в phpmyadmin.

shadowВладимир
08.07.2013 06:01

Братья и сестры! Я сейчас сойду с ума! Заменил getProducts на pdoResources и скорость возрастала с 4 секунд первой загрузки до 1.5 и из кэша render time: 0,6472 s При этом ни одна TVшка не пострадала. Василий! Ты сотворил чудо! Офигеть)))

bezumkinВасилий Наумкин
08.07.2013 06:05

Очень рад!

shadowВладимир
08.07.2013 06:20

Не, ну в 3 раза!!! Вот где Revolution!

it-developeВиталий Воропаев
08.07.2013 06:25

Скорее, вот где прямые руки!

shadowВладимир
08.07.2013 08:18

... вот в эти прямые руки Василия отправлю ка я >, как ниже сказано "в похрустывающем эквиваленте")))

Мордынский Николай
08.07.2013 06:08

tplLast , tplFirst надо ... нужная штука при оформлении каталогов ..ибо черезщ css3 невсе браузеры понимают last irstChild модификаторы, да и четный не четный элемент Tpl тоже бывает нужен.

bezumkinВасилий Наумкин
08.07.2013 06:15

Заметку прочитай, параметры сниппета посмотри.

Мордынский Николай
08.07.2013 06:25

а бля )) пардоньте много букав не осилил действительно все есть)

98b503e504239ead5cc360331СикретНаме
08.07.2013 06:46

Вот это славные вести, Василий, вери биг сенкс!

П.С. Сегодня-завтра зашлю спасибо и в похрустывающем эквиваленте.

П.П.С. И всем советую так сделать/делать, хоть по паре-тройке сотенок в месяц - кто что может. Не жмотьтесь, подерживайте, нам же самим выгодно-полезно, чтобы Василий не сайтики делал, а MODX Revo развивал.

Если что: всё в П.П.С. ИМХО, никого не хотел обидеть.

Алексей Карташов
08.07.2013 12:58

Напишу-ка я сюда.. Василий, в списке параметров к pdoTools в магазине есть такой момент, цитирую:

&tplWrapper по умолчанию: описание: Чанк-обёртка, для заворачивания всех результатов. Понимает один плейсхолдер: .

Т.е. неизвестно какой плейсхолдер-то) Система его вырезала.

bezumkinВасилий Наумкин
08.07.2013 14:38

[[+output]]

Алексей Карташов
08.07.2013 14:56

Спасибо!

Daniel Gibson
08.07.2013 22:41

Many thanks for developing this. In initial tests pdoResources has improved page load times considerably. Will be trying a wider implementation tomorrow.

bezumkinВасилий Наумкин
09.07.2013 01:11

You are welcome!

Daniel Gibson
10.07.2013 22:08

Are conditional templates currently supported?

getResources functions &tplCondition and &conditionalTpls ?

bezumkinВасилий Наумкин
11.07.2013 01:31

At this moment - no. You is the first, who asked about it.

Александр Москвин
13.07.2013 01:29

Отличный скрипт, увеличил производительность в 1.5 раза по сравнению с getProducts Еще бы сделать pdoWayfinder и тогда цены бы не было, готовые решение из одной коробки) А так большое спасибо за активное развитие modx revo )

bezumkinВасилий Наумкин
13.07.2013 02:32

На здоровье!

me6iatonАнтон Мамрашев
13.07.2013 11:18

Спасибо большое ) не знаю как другим но мне не хватает параметра - показать родителя в результате выборки, как &displayStart в Wayfinder...

bezumkinВасилий Наумкин
13.07.2013 12:27

А у getResources такое есть?

me6iatonАнтон Мамрашев
14.07.2013 11:46

нет, в Wayfinder только..

bezumkinВасилий Наумкин
14.07.2013 14:57

Ну вот и ответ.

Алексей
13.07.2013 19:48

Нетривиальный вопрос:

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

Как действует вездесущий гуру в таких ситуациях?

bezumkinВасилий Наумкин
13.07.2013 19:49

Смотри в лог на предмет ошибок.

У меня ни с джойнами, ни с пагинацией проблем нет - вот реальный пример.

к каждому элементу из первой соответствует несколько элементов из второй таблицы

Полагаю, группировка нужна. Это параметр &groupby=``

Алексей
15.07.2013 08:53

группировка "съедает" все результаты, с одинаковым группируемым столбцом (http://www.sql-ex.ru/help/select4.php#group\_by) это не то... а так да, пагинация начинает работать

bezumkinВасилий Наумкин
15.07.2013 09:25

Ну так группировать можно по разным столбцам, не так ли?

Если тебе нужны все строки из второй таблицы - нужно группировать по ней.

Алексей
15.07.2013 09:55

у меня ТРИ коробки. лежат в 1й таблице во 2й таблице сведения о том что в ПЕРВОЙ коробке находится: 1.1 пустота, 1.2 вакуум во ВТОРОЙ 2.1 шайба, 2.2 шпилька, в ТРЕТЕЙ лежит 3.1 зажигалка и 3.2 сигареты. если я джойню эти таблицы - у меня в результате 6 строк. если я группирую по айди то выводятся только результаты 1.1, 2,1, 3,1 (в результате 3 строки) а мне нужно вывести в таком формате 3 строки: строка1: коробка ПЕРВАЯ, содержимое коробки 1.1, 1,2 строка2: коробка ВТОРАЯ, содержимое коробки 2.1, 2,2 строка3: коробка ТРЕТЬЯ, содержимое коробки 3.1, 3,2 т.е. чтобы каждая строка содержала подробные сведения о коробке.

bezumkinВасилий Наумкин
15.07.2013 11:53

В таком формате нужны дополнительные запросы или самостоятельный разбор данных.

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

Алексей
20.07.2013 06:49

не получилось запустить 2 pdoTools - один внутри другого, а сверху getPage. Похоже не хватает гибкой настройки как у RowBoat:

placeholderPrefix	 The prefix to use when setting global placeholders, such as total.

(http://rtfm.modx.com/display/ADDON/Rowboat.Rowboat)

bezumkinВасилий Наумкин
20.07.2013 07:52

Так и появляются рассказы "о тормознутости" Revolution, от таких вот извращений.

Алексей
20.07.2013 09:44

если честно, хотелось бы сделать просто рабочий скрипт, а потом либо его оптимизировать, либо доплатить до лучшего тарифа на вдс"ке. через один сниппет не получается, а через сниппет => чанк => сниппет работает, но через раз, причем при четком указании параметров

$default = array(
    'class' => $class
    ,'where' => json_encode($where)
    ,'leftJoin' => '['.implode(',',$leftJoin).']'
    ,'select' => '{'.implode(',',$select).'}'
    ,'limit' => 0
    ,'offset' => 0
    ,'totalVar' => ''
    ,'return' => 'chunks'
    ,'tpl' => 'Row'
);

и


$pdoFetch->config = array_merge($pdoFetch->config, $default);

у вложенного

bezumkinВасилий Наумкин
20.07.2013 11:32

Сделай 1 сниппет, а внутри него:

$x = $modx->runSnippet('pdoResources', $scriptProperies);

$scriptProperties['x'] = $x;
$y = $modx->runSnippet('msProducts', $scriptProperies);

return $y;

Это схематично, но принцип должен быть понятен.

Алексей
21.07.2013 19:58

немного не понял -) но вся эта писанина всетаки натолкнула на правильную и тривиальную мысль как запустить два pdotools без джойна. единственно что бы хотелось - замена стандартному

$result.= $modx->getChunk('Row',$array);

в режим "fastmode"

bezumkinВасилий Наумкин
22.07.2013 04:07

$pdoFetch = $modx->getService('pdofetch','pdoFetch', MODX_CORE_PATH.'components/pdotools/model/pdotools/', array());
$fastMode = true;

// ... Тут твой код выборки

$result .= $pdoFetch->getChunk('Row', $array, $fastMode);

Даже без fastMode это работает быстрее, чем обычный modX::getChunk();

ВолодянВолодя
15.07.2013 19:27

Василий привет. Подскажи а pdoResources можно вывести изображения товара minishop, по аналогии как ты писал для imageGallery? спасибо!

bezumkinВасилий Наумкин
16.07.2013 00:51

Нет, нужно использовать сниппет msProducts, работающий на том же pdoTools.

Станислав
16.07.2013 10:09

Здравствуйте. Есть вот такая проблема, не знаю уже, как решать: Есть объект имеющий свойства (в лк указывает, пишется в introtext через ||), до 200 свойств. Есть пользовательский фильтр - список чекбоксов (свойств объекта, до 200, соответственно). Гетресом, через сниппет пихнутый в where передаём выбранный массив и хотим получить список объектов имеющих отмеченные свойства, но кроме первых двух свойств не видит он, т.к. в json получаем вот это: [{"AND:introtext:LIKE":"%1%", "OR:introtext:LIKE":"%2)%", "OR:introtext:LIKE":"%3%", "OR:introtext:LIKE":"%4%", "OR:introtext:LIKE":"%5%",}] Уже понятно, что он видит только два, т.к. для него в массиве выше, по факту, только 2 пары ключ-значения, первая строка AND и OR. Пихнуть что-то типа "OR: "1":introtext:LIKE":"%2)%" не получится вроде как, PDO не кушает такое. Может можно как-то решить задачу при помощи pdoResources? Или я что-то не так делаю? Сориентируйте, пожалуйста.

bezumkinВасилий Наумкин
16.07.2013 13:03

Само по себе так хранить 200 параметров - это, конечно, не очень удобно.

У тебя выходит массив с одинаковыми ключами. Хорошо, что в параметр можно передать массив с готовой строкой:


&where=`["
    introtext LIKE '%1%' OR introtext LIKE '%2)%'
"]`

Для контроля правильности запроса нужно использовать &showLog=1

Станислав
16.07.2013 15:31

Спасибо, Василий, помог Ваш pdoResources (гетрес такой материал не кушает, в этом корень проблемы был)!

bezumkinВасилий Наумкин
16.07.2013 15:34

Ура!

JustillusionВладимир Flame
17.07.2013 10:58

Здравствуйте! Подскажите пожалуйста, как с помощью pdoResources выводить media tv с правильными путями? ситуация такая: по умолчанию используется источник файлов с basePath /files/. при использовании pdoResources и подключении tv, путь до изображения/файла указывается относительно папки /files/, т.е. например: images/img1.jpg, а не /files/images/img1.jpg. как можно выводить правильный путь, кроме как писать сниппет для исправления пути?

bezumkinВасилий Наумкин
17.07.2013 11:48

pdoTools работает с базой напрямую, без всяких преобразований - отсюда и скорость.

Нужно путь в чанке:

<img src="/files/[[+image]]" />
JustillusionВладимир Flame
17.07.2013 16:39

с этим понял. решил так: сделал сниппет, который возвращает путь с фиксом, что бы например для изображения можно было применить phpthumbof например.

LevissВиктор Долгий
26.07.2013 09:02

Этот метод выдает имя чанка, используя параметры: ... &tpl_Nth — чанк для каждой n строки, например для каждой третьей будет &tpl_3th=``

Так не работает, работает как у getResources: &tpl_nN — чанк для каждой n строки, например для каждой третьей будет &tpl_n3=``

bezumkinВасилий Наумкин
27.07.2013 03:09

Спасибо, поправил.

Wassi Wassinen
03.09.2013 13:29

Василий, столкнулся с тем, что при переходе с getResources на pdoResources пропали выводы даты. У pdoResources другие плейсхолдеры?

bezumkinВасилий Наумкин
03.09.2013 14:12

Они не пропали, ты скорее всего юзаешь [[+publishedon:strtotime:date=``]]

Так как pdoResources работает с чистыми данными в БД, то он и так получает timestamp, поэтому нужно [[+publishedon:date=``]].

Wassi Wassinen
03.09.2013 14:16

Они не пропали, ты скорее всего юзаешь [[+publishedon:strtotime:date=``]]

Есть такое.

Так как pdoResources работает с чистыми данными в БД, то он и так получает timestamp, поэтому нужно [[+publishedon:date=``]].

Спасибо!

De-RibaskinDe Ribaskin
08.10.2013 20:11

По образу параметра tpl_nN очень не хватает параметра tplWrapper_nN - обертывать каждые N ресурсов. Подобные обертки часто используются в различных слайдерах.

Руслан-КундиусРуслан Кундиус
14.10.2013 12:53

Сортировка больших чисел (в моем случае миллионов), ведет себя как-то странно... Заменил DECIMAL(10,3) на DECIMAL(12,3)- стало нормально

Руслан-КундиусРуслан Кундиус
14.10.2013 13:08

Поди не туда написал, это актуально с версии 1.5

bezumkinВасилий Наумкин
14.10.2013 13:50

Если хочешь это изменение в новых версиях - пиши.

Руслан-КундиусРуслан Кундиус
14.10.2013 14:00

ага, отписался

Саня Кровный
20.10.2013 11:52

1

OnFoxПеретягин Илья
03.02.2014 16:52

Василий добрый вечер! Не смог найти выход из одного момента... Можно заставить pdoResources вывести только не опубликованные ресурсы? А точнее решить бы этот момент с msProducts.

bezumkinВасилий Наумкин
03.02.2014 17:13

Легко!

&where=`{"published":0}`
OnFoxПеретягин Илья
03.02.2014 17:19

Шикарно, спасибо большое! Немного поясню, зачем это надо, может быть кому то пригодиться. Любому сеошнику должна быть известна аксиома, чем больше страниц на сайте, тем лучше (почему и как, это другая тема). Так вот, некоторые товары устаревают, снимаются с производства и т.д., их надо убрать, но при этом сама страница выходит из индекса. Простой и удобный способ убрать страницу при этом оставив ее поисковикам, это сделать раздел под названием например, "архив", где и будут собираться все товары, срок реализации которых закончен (два зайца одним ударом).

Валерий Савинов
11.04.2014 12:23

Василий здравствуйте!

Не могу разобраться как работает pdoResource с тв параметрами множественного выбора с условием вывода html tag в теле основной страницы тв параметры выводятся верно значение1 значение2 значение3 А вот в родительском ресурсе выводятся так значение1||значение2||значение3 то есть в обход выбранного варианта вывода. вывод в родителе:

<ul>[[+tv.tv1]]</ul>

вывод в дочке:

<ul>[[*tv1]]</ul>

Что я делаю не так?

bezumkinВасилий Наумкин
11.04.2014 14:27

Не читаешь документацию?

&processTVs=`1`
Валерий Савинов
11.04.2014 19:56

Как так то? Выше аж целых 2 раза упомянается про отсутствие этого параметра в принципе:

Нет &processTVs=``

&prepareTVs, &prepareTVList, &processTVs, &processTVList — этого нет, и скорее всего, не будет.

но спасибо, что на самом деле он есть)

bezumkinВасилий Наумкин
12.04.2014 02:44

Ничего, что заметка про версию 1.4, а в репозитории 1.9?

Смотри документацию, а не старые заметки.

Валерий Савинов
14.04.2014 12:18

Здравствуйте Василий. Подскажите пожалуйста как сделать выборку по tv с типом date Пробовал:

 &tvFilters=`date>=[[!today]]`

сам сниппет

[[!today]]
return date('Y-m-d H:i:s');

но не выводит ничего. пробовал и через &where, но так как мучаюсь с этим уже 3 или 4 день как именно не вспомню.

bezumkinВасилий Наумкин
14.04.2014 13:50

[[!pdoResources?
    &parents=`0`
    &includeTVs=`date`
    &where=`{"date:>":"[[!today]]"}`
    &showLog=`1`
]]
Валерий Савинов
14.04.2014 14:31

Спасибо огромное! Действительно, кешированный вызов я и не пробовал. единственное что, не выводит сегодняшнюю дату, но с этим решу.

И ещё один надеюсь последний вопрос, работает ли pdoResource с плагином tagLister? tagLister использует вывод getResource а вызов на одной странице pdoResource и getResource практически останавливает очень тормозит загрузку страницы.

bezumkinВасилий Наумкин
14.04.2014 17:53

Без понятия.

Но pdoResources может заменить getResources в 99% случаев - так что, проверяй.

Валерий Савинов
18.04.2014 13:44

Здравсвуйте! с tagLister обломились так как этот плагин сам по себе не подходит под требования. Но речь не об этом.

(немного введу в курс дела) Суть такова: Есть афиша, есть дата начала мероприятия(всегда заполнено), и дата его завершения(заполняется если это не однодневное мероприятие). Мероприятия бывают разные Фильмы, Выставки, Вечеринки, Концерты

pdoResource вызывается на странице 4 раза каждый в своем блоке соответствующий where для всех один

&where=`{"AfishaRunDate:>":"[[!today]]","AfishaRunDate:<":"[[!tomorrow]]","OR:AfishaEndDate:<":"[[!tomorrow]]","AND:AfishaRunDate:>":"[[!today]]"}`

!today:

$date = date('Y-m-d H:i:s');
$d = new DateTime($date);
echo $d->format('Y-m-d 00:00:00');

!tomorrow:

$date = date('Y-m-d H:i:s');
$d = new DateTime($date);
$d->modify("+1 day");
echo $d->format('Y-m-d 00:00:00');

в общем выборка работает отлично, выводит только те мероприятия которые проходят "сегодня" с 0:00:00 сегодня до 0:00:00 завтра.

Проблема в следующем: после выборки, ресурсы начинают выводится не в своем блоке а везде, или не выводиться. Если where поставить только в 1 из 4ех блоков, или же выводить без выборки вовсе, то в все нормально, а если во всех то беда. &parents у каждого блока естественно свой.

проблема в множественном вызове? или я опять что то делаю не так? Извините за столь частые вопросы. Просто мне как верстальщику ну очень сложно разобраться =(

bezumkinВасилий Наумкин
18.04.2014 13:56

1. В сниппетах MODX не нужно использовать echo:

return $d->format('Y-m-d 00:00:00');

2. Условие лучше задать через BETWEEN:

[[!pdoResources?
    &parents=`0`
    &includeTVs=`date`
    &where=`["date BETWEEN '[[!today]]' AND '[[!tomorrow]]'"]`
    &showLog=`1`
]]

Возможно, после этого заработает как надо.

Валерий Савинов
18.04.2014 19:23
&where=`["(Date1 BETWEEN '[[!today]]' AND '[[!tomorrow]]') OR (Date2 > '[[!today]]')"]

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

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

Все - разобрался корректно работает вот так

&where=`["(Date1 BETWEEN '[[!today]]' AND '[[!tomorrow]]' OR Date2 > '[[!today]]')"]

Спасибо за помощь =)

le-genda@yandex.rule-genda
18.07.2014 13:25

А мне вот очень очень нужно чтобы была возможность работы с @FILE и @INLINE чанками.

bezumkinВасилий Наумкин
18.07.2014 13:26

Заметка написана год назад. Уже давно всё есть - http://docs.modx.pro/components/pdotools/general-settings.

le-genda@yandex.rule-genda
18.07.2014 13:26

а почему же не работает?

bezumkinВасилий Наумкин
18.07.2014 13:28

Вот бы узнать.

le-genda@yandex.rule-genda
18.07.2014 13:34

я прошу прощения, не то чтобы я хотела обидеть вас ). это замечательно, что вы сделали pdoTools. и да, я не программист, ни каким боком, потому использую готовое решение.

Подскажите мне вот что, я вызываю сниппет следующим образом


[[!pdoResources?
    &parents=`5, 6`
    &depth=`0`
    &tplPath=`MODX_ASSETS_PATH . 'elements/chunks/'`
    &tpl=`@FILE ProductCard.tpl`
    &hideContainers=`1`
]]

и у меня ничего не происходит на странице а если поставить

&hideContainers=`0`

, то просто вываливается массив со всеми данными. Что я не так делаю?

le-genda@yandex.rule-genda
18.07.2014 13:58

Василий, можете подсказать что я не так делаю?

le-genda@yandex.rule-genda
18.07.2014 14:37

Разобралась в чем дело. 1. Сниппет не хочет работать с чанками типа @FILE 2. Я почему-то ждала, что в первом уровне будут выводится все внтуренние ресурсы со всех уровней, но этого не происходит.

Так почему @FILE не работает? у меня самый свежий пакет pdoRecources и revo 2.3

И еще вопрос, как сделать так чтобы в самом каталоге выводились все ресурсы со всех уровней подкаталогов?

le-genda@yandex.rule-genda
18.07.2014 14:51

Заработало!

нужно было правильно указать путь к чанкам

&tplPath=assets_path+'elements/chunks/'

и поставить глубину больше нуля

&depth=`10`

без косых кавычек

когда-то давным давно, когда я работала с evo, 0 обозначал бесконечную глубину, почему здесь не так?

bezumkinВасилий Наумкин
18.07.2014 16:05

Заработало!

Я же не зря ссылку дал на документацию.

почему здесь не так?

Потому что это не Evo. Глубина 0 означает выбрать только прямых потомков ресурса в системном методе modX::getChildIds().

le-genda@yandex.rule-genda
18.07.2014 16:22

Спасибо за разъяснения про modX::getChildIds(). Этого я не знала. И я все-таки рано радовалась. У меня так и не заработал шаблон из чанка @FILE. Я указала путь, но забыла указать сам файл, так что чанк брался из базы. Что же все-таки не так в моем вызове шаблона-чанка из файла?

И да, документацию я изучила вдоль и поперек еще до того как сюда написала, но все равно спасибо.

bezumkinВасилий Наумкин
18.07.2014 17:08

Ну конечно, вдоль и поперек.

Вызов сниппета:

[[!pdoMenu?
    &parents=`0`
    &tpl=`@FILE test.tpl`
    &level=`1`
    &showLog=`1`
    &tplPath=`/`
]]

Файл в корне сайта /test.tpl

<h4><a href="[[+link]]">[[+pagetitle]]</a></h4>

Вызываем - и, как ни странно, работает!

le-genda@yandex.rule-genda
18.07.2014 17:15

странно, теперь работает. извините за оторбранное у вас время, чувствую себя дебилом ), спасибо.

bezumkinВасилий Наумкин
18.07.2014 17:24

Магия.

le-genda@yandex.rule-genda
18.07.2014 17:30

зато я могу подсказать все, что угодно по верстке и дизайну :), обращайтесь ).

Екатерина Чеканская
05.09.2014 21:38

Василий здравствуйте! pdoResources выдает ошибку на выборке из 3-х ресурсов: Could not process query, error #1104: The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET MAX_JOIN_SIZE=# if the SELECT is okay

С чем это может быть связано?

Екатерина Чеканская
06.09.2014 18:02

Ошибка возникает при подключении более 9 TV-параметров.

bezumkin
Василий Наумкин
30.06.2022 03:58
Есть ли возможность формировать &quot;friendly URL aliases&quot;, используя аналог translit MODx? ...
bezumkin
Василий Наумкин
27.06.2022 03:32
Спасибо за исправления, очень выручаешь =) Но учитывая количество не описаных в заметке дополнительн...
bezumkin
Василий Наумкин
27.06.2022 03:10
что будет использоваться для вывода многоуровневого меню Посмотри как работают комментарии на этом ...
bezumkin
Василий Наумкин
25.06.2022 11:56
Поправил, спасибо!
bezumkin
Василий Наумкин
22.06.2022 10:08
Я обычно не пользуюсь RTE редакторами, потому что они пишут всякое непонятное что в HTML. Но можно в...
bezumkin
Василий Наумкин
21.06.2022 01:58
onLoad(data) { this.total = data.total }, и onLoad({total}) { this.total = total }, В нашем случ...
bezumkin
Василий Наумкин
20.06.2022 14:01
Прекрасно тебя понимаю, я когда сам в этом разбирался - голова дымилась. Но зато теперь прямо-таки п...
bezumkin
Василий Наумкин
20.06.2022 09:30
Не надо, оно по умолчанию так - я просто чуть более подробно написал.
bezumkin
Василий Наумкин
19.06.2022 13:42
А можно же из 1 файла сделать 2 экспорта. По-умолчанию, и отдельно для футера: export const Footer =...
bezumkin
Василий Наумкин
19.06.2022 09:44
Тебе спасибо, что поддерживаешь рублём мои начинания!