DocLister 2.3.9

Вялотекущая разработка DocLister продолжается, несмотря на жару и духоту, и я сегодня зарелизил версию 2.3.9 (вообще 2.3.8 и вчера, но пришлось сделать существенные правки в DLMenu).


Так как последний раз в новостях упоминалась 2.2.0, то изменений в общем-то не так мало накопилось, но большинство из них это исправления ошибок и оптимизации. Напишу о некоторых интересных.

Обратная пагинация
Включается параметром reversePagination=`1` и в результате ссылки на страницы выводятся в обратном порядке:


Благодаря этому старые записи остаются на одних и тех же страницах. А еще в пагинаторе были починены редиректы для несуществующих страниц.

Максимальное количество выводимых документов
Не знаю, где это может понадобиться, но почему бы и не сделать. Задается параметром maxDocs. При этом корректно работает пагинация. Тот кто предложил это улучшение вероятно давно забил на MODX и DocLister, тем не менее, задача была героически решена спустя несколько лет.

DLMenu, DLSitemap, DLBuildMenu, DLUsers
О новых сниппетах я уже подробно писал, а о старых DLBuildMenu и DLUsers напишу только то, что удалил их из комплекта, раз есть более удобные альтернативы.

Возможность переопределить методы checkAlias и getAlias в modResource
На одном сайте возникла проблема с импортом тысяч товаров, которые хранились, как это обычно бывает, в виде документов. Казалось, что дело в количестве товаров, и я уже думал, что быстро решу проблему своим модулем для импорта, где файл обрабатывается по частям через ajax, но не тут-то было: после пары тысяч товаров мой модуль тоже начал жутко тормозить и положил сервер. Мучился я долго, пока не выяснил, что тормоза создает проверка alias на дубликаты с последующим исправлением. Проверку я отключил, расширив modResource, а в конце импорта одним запросом сделал алиасы уникальными, дописав к ним id документа.

Убрано сообщение о том, что параметр tpl пуст
Часто хочется получить данные из DocLister без всяких обработок. После исправления это стало возможным:

$modx->runSnippet('DocLister', array(
    'idType' => 'parents',
    'parents' => 0,
    'tpl' => '',
    'saveDLObject' => '_DL'
));
$docs = $modx->getPlaceholder('_DL')->docsCollection()->toArray();


Изменена работа параметра &api
Если в параметре перечислить поля, то только они и будут выведены (если есть такая возможность). Раньше была какая-то неопределенность в этом всем. Опять же появилась возможность пропустить ненужные обработки, которые выполяются в этом режиме.

Дополнительный вариант вывода данных
Если в параметре JSONformat указать «simple», то в виде json будет выведен список документов и ничего больше.

Класс modManagers для работы с менеджерами
Теперь можно создавать, удалять и авторизовать менеджеров с фронтенда (: Поддержка класса добавлена в FormLister, так что можно написать собственную админку. Тем более, что в modResource появилась возможность присваивать документам группы с помощью метода setDocumentGroups.

Параметр sanitizeTags
Дополнительный параметр экстендера e, который позволяет экранировать тэги MODX при выводе документов через DocLister. Параметр появился после того, как я сделал в FormLister возможность откатить порчу данных в POST парсером в целях безопасности. В общем, если есть сомнения, что в выводе могут появиться MODX-тэги, используйте этот параметр.

Ну и еще для тех полутора человек, кто пользуется MODxAPI. После некоторых правок корректная работа методов setUserGroups, setDocumentGroups и класса modResource в целом возможна только при наличии UNIQUE-индексов в соответствующих таблицах. С версии Evo 1.3.4 все будет сразу, а пока можно добавить вручную (при необходимости):

ALTER TABLE `modx_site_tmplvar_contentvalues` ADD UNIQUE INDEX `ix_tvid_contentid` (`tmplvarid`,`contentid`);
ALTER TABLE `modx_member_groups` ADD UNIQUE INDEX `ix_group_member` (`user_group`,`member`);
ALTER TABLE `modx_web_groups` ADD UNIQUE INDEX `ix_group_user` (`webgroup`,`webuser`);
ALTER TABLE `modx_document_groups` ADD UNIQUE INDEX `ix_dg_id` (`document_group`,`document`);

19 комментариев

avatar
Похоже и те «полтора» вымерли, раз ни одного комментария ))))
avatar
Ага, поломку контроллера Onetable никто и не заметил.
avatar
Я как раз на неё нарвался. =) Пока искал причины да обновлялся вышла уже версия с исправлениями. Поэтому и написать не успел.

