Drupal 8:Taxonomy页面限制基于父术语

时间:2017-01-06 15:30:02

标签: drupal drupal-8 drupal-taxonomy hook-form-alter

在Drupal 8站点中,我有一个分类页面,上面有一个视图块。该视图列出了标有您所在页面术语的文章。它还显示了标有当前分类页面的子条款的文章。

我正在使用公开的过滤器“内容:具有分类术语(有深度)(暴露)”让用户根据子条款过滤文章。目前,该过滤器显示所有术语,无论您当前使用哪种分类法。

以下是公开过滤器中列出的项目示例:

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

其中一个父条款的网址为:

site.com/animal/mammals

我需要限制公开过滤器中的选项列表,以便仅根据URL显示该术语的子项。因此,在上面的URL中,只有Cat和Dog会列在公开的过滤器中。

在Drupal 7中,我可以使用URL arg(2)在我的theme.module中使用hook_form_alter来获取术语名称。我在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

  }
}

如果这不是实现目标的方法,我愿意接受其他选择。提前谢谢。

1 个答案:

答案 0 :(得分:0)

hook_form_alter仍然有效,但在Drupal 8中删除了arg()。

我不清楚arg()的一般替代是什么。下面的代码使用两种技术来获取分类术语id。

您可能希望在开发过程中关闭视图中的缓存。

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;
    }
  } 

}