Как просто показать блок NodeQueue на включенных узлах?

В моем блоге у меня есть серия сообщений на общую тему, которые я хотел бы связать вместе с общий блок навигации, чтобы читатели могли легко переходить по серии вперед или назад.

Я использовал NodeQueue, чтобы последовательно собрать все записи блога. Размещение связанного блока на моей боковой панели дает мне нужную мне навигацию, НО блок появляется на каждой странице моего сайта.

Я хочу ограничить видимость блока, чтобы он отображался только на страницах, включенных в очередь. Как я могу это сделать?

Я знаю, что NodeQueue создает свои блоки с помощью представлений, поэтому я полагаю, что ответ может быть больше связан с использованием представлений чем NodeQueue. Если есть модуль, который делает то, что мне нужно, было бы здорово. Если для ответа требуется PHP (скажем, для настройки видимости блока), мне понадобится некоторая помощь.

Блог работает на Drupal 6.19, и у меня есть тестовый экземпляр, на котором я могу попробовать что-то, прежде чем переходить к работающему сайту.


person Bevan    schedule 09.10.2010    source источник
comment
Думаю, у меня есть ответ, который мог бы вас удовлетворить. Но до этого имеет значение, если файл. блок связанных историй находится не на боковой панели, а в конце записи блога. b. Важен ли порядок элементов, отображаемых как связанные истории? c. Это нормально / не нормально, если история, которую вы в данный момент просматриваете, повторяется в виде ссылки в списке связанных историй? Или его следует исключить из списка историй части сериала   -  person Sid Kshatriya    schedule 11.10.2010
comment
@NoParrots - интересно. Чтобы ответить на ваши вопросы: в конце моей записи в блоге было бы хорошо, но не идеально; Порядок публикаций важен - некоторые из них представляют собой серию технических статей, каждая из которых основывается на том, что было написано ранее; Должен быть показан пост, который вы просматриваете в данный момент, в качестве контекста для того, где вы находитесь в последовательности.   -  person Bevan    schedule 11.10.2010


Ответы (3)


Видимость блока не имеет ничего общего с его содержимым. Если бы вы хотели отобразить статический блок для узлов в очереди, это было бы столь же сложно.

Я вижу возможные решения.

  • Ручной ввод узлов в настройках видимости блока и выбор показывать на перечисленных страницах
  • создать фрагмент PHP, чтобы проверить, видит ли пользователь узел, запросить базу данных, чтобы узнать, находится ли он в очереди. (Мне такой подход не нравится)

Первый дает больше возможностей для управления, но последний может легко сломаться, и я не люблю хранить код в базе данных.

person googletorp    schedule 09.10.2010
comment
Хотя у вас проблема перевернута - я хочу отображать блок nodequeue для всех блоков в очереди, а не статический - вы, по крайней мере, нашли решение: вручную перечислить все узлы из очереди в настройках видимости блока в Показать на перечисленных страницах. Не особенно аккуратный - и решение, требующее много ручного ухода. Тем не менее, решение, которое работает, превосходит все, что не работает. Спасибо. - person Bevan; 09.10.2010
comment
@Bevan Вы неправильно прочитали мой ответ. Я хотел сказать, что не имеет значения, какой блок вы хотите отображать в узлах очереди узлов, инструменты для этого одинаковы. Если вы часто меняете узлы в очереди, вы можете подумать о решении php. Вам нужно запросить таблицу nodequeue_nodes, чтобы узнать, находится ли текущий узел в очереди. - person googletorp; 10.10.2010
comment
Вы правы, я неправильно прочитал ваш ответ. На данный момент я вручную составлю список узлов - мои навыки PHP практически отсутствуют, но мне просто нужно научиться. - person Bevan; 10.10.2010

