在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
}
}
如果这不是实现目标的方法,我愿意接受其他选择。提前谢谢。
答案 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;
}
}
}