2017-01-06 4 views
0

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

Я использую экспонированный фильтр. «Содержание: имеет термины таксономии (с глубиной) (выставлены)», чтобы пользователь мог фильтровать статьи на основе дочерних терминов. В настоящее время этот фильтр показывает все термины, независимо от того, в какой таксономии вы сейчас находитесь.

Ниже приведен пример из элементов, перечисленных в облученной фильтре:

Mammals 
- Cat 
- Dog 
Reptiles 
- Lizard 
- Snake 
Amphibians 
- Frog 
- Salamander 

URL-адрес для одного из родительских терминов будет:

site.com/animal/mammals

Мне нужно ограничить список опций в подверженном фильтре, чтобы показывать только дети этого термина на основе URL. Таким образом, по указанному выше URL, только Cat и Dog будут указаны в открытом фильтре.

В Drupal 7 Я мог бы выполнить это с помощью hook_form_alter в моей теме.module, используя URL arg (2), чтобы получить имя этого имени. Я не могу найти никакой документации о том, как это сделать в Drupal 8.

Вот что я нашел до сих пор:

function myTheme_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) { 

    if ($form_id == 'views_exposed_form' && $form['#id'] == 'views-exposed-form-article-tags-block-1') { 

    $term = arg(2); 
    //Need D8 code to load term, find it's children and alter the select box to show those children 

    } 
} 

Я открыт для других вариантов, если это не путь для достижения своей цели , Заранее спасибо.

ответ

0

hook_form_alter будет продолжать работать, хотя Arg() удаляется в Drupal 8.

Это не для меня ясно, что общая замена Arg() есть. В приведенном ниже коде используются два метода для получения идентификатора терминов таксономии.

Возможно, вы захотите отключить кеширование во время разработки.

function myTheme_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) { 

    if ($form_id == 'views_exposed_form' && $form['#id'] == 'views-exposed-form-article-tags-block-1') { 

    // initial page load 
    $parameters = \Drupal::routeMatch()->getRawParameters(); 
    $this_term_id = $parameters->get('taxonomy_term'); 

    // ajax refresh via apply button 
    if (!isset($this_term_id)) { 
     $this_term_id = $_REQUEST['view_args']; 
    } 

    // get children of $this_term_id 
    $tree = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree('tags', $parent = $this_term_id, $max_depth = NULL, $load_entities = FALSE); 

    // get rid of all options except default 
    $all_option = $form['term_node_tid_depth']['#options']['All']; 
    unset($form['term_node_tid_depth']['#options']); 
    $form['term_node_tid_depth']['#options']['All'] = $all_option; 

    // add child terms 
    foreach ($tree as $term) { 
     $option = new stdClass(); 
     $option->option[$term->tid]=$term->name; 
     $form['term_node_tid_depth']['#options'][] = $option; 
    } 
    } 

} 
+0

Это сработало. Спасибо! – Pagri