Как различать пункты меню без дочерних элементов и отображать различное содержимое на панелях или представлениях?


У меня есть меню на основе таксономии (3 уровня), которое отображает определенный тип контента. Элементы содержимого всегда помечаются как дочерние элементы самого низкого уровня (*), поэтому при выборе пунктов меню отображается диапазон содержимого.

top-level | mid-level1 | child1*
          |            | child2*
          |
          | mid-level2 - child3*
          |
          | child4*

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

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

Что я могу использовать в качестве контекста для выбора родителей и какой крючок использовать?

Author: Ashlar, 2012-01-09

1 answers

Это отличный пример пользовательского плагина Ctools. В этом случае наш тип плагина - "Доступ". Приведенное ниже скопировано из "term_has_parent" и принято для поиска обратного. Вероятно, это можно было бы улучшить с помощью более надежной проверки ошибок.

В панелях вы получите новое "Правило выбора", чтобы вы могли отличать термины, у которых есть дочерние элементы, от тех, у которых их нет.

<?php
/**
 * Plugins are described by creating a $plugin array which will be used
 * by the system that includes this file.
 */
$plugin = array(
  'title' => t("Taxonomy: term has child(ren)"),
  'description' => t('Control access if a term has children.'),
  'callback' => 'term_has_child_ctools_access_check',
  'default' => array('negate' => 0),
  'summary' => 'term_has_child_ctools_access_summary',
  'required context' => new ctools_context_required(t('Term'), array('taxonomy_term', 'terms')),
);

/**
 * Check for access.
 */
function term_has_child_ctools_access_check($conf, $context) {
  $children = db_select('taxonomy_term_hierarchy', 't')
    ->fields('t')
    ->condition('parent', $context->data->tid)
    ->range(0, 1)
    ->execute()
    ->fetchAssoc();

  return count($children) > 1;
}

/**
 * Provide a summary description based upon the checked terms.
 */
function term_has_child_ctools_access_summary($conf, $context) {
  return 'Returns true if the current term has children';
}

Если вы не знаете, как использовать пользовательский плагин Ctools, я предлагаю, чтобы это тема другого вопроса.

 1
Author: Letharion, 2012-01-26 22:07:48