[pdoTools] 2.2.5 - ускорение обработки url

Привет, друзья!

Представляю вам новую версию pdoTools, в которой вы можете отключить использование функции modX::makeUrl() во всех сниппетах.

Если на вашем сайте включены friendly_urls и вы генерируете большие массивы страниц, то можно указывать новый тип &scheme — uri.
[[!pdoMenu?
	&parents=`0`
	&level=`3`
	&scheme=`uri`
	&showLog=`1`
]]
Тогда вместо запуска modx::makeUrl() в плейсхолдер [[+link]] будет подставлено содержимое поля uri ресурса. Если же это сделать не получается, то будет запущен оригинальный метод.

По умолчанию modx::makeUrl() используется всегда, что может приводить к тормозам. Теперь вы можете его отключить.

Для проверки скорости я сгенерировал меню modx.pro и получил вот такой лог:
0.0082948: pdoTools loaded
0.0000319: xPDO query object created
0.0005062: Added selection of modResource: SQL_CALC_FOUND_ROWS `id`, `type`, `contentType`, `pagetitle`, `longtitle`, `description`, `alias`, `link_attributes`, `published`, `pub_date`, `unpub_date`, `parent`, `isfolder`, `introtext`, `content`, `richtext`, `template`, `menuindex`, `searchable`, `cacheable`, `createdby`, `createdon`, `editedby`, `editedon`, `deleted`, `deletedon`, `deletedby`, `publishedon`, `publishedby`, `menutitle`, `donthit`, `privateweb`, `privatemgr`, `content_dispo`, `hidemenu`, `class_key`, `context_key`, `content_type`, `uri`, `uri_override`, `hide_children_in_tree`, `show_in_tree`, `properties`, `hide_on_start`, `show_on_start`, `ticket_rating`
0.0000708: Processed additional conditions
0.0005760: Added where condition: modResource.parent:IN(1,15,5162,30,7595,47,40,3327,3439,4423,4724,12,17,13,21,16,14,18,19,20,22,23,24,4441,31,32,33,34,3,41,42,43,46,44,45,50), OR:modResource.id:IN(1,15,5162,30,7595,47,40,3327,3439,4423,4724,12,17,13,21,16,14,18,19,20,22,23,24,4441,31,32,33,34,3,41,42,43,46,44,45,50), modResource.published=1, modResource.hidemenu=0, modResource.deleted=0, modResource.context_key=web
0.0000770: Sorted by modResource.menuindex, ASC
0.0003381: SQL prepared "SELECT SQL_CALC_FOUND_ROWS `modResource`.`id`, `modResource`.`type`, `modResource`.`contentType`, `modResource`.`pagetitle`, `modResource`.`longtitle`, `modResource`.`description`, `modResource`.`alias`, `modResource`.`link_attributes`, `modResource`.`published`, `modResource`.`pub_date`, `modResource`.`unpub_date`, `modResource`.`parent`, `modResource`.`isfolder`, `modResource`.`introtext`, `modResource`.`content`, `modResource`.`richtext`, `modResource`.`template`, `modResource`.`menuindex`, `modResource`.`searchable`, `modResource`.`cacheable`, `modResource`.`createdby`, `modResource`.`createdon`, `modResource`.`editedby`, `modResource`.`editedon`, `modResource`.`deleted`, `modResource`.`deletedon`, `modResource`.`deletedby`, `modResource`.`publishedon`, `modResource`.`publishedby`, `modResource`.`menutitle`, `modResource`.`donthit`, `modResource`.`privateweb`, `modResource`.`privatemgr`, `modResource`.`content_dispo`, `modResource`.`hidemenu`, `modResource`.`class_key`, `modResource`.`context_key`, `modResource`.`content_type`, `modResource`.`uri`, `modResource`.`uri_override`, `modResource`.`hide_children_in_tree`, `modResource`.`show_in_tree`, `modResource`.`properties`, `modResource`.`hide_on_start`, `modResource`.`show_on_start`, `modResource`.`ticket_rating` FROM `modx_site_content` AS `modResource` WHERE  (  ( `modResource`.`parent` IN (1,15,5162,30,7595,47,40,3327,3439,4423,4724,12,17,13,21,16,14,18,19,20,22,23,24,4441,31,32,33,34,3,41,42,43,46,44,45,50) OR `modResource`.`id` IN (1,15,5162,30,7595,47,40,3327,3439,4423,4724,12,17,13,21,16,14,18,19,20,22,23,24,4441,31,32,33,34,3,41,42,43,46,44,45,50) )  AND `modResource`.`published` = 1 AND `modResource`.`hidemenu` = 0 AND `modResource`.`deleted` = 0 AND `modResource`.`context_key` = 'web' )  ORDER BY modResource.menuindex ASC "
0.0680649: SQL executed
0.0002029: Total rows: 4392
0.0556550: Rows fetched
0.1302130: Returning raw data
0.0671182: Tree was built
0.0181720: Start template tree
0.0054049: Created inline chunk with name "ad22a6773e8643db35baf6e56fa79c5d"
1.8507850: Created inline chunk with name "dc6d3757597108f87f958f868cf1591a"
0.5560040: End template tree
2.7648549: Total time
90 439 680: Memory usage
2.8 сек. для генерации меню из 4 392 ресурсов.