Не такие уж и полтора.
avatar
на данный момент у топика 12 плюсов, 6 закладок и 196 просмотров. Ни кто не «вымер», просто аж слов не хватает выразить автору топика благодарность :)
avatar
Это точно ))
avatar
Максимальное количество выводимых документов
Не знаю, где это может понадобиться, но почему бы и не сделать. Задается параметром maxDocs. При этом корректно работает пагинация. Тот кто предложил это улучшение вероятно давно забил на MODX и DocLister, тем не менее, задача была героически решена спустя несколько лет.

Я живой!!! И не забил)) просто у меня на гите другой ник.

Спасибо за доработку.

Это мне нужно было для ограничения вывода личных сообщений между веб-пользователями в их личных кабинетах (чтобы не забывали чистить старые сообщения)))

Может так же пригодиться в аналогичной ситуации для форума, если какой когда-то появится (Дмитрий как-то тему по форуму уже подымал).
  • paic
  • +1
avatar
Благодарствую за проделанную работу!
Я тут вообще редко отписываюсь, но слежу постоянно — так не переживай!
avatar
Я тоже жив! "задача была героически решена " — это повеселило ))
Спасибо за работу.
avatar
Подскажите, как сделать сортировку в DocLister по TV так, чтобы параметры, у которых значение NULL показывались в конце?
Если делать сортировку от большего к меньшему — то NULL в конце, но мне надо сделать сортировку от меньшего к большему, в этом случае все значения NULL в начале.

Посмотрел в дебаге sql, который генерируется.
Попробовал сделать так:

&orderBy=`IF(`dltv_price_1`.`value` IS NULL,1,0), price ASC`
работает, пока не включаю фильтр.
при включенном фильтре название таблицы становится не `dltv_price_1`, а `dltv_price_4`.`value` и поэтому вообще ничего не выводится.

Как сделать так, чтобы выводить от меньшего к большему и NULL в конце?
avatar
Возникло пара вопросов — что значит «пока не включаю фильтр» и откуда вы берете tv со значением null?
avatar
Галочка в наличии добавляет фильтр такого вида:
AND(tvd:price:gt:0;tvd:price:lt:100000)
www.proturbo66.ru/katalog/turbiny/katalog-turbokompressorov.html

В TV price по идее либо цифра стоит, значение по умолчанию не установлено.
Значений с таким параметром в таблице нет, но, насколько я понимаю, такое значение появляется у товаров при формировании запроса doclister-ом.
Вот скрин вывода запроса доклистера prntscr.com/ixed5u
avatar
Странноватая галочка «в наличии», не находите? :) Почему бы ей не фильтровать какую-нибудь птичку «в наличии» или хотя бы «количество на складе» (отличное от нуля). Зачем ей фильтровать цену, по которой к тому же идет сортировка.

А вообще, если этот фильтр формируется динамически, то можно там же динамически в зависимости от галочки формировать и условие сортировки, подставляя, где надо dltv_price_1 / dltv_price_4 — но честно говоря, метод стремный, потому что завтра у вас добавится еще один ТВ, цена станет не dltv_price_4, а например dltv_price_5 и мало кто поймет в чем дело.
avatar
опять же, имея галочку «в наличии» можно дополнительно сортировать по ней, отправляя товары «нет в наличии» в конец списка без всяких сомнительных манипуляций с ценой.
avatar
Отдельного поля в наличии нет, если есть цена, то значит товар в наличии. Разве такая логика не может быть?
Да, я думал насчет динамического формирования сортировки, придется сделать так.
Хотя можно попробовать добавить еще поле наличие.

Других способов нету?
avatar
Недавно начал работать с DocLister. Не получается задать сортировку в случайном порядке.
&order=`ASC` &sortType=`other` &orderBy=`rand()` &sortBy=`price`

Что здесь не так?
avatar
Оставить только:
&sortType=`other`
&orderBy=`RAND()`

Вызов доклистера делать не кэшируемым.
avatar
Спасибо!
avatar
Возник еще один интересный вопрос. Как на странице с вызовом DocLister вывести количество объектов на странице (показано 1-8 товаров из 48). И если перейти по навигации на вторую страницу писалось бы 9-16 из 48 (где 48 — всего объектов)
avatar
Сам нашел — modx.im/blog/questions/5206.html
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.