[pdoTools] Версия 1.9.0-beta со своим парсером

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

Итак, главное изменение — это собственный pdoParser, который вы можете активировать прямо при установке:

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

Чуть потому, что он пока не берёт на себя условия и фильтры, обрабатывая только простенькие теги, типа [[+id]] и [[~15]]. Однако, это он делает быстрее modParser, потому что не создаёт лишних объектов.

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

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

Помимо возможной прибавки скорости, вы получите еще и новые возможности по удобному выводу данных из разных ресурсов. Думаю, многие знают про интересный компонент fastField, который добавляет в систему обработку дополнительных плейсхолдеров, типа [[#15.pagetitle]].
Так вот, чтобы при активации pdoParser эти замечательные теги не прекращали свою работу, я добавил функционал по их обработке. С разрешения автора, конечно.

Теперь вы сможете:
  • Выводить поля ресурсов: [[#15.pagetitle]], [[#20.content]]
  • Выводить ТВ параметры ресурсов: [[#15.date]], [[#20.some_tv]]
  • Выводить поля товаров miniShop2: [[#21.price]], [[#22.article]]
  • Выводить массивы ресурсов и товаров: [[#12.properties.somefield]], [[#15.size.1]]
  • Выводить глобальные массивы: [[#POST.key]], [[#SESSION.another_key]]
  • Распечатывать массивы для отладки: [[#15.colors]], [[#GET]], [[#12.properties]]
С компонентом debugParser это всё отлично сочетается.

Новые теги можно вызывать как в чанках, так и на странице. В общем, везде.

Другие изменения

Основные методы pdoTools работают через свой парсер, даже если он не включен в системе. То есть, они его просто загружают, как обычный класс, и вызывают методы.

Поэтому значительно были переписаны методы getChunk, parseChunk, fastProcess и makePlaceholders. Если вы обычный пользователь — разницы быть не должно, а разработчики сами посмотрят, что там поменялось.

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

С одной стороны, круто конечно, что он умудрялся делать это за 1 секунду, а с другой — непорядок. После внесения правок сниппет отрабатывает за 0,3сек без кэша, потому что всё-равно приходится выбирать все ресурсы категории, иначе нельзя нормально сортировать.

Исправлен сниппет pdoUsers. Оказывается, он не фильтровал по группам пользователей, если те были указаны именами, а не id. Баг был довольно давно, а никто и не заметил.

Методы getObject и getCollection выполняются в отдельных экземплярах. Раньше можно было словить баг, если вызвать такой метод внутри pdoResource — потому что он добавлял параметры в общий конфиг. Сейчас проблем быть не должно, методы можно использовать где угодно.
$pdo = $modx->getService('pdoFetch');
if ($res = $pdo->getObject('modResource', 15, array('select' => 'pagetitle'))) {
	print_r($res);
}

Исправлена ошибка с пустыми ТВ типа file и image, когда там выводился путь к источнику и их нельзя было проверять на пустоту.

В сниппет pdoResources добавлена возможность возвращать id ресурсов в плейсхолдер.
[[!pdoResources?
	&parents=`0`
	&returnIds=`1`
	&toPlaceholder=`test`
]]
[[+test]]

Заключение

Вот некоторые спрашивают, мол зачем нужен pdoTools, если MODX все это сам умеет? Нет, друзья, не всё он умеет.

Я могу привести много примеров, но вот прикольный — cоздание чанка из контента ресурса, а потом его рендер данными этого ресурса:
$pdo = $modx->getService('pdoFetch');
if ($res = $pdo->getObject('modResource',15)) {
	$chunk = '@INLINE '.$res['content'];
	echo $pdo->getChunk($chunk, $res);
}

В общем — качаем, обновляемся, пишем отзывы.

Еще раз напоминаю — это бета версия, могут быть ошибки. Хотя, мой сайт работает уже на ней, какое-то время.

Следующая заметка
[Jevix] Версия 1.2.0 - исправление ошибок обработки
Предыдущая заметка
[Sendex] Компонент управления рассылками


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

  1. Чикин Артур 20 декабря 2013, 22:02 # 0
    Может в место того что бы удалять настройки просто добавить в настройки переключатель включить свой парсер Да\Нет?
    1. Василий Наумкин 20 декабря 2013, 22:31 # 0
      Может, ты сначала посмотришь, как MODX инициализирует парсер?
      1. Чикин Артур 21 декабря 2013, 20:57 # 0
        В новом классе парсере добавить проверку по ключу, если ключ 0 или 1 то перейти в стандартный парсер или попробовать обработать параметр. Или так не выйдет?
    2. Александр Наумов 21 декабря 2013, 00:17 # 0
      Круто, спасибо!!! Особенно за это:
      Исправлена ошибка с пустыми ТВ типа file и image, когда там выводился путь к источнику и их нельзя было проверять на пустоту.
      Пошел ставить.
      1. aj 23 декабря 2013, 16:58 # 0
        [ОК, перенес сюда] — Не очень понимаю, что происходит, но не работает. Неспешно пытаюсь получить хоть что-то на выходе второй час. Причем на другой MODx площадке той же версии, с теми же настройками, на том же хостинге работает.

        Причем даже &showLog не пашет. Не подскажете в чем может быть дело?
        1. Василий Наумкин 23 декабря 2013, 17:00 # 0
          Что-то накрутил с чанками, или вовсе не установил компонент.

          showLog пашет практически всегда.
          1. aj 23 декабря 2013, 17:06 # 0
            Я сейчас попробовал вызвать pdoUsers — результат тот же. На второй площадке все ок. Компонент установлен.

            Залез в сниппет pdoResources, добавил в самое начало echo 'Work'; На выходе появилась надпись Work. Т.е. сниппет вызывается, все нормально. Проверил чанк — тоже все норм.

            Вот код чанка:
            <div style="float:left; margin:5px; width:208px; border:1px solid #333;">
            [[+pagetitle]]
            </div>
            
            Вот вызов:
            [[!pdoResources? &parents=`0` &limit=`10` &tpl=`techListItemTpl` &showLog=`1` &showUnpublished=`1`]]
            
            И вроде все правильно. Может Simple Dream как-то влиять на работу после установки? Это второй ключ на аккаунте.
            1. Василий Наумкин 23 декабря 2013, 17:08 # 0
              Зайди в системный журнал MODX, похоже у тебя класс pdoTools не загружается.
              1. aj 23 декабря 2013, 17:20 # 0
                Could not load class: pdoFetch from pdofetch.
                Если я правильно понимаю, то компонент встал криво. Попробовал переставить — та же петрушка. Файлы на месте. В том числе и pdofetch.class.php

                Можно где-то руками проверить пути? Я так понял вот тут все останавливается:
                if (!$modx->getService('pdoFetch')) {return false;}
                1. Василий Наумкин 23 декабря 2013, 17:28 # 0
                  Удали полностью, чтобы даже в управлении пакетами не было компонента, и заново поставь.
                  1. aj 23 декабря 2013, 17:34 # 0
                    1) Деинсталировал
                    2) Удалил
                    3) Проверил по FTP — файлов нет
                    4) Скачал заново
                    5) Поставил
                    6) Не работает
                    1. aj 23 декабря 2013, 17:38 # 0
                      Поменял немного код getService — заработало. Но таким образом мне придется все сниппеты pdoTools менять.

                      if (!$modx->getService('pdoFetch', 'pdoFetch', 'core/components/pdotools/model/pdotools/')) {return false;}
        2. Александр Наумов 23 декабря 2013, 18:33 # 0
          Исправлена ошибка с пустыми ТВ типа file и image, когда там выводился путь к источнику и их нельзя было проверять на пустоту.
          Василий, хочу уточнить ошибка это или нет.
          Создал ТВ с именем file, параметр ввода — Файл в форму добавил поле
          <input type="file" name="file">
          Ни плагинов, ни сниппитов для обработки данного поля не подключал.
          В итоге после сохранения в поле файл — пустота, хотя, когда то же самое проделываю с формой которую обрабатывает FormIt в поле выводится не ссылка, а информация о файле.

          Вопрос, что должен выводить Тикет, пустоту или информацию о файле?
          1. Василий Наумкин 23 декабря 2013, 18:37 # 0
            Какая связь между созданием тикета и выводом ТВ через pdoTools?

            Я же объяснял, что данные файла находятся в массиве $_FILES, а не $_POST. FormIt это, наверное, учитывает, а Tickets — нет.
            1. Александр Наумов 23 декабря 2013, 18:39 # 0
              Понял, спасибо!
          2. Cyrax_02 27 декабря 2013, 15:59 # 0
            Где можно посмотреть исходники pdotools.class.php на github'е?
            github.com/bezumkin/pdoTools/blob/master/core/model/modx/pdotools/pdotools.class.php
            1. Алексей 06 января 2014, 08:36 # 0
              Обнаружена проблема с totalVar. (связка pdoMenu, их 2 штуки и один mfilter + несколько своих сниппетов на pdoTools)
              Ранее решалось принудительной установкой в pdoMenu totalVar=`topmenu` и totalVar=`leftmenu` (+ в своих сниппетах на pdotools также), с новой версией этот финт не проходит — mfilter везде при загрузке страницы устанавливает плейсхолдер [[+total]] то в 1 то в 0 — когда в 0 — JS еще и скрывает фильтры сортировки. (при пагинации через ajax плейсхолдер [[+total]] работает)
              1. Василий Наумкин 06 января 2014, 08:47 # 0
                Обнови mSearch2 — должно помочь.

                Плюс, в новой версии гораздо понятнее выглядит количество результатов возле фильтра.
                1. Алексей 20 июня 2014, 20:43 # 0
                  Да, все заработало -) круто) только все тоже самое наблюдается и с limit, хотя особо не напрягает, но все же
              2. Чикин Артур 06 января 2014, 18:41 # 0
                Может при установке своего парсера для системных ключей назначить категорию system и имя с описанием?

                А то как то не правильно наблюдать 2 голых настройки.
                1. Василий Наумкин 07 января 2014, 09:02 # 0
                  Артур, давай уже пользоваться GitHub для таких предложений?

                  Я при разработке новой версии не просматриваю все комментарии, на предмет здравых идей. А вот список issues на GitHub — просматриваю.
                2. Алексей 02 апреля 2014, 19:11 # 0
                  можно ли с помощью директивы [[~[[+id]]]] вывести ссылку на удаленный ресурс?
                  (он еще сохранен в корзине, и, по идее у него только поднят флажок deleted)
                  1. Алексей 02 апреля 2014, 19:23 # 0
                    в общем нужно использовать
                    /[[+alias]]
                  2. Александр Котлов 03 апреля 2014, 14:32 # 0
                    Заметил странную фигню.

                    Чистая установка модикса. Ставлю пакеты, создаю чанки — полет нормальный. Ставлю PdoTools — появляется проблема с preg_match() и пока такие телодвижения не проделаешь —
                    Нужно изменить в файлах:
                    core/model/modx/mysql/modsnippet.map.inc.php
                    core/model/modx/mysql/modchunk.map.inc.php

                    строки:
                    с этой 'rule' => '/^(?!\s)[a-zA-Z0-9\x2d-\x2f\x7f-\xff_-\s]+(?!\s)$/'
                    на эту 'rule' => '/^(?!\s)[a-zA-Z0-9\x2d-\x2f\x7f-\xff-_\s]+(?!\s)$/'
                    Ни пакет поставить, ни чанк новый создать.
                    1. Василий Наумкин 03 апреля 2014, 15:53 # 0
                      На test.modx.pro сможешь показать?
                      1. Александр Котлов 03 апреля 2014, 16:18 # 0
                        Не повторяется. Точнее строчка выглядит так что дожна быть беда:
                        'rule' => '/^(?!\\s)[a-zA-Z0-9\\x2d-\\x2f\\x7f-\\xff_-\\s]+(?!\\s)$/'
                        Но не ругается, а мой хостинг давится.
                        А на чистой установке модикса у меня на хостинге строчка как во втором варианте получается:
                        'rule' => '/^(?!\s)[a-zA-Z0-9\x2d-\x2f\x7f-\xff-_\s]+(?!\s)$/'
                        Думаю что в что в версии PHP дело. У хостера какие-то работы были, и началось в скоре после них.

                        Может кому то пост поможет проблему решить у кого тоже хостинг кривой.
                        1. Пётр Молчанов 03 апреля 2014, 16:26 # 0
                          У меня это случилось после недавнего обновления пхп или хз из-за какого стечения обстоятельств. Мне тоже пришлось править эти строчки.
                          Вот тоже тема была community.modx-cms.ru/blog/solutions/15324.html
                          1. Александр Котлов 03 апреля 2014, 16:44 # 0
                            Я собственно решение там и увидел, но чет на оригинал линк дать забыл(
                    2. Алексей 19 октября 2014, 07:44 # 0
                      было бы круто прямо в парсер добавить возможность вкладывать html файлы (чанки) без создания их в панели управления. к примеру: [[#chunk.assets.elements.shunk1.html]]
                      1. Василий Наумкин 19 октября 2014, 07:54 # 0
                        Может быть, но
                        1. Ты скоро сам запутаешься, где и что вызывается
                        2. Не будут работать вот такие прекрасные дополнения
                        3. Возможны какие-нибудь уязвимости, типа LFI.
                        4. Ну и самое главное: ты легко можешь сделать это самостоятельно, написал свой простой сниппет getChunk как-то так:
                        <?php
                        
                        return MODX_CORE_PATH . 'chunks/' . $file;
                        И вызывать его где нужно:
                        [[!getChunk?file=`mychunk.tpl`]]
                        Так что, добавлять в парсер pdoTools такой функционал я не буду.
                      Добавление новых комментариев отключено.