И это с родными чанками, а если указать чанк Fenom:
[[!pdoMenu?
	&parents=`0`
	&level=`3`
	&showLog=`1`
	&scheme=`uri`
	&tpl=`@INLINE <li{$classes}><a href="{$link}" {$attributes}>{$menutitle}</a>{$wrapper}</li>`
]]
то
0.0084081: pdoTools loaded
0.0000329: xPDO query object created
0.0004718: Added selection of modResource: SQL_CALC_FOUND_ROWS `id`, `type`, `contentType`, `pagetitle`, `longtitle`, `description`, `alias`, `link_attributes`, `published`, `pub_date`, `unpub_date`, `parent`, `isfolder`, `introtext`, `content`, `richtext`, `template`, `menuindex`, `searchable`, `cacheable`, `createdby`, `createdon`, `editedby`, `editedon`, `deleted`, `deletedon`, `deletedby`, `publishedon`, `publishedby`, `menutitle`, `donthit`, `privateweb`, `privatemgr`, `content_dispo`, `hidemenu`, `class_key`, `context_key`, `content_type`, `uri`, `uri_override`, `hide_children_in_tree`, `show_in_tree`, `properties`, `hide_on_start`, `show_on_start`, `ticket_rating`
0.0000770: Processed additional conditions
0.0005898: Added where condition: modResource.parent:IN(1,15,5162,30,7595,47,40,3327,3439,4423,4724,12,17,13,21,16,14,18,19,20,22,23,24,4441,31,32,33,34,3,41,42,43,46,44,45,50), OR:modResource.id:IN(1,15,5162,30,7595,47,40,3327,3439,4423,4724,12,17,13,21,16,14,18,19,20,22,23,24,4441,31,32,33,34,3,41,42,43,46,44,45,50), modResource.published=1, modResource.hidemenu=0, modResource.deleted=0, modResource.context_key=web
0.0001080: Sorted by modResource.menuindex, ASC
0.0003691: SQL prepared "SELECT SQL_CALC_FOUND_ROWS `modResource`.`id`, `modResource`.`type`, `modResource`.`contentType`, `modResource`.`pagetitle`, `modResource`.`longtitle`, `modResource`.`description`, `modResource`.`alias`, `modResource`.`link_attributes`, `modResource`.`published`, `modResource`.`pub_date`, `modResource`.`unpub_date`, `modResource`.`parent`, `modResource`.`isfolder`, `modResource`.`introtext`, `modResource`.`content`, `modResource`.`richtext`, `modResource`.`template`, `modResource`.`menuindex`, `modResource`.`searchable`, `modResource`.`cacheable`, `modResource`.`createdby`, `modResource`.`createdon`, `modResource`.`editedby`, `modResource`.`editedon`, `modResource`.`deleted`, `modResource`.`deletedon`, `modResource`.`deletedby`, `modResource`.`publishedon`, `modResource`.`publishedby`, `modResource`.`menutitle`, `modResource`.`donthit`, `modResource`.`privateweb`, `modResource`.`privatemgr`, `modResource`.`content_dispo`, `modResource`.`hidemenu`, `modResource`.`class_key`, `modResource`.`context_key`, `modResource`.`content_type`, `modResource`.`uri`, `modResource`.`uri_override`, `modResource`.`hide_children_in_tree`, `modResource`.`show_in_tree`, `modResource`.`properties`, `modResource`.`hide_on_start`, `modResource`.`show_on_start`, `modResource`.`ticket_rating` FROM `modx_site_content` AS `modResource` WHERE  (  ( `modResource`.`parent` IN (1,15,5162,30,7595,47,40,3327,3439,4423,4724,12,17,13,21,16,14,18,19,20,22,23,24,4441,31,32,33,34,3,41,42,43,46,44,45,50) OR `modResource`.`id` IN (1,15,5162,30,7595,47,40,3327,3439,4423,4724,12,17,13,21,16,14,18,19,20,22,23,24,4441,31,32,33,34,3,41,42,43,46,44,45,50) )  AND `modResource`.`published` = 1 AND `modResource`.`hidemenu` = 0 AND `modResource`.`deleted` = 0 AND `modResource`.`context_key` = 'web' )  ORDER BY modResource.menuindex ASC "
0.0749900: SQL executed
0.0002191: Total rows: 4392
0.0871830: Rows fetched
0.1325550: Returning raw data
0.0684011: Tree was built
0.0181000: Start template tree
0.0049889: Created inline chunk with name "48e54d681cadea8b959ffb02a7661e02"
0.0610340: Compiled Fenom chunk with name "inline/48e54d681cadea8b959ffb02a7661e02"
0.3693681: Created inline chunk with name "dc6d3757597108f87f958f868cf1591a"
0.1056440: End template tree
0.9358311: Total time
90 439 680: Memory usage
Чуть меньше секунды!

