Ссылка на соседние статьи в articles

Всем привет!

Тут на днях столкнулся с проблемой: есть сайт (motorespect.com), в нем 2 раздела: новости и статьи, оба организованы в формате блога с помощью сниппета articles. Появилась задача: нужно в каждой статье и в каждой новости, после основного контента, поставить ссылки, типа — «предыдущая новость» «следующая новость».

Я 2 дня рыл modx и гугл, толку ноль! Так понимаю, что у articles нет встроенного плейсхолдера для этой задачи… хотел наваять простенький сниппет, который будет возвращать ссылку по ID текущей страницы +, — 1, да вот незадача: все ресурсы от articles упрятаны в один контейнер, у каждого есть свой ID, но идентификаторы присваиваются статьям/новостям по времени их добавления! То есть, если последняя добавл.новость имеет id = 300, а статья — 295, то — если добавляем статью — ей присваивается id=301, а не 296… получается, что все ресурсы articles валятся в общую кучу, но в каждой из них есть своя метка принадлежности своему контейнеру… я так это понял!

К сожалению, pdotools не годится для этой задачи: проблема с настройкой сервера хостинга…

Пытался с помощью getResurces вывести — указав родительский контейнер, не могу сообразить как поставить сортировку (или фильтр), чтобы выводил соседние ресурсы…

Друзья, подскажите, в какую сторону глядеть??? Я в MODx новичок, система очччень нравится, огромное желание её освоить! Пока, к сожалению, пытаюсь набираться опыта у более взрослых коллег…

С уважением, Алексей.

Comments

Воспользуйся плагином siblingNav:

  1. Установи его
  2. В шаблоне статьи, там где нужно разместить ссылки на предыдущую и следующую статьи помести код:
[[!siblingNav? &showHidden=`1` &limit=`1` &sortBy=`{"publishedon":"ASC"}`]]
[[+sn.first]][[+sn.prev]][[+sn.prevlinks]][[+sn.self]][[+sn.nextlinks]][[+sn.next]][[+sn.last]]

Если сортировка неправильная, то вместо ASC ставь DESC. Получится такой вид, как на картинке: http://nimb.ws/duswvQ Это поможет тебе убедиться, что все работает 3) Из второй строки кода, который я привел, удали ненужные теги. Например если, не нужно отображать ссылки на первую и последнюю страницу — удаляй [[+sn.first]] и [[+sn.last]] Для оставшихся тегов пропиши шаблоны в вызов плагина. То есть в первой строке перед закрывающимися скобками ставишь пробел и добавляешь параметры:

&rowTpl=`siblings.RowTpl` &selfTpl=`siblings.SelfTpl` &prevTpl=`siblings.PrevTpl` &nextTpl=`siblings.nextTpl` &firstTpl=`siblings.firstTpl` &lastTpl=`siblings.lastTpl`
  1. Cоздай чанки с соответствующими именами(siblings.RowTpl, siblings.PrevTpl, и т.д.). Что туда писать можно подсмотреть в тех чанках, что идут по умолчанию (они лежат в папке /core/components/siblingnav/elements/chunks). Например в siblings.nextTpl:
<li>
	[[+_isactive:is=`1`:then=`
	<a class="btn next" href="[[~[[+id]]]]">Следущая »</a>  
	`:else=`
	''
	`]]	
</li>

Если хочется использовать названия статей вместо «Следущая» или «Предыдущая», то используй плейсхолдер [[+pagetitle]] 5) С помощью CSS приведи ссылки в божеский вид(убирай буллиты, если использовал тег , делай кнопками, используя классы, располагай в одну строчку и т.д.)

Забыл еще параметр parents. Если я правильно понял, то ты хочешь, чтобы новости и статьи были одной коллекцией? Тогда указывай в параметрах parents=10,12``, где 10 и 12 это id контейнеров «Новости» и «Статьи».

Андрей, спасибо огромное за развернутый ответ! Да, воспользовался этим замечательным сниппетом! Немного пришлось помучаться с направлением сортировки — по замыслу, две предыдущие новости должны выводиться так: более новая выше, а вторая, которая ниже, более древняя! Подумал и разобрался… сейчас все в ажуре!) Ещё раз — благодарю…

Спасибо. Ну, там всего два варианта, зачем мучиться? :) ASC и DESC.

Вот сам вызов сниппета:

