Недавно стал работать с Drupal 7. Практически сразу возникла некоторая трудность. Необходимо было организовать на сайте перелинковку между всеми статьями по кольцу, то есть:К сожалению, простого готового простого решения найти не удалось. Есть, безусловно, различные модули и сниппеты для перелинковки, но чтобы именно по кольцу + гарантия что кольцо не оборвется - не нашел, а связываться с такими вещами как Views желания на тот момент не было.Статья1 --> Статья2 --> Статья3 --> ... --> СтатьяN --> Статья1
Вот и решил написать свой сниппет, который в конце каждого материала выводит две ссылки: на следующую и на предыдущую статьи. Причем, если просматриваемая статья последняя (т.е. следующей нет), то выводится ссылка на первый материал. И наоборот, если читаем первую статью (предыдущей нет) - видим ссылку на последнюю.
Итак, вот код, который необходимо вставить в файл template.php, лежащий в папке используемой на сайте темы:
Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 3 сообщение(ий)):У вас нет прав чтобы видеть скрытый текст, содержащийся здесь.
Пусть у нас есть таблица node следующего вида:
nid title type status 1 Интересная статья article 1 2 Хорошая статья article 1 3 Нужная статья article 1
Разберем код на примере функции prev_node, возвращающей нам готовую к выводу html-строку :
Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 3 сообщение(ий)):У вас нет прав чтобы видеть скрытый текст, содержащийся здесь.
В функции next_node все аналогично. Теперь нам надо вставить готовую к выводу ссылку в шаблон node.tpl.php. Где именно вставлять - дело уже ваше, все от шаблона зависит. Расскажу лишь принцип, пример, опять же, с функцией prev_node:
1) Необходимо в самом шаблоне node.tpl.php некоторой переменной присвоить значение, получаемое из функции prev_node:PHP код:2) Надо собственно вывести значение переменной:<?php $prev_node = prev_node($node); ?>PHP код:Этот код вставляем там, где необходима ссылка на предыдущую статью.<?php print $prev_node ?>
У меня в node.tpl.php получилось что-то типа:PHP код:Тут, кстати, есть небольшая хитрость:<div class="node-navigator">
<?php
$prev_node = prev_node($node);
$next_node = next_node($node);
?>
<div class="prev-node"><?php print $prev_node ?></div>
<div class="next-node"><?php print $next_node ?></div>
<div class="cleaner"></div>
</div>
Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 5 сообщение(ий)):У вас нет прав чтобы видеть скрытый текст, содержащийся здесь.
Вот собственно и все. Таким несложным способом мы получаем кольцевую перелинковку статей.
P.S. Если где-то был не точен в терминах, извиняйте. Ну и не стесняйтесь задавать вопросы.. хотя учитывая популярность ветки Друпала на этом форуме сомневаюсь что вопросов будет много :)
- 03.09.2012 20:42
Последний раз редактировалось misterBald; 03.09.2012 в 20:56.
- 03.09.2012 22:00
Брат, ну такие вещи либо модулем оформлять уж, либо вьюхой делать.
А так получается решение затачивается в тему оформления, не очень гибко...
Хотя на "Спасибо" хряпну разумеется, в поддержку друпал-инициативы
зы упомянуть модули http://drupal.org/project/prev_next и совсем свежий http://drupal.org/project/treewalk для похожих задач не лишним будет, надеюсь.Последний раз редактировалось pselfin; 03.09.2012 в 22:05.
- 04.09.2012 01:47
Согласен, что не самый гибкий вариант, зато довольно поучительный. В любом случае, я, пока разбирался, много нового узнал. Хотя до написания собственного модуля точно еще не дорос :)
С views я пока что "на вы", поэтому оказалось проще вот такой вот сниппет организовать. Да и вьюхи ставить из-за двух ссылок по-моему как-то накладно, хотя может я заблуждаюсь
- 03.11.2012 21:23
- 04.11.2012 22:44
Спасибо, давно искал решение этой проблемы.
А как описанным способом можно оформить перелинковку с выводом предыдущих и следующих трёх статей, а не одной?Последний раз редактировалось mr.Temkin; 04.11.2012 в 23:00.
- 06.11.2012 05:48
mr.Temkin, хороший вопрос. Попробую ответить.
Первое, что приходит в голову: для каждой из ссылок сделать свою функцию, т.е. prev_node1, prev_node2 и prev_node3. У нас есть часть кода, где мы задаем токен заапроса к базе данных :nidPHP код:В данном случае мы берем nid текущей статьи и с его помощью делаем запрос к базе данных, получая массив данных, относящихся к предыдущей статье - $prev_node.array (':nid' => $node->nid,':type' => $node->type))->fetchObject();
А если мы возьмем и зададим :nid равным nid предыдущей статьи? Правильно - получим из запроса к БД массив данных, относящихся к пред-предыдущей статье. А если возьмем nid пред-предыдущей - получим данные о пред-пред-предыдущей :) Все логично. А вот с технической стороны точно будут проблемы (решаемые). Попробую что-то придумать:
1) Берем и задаем переменную, равную nid предыдущей статьи, что-то типа: $pnid1=(($node->nid)-1)
2) От переменной не будет толку, если она окажется равной нулю (т.к. статей с таким nid просто нет) - надо будет сделать проверку. Если все ок, то смело делаем запрос к БД и тд... Если не ок (предыдущей статьи не существует), то надо обратиться к БД, найти максимальный nid (для последней статьи) и приравнять его к значению переменной $nid1.
3) В случае с $pnid2=(($node->nid)-2) еще сложнее. Она может оказаться как равной нулю, так и равной -1. Если ноль - см пункт 2. Если -1, то надо приравнять $pnid2 к максимальному nid минус 1, а для этого потребуется запрос к БД с целью установления этого самого максимального nid.
4) Когда речь пойдет о функциях next_node, то в каждом случае придется предварительно узнавать максимальный nid и сравнивать с ним значения переменных $nnid1 и $nnid2. И если случилось так, что одна из этих переменных больше чем макс nid, то делать запрос к БД, находя там минимальный nid и приравнивать к нему (и к мин nid + 1).
Как-то так получается. Честно скажу, реализовать все это в виде кода я сейчас не готов.
---------- Сообщение добавлено 04:48 ---------- Предыдущее 04:44 ----------
P.S. Писал что называется на одном дыхании, перечитал и решение стало казаться слишком громоздким. Уверен, что можно придумать что-то поэлегантнее. (Например, сделать все это циклом, где задается количество ссылок которые необходимо вывести.. - но это уже точно модуль писать надо.)Последний раз редактировалось misterBald; 06.11.2012 в 06:01.
Спасибо сказали:
mr.Temkin(07.11.2012), - 07.11.2012 19:49
Вам бы точно стоило выпустить такой модуль с расширенной версией перелинковки, шикарный инструмент бы вышел :)
- 06.03.2013 19:23
Супер, спасибо!
- 17.04.2013 16:41
Здорово, спасибо !
- 06.09.2013 13:59
очень, конечно, интересует кольцо по разделу из нескольких ссылок на странице
Тэги топика:
- db_query,
- drupal,
- node,
- node-,
- prev_node,
- title,
- type,
- данный,
- запрос,
- значение,
- кольцевой,
- максимальный,
- перелинковка,
- переменная,
- пока,
- предыдущий,
- равный,
- статья,
- функция
Похожие темы
| Темы | Раздел | Ответов | Последний пост |
|---|---|---|---|
Перелинковка (посоветуйте) | Общие вопросы поисковой оптимизации | 16 | 21.08.2012 02:40 |
Перелинковка от webeffector'a? | Автопродвижение в агрегаторах | 3 | 14.02.2012 12:59 |
Внутренняя перелинковка в CMS DLE | Дайджест блогосферы | 7 | 24.12.2011 14:14 |
Внутренняя перелинковка | Вопросы от новичков | 3 | 12.11.2011 19:53 |
Перелинковка профилей | Дорвеи и black SEO | 19 | 07.12.2010 18:22 |



