[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]].
[[+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)
Всё остальное в наличии.

Следующая заметка
[jsLock] Скрипт блокировки сайта
Предыдущая заметка
[Office] Личный кабинет miniShop2


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

  1. Sadykh Sadykhov 07 июля 2013, 18:15 # 0
    Часто при работе использую tpl_N, tpl_nN — не всё вместе, но всё таки. То есть шаблон для конкретного ресурса, или каждого n-ого ресурса. Добавите? Фильтры работают в чанках?

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

    UPD: в магазине не указаны параметры tpl_N и tpl_Nth, в посте есть.
    1. Василий Наумкин 07 июля 2013, 18:24 # 0
      А как их указать? Ведь таких параметров нет, а могут быть &tpl_4, &tpl_4th и т.п.

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

      1. Sadykh Sadykhov 07 июля 2013, 18:29 # 0
        Также, как и в посте. По моему мнению, этого вполне достаточно.

        &tpl_N — чанк для n строки, например для 4й строки будет &tpl_4=``
        &tpl_Nth — чанк для каждой n строки, например для каждой третьей будет &tpl_3th=``
        Спасибо, что радуете расширениями.
        1. Василий Наумкин 07 июля 2013, 18:32 # 0
          Там параметры выводятся прямо из сниппета. Если они в нем не прописаны — их нет и на странице.

          Это позволяет не следить за их актуальностью, все обновляется само, вместе с пакетом. Подумаю, как это улучшить, в будущем.
          1. Sadykh Sadykhov 07 июля 2013, 18:33 # 0
            А если указать их в сниппете в закомментированном виде?
            1. Василий Наумкин 07 июля 2013, 18:34 # 0
              Садых, не выноси мозг.

              Если можно было бы так сделать — сделал бы. У getResources они тоже не указаны.
    2. Василий Краковецкий 07 июля 2013, 18:51 # 0
      Мне для переезда помню не хватало 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',
              '<<' => '<',
              '<=' => '<=',
              '=<' => '=<',
              '>>' => '>',
              '>=' => '>=',
              '=>' => '=>'
          );
      
      то будет полноценная замена
      1. Василий Наумкин 07 июля 2013, 19:01 # 0
        Зачем, если это можно писать прямо в &where=``?
        &includeTVs=`test,test2`
        &where=`{
        	"test:!=":"0"
        	,"test2":"1"
        }`
        Просто попробуй, и напиши, что именно не работает. Учитывая, что запрос один, я не вижу смысла делать отдельный параметр для фильтрации по ТВ. Разве что, для более плавного перехода с getResources.

        В общем, пока под вопросом.
        1. Василий Краковецкий 07 июля 2013, 19:05 # 0
          Да, для более плавного перехода и было сделано, да и проще(привычнее) это чем каждый раз писать все это в where. К тому же не надо лезть в сниппет, достаточно подредактировать вызов.
          1. Василий Наумкин 07 июля 2013, 19:09 # 0
            Не нужно лезть в сниппет, &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.
            1. Василий Краковецкий 07 июля 2013, 19:15 # 0
              Аааа, да, согласен, к тому же можно применять CAST, что иногда необходимо, так что единственное преимущество моего вариант именно легкость переезда. К тому же стоит упомянуть что конструкцию 'TV'.$filter[0].'.value' придумал сам, поскольку нигде нет никакой документации о том как делать фильтрацию по тв параметрам через pdoTools.
              1. Василий Наумкин 07 июля 2013, 19:25 # 0
                Ну, ты же видишь, что в нашем случае ТВ — это просто поле выборки из приджойненной таблицы.
                Если это знать — никаких особенных инструкций не нужно, просто фильтруй по этому полю.

                В getResources ТВ обрабатываются отдельно, там такой параметр необходим.
      2. Володя 07 июля 2013, 19:55 # 0
        Василий проверь сортировку при Asc… чет чудит помоему/
        p.s. пардон это я накосячил)
        1. Руслан Кундиус 07 июля 2013, 21:35 # 0
          а в «sortby» автозамены ТВ нету? В mSearch2 работает если просто указать ТВ, а в pdoResources только если «TVtest.value» (ну по крайней мере у меня)
          1. Василий Наумкин 07 июля 2013, 21:45 # 0
            Насколько я понимаю, тут автозамена не нужна, ибо сортировка ведется по извлекаемому полю, у которого уже есть псевдоним.

            По нему и сортируем, вот рабочий пример:
            [[!pdoResources?
            	&parents=`-1`
            	&includeTVs=`test,test2`
            	&sortby=`test`
            	&showLog=`1`
            ]]
            1. Руслан Кундиус 07 июля 2013, 22:05 # 0
              пишу так:
              [[!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» то всё ок…
              1. Василий Наумкин 08 июля 2013, 04:06 # 0
                Не знаю, почему у меня работает, видимо уже что-то накрутил на сервере. Ну или версии ПО разные.

                В любом случае — обновляй пакет, теперь автозамена включена и в сортировке.
                1. Владимир 08 июля 2013, 12:15 # 0
                  У меня &sortby=`TVимятвшкиt.value` работает при фильтрации, а &sortby=`имятвшки` — нет («пустой лист»), но при этом меня такой вариант очень даже устраивает))

                  1. Василий Наумкин 08 июля 2013, 12:22 # 0
                    В версии 1.4.0 beta1 уже должно работать.

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

                    Ну и можно скопипастить и проверить запрос самостоятельно, в phpmyadmin.
          2. Владимир 08 июля 2013, 10:01 # 0
            Братья и сестры! Я сейчас сойду с ума! Заменил getProducts на pdoResources и скорость возрастала с 4 секунд первой загрузки до 1.5 и из кэша render time: 0,6472 s
            При этом ни одна TVшка не пострадала.
            Василий! Ты сотворил чудо!
            Офигеть)))
            1. Василий Наумкин 08 июля 2013, 10:05 # 0
              Очень рад!
              1. Владимир 08 июля 2013, 10:20 # 0
                Не, ну в 3 раза!!! Вот где Revolution!
                1. Виталий Воропаев 08 июля 2013, 10:25 # 0
                  Скорее, вот где прямые руки!
                  1. Владимир 08 июля 2013, 12:18 # 0
                    … вот в эти прямые руки Василия отправлю ка я <<спасибо>>, как ниже сказано «в похрустывающем эквиваленте»)))
            2. Мордынский Николай 08 июля 2013, 10:08 # 0
              tplLast, tplFirst надо… нужная штука при оформлении каталогов… ибо черезщ css3 невсе браузеры понимают last irstChild модификаторы, да и четный не четный элемент Tpl тоже бывает нужен.
              1. Василий Наумкин 08 июля 2013, 10:15 # 0
                Заметку прочитай, параметры сниппета посмотри.
                1. Мордынский Николай 08 июля 2013, 10:25 # 0
                  а бля )) пардоньте много букав не осилил действительно все есть)
              2. СикретНаме 08 июля 2013, 10:46 # 0
                Вот это славные вести, Василий, вери биг сенкс!

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

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

                Если что: всё в П.П.С. ИМХО, никого не хотел обидеть.
                1. Алексей Карташов 08 июля 2013, 16:58 # 0
                  Напишу-ка я сюда…
                  Василий, в списке параметров к pdoTools в магазине есть такой момент, цитирую:
                  &tplWrapper
                  по умолчанию:
                  описание: Чанк-обёртка, для заворачивания всех результатов. Понимает один плейсхолдер:.
                  Т.е. неизвестно какой плейсхолдер-то) Система его вырезала.
                  1. Василий Наумкин 08 июля 2013, 18:38 # 0
                    [[+output]]
                    1. Алексей Карташов 08 июля 2013, 18:56 # 0
                      Спасибо!
                  2. Daniel Gibson 09 июля 2013, 02:41 # 0
                    Many thanks for developing this. In initial tests pdoResources has improved page load times considerably. Will be trying a wider implementation tomorrow.
                    1. Василий Наумкин 09 июля 2013, 05:11 # 0
                      You are welcome!
                      1. Daniel Gibson 11 июля 2013, 02:08 # 0
                        Are conditional templates currently supported?

                        getResources functions &tplCondition and &conditionalTpls?
                        1. Василий Наумкин 11 июля 2013, 05:31 # 0
                          At this moment — no. You is the first, who asked about it.
                    2. Александр Москвин 13 июля 2013, 05:29 # 0
                      Отличный скрипт, увеличил производительность в 1.5 раза по сравнению с getProducts
                      Еще бы сделать pdoWayfinder и тогда цены бы не было, готовые решение из одной коробки)
                      А так большое спасибо за активное развитие modx revo )
                      1. Василий Наумкин 13 июля 2013, 06:32 # 0
                        На здоровье!
                      2. Антон Мамрашев 13 июля 2013, 15:18 # 0
                        Спасибо большое ) не знаю как другим но мне не хватает параметра — показать родителя в результате выборки, как &displayStart в Wayfinder…
                        1. Василий Наумкин 13 июля 2013, 16:27 # 0
                          А у getResources такое есть?
                          1. Антон Мамрашев 14 июля 2013, 15:46 # 0
                            нет, в Wayfinder только…
                            1. Василий Наумкин 14 июля 2013, 18:57 # 0
                              Ну вот и ответ.
                        2. Алексей 13 июля 2013, 23:48 # 0
                          Нетривиальный вопрос:

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

                          Как действует вездесущий гуру в таких ситуациях?
                          1. Василий Наумкин 13 июля 2013, 23:49 # 0
                            Смотри в лог на предмет ошибок.

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

                            к каждому элементу из первой соответствует несколько элементов из второй таблицы
                            Полагаю, группировка нужна. Это параметр &groupby=``
                            1. Алексей 15 июля 2013, 12:53 # 0
                              группировка «съедает» все результаты, с одинаковым группируемым столбцом (http://www.sql-ex.ru/help/select4.php#group_by)
                              это не то…
                              а так да, пагинация начинает работать
                              1. Василий Наумкин 15 июля 2013, 13:25 # 0
                                Ну так группировать можно по разным столбцам, не так ли?

                                Если тебе нужны все строки из второй таблицы — нужно группировать по ней.
                                1. Алексей 15 июля 2013, 13:55 # 0
                                  у меня ТРИ коробки. лежат в 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
                                  т.е. чтобы каждая строка содержала подробные сведения о коробке.
                                  1. Василий Наумкин 15 июля 2013, 15:53 # 0
                                    В таком формате нужны дополнительные запросы или самостоятельный разбор данных.

                                    Напиши для этого случая свой сниппет, используя pdoTools, он изначально так и придумался.
                                    1. Алексей 20 июля 2013, 10:49 # 0
                                      не получилось запустить 2 pdoTools — один внутри другого, а сверху getPage. Похоже не хватает гибкой настройки как у RowBoat:
                                      placeholderPrefix	 The prefix to use when setting global placeholders, such as total.
                                      (http://rtfm.modx.com/display/ADDON/Rowboat.Rowboat)
                                      1. Василий Наумкин 20 июля 2013, 11:52 # 0
                                        Так и появляются рассказы «о тормознутости» Revolution, от таких вот извращений.
                                        1. Алексей 20 июля 2013, 13:44 # 0
                                          если честно, хотелось бы сделать просто рабочий скрипт, а потом либо его оптимизировать, либо доплатить до лучшего тарифа на вдс«ке.
                                          через один сниппет не получается, а через сниппет => чанк => сниппет работает, но через раз, причем при четком указании параметров
                                          $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);
                                          
                                          у вложенного
                                          1. Василий Наумкин 20 июля 2013, 15:32 # 0
                                            Сделай 1 сниппет, а внутри него:
                                            $x = $modx->runSnippet('pdoResources', $scriptProperies);
                                            
                                            $scriptProperties['x'] = $x;
                                            $y = $modx->runSnippet('msProducts', $scriptProperies);
                                            
                                            return $y;
                                            Это схематично, но принцип должен быть понятен.
                                            1. Алексей 21 июля 2013, 23:58 # 0
                                              немного не понял -)
                                              но вся эта писанина всетаки натолкнула на правильную и тривиальную мысль как запустить два pdotools без джойна. единственно что бы хотелось — замена стандартному
                                              $result.= $modx->getChunk('Row',$array);
                                              в режим «fastmode»
                                              1. Василий Наумкин 22 июля 2013, 08:07 # 0
                                                $pdoFetch = $modx->getService('pdofetch','pdoFetch', MODX_CORE_PATH.'components/pdotools/model/pdotools/', array());
                                                $fastMode = true;
                                                
                                                // ... Тут твой код выборки
                                                
                                                $result .= $pdoFetch->getChunk('Row', $array, $fastMode);
                                                

                                                Даже без fastMode это работает быстрее, чем обычный modX::getChunk();
                            2. Володя 15 июля 2013, 23:27 # 0
                              Василий привет. Подскажи а pdoResources можно вывести изображения товара minishop, по аналогии как ты писал для imageGallery?
                              спасибо!
                              1. Василий Наумкин 16 июля 2013, 04:51 # 0
                                Нет, нужно использовать сниппет msProducts, работающий на том же pdoTools.
                              2. Станислав 16 июля 2013, 14:09 # 0
                                Здравствуйте. Есть вот такая проблема, не знаю уже, как решать:
                                Есть объект имеющий свойства (в лк указывает, пишется в 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? Или я что-то не так делаю? Сориентируйте, пожалуйста.
                                1. Василий Наумкин 16 июля 2013, 17:03 # 0
                                  Само по себе так хранить 200 параметров — это, конечно, не очень удобно.

                                  У тебя выходит массив с одинаковыми ключами. Хорошо, что в параметр можно передать массив с готовой строкой:
                                  &where=`["
                                  	introtext LIKE '%1%' OR introtext LIKE '%2)%'
                                  "]`
                                  
                                  Для контроля правильности запроса нужно использовать &showLog=`1`
                                  1. Станислав 16 июля 2013, 19:31 # 0
                                    Спасибо, Василий, помог Ваш pdoResources (гетрес такой материал не кушает, в этом корень проблемы был)!
                                    1. Василий Наумкин 16 июля 2013, 19:34 # 0
                                      Ура!
                                2. Владимир Flame 17 июля 2013, 14:58 # 0
                                  Здравствуйте! Подскажите пожалуйста, как с помощью pdoResources выводить media tv с правильными путями?
                                  ситуация такая: по умолчанию используется источник файлов с basePath /files/. при использовании pdoResources и подключении tv, путь до изображения/файла указывается относительно папки /files/, т.е. например: images/img1.jpg, а не /files/images/img1.jpg. как можно выводить правильный путь, кроме как писать сниппет для исправления пути?
                                  1. Василий Наумкин 17 июля 2013, 15:48 # 0
                                    pdoTools работает с базой напрямую, без всяких преобразований — отсюда и скорость.

                                    Нужно путь в чанке:
                                    <img src="/files/[[+image]]" />
                                    1. Владимир Flame 17 июля 2013, 20:39 # 0
                                      с этим понял.
                                      решил так: сделал сниппет, который возвращает путь с фиксом, что бы например для изображения можно было применить phpthumbof например.
                                  2. Виктор Долгий 26 июля 2013, 13:02 # 0
                                    Этот метод выдает имя чанка, используя параметры:

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

                                    Так не работает, работает как у getResources:
                                    &tpl_nN — чанк для каждой n строки, например для каждой третьей будет &tpl_n3=``
                                    1. Василий Наумкин 27 июля 2013, 07:09 # 0
                                      Спасибо, поправил.
                                    2. Wassi Wassinen 03 сентября 2013, 17:29 # 0
                                      Василий, столкнулся с тем, что при переходе с getResources на pdoResources пропали выводы даты. У pdoResources другие плейсхолдеры?
                                      1. Василий Наумкин 03 сентября 2013, 18:12 # 0
                                        Они не пропали, ты скорее всего юзаешь [[+publishedon:strtotime:date=``]]

                                        Так как pdoResources работает с чистыми данными в БД, то он и так получает timestamp, поэтому нужно [[+publishedon:date=``]].
                                        1. Wassi Wassinen 03 сентября 2013, 18:16 # 0
                                          Они не пропали, ты скорее всего юзаешь [[+publishedon:strtotime:date=``]]
                                          Есть такое.

                                          Так как pdoResources работает с чистыми данными в БД, то он и так получает timestamp, поэтому нужно [[+publishedon:date=``]].
                                          Спасибо!
                                      2. De Ribaskin 09 октября 2013, 00:11 # 0
                                        По образу параметра tpl_nN очень не хватает параметра tplWrapper_nN — обертывать каждые N ресурсов.
                                        Подобные обертки часто используются в различных слайдерах.
                                        1. Руслан Кундиус 14 октября 2013, 16:53 # 0
                                          Сортировка больших чисел (в моем случае миллионов), ведет себя как-то странно… Заменил DECIMAL(10,3) на DECIMAL(12,3)- стало нормально
                                          1. Руслан Кундиус 14 октября 2013, 17:08 # 0
                                            Поди не туда написал, это актуально с версии 1.5
                                            1. Василий Наумкин 14 октября 2013, 17:50 # 0
                                              Если хочешь это изменение в новых версиях — пиши.
                                              1. Руслан Кундиус 14 октября 2013, 18:00 # 0
                                                ага, отписался
                                            2. Саня Кровный 20 октября 2013, 15:52 # 0
                                              1
                                              1. Перетягин Илья 03 февраля 2014, 20:52 # 0
                                                Василий добрый вечер!
                                                Не смог найти выход из одного момента… Можно заставить pdoResources вывести только не опубликованные ресурсы? А точнее решить бы этот момент с msProducts.
                                                1. Василий Наумкин 03 февраля 2014, 21:13 # 0
                                                  Легко!
                                                  &where=`{"published":0}`
                                                  1. Перетягин Илья 03 февраля 2014, 21:19 # +1
                                                    Шикарно, спасибо большое!
                                                    Немного поясню, зачем это надо, может быть кому то пригодиться.
                                                    Любому сеошнику должна быть известна аксиома, чем больше страниц на сайте, тем лучше (почему и как, это другая тема). Так вот, некоторые товары устаревают, снимаются с производства и т.д., их надо убрать, но при этом сама страница выходит из индекса. Простой и удобный способ убрать страницу при этом оставив ее поисковикам, это сделать раздел под названием например, «архив», где и будут собираться все товары, срок реализации которых закончен (два зайца одним ударом).
                                                2. Валерий Савинов 11 апреля 2014, 16:23 # 0
                                                  Василий здравствуйте!

                                                  Не могу разобраться как работает pdoResource с тв параметрами множественного выбора с условием вывода html tag
                                                  в теле основной страницы тв параметры выводятся верно
                                                  значение1
                                                  значение2
                                                  значение3
                                                  А вот в родительском ресурсе выводятся так значение1||значение2||значение3 то есть в обход выбранного варианта вывода.
                                                  вывод в родителе:
                                                  <ul>[[+tv.tv1]]</ul>
                                                  вывод в дочке:
                                                  <ul>[[*tv1]]</ul>
                                                  Что я делаю не так?
                                                  1. Василий Наумкин 11 апреля 2014, 18:27 # 0
                                                    Не читаешь документацию?

                                                    &processTVs=`1`
                                                    1. Валерий Савинов 11 апреля 2014, 23:56 # 0
                                                      Как так то?
                                                      Выше аж целых 2 раза упомянается про отсутствие этого параметра в принципе:

                                                      Нет &processTVs=``
                                                      &prepareTVs, &prepareTVList, &processTVs, &processTVList — этого нет, и скорее всего, не будет.
                                                      но спасибо, что на самом деле он есть)
                                                      1. Василий Наумкин 12 апреля 2014, 06:44 # 0
                                                        Ничего, что заметка про версию 1.4, а в репозитории 1.9?

                                                        Смотри документацию, а не старые заметки.
                                                  2. Валерий Савинов 14 апреля 2014, 16:18 # 0
                                                    Здравствуйте Василий.
                                                    Подскажите пожалуйста как сделать выборку по tv с типом date
                                                    Пробовал:
                                                    &tvFilters=`date>=[[!today]]`
                                                    сам сниппет
                                                    [[!today]]
                                                    return date('Y-m-d H:i:s');
                                                    но не выводит ничего.
                                                    пробовал и через &where, но так как мучаюсь с этим уже 3 или 4 день как именно не вспомню.
                                                    1. Василий Наумкин 14 апреля 2014, 17:50 # 0
                                                      [[!pdoResources?
                                                      	&parents=`0`
                                                      	&includeTVs=`date`
                                                      	&where=`{"date:>":"[[!today]]"}`
                                                      	&showLog=`1`
                                                      ]]
                                                      1. Валерий Савинов 14 апреля 2014, 18:31 # 0
                                                        Спасибо огромное!
                                                        Действительно, кешированный вызов я и не пробовал.
                                                        единственное что, не выводит сегодняшнюю дату, но с этим решу.

                                                        И ещё один надеюсь последний вопрос, работает ли pdoResource с плагином tagLister?
                                                        tagLister использует вывод getResource а вызов на одной странице pdoResource и getResource практически останавливает очень тормозит загрузку страницы.
                                                        1. Василий Наумкин 14 апреля 2014, 21:53 # 0
                                                          Без понятия.

                                                          Но pdoResources может заменить getResources в 99% случаев — так что, проверяй.
                                                    2. Валерий Савинов 18 апреля 2014, 17:44 # 0
                                                      Здравсвуйте!
                                                      с 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 у каждого блока естественно свой.

                                                      проблема в множественном вызове? или я опять что то делаю не так?
                                                      Извините за столь частые вопросы. Просто мне как верстальщику ну очень сложно разобраться =(
                                                      1. Василий Наумкин 18 апреля 2014, 17:56 # 0
                                                        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`
                                                        ]]
                                                        Возможно, после этого заработает как надо.
                                                        1. Валерий Савинов 18 апреля 2014, 23:23 # +1
                                                          &where=`["(Date1 BETWEEN '[[!today]]' AND '[[!tomorrow]]') OR (Date2 > '[[!today]]')"]
                                                          если обе даты заполнены выводит по блокам правильно
                                                          если есть только дата начала то пихает во все блоки…

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

                                                          Все — разобрался
                                                          корректно работает вот так
                                                          &where=`["(Date1 BETWEEN '[[!today]]' AND '[[!tomorrow]]' OR Date2 > '[[!today]]')"]
                                                          Спасибо за помощь =)
                                                      2. le-genda 18 июля 2014, 17:25 # 0
                                                        А мне вот очень очень нужно чтобы была возможность работы с @FILE и @INLINE чанками.
                                                        1. Василий Наумкин 18 июля 2014, 17:26 # +1
                                                          Заметка написана год назад. Уже давно всё есть — docs.modx.pro/components/pdotools/general-settings.
                                                          1. le-genda 18 июля 2014, 17:26 # 0
                                                            а почему же не работает?
                                                            1. Василий Наумкин 18 июля 2014, 17:28 # -1
                                                              Вот бы узнать.
                                                              1. le-genda 18 июля 2014, 17:34 # 0
                                                                я прошу прощения, не то чтобы я хотела обидеть вас ). это замечательно, что вы сделали pdoTools. и да, я не программист, ни каким боком, потому использую готовое решение.

                                                                Подскажите мне вот что, я вызываю сниппет следующим образом
                                                                [[!pdoResources?
                                                                	&parents=`5, 6`
                                                                	&depth=`0`
                                                                	&tplPath=`MODX_ASSETS_PATH . 'elements/chunks/'`
                                                                	&tpl=`@FILE ProductCard.tpl`
                                                                	&hideContainers=`1`
                                                                ]]
                                                                
                                                                и у меня ничего не происходит на странице
                                                                а если поставить
                                                                &hideContainers=`0`
                                                                , то просто вываливается массив со всеми данными.
                                                                Что я не так делаю?
                                                                1. le-genda 18 июля 2014, 17:58 # 0
                                                                  Василий, можете подсказать что я не так делаю?
                                                                  1. le-genda 18 июля 2014, 18:37 # 0
                                                                    Разобралась в чем дело.
                                                                    1. Сниппет не хочет работать с чанками типа @FILE
                                                                    2. Я почему-то ждала, что в первом уровне будут выводится все внтуренние ресурсы со всех уровней, но этого не происходит.

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

                                                                    И еще вопрос, как сделать так чтобы в самом каталоге выводились все ресурсы со всех уровней подкаталогов?
                                                                    1. le-genda 18 июля 2014, 18:51 # 0
                                                                      Заработало!

                                                                      нужно было правильно указать путь к чанкам
                                                                      &tplPath=assets_path+'elements/chunks/'
                                                                      и поставить глубину больше нуля
                                                                      &depth=`10`
                                                                      без косых кавычек

                                                                      когда-то давным давно, когда я работала с evo, `0` обозначал бесконечную глубину, почему здесь не так?
                                                                      1. Василий Наумкин 18 июля 2014, 20:05 # +1
                                                                        Заработало!
                                                                        Я же не зря ссылку дал на документацию.

                                                                        почему здесь не так?
                                                                        Потому что это не Evo. Глубина 0 означает выбрать только прямых потомков ресурса в системном методе modX::getChildIds().
                                                                        1. le-genda 18 июля 2014, 20:22 # 0
                                                                          Спасибо за разъяснения про modX::getChildIds(). Этого я не знала.
                                                                          И я все-таки рано радовалась. У меня так и не заработал шаблон из чанка @FILE. Я указала путь, но забыла указать сам файл, так что чанк брался из базы. Что же все-таки не так в моем вызове шаблона-чанка из файла?

                                                                          И да, документацию я изучила вдоль и поперек еще до того как сюда написала, но все равно спасибо.
                                                                          1. Василий Наумкин 18 июля 2014, 21:08 # 0
                                                                            Ну конечно, вдоль и поперек.

                                                                            Вызов сниппета:
                                                                            [[!pdoMenu?
                                                                            	&parents=`0`
                                                                            	&tpl=`@FILE test.tpl`
                                                                            	&level=`1`
                                                                            	&showLog=`1`
                                                                            	&tplPath=`/`
                                                                            ]]

                                                                            Файл в корне сайта /test.tpl
                                                                            <h4><a href="[[+link]]">[[+pagetitle]]</a></h4>

                                                                            Вызываем — и, как ни странно, работает!
                                                                            1. le-genda 18 июля 2014, 21:15 # 0
                                                                              странно, теперь работает.
                                                                              извините за оторбранное у вас время, чувствую себя дебилом ), спасибо.
                                                                              1. Василий Наумкин 18 июля 2014, 21:24 # 0
                                                                                Магия.
                                                                                1. le-genda 18 июля 2014, 21:30 # 0
                                                                                  зато я могу подсказать все, что угодно по верстке и дизайну :), обращайтесь ).
                                                              2. Екатерина Чеканская 06 сентября 2014, 01:38 # 0
                                                                Василий здравствуйте!
                                                                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

                                                                С чем это может быть связано?
                                                                1. Екатерина Чеканская 06 сентября 2014, 22:02 # 0
                                                                  Ошибка возникает при подключении более 9 TV-параметров.
                                                                Добавление новых комментариев отключено.