Нам необходимо отображать в ленте некоторое минимальное количество новостей, иначе, после отправки в архив сразу всех новостей за месяц сайт будет выглядеть несолидно. Перетаскивание новостей поштучно, вручную, создает много работы редактору. Снимать новости с публикации или удалять никак нельзя - таково требование заказчика. Как же решить эту проблему?
Напрашиваются различные пути:
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, с четким разделением новостей и самостоятельной навигацией по разделам. А этот прием оставим пока для памяти.
Да, мы нашли, как устранить упомянутые сбои. Необходимо страницу, куда выводятся новости сделать некэшируемой. В результате ленты из разных папок правильно сливаются и навигатор правильно работатет. Но что-то этот вариант (за который мы и боролись) теперь посознательно кажется менее удобным. На сей момент окончательного решения мы не приняли, а как в итоге сделали вы увидите на главной странице сайта.
О других вариантах работы с новостями мы расскажем в дополнительных заметках.
Написать комментарий