Наши заметки о MODx
В этом разделе мы будем собирать небольшую копилку секретов по работе с системой управления контентом сайта (CMS) MODx. Эти заметки ни в коем случае не претендуют на лавры документации. На нашем сайте тема MODx вообще занимает небольшой уголок, и эти материалы мы размещаем только потому, что по роду основной работы нам приходится оказывать техническую поддержку нескольким десяткам организаций, использующих наши прототипы сайтов. В то же время кое-что может пригодиться и другим людям.
Мы не претендуем на изложение "истины в последней инстанции". Наверняка в этих заметках гуру MODx найдут неточности и ошибки. Мы будем очень благодарны, если на это нам укажут в комментариях.
В заметках мы стараемся не просто сразу приводить готовое правильное решение, но и показываем, как мы набивали шишки в процессе поиска.

Как делать ленту новостей из разных папок



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

Напрашиваются различные пути:

1. "Механизировать" перемещение документов в другие папки. Этот путь кажется сомнительным, отложим на крайний случай.

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

3. Сделать несколько вызовов Ditto с разными аргументами на одной странице.

4. Воспользоваться каким-то иным сниппетом.

Изучим параметры Ditto.

Основной параметр - startID  это идентификатор папки из которой берутся документы для формирования результата. Здесь нет возможности задать папки перечислением. Копаем дальше.

Есть параметр documents. Этот параметр должен содержать список ID'ов тех документов, которые будут отображены в результатах. Т. е. можно жестко задать список документов, которые будут отображаться. Значения: список любых валидных документов, разделенный запятыми.

Вызов документов по списку ID

Попробуем. Выведем в виде ленты несколько папок с ID-ами  245, 1403, 1397, задавая уровень вложенности параметром dept.

[ [Ditto? &documents=`245,1403,1397` &depth=`3` &summarize=`10` &removeChunk=`Comments` &tpl=`ditto_news` &sortBy=`pub_date` &sortDir=`desc` &paginate=`1` &language=`russian-UTF8` &extenders=`summary,dateFilter` &paginateAlwaysShowLinks=`0`  &truncText=`Читать полностью...` &dateSource=`pub_date` &dateFormat=`%d.%m.%Y `] ]

  При таком вызове выводятся три документа, но не показываются вложенные в них. А нам-то как раз нужны вложенные документы. Параметр depth, к сожалению, влияния не оказывает. Однако, в самом крайнем случае, десяток-другой новостей можно вывести и так.

Вызов нескольких Ditto

Здесь надо задавать каждому вызову в параметре ID самой "дитты". Делаем два вызова:

[ [Ditto? &startID=`24` &summarize=`10` &removeChunk=`Comments` &tpl=`ditto_news` &sortBy=`pub_date` &sortDir=`desc` &paginate=`1` &language=`russian-UTF8` &extenders=`summary,dateFilter` &paginateAlwaysShowLinks=`0`  &truncText=`Читать полностью...` &dateSource=`pub_date` &dateFormat=`%d.%m.%Y `] ]

[ [Ditto? &startID=`1462` &summarize=`10` &removeChunk=`Comments` &tpl=`ditto_news` &sortBy=`pub_date` &sortDir=`desc` &paginate=`1` &language=`russian-UTF8` &extenders=`summary,dateFilter` &paginateAlwaysShowLinks=`0`  &truncText=`Читать полностью...` &dateSource=`pub_date` &dateFormat=`%d.%m.%Y `] ]

В результате мы действительно видим ленты из разных папок! Но! Навигационная линейка заполняется только для последней папки. Это не очень-то хорошо. И даже если мы вставим навигационную линейку между вызовами Ditto - всё равно в неё попадут данные последней папки.

Но новости-то показаны! Пробуем разобраться с "падинатором". Вызов навигационной линейки у нас сделан в виде плейсхолдеров прямо в контенте. Надо как-то "сказать" плейсхолдерам, с какой именно "диттой" они связаны.

Напишем вот такой код:

