Скрытые фичи Panels: использование хитрого view display под названием "view context"

Главные вкладки

Аватар пользователя Товарищ 620 Товарищ 620 31 октября 2012 в 0:05

Сегодня в очередной раз был приятно удивлен возможностями Panels и View context в Drupal. Оказалось, однако, что на Drupal 7 эти возможности никто почти не использует, видимо потому, что про них просто мало кто знает (ну а конкретно ту штуку, которая нужна была мне - вообще никто не юзал с момента релиза D7, так как там в прицнипе был нерабочий код).
Старясь исправить ситуация хотя бы чуть-чуть, решил написать об этом тут.

Во Views есть такой вариант Display под названием "Context". Никогда раньше им не пользовался, но оказалось он делает офигенно полезные вещи.

Допустим стоит задача разместить на панели что-то, что как-то и достаточно хитро связано с уже имеющимися на панели контекстами, но с помощью Views в принципе вытаскивается. Можно конечно создать view типа content pane, параметаризовать её контекстом, и разместить на панели. Но хорошо, когда контекст уже есть, а что если нет? Что если стандартных, достаточно тривиальных контекстов, как то Node from Node (по поляем), Taxonomy from Node (по полям) (из ctools relashionships) не достаточно? Тут два варианта:

1) притягиваемые views panes параметаризовать имеющимся контекстом и строить сложный view, пока "не доберешься" до нужных данных (через views relashioships)
2) как-то добавить новые контексты которыми параметаризовать views panes, которые становятся теперь простыми, поскольку им сразу даются нужные параметры.

И вот, как раз второе можно сделать с помощью дисплея views context.

1. Сначала вы создаете display типа context, который вам вытаскивает нужные объекты (которые позже станут контекстами на панели)
2. Теперь в панелях в разеле контексты > relashionships добавляете эту появившуюся вьюху и она сама становится контекстом, но плюс
3. расширяет список relashionships, через который теперь можно притянуть то, что тащит уже сама вьюха. И вот это то - тоже становится контекстом!

Я не проврял пока ничего кроме притаскивания таким образом taxonomy terms (которые сперва не заработали - см. ссылку вверху - там блин был stuff из D6 Sad ), но полагаю работать должно как минимум для нодов.

Теперь, у вас есть возможность

1) Также просто размещать на панели куски притянутого контекста, поля - да всё что угодно.
2) Использовать притянутые контексты для параметаризации других вьюх

А также, будучит притянутой таким вот образом (через view context), вьюха становится доступной для операции Smile Вы можете вывести любую часть вьюхи где угодно в панели, на любой pane. Скажем, можно header вывести в панели слева, footer - сверху, результаты - в середине, а листалку - еще где-нибудь. Можно также разбить притянутую по номерам строк, выводя, скажем нечетные строки - слева, а четные - справа. Или вывести рекламу между 3 и 4-ой строкой. Еще можно вывести только отдельные поля из результатов.

В общем, спасибо Мерлину, он сегодня просвятил. Я пообещал ему поделиться с кем-нибудь. Делюсь.

p.s. Сорри что сумбурно, но просто нет времени.

best
OnkelTem

Комментарии

Аватар пользователя Eugeny Eugeny 31 октября 2012 в 2:47

Спасибо. Но текст с трудом усваивается. Если не сложно приведите какой-нибудь пример где эта штука понадобиться.

Аватар пользователя Товарищ 620 Товарищ 620 31 октября 2012 в 12:47

"Ромка" wrote:
осмотрите это видео: http://drupalize.me/videos/views-context, да и все остальные видео серии, в них много интересного рассказывается, в т.ч. и о дисплей тайпе контекст.

Ага, спасибо, что-то в этом роде. Только там самое интересное как начинается в конце - ошибки валятся, видимо скринкаст писался, когда совсем сырая семёрка ещё была. У меня вот такая же хрень была когда я пытался Term from view притащить. Но сейчас уже всё ок будет, если патчик навернуть.

