[pdoTools] Версия 1.5.0: новый сниппет pdoUsers

Сегодня доработал и выпустил новую версию pdoTools. Главное новшество — сниппет pdoUsers, позволяющий легко выводить ваших пользователей.

Рабочий пример — у нас на сайте.

В принципе, это бета-версия, но данный статус касается только pdoUsers, а вот pdoResources вполне себе стабилен и проблем при обновлении быть не должно.

pdoUsers

Этот сниппет обладает ровно теми же возможностями, что и pdoResources, отличаются только несколько параметров:
  • showInactive — показывать неактивных пользователей? По умолчанию — нет.
  • showBlocked — показывать заблокированных пользователей? По умолчанию — тоже нет.
  • users — Список пользователей, через запятую. Можно указывать username и id. Тире перед значением исключает юзера из выборки.
    Если параметр &sortby пуст, или равен «modUser.id», то пользователи будут выведены в том порядке, как указаны.
  • groups — Список групп пользователей, через запятую. Можно указывать имена групп и id. Тире перед значением исключает всех пользователей этой группы из выборки.
  • roles — Список ролей пользователей, через запятую. Можно указывать имена ролей и id. Тире перед значением исключает всех пользователей с этой ролью из выборки.
Если вы указываете несколько параметров, то пользователь должен удовлетворять им всем. Пример выборки администраторов:
[[!pdoUsers?
	&groups=`Administrator`
]]

Выборка Super User из Administrator
[[!pdoUsers?
	&groups=`Administrator`
	&roles=`Super user`
]]

Выборка всех админов, кроме одного, с id = 5:
[[!pdoUsers?
	&users=`-5`
	&groups=`Administrator`
	&roles=`Super user`
]]

Выборка строго определенных юзеров, по именам и id:
[[!pdoUsers?
	&users=`ivanov,petrov,10`
]]

В общем, грамотной комбинацией 3х параметров можно выбрать любых пользователей.

Обратите внимание, в параметрах &users, &groups и &roles можно указывать как имена, так и id. Однако, если вы указываете имена, то для определения их id будет сделаны дополнительные запросы в БД.

Если же вы указываете сразу id — запросов не будет, и выборка пройдёт чуть быстрее. На глаз разница почти незаметна, просто имейте в виду.

Все параметры сортировки, оформления и прочего — ровно те же, что и в pdoResources, включая &conditionalTpls.

pdoResources

Здесь исправлена работа с параметром &toSeparatePlaceholders=``, который сохраняет все результаты в разные плейхолдеры.

Также параметр &parents научился исключать ресурсы родителей, если указать перед ними тире.

Например, выбираем все ресурсы из категории = 9, исключая ресурсы подкатегорий = 12 и 15:
[[!pdoResources?
	&parents=`9, -12, -15`
]]

Сами категории 12 и 15 будут выбраны, ибо мы исключили только их потомков, но не их самих. Если же нужно убрать их полностью, то:
[[!pdoResources?
	&parents=`9, -12, -15`
	&resources=`-12, -15`
]]

Заключение

Новая версия уже доступна в нашем репозитории.

Ставим, тестим, пишем отзывы.

Обновлено 25.08.13

Раскопали и починили старый глюк с рекурсивным вызовом сниппетов pdoTools друг в друге.

Виновата функция modX::getService(), которая отдаёт всем сниппетам один экземпляр класса pdoTools и они меняют в нём конфиг. Отсюда и проблемы.

Если хотите пофиксить свои сниппеты самостоятельно — нужно поменять в начале строку
$pdoFetch = $modx->getService('pdofetch','pdoFetch', MODX_CORE_PATH.'components/pdotools/model/pdotools/',$scriptProperties);
на
if (!$modx->loadClass('pdofetch', MODX_CORE_PATH . 'components/pdotools/model/pdotools/', false, true)) {return false;}
$pdoFetch = new pdoFetch($modx, $scriptProperties);

Тогда для каждого сниппета будет создаваться отдельный экземпляр класса со своими конфигами и логами — это решит вопрос.

В репозитории лежит уже обновленная версия pdoTools, сниппеты компонентов обновлю позже, как будет время.

