Кольцевая перелинковка в Drupal 7

(Ответов: 13, Просмотров: 5396)
Страница 1 из 2 12 Последняя
  1. Дипломник Аватар для misterBald
    • Регистрация: 06.01.2012
    • Сообщений: 159
    • Репутация: 29
    Недавно стал работать с Drupal 7. Практически сразу возникла некоторая трудность. Необходимо было организовать на сайте перелинковку между всеми статьями по кольцу, то есть:
    Статья1 --> Статья2 --> Статья3 --> ... --> СтатьяN --> Статья1
    К сожалению, простого готового простого решения найти не удалось. Есть, безусловно, различные модули и сниппеты для перелинковки, но чтобы именно по кольцу + гарантия что кольцо не оборвется - не нашел, а связываться с такими вещами как Views желания на тот момент не было.

    Вот и решил написать свой сниппет, который в конце каждого материала выводит две ссылки: на следующую и на предыдущую статьи. Причем, если просматриваемая статья последняя (т.е. следующей нет), то выводится ссылка на первый материал. И наоборот, если читаем первую статью (предыдущей нет) - видим ссылку на последнюю.

    Итак, вот код, который необходимо вставить в файл 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 код:
    <?php $prev_node prev_node($node); ?>
    2) Надо собственно вывести значение переменной:
    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. Если где-то был не точен в терминах, извиняйте. Ну и не стесняйтесь задавать вопросы.. хотя учитывая популярность ветки Друпала на этом форуме сомневаюсь что вопросов будет много :)
    Последний раз редактировалось misterBald; 03.09.2012 в 20:56.
    • 10

    Спасибо сказали:

    amaya(06.06.2015), arhimed(11.04.2014), Cepera(03.11.2012), den perek(06.03.2013), KipiaSoft(06.03.2013), mr.Temkin(07.11.2012), pesochek(11.09.2014), pselfin(03.09.2012), Psihard(03.04.2014), Web-change(06.07.2013),
  2. Дипломник Аватар для pselfin
    • Регистрация: 25.10.2011
    • Сообщений: 233
    • Репутация: 62
    Брат, ну такие вещи либо модулем оформлять уж, либо вьюхой делать.
    А так получается решение затачивается в тему оформления, не очень гибко...
    Хотя на "Спасибо" хряпну разумеется, в поддержку друпал-инициативы
    зы упомянуть модули http://drupal.org/project/prev_next и совсем свежий http://drupal.org/project/treewalk для похожих задач не лишним будет, надеюсь.
    Последний раз редактировалось pselfin; 03.09.2012 в 22:05.
    Надежный сервис выгодного обмена Cashadmin.ru (тема на форуме) .
    • 0
  3. Дипломник Аватар для misterBald
    • Регистрация: 06.01.2012
    • Сообщений: 159
    • Репутация: 29
    Согласен, что не самый гибкий вариант, зато довольно поучительный. В любом случае, я, пока разбирался, много нового узнал. Хотя до написания собственного модуля точно еще не дорос :)
    С views я пока что "на вы", поэтому оказалось проще вот такой вот сниппет организовать. Да и вьюхи ставить из-за двух ссылок по-моему как-то накладно, хотя может я заблуждаюсь
    • 0
  4. Студент
    • Регистрация: 06.10.2009
    • Сообщений: 45
    • Репутация: 19
    • Webmoney BL: ?
    Тоже оспасиблю, хотя такие вещи делать надо обязательно модулем, и желательно с комментами кода. Кстати с 7 версии можно вместо db_query использовать сразу хуки db_select, db_insert и т.д.
    • 0
  5. Новичок Аватар для mr.Temkin
    • Регистрация: 17.11.2010
    • Сообщений: 13
    • Репутация: 9
    Спасибо, давно искал решение этой проблемы.

    А как описанным способом можно оформить перелинковку с выводом предыдущих и следующих трёх статей, а не одной?
    Последний раз редактировалось mr.Temkin; 04.11.2012 в 23:00.
    • 0
  6. Дипломник Аватар для misterBald
    • Регистрация: 06.01.2012
    • Сообщений: 159
    • Репутация: 29
    mr.Temkin, хороший вопрос. Попробую ответить.

    Первое, что приходит в голову: для каждой из ссылок сделать свою функцию, т.е. prev_node1, prev_node2 и prev_node3. У нас есть часть кода, где мы задаем токен заапроса к базе данных :nid
    PHP код:
    array (':nid' => $node->nid,':type' => $node->type))->fetchObject(); 
    В данном случае мы берем nid текущей статьи и с его помощью делаем запрос к базе данных, получая массив данных, относящихся к предыдущей статье - $prev_node.

    А если мы возьмем и зададим :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.
    Банально, но я зарабатываю тут.
    • 1

    Спасибо сказали:

    mr.Temkin(07.11.2012),
  7. Новичок Аватар для mr.Temkin
    • Регистрация: 17.11.2010
    • Сообщений: 13
    • Репутация: 9
    Вам бы точно стоило выпустить такой модуль с расширенной версией перелинковки, шикарный инструмент бы вышел :)
    • 0
  8. Новичок Аватар для den perek
    • Регистрация: 19.06.2006
    • Сообщений: 4
    • Репутация: 4
    Супер, спасибо!
    • 0
  9. Новичок Аватар для Prospec
    • Регистрация: 18.01.2011
    • Сообщений: 10
    • Репутация: 9
    Здорово, спасибо !
    • 0
  10. Новичок Аватар для Concurent
    • Регистрация: 26.09.2007
    • Сообщений: 6
    • Репутация: 88
    очень, конечно, интересует кольцо по разделу из нескольких ссылок на странице
    • 0
Страница 1 из 2 12 Последняя

Похожие темы

Темы Раздел Ответов Последний пост
Перелинковка (посоветуйте)
Общие вопросы поисковой оптимизации 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

У кого попросить инвайт?

Вы можете попросить инвайт у любого модератора:

Информеры