"Eugeny" wrote:
Спасибо. Но текст с трудом усваивается. Если не сложно приведите какой-нибудь пример где эта штука понадобиться.

В качестве примера я могу описать свою задачу, которую решаю.

1. Есть справочник таксономии "Категории товаров"
2. Также есть "база товаров", которые привязаны к категориям (используется Drupal Commerce)
3. Страницы вида taxonomy/term/%term переопределены в Page Manager и они выводят:
3.1 view с товарами текущей категории (ну и с фильтрами и листалкой)
3.2 короткое описание катеории с иконкой (тизер), и ссылку на страницу "подробнее о категории".
4. Страница с описанием категории содержит:
4.1 развернутое описание категории
4.2 колонку новостей привязанных к данной категории
4.3.список вложенных категорий, выводимых ссылками, ведущих на аналогичные страницы-описания категорий.

Минимальная очевидная модель для этого:

1. Создаем Node типа "Описание катеории"
2. Добавляем в Taxonomy_term поле "Ссылка на описание" типа EntityReference, ссылающееся на ноды с описаниями.

На странице товаров выводить тизер описания - элементарно, так как на странице taxonomy/term/%term
есть контекст Term, а он содержит поля, среди которых есть "Ссылка на описание". Так что можно добавить на панель:

1. либо значение этого поля из группы Taxonomy term, выбрав режим "Teaser" со ссылкой подробнее.
2. либо вначале вначале добавить полноценый контекст Node типа "Описание категории" в закладке Contexts из списке Relapshionships, а потом уже положить его на панель, скажем, через Entity > Rendered Entity, опять же выбрав режим "Teaser" со ссылкой подробнее. Это более универсальный способ, потому как имея полноценный контекст, мы не ограничены field_formatter'ом, и можем по кускам исползовать контекст.

Половина дела сделано. А вот теперь предстоит на странице описания категории:

1) как-то вытащить саму категорию (обратной то ссылки с Node на Term у нас нет)
2) отфильтровать новости по этой категории
3) вывести список вложенных в категорию категорий.

Как эта задача решается по-человечески без view context? Я вот два дня думал, ничего не придумал, кроме как добавить в Node обратную ссылку на Term, что есть плохо.

А с помощью view context мы делаем следующее:

1. Создаем view, которая выбирает taxonomy term для переданного в кач аргумента node_id и ставим ей display mode = context
2. В свойстве Argument Input ставим: from Context > Node > Content ID.
3. Создаем в панели node/%node вариант для Node тип "Описание категории" (выбор варианта - по типу ноды)
4. В закладке Context в Relashionships добавляем созданную view и в кач аргумента выбираем уже имеющийся контекст Node.
5. Там же в Relashionships добавляем появившую связь-контекст "term from view" и указываем, чтобы брался первый терм (row 1).
6. Теперь при добавлении контента на панель у нас помимо "Node being viewed" есть контекст "term from view" и мы можем использовать его как если бы мы были на страничке "taxonomy/term/%term".
7. Создаем view, которая выводит новости для переданного в кач аргумента term_id и ставим ей display mode = content pane.
8. В свойстве Argument Input ставим: from Context > Taxonomy Term > Term ID.
9. Кладем вьюху на панель, и указываем в кач аргумента "term from view".
10. Ну и так далее.

Надеюсь так более наглядно? Smile

Аватар пользователя magazins magazins 13 мая 2014 в 15:04

Quote:

Надеюсь так более наглядно? :)

Простите, а можно в скриншотах или более полный путь пошаговый, что-то вообще путаница.

Или может есть другой путь для вывода описания категории?

Аватар пользователя Antoniy Antoniy 10 декабря 2012 в 15:38

"Valeratal" wrote:
но все равно не понял

Ага, я тоже.. Это надо как-то адаптировать под какие-то свои задачи, тогда будет понятнее..

Аватар пользователя carbide carbide 27 декабря 2012 в 19:27

Странно, никогда не замечал этой вкладки во views. Спасибо.
Имхо, проще написать ctools плагин для контекста, заранее более гибко и расширять можно вне зависимости от функционала views.