<ul>
[[!siblingNav? 
   &showHidden=`1`
   &prevTpl=`snprevtpl`
   &limit=`2`
   &nextTpl=`snnexttpl`
   &selfTpl=`snselftpl`
]]
[[+sn.next]][[+sn.self]][[+sn.prevlinks]]
</ul>

По задумке, он должен выводить маркированный список из 4 пунктов. Сверху вниз: ссылка на следующую новость, название текущей статьи, ссылка на предыдущую новость, ссылка на пред-предыдущую!))) Все получилось, но — две нижние ссылки были поменяны местами — сверху была более старая ссылка, а ниже — более новая… по задумке нужно было наоборот!

При попытке добавить параметр

&sortBy=`{"menuindex":"DESC"}`

, все строки целиком менялись местами, т.е., след.новость шла нижней строкой и т.д…

Методом тыка пришел к такому вызову:

[[!siblingNav? 
   &showHidden=`1`
   &prevTpl=`snprevtpl`
   &limit=`2`
   &nextTpl=`snnexttpl`
   &selfTpl=`snselftpl`
   &sortBy=`{"menuindex":"DESC"}`
]]
[[+sn.prev]][[+sn.self]][[+sn.nextlinks]]

Тогда всё заработало как надо…

Да, и объясните, пожалуйста, в чанке есть строка

[[+_isactive:is=`1`:then=`

, что это за параметр и почему там цифра 1? Я порыл в гугле, но найти не смог, к сожалению!

  1. Путаница с порядком сортировки возникает из-за того, что у тебя направление статей от старой к новым — снизу вверх, а автор сниппета держал в голове при написании, наверное, слева направо. Управлять этим можно либо поменяв местами плейсхолдеры next и prev, либо как ты сделал — меняя порядок сортировки (возрастание/убывание).

  2. 1 и 0 — это true и false. Если есть что отображать в шаблоне, то сниппет кладет в _isactive единицу, если нет — то ноль. Это позволяет делать активные ссылки, если есть контент и неактивные, если нет.

[[+sn.first]] — если текущая статья близко «старому» концу списка (третья при твоем limit=2), то от сниппета в шаблон firsttpl (если б ты его создал и использовал) придет _isactive=0 и на месте плейсхолдера [[+sn.first]] на странице отобразится неактивная ссылка (тот код, что в ветке else).

[[+sn.prev]] — если текущая статья близко к «старому» концу списка (предпоследняя или последняя при твоем limit=2), то в шаблон snprevtpl придет значение _isactive=0 и на месте плейсхолдера [[+sn.prev]] отобразится код ветки else.

[[+sn.next]] и [[+sn.last]] — аналогично. Если текущая статья близко к «новому» краю списка, то в шаблоны, отвечающие за вывод HTML кода в эти плейсхолдеры приходит _isactive=0 и при рендеринге шаблонов snnexttpl и snlast (если б он у тебя был) на страницу попадает код из веток else.

[[+sn.prevlinks]] и [[+sn.nextlinks]] — в эти плейсхолдеры подставляется код, отрендеренный с помощью чанка core/components/siblingnav/elements/chunks/snrow.chunk.html. Ты и его можешь переопределить своим чанком, если воспользуешься параметром &rowTpl.

[[+sn.self]] — за вывод в него отвечает чанк core/components/siblingnav/elements/chunks/snself.chunk.html, который можно переопределить с помощью параметра selfTpl. Но с этим ты разобрался.

А я ж в первой инструкции писал про сортировку — если порядок неправильный, просто DESC вместо ASC.

Да, я помню! Как и писал уже — после перенаправления сортировки пришлось менять местами плейсхолдеры вывода предыдущих и последующих новостей…

Это потому что у тебя сортировка по menuindex, а я писал о publishedon. menuindex — это позиция ресурса в контейнере в дереве ресурсов слева. Articles скрывает элементы в дереве, отображая их вместо этого в таблице. Статьи у тебя идут в том же порядке, что и в этой таблице — это хорошо. Но, если ты добавишь статью с датой публикации, например прошлым годом, то она будет все равно отображаться первой, с articles ты лишаешься возможности перетаскивать ресурсы и управлять значением menuindex. Используя publishedon, ты можешь поменять дату публикации, открыв и отредактировав статью и передвинуть ее на сайте в прошлое, c menuindex — нет.