Передача аргумента из URL-адреса на панели в панель просмотра или блок
У меня есть страница, на которой я хочу отобразить все ресурсы для курса, сгруппированные по термину таксономии. Курсы являются органическими группами, а ресурсы - это материалы, принадлежащие этим группам. Я использую панели для отображения содержимого, и для этого я переопределяю view_node. Я уже создал панель просмотра, в которой перечислены все различные категории ресурсов, и теперь я пытаюсь перечислить все ресурсы для категории.
Панель использует следующую структуру URL-адресов:
Курс/название курса/ресурсы/термин таксономии ресурсов
Так, например, у меня есть URL-адрес
/курс/тест-курс/ресурсы/транспорт
Затем я хочу отобразить все ресурсы, относящиеся к термину таксономии "транспорт". Поэтому я предполагаю, что аргумент URL, который я хочу передать, равен %4.
Я уже больше дня пытаюсь разными способами передать аргумент URL в представление, но безуспешно. Я пробовал использовать панель просмотра для отображения результатов, а также блок просмотра, и исследовал различные методы передачи аргумента без успеха. Он отлично работает в самом представлении, но когда я помещаю его на панель, он не работает. Кто-нибудь может показать мне, как я могу это сделать?
Я использую D7.18, технические средства 7.x-1.0-rc1, панели 7.x-3.0 и представления 7.x-3.7.
4 answers
Пример сценария:
Существует панель, содержащая панель просмотра содержимого.
URL панели: /panel_url
Пример с аргументом: /panel_url/имя термина
С BEF: /panel_url?категория=123
Как настроить (имея существующую панель и добавленную панель содержимого):
- Добавьте контекстный фильтр в представление. Например: Просмотр имени таксономии контекстных фильтров
- Измените настройки в разделе "Вид -> Настройки панели ->Ввод аргументов", чтобы загрузить аргумент "Из аргумента панели" (например, Первый).
Готово.
Кроме того, если вы используете Улучшенные фильтры , вы можете внести следующие улучшения.
Чтобы установить текущую активную ссылку на основе аргумента (если вы используете select_as_links):
/**
* Implements hook_preprocess_[themeFunctionName]().
*/
function foo_preprocess_select_as_links(&$variables) {
$options = isset($variables['element']['#options']) ? array_change_key_case(array_flip($variables['element']['#options']), CASE_LOWER) : array();
$selected = end((arg()));
if (array_key_exists($selected, $options)) {
$variables['element']['#value'] = $options[$selected];
}
}
Чтобы установить текущую активную ссылку на основе аргумента (если вы используете select):
/**
* Implements hook_preprocess_[themeFunctionName]().
*/
function foo_preprocess_select(&$variables) {
switch (arg(0)) {
case 'panel_url':
if (@$variables['element']['#name'] == 'category') {
$options = isset($variables['element']['#options']) ? array_change_key_case(array_flip($variables['element']['#options']), CASE_LOWER) : array();
$selected = end((arg()));
if (array_key_exists($selected, $options)) {
if ($variables['element']['#value'] <> $options[$selected]) {
$variables['element']['#value'] = $options[$selected];
} else {
// drupal_goto('panel_url');
}
}
}
break;
}
}
Чтобы сделать ссылки SEO-дружественными, вы можете попробовать что-то вроде:
/**
* Implements hook_url_inbound_alter().
*/
function foo_url_outbound_alter(&$path, &$options, $original_path){
if (arg(0) == 'panel_url') {
// Convert URL like: /panel_url?category=29 into /panel_url/term_name (SEO friendly)
$path_info = parse_url($path);
switch (@$path_info['path']) {
case 'panel_url/term_name':
case 'panel_url/term_name2':
$path = 'panel_url/all'; // Convert loopy urls into base url
}
if (strpos($path, '?category=') !== FALSE) { // Convert term id into human name
list(, $tid) = explode('=', current(explode('&', $path_info['query']))); // get tid from URL
$term_name = strtolower(taxonomy_term_load((int)$tid)->name);
$path = '/panel_url' . '/' . $term_name; // See also: $path_info['path']
}
}
}
Мне удалось решить эту проблему. Решение не совсем то, на что я надеялся, но оно работает.
Прежде всего, я изменил аргумент URL, чтобы использовать идентификатор термина, а не имя термина на панели. Затем в области просмотра вместо использования "идентификатор термина таксономии из URL" в разделе "предоставить аргумент по умолчанию" настроек контекста я использовал "исходное значение из URL" и указал компонент пути. Мне также нужно было настроить базовую проверку для использования термина id.
Я бы все еще было бы интересно услышать, есть ли более аккуратный способ сделать это, где можно было бы использовать название термина в URL-адресе вместо идентификатора.
На панели просмотра создайте связь с термином таксономии. Как только вы это сделаете, создайте контекстный фильтр на основе этой связи, чтобы передать имя термина. Установите фильтр так, чтобы он принимал необработанный аргумент URL, укажите номер элемента в пути, и это все.
Мои проблемы с передачей аргумента были вызваны недостаточным пониманием панелей/страниц. Я ошибочно создал узел (из базового типа содержимого страницы), ожидая, что смогу отредактировать его в панелях для отправки аргумента. Добавление аргумента в URL-путь всегда приводило к тому, что страница не была найдена.
Позже я понял, что мне нужно перейти в раздел Структура > Страницы> Добавить пользовательскую страницу, а затем добавить представление панели содержимого, чтобы эффективно передать аргумент. Также необходимо было убедиться, что в представлении панели содержимого был правильно задан ввод аргументов, прежде чем его удалось найти на пользовательской странице.
Я нашел, где я ошибся, читая этот учебник: http://www.metaltoad.com/blog/passing-page-arguments-view-panes