Хорошо, это немного длинное, но, на мой взгляд, элегантное решение. Надеюсь, это вас не отпугнет - это действительно несложно, но, в отличие от кода, его сложно объяснить в тексте. Было весело разобраться в этом. Этот ответ работает в Views версии 2 или выше. По сути, решение объединяет два модуля

  1. Представления прикрепляются (http://drupal.org/project/views_attach)
  2. Nodequeue (в частности, очередь таксономии)

Пожалуйста, прочтите о прикрепленных изображениях, прежде чем продолжить. Прикрепленные просмотры лучше всего объясняются этим видео http://mustardseedmedia.com/podcast/episode37

Очередь таксономии - это не что иное, как очередь узлов, которая автоматически создается для каждого термина таксономии в словаре. Допустим, у нас есть очередь узлов таксономии с именем My Lists. Допустим, у вас есть словарь под названием Series, в котором есть 3 термина: Apache Solr Tutorial Series, CSS Tips and Techniques Series, Drupal Views Tips Series. И если My Lists использует Series в качестве источника таксономии, то будут созданы 3 вложенные очереди - по одной для каждого термина.

В вашем блоге будет несколько серий статей (вы называете это статьями на «общую тему»). Каждая серия будет независимой от другой серии. Каждая серия будет содержать списки из 2 или более блогов. Важно отметить, что в предлагаемом мной решении блог может быть только частью 1 серии - я надеюсь, что это нормально. Мы используем решение на основе Nodequeue из-за вашего требования, чтобы порядок перечисления блогов в серии был важен и должен быть сохранен.

Сначала вам нужно создать словарь (допустим, мы называем его Series). Каждый раз, когда вы создаете новую серию блогов, вы будете создавать новый термин таксономии, например Apache Solr Tutorials Series, CSS Tips and Techniques Series и т. Д. Убедитесь, что словарь Series применим к вашему blog типу контента.

Теперь вам нужно создать очередь таксономии. Просто включите Smartqueue Taxonomy в списке модулей. Он поставляется со стандартным модулем Nodequeue. Щелкните Управление контентом> Nodequeue> очередь таксономии. Назовите очередь My Lists. Убедитесь, что вы выбрали Series в качестве словаря. Вы можете оставить длину очереди равной 0 (неограниченной), потому что в каждой серии блогов может быть любое количество блогов. В настоящее время:

  1. Link "add to queue" text: положить Add to %subqueue
  2. Link "remove from" queue text: положить Remove from %subqueue

Это своего рода удобство. Внизу каждого узла blog будут показаны ссылки для добавления или удаления из очереди соответствующей таксономии. Таким образом, если в статье блога есть термин таксономии CSS Tips and Techniques, она получит ссылку внизу полной страницы узла (или даже в виде тизера), чтобы ее можно было добавить в подочередь CSS Tips and Techniques в My Lists nodequeue.

На этом настройка очередей таксономии завершена.

Теперь мы переходим к приложению Views. Пожалуйста, включите модуль присоединения представлений, прежде чем продолжить. По сути, Views attach прикрепляет представление в конце узла. В нашем случае нашим представлением будет список других статей в серии (только если блог является частью серии).

По сути, нам нужно «передать» термин таксономии узла в представление. Этот термин таксономии выберет соответствующую вложенную очередь в My Lists nodequeue. Все элементы в этой подочереди будут показаны в точном порядке, указанном вами (через стандартный интерфейс Nodequeue).

Шаги, чтобы сделать вид.

  1. Назовем представление display_other_blogs_in_series.
  2. Добавьте отображение типа Node Content (доступно после включения вложения видов). Это отображение, аналогичное отображению блоков и страниц, но с особой способностью прикрепляться к узлу.

Выполните следующие настройки в Node Content Display

Node content settings
Node types: blog
Build modes: Teaser, Full node
Arguments: token
Show title: No

Вы должны выбрать Use tokens from the node the view is attached to в разделе «Аргументы». Пусть токен будет [term-id]. Это «ID основного термина таксономии». Это очень важно!! По сути, вы собираетесь передать термин таксономии узла блога из словаря Series (например, Советы и методы CSS) в качестве аргумента представления. Чтобы это произошло, словарь Series должен иметь наименьший вес. (См. http://groups.drupal.org/node/11788#comment-38332). Если у него самый низкий вес, словарь таксономии будет первым в разделе таксономии формы редактирования узла.

Теперь нам нужно указать нашему View принимать элементы только из очереди My Lists. Добавьте отношения Nodequeue: Queue. Убедитесь, что выбрано [x] Require this relationship. Убедитесь, что [x] Limit to one or more queues выбран с My list в качестве очереди.

Добавьте аргумент Nodequeue: Subqueue Reference. Убедитесь, что отношение равно queue, т. Е. Отношение, которое мы определили выше. Этот аргумент будет термином таксономии из Series словаря. Этот аргумент приведет к выбору правильной подочереди.

Добавьте интересующие вас поля, например Node: Title. Убедитесь, что Node: Title преобразован в гиперссылку, отметив Link this field to its Node

Добавьте Nodequeue: Position в качестве критерия сортировки. Убедитесь, что порядок сортировки возрастающий, и убедитесь, что используется связь queue.

Убедитесь, что в фильтрах вы добавили Node: Type = blog в качестве фильтра.

Итак, что будет делать это представление:

  1. Возьмите термин таксономии из Series словаря в узле, который просматривается в данный момент.
  2. Передайте это как аргумент представлению display_other_blogs_in_series
  3. Представление будет использовать этот аргумент для выбора соответствующей вложенной очереди в очереди My Lists.
  4. Элементы в подочереди будут перечислены один за другим точно в указанном вами порядке.
  5. Это будет правильно отображаться в каждом блоге, который является частью определенной серии.

Вот и все!

Постскриптум: если вы используете Просмотры 3 (на момент написания - alpha3) и, вам нужен блок (прямо сейчас соответствующие статьи находятся в конце узла body) вы можете сделать это следующим образом:

  1. Забудьте о прикреплении просмотров ... это не обязательно
  2. Добавьте вид блока. Он должен содержать те же аргументы, отношения, поля и фильтры, что и приведенные выше инструкции для Node Content дисплея.
  3. Вам нужно немного изменить настройки аргумента Nodequeue: Subqueue Reference: В разделе Action to take if argument is not present: выберите [x] Provide Default Argument. Выберите [x] Taxonomy Term ID from URL. Теперь убедитесь, что [] Load default argument from term page не выбран и [x] Load default argument from node page, thats good for related taxonomy blocks. Также [x]Limit terms by vocabulary, и выберите Series словарь.
  4. Убедитесь, что вы назвали блок и поместили его в соответствующий регион.
person Sid Kshatriya    schedule 11.10.2010
comment
Хорошее элегантное решение - попробую в своей песочнице. - person Bevan; 12.10.2010
comment
@Bevan: небольшой момент, если вы раньше не работали с очередями таксономии. Вложенная очередь создается явно только при добавлении в очередь. Чтобы сделать это в первый раз, щелкните ссылку «добавить» к ‹имени подочереди›, которая появится под каждым узлом блога. Перед этим вам нужно будет указать Series термин в форме редактирования узла для этого блога. - person Sid Kshatriya; 12.10.2010
comment
@Bevan: добавлены инструкции по добавлению серии в блок. Требуются Просмотры 3. - person Sid Kshatriya; 12.10.2010

Я на самом деле не играл с NodeQueue, но, судя по вашему описанию, это похоже на то, что вы должны уметь делать с помощью представлений. Пару мыслей.

Если вы используете отдельный тип контента только для записей блога, вы сможете добавить этот тип контента в качестве фильтра в представление. Это, наверное, было бы проще всего.

Если вы не можете этого сделать, я бы посмотрел, можете ли вы добавить фильтр для NodeQueue, поскольку он также должен работать.

Если ничего из вышеперечисленного не сработает, я посмотрю, сможете ли вы добавить связь с NodeQueue. Это, скорее всего, приведет к тому, что вы сможете добавить фильтр для NodeQueue.

Наконец, если вы не получили здесь удовлетворительного ответа, я бы посоветовал вам разместить свой вопрос на Drupal.org, поскольку именно там многие эксперты по drupal отвечают на вопросы.

person Sid_M    schedule 09.10.2010
comment
Сам блок работает так, как я хочу - он перечисляет все узлы, которые я перечислил в очереди. Это делается через представление с использованием отношения очереди к закрытым узлам. Что я хочу сделать, так это скрыть / показать блок на разных страницах сайта, в зависимости от того, является ли узел, показанный на странице, членом очереди. - person Bevan; 09.10.2010
comment
Ооо! Извините, я не знаю, почему я подумал, что это ответ на ваш вопрос. Вы можете взглянуть на модуль контекста. Я считаю, что он должен дать больше контроля над тем, где появляются блоки. - person Sid_M; 09.10.2010
comment
Также, если вы решите создать фрагмент php, один из способов минимизировать код в блоке - поместить фрагмент в функцию тематики, а затем вызвать тему (the_snippet_function) из блока. - person Sid_M; 09.10.2010