Передача аргумента из URL-адреса на панели в панель просмотра или блок


У меня есть страница, на которой я хочу отобразить все ресурсы для курса, сгруппированные по термину таксономии. Курсы являются органическими группами, а ресурсы - это материалы, принадлежащие этим группам. Я использую панели для отображения содержимого, и для этого я переопределяю view_node. Я уже создал панель просмотра, в которой перечислены все различные категории ресурсов, и теперь я пытаюсь перечислить все ресурсы для категории.

Панель использует следующую структуру URL-адресов:

Курс/название курса/ресурсы/термин таксономии ресурсов

Так, например, у меня есть URL-адрес

/курс/тест-курс/ресурсы/транспорт

Затем я хочу отобразить все ресурсы, относящиеся к термину таксономии "транспорт". Поэтому я предполагаю, что аргумент URL, который я хочу передать, равен %4.

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

Я использую D7.18, технические средства 7.x-1.0-rc1, панели 7.x-3.0 и представления 7.x-3.7.

Author: kiamlaluno, 2013-05-14

4 answers

Пример сценария:

Существует панель, содержащая панель просмотра содержимого.

URL панели: /panel_url

Пример с аргументом: /panel_url/имя термина

С BEF: /panel_url?категория=123

Как настроить (имея существующую панель и добавленную панель содержимого):

  1. Добавьте контекстный фильтр в представление. Например: Просмотр имени таксономии контекстных фильтров
  2. Измените настройки в разделе "Вид -> Настройки панели ->Ввод аргументов", чтобы загрузить аргумент "Из аргумента панели" (например, Первый).

Готово.


Кроме того, если вы используете Улучшенные фильтры , вы можете внести следующие улучшения.

Чтобы установить текущую активную ссылку на основе аргумента (если вы используете 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']
    }
  }
}
 3
Author: kenorb, 2017-04-13 12:46:58

Мне удалось решить эту проблему. Решение не совсем то, на что я надеялся, но оно работает.

Прежде всего, я изменил аргумент URL, чтобы использовать идентификатор термина, а не имя термина на панели. Затем в области просмотра вместо использования "идентификатор термина таксономии из URL" в разделе "предоставить аргумент по умолчанию" настроек контекста я использовал "исходное значение из URL" и указал компонент пути. Мне также нужно было настроить базовую проверку для использования термина id.

Я бы все еще было бы интересно услышать, есть ли более аккуратный способ сделать это, где можно было бы использовать название термина в URL-адресе вместо идентификатора.

 2
Author: Ben, 2013-05-14 12:27:04

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

 0
Author: user140, 2015-11-14 11:42:28

Мои проблемы с передачей аргумента были вызваны недостаточным пониманием панелей/страниц. Я ошибочно создал узел (из базового типа содержимого страницы), ожидая, что смогу отредактировать его в панелях для отправки аргумента. Добавление аргумента в URL-путь всегда приводило к тому, что страница не была найдена.

Позже я понял, что мне нужно перейти в раздел Структура > Страницы> Добавить пользовательскую страницу, а затем добавить представление панели содержимого, чтобы эффективно передать аргумент. Также необходимо было убедиться, что в представлении панели содержимого был правильно задан ввод аргументов, прежде чем его удалось найти на пользовательской странице.

Я нашел, где я ошибся, читая этот учебник: http://www.metaltoad.com/blog/passing-page-arguments-view-panes

 0
Author: vrwired, 2016-08-09 20:03:26