Вполне возможно, что в каких-то ситуациях url получатся неправильными, поэтому перед влючением советую проверить всё как следует.

В pdoResources параметр &scheme работает только при включении &useWeblinkUrl, а так как по умолчанию он отключен, проще сразу указывать плейсхолдер [[+uri]] в чанках.

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

— Сниппет pdoTitle теперь передаёт все полученные параметры во вложенный вызов pdoCrumbs. Так что вы можете указывать параметр &exclude и другие.

— Сниппет pdoSitemap научился обрабатывать теги MODX, если они вдруг встречаются в ссылках. Например, из-за мультиязычности этого сайта ссылка на файлохранилище унас выглядит так:
[[!++cultureKey:is=`ru`:then=`https://file.modx.pro`:else=`https://file.modx.pro/en/`]]

Новая версия уже в репозиториях, можно обновляться.
Василий Наумкин
07 февраля 2016, 11:10
modx.pro
4
4 643
+14

Комментарии: 32

Alex Alex
Alex Alex
07 февраля 2016, 14:25
-5
При выводе TV с типом вывода Дата, отображает не так как настроено в TV. Т.е. выдаёт всё от дней до секунд. В настройках TV стоит %d-%m-%Y
    Alex Alex
    Alex Alex
    07 февраля 2016, 14:30
    -8
    Даёшь больше минусов без объяснения!
      Василий Наумкин
      07 февраля 2016, 14:46
      +2
      Даёшь чтение документации перед задаванием вопросов! Да и указание сниппета и вызова, чтобы можно было убедиться в наличии бага, тоже не помешает.

      Параметр &processTVs.
        Alex Alex
        Alex Alex
        07 февраля 2016, 15:05
        +1
        Отлично, спасибо!
        Alex Alex
        Alex Alex
        07 февраля 2016, 15:08
        -3
        мало минусов, больше злости =)

        А если честно, то после такого страшно вопросы задавать.
          Василий Наумкин
          07 февраля 2016, 16:12
          +2
          И не говори, страх какой в этом интернете — могут минус поставить!
            Alex Alex
            Alex Alex
            07 февраля 2016, 17:16
            -5
            Зная тебя — ставь.
              Роман Садоян
              08 февраля 2016, 11:20
              +1
              Зная его — ставлю.
                Это сообщение было удалено
      Павел Гвоздь
      07 февраля 2016, 14:51
      +2
      Спасибо за &exclude в pdoTitle! :)
        Владимир Дремучий
        07 февраля 2016, 15:10
        +1
        pdoCrumbs валит страницу, ошибка 500

        UPD: Переустановил pdoTools, теперь все нормально. Спасибо :)
          brioni
          08 февраля 2016, 15:33
          0
          Такая же проблема.
          Переустановка пакета pdoTools не помогает.
          Может нужен откат к предыдущей версии?
            Владимир Дремучий
            08 февраля 2016, 15:35
            0
            Попробуй откатится, потом обновить.
              brioni
              08 февраля 2016, 15:47
              0
              Откат — удаление — установка — работа pdoCrumbs
          Алексей
          07 февраля 2016, 17:02
          0
          Спасибо за обновления! Подскажите, схема генерации uri (&scheme=`uri`) работает в режиме
          &scheme=`full`
          или
          &scheme=`abs`
          ?
            Илья Уткин
            07 февраля 2016, 18:29
            +3
            URI в базе данных хранятся от корня сайта (но без первого слеша)
              Алексей
              07 февраля 2016, 23:21
              0
              Тогда вместо запуска modx::makeUrl() в плейсхолдер [[+link]] будет подставлено содержимое поля uri ресурса. Если же это сделать не получается, то будет запущен оригинальный метод.
              Я имею ввиду, когда не удастся подставить uri поле ресурса — как будет генериться схема url в этом случае.
              будет запущен оригинальный метод.
              с какой схемой? -)
                Василий Наумкин
                08 февраля 2016, 04:44
                +1
                С такой же, то есть -1.
                  Алексей
                  08 февраля 2016, 09:12
                  1
                  0
                  ок! круто.
                  Василий, подскажи, почему не показываешь синтаксис феном во всей его красе — передача массивов сниппетам?
                  {$_modx->runSnippet('!pdoMenu',[
                  	'parents'	=>0,
                  	'level'		=>3,
                  	'showLog'	=>1,
                  	'scheme'	=>'uri',
                  	'tpl'		=>'@INLINE <li{$classes}><a href="{$link}" {$attributes}>{$menutitle}</a>{$wrapper}</li>'
                  ])}
                Борода
                14 марта 2016, 12:49
                0
                А если поставить значение link_tag_scheme — full. Всё равно uri будут в базе от корня без первого слеша?
                  Илья Уткин
                  14 марта 2016, 12:56
                  0
                  Не знаю, но думаю, что да.

                  Вот, вы проверьте и нам расскажите))
                    Борода
                    16 марта 2016, 17:03
                    0
                    Если Я правильно всё сделал, то ты правильно думал)
                    По ходу, link_tag_scheme — full просто [[++site_url]] при генерации ссылок подставляет) В принципе, логично. Вдруг адрес сайта поменяется, а в базе ссылки со старым адресом)
              Сергей Шлоков
              08 февраля 2016, 13:32
              0
              Актуально только для некэшируемого pdoMenu.
              __________
              Кэп :)
                brioni
                08 февраля 2016, 16:07
                0
                Для работы pdoSitemap, также как и для pdoCrumbs требуется переустановка пакета pdoTools 2.2.5:
                Деинсталлировать — Отмечаем Восстановить — затем Установить заново
                Иначе ошибка 500 на страницах с вызовом сниппета
                  Василий Наумкин
                  08 февраля 2016, 16:17
                  +1
                  Вы бы хоть в логи заглянули, отчего такая ошибка вылезает у вас? Более 70 загрузок только из modstore, а об ошибке отписались всего 2 человека. При этом, переустановка решает вопрос.

                  Сдаётся мне, проблема не в компоненте.
                    brioni
                    08 февраля 2016, 16:43
                    0
                    Василий, а в Журнале ошибок MODX Revolution пусто
                      Василий Наумкин
                      08 февраля 2016, 16:47
                      +1
                      Ошибок 500 в журнале MODX не может быть по определению.

                      Ошибки сервера пишутся в лог сервера.
                        brioni
                        08 февраля 2016, 16:56
                        0
                        такая статистика на сервера была отключена — подключил
                    Денис
                    16 февраля 2016, 14:47
                    0
                    пока решил проблему таким же способом
                    Это сообщение было удалено
                      Это сообщение было удалено
                      Сергей Шлоков
                      15 октября 2016, 11:20
                      0
                      А шаблон для категорий, указанный в tplCategoryFolder параметре, должен использоваться для ресурсов с isfolder=1?
                      В документации написано так
                      &tplCategoryFolder Специальный чанк оформления категории. Категория — это документ с «isfolder = 1» и или нулевым шаблоном, или с атрибутом «rel=category»
                      В коде такой проверки нет.
                        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                        32