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

14 авг. 2015 г., 20:25

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

В блоге Песочница

Всем привет!
Тут на днях столкнулся с проблемой: есть сайт (motorespect.com), в нем 2 раздела: новости и статьи, оба организованы в формате блога с помощью сниппета articles. Появилась задача: нужно в каждой статье и в каждой новости, после основного контента, поставить ссылки, типа — «предыдущая новость» «следующая новость».
Я 2 дня рыл modx и гугл, толку ноль! Так понимаю, что у articles нет встроенного плейсхолдера для этой задачи… хотел наваять простенький сниппет, который будет возвращать ссылку по ID текущей страницы +, — 1, да вот незадача: все ресурсы от articles упрятаны в один контейнер, у каждого есть свой ID, но идентификаторы присваиваются статьям/новостям по времени их добавления! То есть, если последняя добавл.новость имеет id = 300, а статья — 295, то — если добавляем статью — ей присваивается id=301, а не 296… получается, что все ресурсы articles валятся в общую кучу, но в каждой из них есть своя метка принадлежности своему контейнеру… я так это понял!
К сожалению, pdotools не годится для этой задачи: проблема с настройкой сервера хостинга…
Пытался с помощью getResurces вывести — указав родительский контейнер, не могу сообразить как поставить сортировку (или фильтр), чтобы выводил соседние ресурсы…
Друзья, подскажите, в какую сторону глядеть??? Я в MODx новичок, система очччень нравится, огромное желание её освоить! Пока, к сожалению, пытаюсь набираться опыта у более взрослых коллег…
С уважением, Алексей.
Воспользуйся плагином 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`
4) 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 b 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 — нет.

Добавить комментарий