Следующая заметка
[miniShop2] 2.1.0-beta2: улучшения админки и фиксы
Предыдущая заметка
[miniShop2] 2.1.0-beta1: галерея и профиль покупателя


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

  1. Виталий Князь 25 августа 2013, 11:35 # 0
    Красавчик! :D
    1. Денис Богдановский 25 августа 2013, 16:18 # 0
      Ура!!! Респект!
      1. Денис Богдановский 28 августа 2013, 12:37 # 0
        Подскажите, как вывести аватар пользователя?
        В &tpl=`tpl.User.row` пробовал вставить
        <img src="[[+gravatar]]?s=100"  />
        , но ничего не получается.
        1. Сергей Савельев 12 сентября 2013, 07:45 # 0
          [2013-09-12 07:16:31] (ERROR @ /index.php) [pdoTools] Error 42S22: Unknown column 'TVgalleryalbum.contentid' in 'on clause'
          [2013-09-12 07:18:14] (ERROR @ /index.php) [pdoTools] Error 42S22: Unknown column 'TVgalleryalbum.contentid' in 'on clause'
          [2013-09-12 07:18:22] (ERROR @ /index.php) [pdoTools] Error 42S22: Unknown column 'TVgalleryalbum.contentid' in 'on clause'
          В версии 1.0.5 beta2 почти всё выводилось без ошибок, пробовал восстанавливать предыдущий пакет. Потом решил удалить, установить вновь 1.0.5pl, ну и… Теперь ничего не выводится, посредством pdoResources.

          Не то чтобы я настаивал на необходимости доработки, хотя..), короче, думаю, многим знакомо — community.modx-cms.ru/blog/tips_and_tricks/8733.html Если нет, рекомендую ;)

          Сам что-то не созрел, чтобы понять в чём подвох.

          showLog:
          0.0000191: pdoTools loaded
          0.0010450: Conditions prepared
          0.0000339: Query parameters ready
          0.0000720: xPDO query object created
          0.0005751: Included list of tvs: galleryAlbum, gallery_date, gallery_date_end
          0.0004849: leftJoined modTemplateVarResource as TVgalleryAlbum
          0.0004551: leftJoined modTemplateVarResource as TVgallery_date
          0.0004408: leftJoined modTemplateVarResource as TVgallery_date_end
          0.0000122: Grouped by modResource.id
          0.0005689: Added selection of modResource: 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`.`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`
          0.0000241: Added selection of TVgalleryAlbum: IFNULL(`TVgalleryAlbum`.`value`, "") as `tv.galleryAlbum`
          0.0000210: Added selection of TVgallery_date: IFNULL(`TVgallery_date`.`value`, "") as `tv.gallery_date`
          0.0000200: Added selection of TVgallery_date_end: IFNULL(`TVgallery_date_end`.`value`, "") as `tv.gallery_date_end`
          0.0005500: Added where condition: published=1, deleted=0, modResource.parent:IN(217,218,219,220,239,244,248,269,310,315,316,328,383,412,413,414,415,416,417,418)
          0.0000410: Sorted by publishedon, DESC
          0.0000119: Limited to 0, offset 0
          0.0004740: 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`.`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`, IFNULL(`TVgalleryAlbum`.`value`, "") as `tv.galleryAlbum`, IFNULL(`TVgallery_date`.`value`, "") as `tv.gallery_date`, IFNULL(`TVgallery_date_end`.`value`, "") as `tv.gallery_date_end` FROM `modx_site_content` AS `modResource` LEFT JOIN `modx_site_tmplvar_contentvalues` `TVgalleryAlbum` ON `TVgalleryalbum`.`contentid` = `modResource`.`id` AND `TVgalleryalbum`.`tmplvarid` = 418 LEFT JOIN `modx_site_tmplvar_contentvalues` `TVgallery_date` ON `TVgallery_date`.`contentid` = `modResource`.`id` AND `TVgallery_date`.`tmplvarid` = 416 LEFT JOIN `modx_site_tmplvar_contentvalues` `TVgallery_date_end` ON `TVgallery_date_end`.`contentid` = `modResource`.`id` AND `TVgallery_date_end`.`tmplvarid` = 417 WHERE  ( `modResource`.`published` = 1 AND `modResource`.`deleted` = 0 AND `modResource`.`parent` IN (217,218,219,220,239,244,248,269,310,315,316,328,383,412,413,414,415,416,417,418) )  GROUP BY modResource.id ORDER BY publishedon DESC "
          0.0048490: Total time
          15 728 640: Memory usage
          1. Василий Наумкин 12 сентября 2013, 07:54 # 0
            Это новая версия, там есть пара хороших изменений при работе с ТВ (сегодня будет заметка).

            Но, видать, не все гладко. Попробуй заменить в файле pdofetch.class.php (строка 343):
            $alias = 'TV'.$tv['name'];
            $name = strtolower($tv['name']);
            на
            $name = strtolower($tv['name']);
            $alias = 'TV'.$name;

            Если поможет — выпущу обновление.
            1. Сергей Савельев 12 сентября 2013, 08:04 # 0
              Я бы, на твоём месте, на вечеринках уже давно бы начал плюваться кодом :D
              Работает. Спасибо.
              1. Василий Наумкин 12 сентября 2013, 08:05 # 0
                Отлично, щас запулю pl1
            2. Василий Наумкин 12 сентября 2013, 07:57 # 0
              Ну и по поводу рекомендации использовать Gallery — спасибо, не надо.

              Я тебе лучше сам порекомендую store.simpledream.ru/ms2gallery =)
              1. Сергей Савельев 12 сентября 2013, 08:06 # 0
                990 рублей для одного сайта? :[
                1. Василий Наумкин 12 сентября 2013, 08:11 # 0
                  + 10% скидка для каждого следующего.

                  Можешь потестить на modx-test.com — разница серьезная:
                  — источники файлов (можно грузить картинки в Amazaon S3 или еще куда)
                  — автогенерация превью, phpthumbof не используется
                  — ресайз больших картинок перед загрузкой, на клиенте
                  — нормальный пакетный ajax аплоад, есть и drag-n-drop

                  Короче, много там всего, проще посмотреть.
                  1. Сергей Савельев 12 сентября 2013, 08:13 # 0
                    Это я всё обязательно сделаю, только на следующем уроке.
                    1. Сергей Савельев 12 сентября 2013, 08:21 # 0
                      Интересно, что думают о такой серьёзной разнице, и в общем о всей твоей деятельности, MODX разработчики? Я по английски не очень, так бы обчитал все форумы до багов.
                      1. Василий Наумкин 12 сентября 2013, 08:24 # 0
                        Не знаю, я тоже не силен в языках.

                        Вроде на следующей MODXpo будет доклад про pdoTools от Susan Ottwell.
                        Там и послушаем, в записи.
                        1. Сергей Савельев 12 сентября 2013, 08:44 # 0
                          Мне очень интересно. Хочется понять, как работает библиотека pdoTools, не знаю с чего начать, чтобы разобраться. Например для того, чтобы сделать прикрепление фалов (pdf,zip…), с возможностью категоризации. Сколько бы у тебя ушло время на создание этой маленькой, но полезной функции? Это не заказ и не просьба, хочется начать «наматывать на ус».
                          1. Сергей Савельев 12 сентября 2013, 09:09 # 0
                            Сфера деятельности человека не должна циклиться на копировании информации с одного сайта на другой, я абсолютно в этом уверен, создание подобных, упрощающих логику и сокращая время разработки, расширений, знаю, неотъемлемая часть творческих людей: музыкантов, художников, писателей… тех людей, на которых мы надеемся, постоянно.

                            То что у тебя сейчас происходит, многим не понятно, вдохновение ли это или совокупность сложных процессов, включающих опыт, программ, людей…

                            Очень приятно испытывать чувства переключения режима с «копировать, написать, вставить, обвести, нажать..» на тот режим, в котором всё хорошо и все благоприятно настроены, жаждут того, чтобы делать вместе великое дело, которое как единственное средство для выздоровления, совершенный и универсальный стимул для жизни.
                2. Сергей Шлоков 15 ноября 2014, 22:09 # 0
                  Василий, подскажи, пожалуйста, как передать в сниппет тег? Хочу убрать текущего пользователя из списка пользователей.
                  [[!pdoUsers? &users=`-[[!+modx.user.id]]`
                  Так тег не парсится. Поставил галочку у сниппета Предварительно обрабатывать теги в параметрах. Все равно не парсится. Есть какой-то способ распарсить тег перед передачей в сниппет?
                  1. Сергей Шлоков 15 ноября 2014, 22:42 # 0
                    Снимаю вопрос. Заработало. Фиг знает почему.
                    Update. Понял. Убрал восклицательный знак.
                  Добавление новых комментариев отключено.