<h3>Последние новости</h3>
[ [Ditto? &id=`news` &startID=`24` &summarize=`2` &removeChunk=`Comments` &tpl=`ditto_news` &sortBy=`pub_date` &sortDir=`desc` &paginate=`1` &language=`russian-UTF8` &extenders=`summary,dateFilter` &paginateAlwaysShowLinks=`0`  &truncText=`Читать полностью...` &dateSource=`pub_date` &dateFormat=`%d.%m.%Y `] ]
Показано [ +news_start+ ] - [ +news_stop+ ] из [ +news_total+ ] материалов
[ +news_previous+ ] | [ +news_pages+ ] | [ +news_next+ ]

<h3>Старые новости</h3>
[ [Ditto? &id=`old` &startID=`1462` &summarize=`2` &removeChunk=`Comments` &tpl=`ditto_news` &sortBy=`pub_date` &sortDir=`desc` &paginate=`1` &language=`russian-UTF8` &extenders=`summary,dateFilter` &paginateAlwaysShowLinks=`0`  &truncText=`Читать полностью...` &dateSource=`pub_date` &dateFormat=`%d.%m.%Y `] ]
Показано [ +old_start+ ] - [ +old_stop+ ] из [ +old_total+ ] материалов
[ +old_previous+ ] | [ +old_pages+ ] | [ +old_next+ ]

Что мы сделали:

1. Присвоили вызовам Ditto каждому свой id: news и old. Теперь каждый экземпляр Ditto имеет своё имя.

2. В плейсхолдерах навигационной линейки мы добавили префиксы news_ и old_.  Смотрим на результат:

  Вызов двух лент новостей

Вызов двух лент новостей

  Всё получилось как надо! Сюрприз

Мы на одной странице вывели ленту и старых новостей из папки 1462, и новых новостей из папки 24. Старые и новые новости мы разделили заголовками. У каждой ленты есть своя навигационная линейка, и обе они работают правильно.

Таким образом мы можем реализовать идею - сразу создавать папки новостей по месяцам и выводить ленты новостей на одну страницу. Здесь мы всегда добьемся некоторого оптимального заполнения страницы установкой summarize. Допустим, хорошо вписывается в дизайн 20 новостей. Вызов сниппета производится у нас на одной странице, его легко корректировать. В начале месяца, когда свежих новостей мало, мы для них установим summarize = 5, а для старых - summarize=15. А в конце месяца - наоборот.

Но это еще не всё! Нашелся еще один вариант.

Список папок в parents

Вызов Ditto можно сделать с аргументом parents, в котором перечисляются через запятую ID-ы папок. Вот так:

[ [Ditto? &parents=`24,1403,1397` &depth=`3` &summarize=`10` &removeChunk=`Comments` &tpl=`ditto_news` &sortBy=`pub_date` &sortDir=`desc` &paginate=`1` &language=`russian-UTF8` &extenders=`summary,dateFilter` &paginateAlwaysShowLinks=`0`  &truncText=`Читать полностью...` &dateSource=`pub_date` &dateFormat=`%d.%m.%Y `] ]

  При таком вызове выводятся в одну ленту новости из трех папок. То есть опять же вроде бы то, что надо. Однако не совсем то. Обнаружены такие недостатки:

1. Навигационная линейка по страницам правильно отображает количество документов и страниц, но работает неправильно.

2. Новости в одну ленту сливаются непредсказуемо - старые могут оказаться выше новых и всякое такое.

Наверняка от всего этого можно как-то избавиться (установкой фильтра, сортировкой или еще как-нибудь), и, возможно мы это сделаем.
Однако пока нам показался более приемлемым предыдущий вариант - два вызова Ditto, с четким разделением новостей и самостоятельной навигацией по разделам. А этот прием оставим пока для памяти.

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

 О других вариантах работы с новостями мы расскажем в дополнительных заметках.

06-02-2009 11:48:59



    Содержание раздела «Новости из разных папок»:
Комментарии любых посетителей

Написать комментарий