mg15 14 августа 2015 1 9
Всем привет!

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

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

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

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

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

С уважением, Алексей.
9 комментариев
4
4ster 18 августа 2015г в 12:33 #
Воспользуйся плагином 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 приведи ссылки в божеский вид(убирай буллиты, если использовал тег , делай кнопками, используя классы, располагай в одну строчку и т.д.)
4
4ster 18 августа 2015г в 12:43 #
Забыл еще параметр parents. Если я правильно понял, то ты хочешь, чтобы новости и статьи были одной коллекцией? Тогда указывай в параметрах parents=`10,12`, где 10 b 12 это id контейнеров «Новости» и «Статьи»
m
mg15 18 августа 2015г в 17:10 #
Андрей, спасибо огромное за развернутый ответ! Да, воспользовался этим замечательным сниппетом! Немного пришлось помучаться с направлением сортировки — по замыслу, две предыдущие новости должны выводиться так: более новая выше, а вторая, которая ниже, более древняя! Подумал и разобрался… сейчас все в ажуре!)
Ещё раз — благодарю…
4
4ster 18 августа 2015г в 19:19 #
Спасибо. Ну, там всего два варианта, зачем мучиться? :) ASC и DESC.
m
mg15 19 августа 2015г в 11:13 #
Вот сам вызов сниппета:
<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? Я порыл в гугле, но найти не смог, к сожалению!
4
4ster 19 августа 2015г в 15:08 #
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. Но с этим ты разобрался.
4
4ster 19 августа 2015г в 15:17 #
А я ж в первой инструкции писал про сортировку — если порядок неправильный, просто DESC вместо ASC.
m
mg15 19 августа 2015г в 15:22 #
Да, я помню! Как и писал уже — после перенаправления сортировки пришлось менять местами плейсхолдеры вывода предыдущих и последующих новостей…
4
4ster 19 августа 2015г в 17:05 #
Это потому что у тебя сортировка по menuindex, а я писал о publishedon. menuindex — это позиция ресурса в контейнере в дереве ресурсов слева. Articles скрывает элементы в дереве, отображая их вместо этого в таблице. Статьи у тебя идут в том же порядке, что и в этой таблице — это хорошо. Но, если ты добавишь статью с датой публикации, например прошлым годом, то она будет все равно отображаться первой, с articles ты лишаешься возможности перетаскивать ресурсы и управлять значением menuindex. Используя publishedon, ты можешь поменять дату публикации, открыв и отредактировав статью и передвинуть ее на сайте в прошлое, c menuindex — нет.
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.