Como posso criar uma exibição de nós filhos com base no relacionamento do menu?

17

Digamos que você tenha as seguintes páginas em uma árvore de menus:

  • Projetos
    • Projeto Um
    • Projeto Dois
    • Projeto Três

Estou procurando uma maneira de criar uma exibição que será incorporada na página Projeto (pai) que mostrará uma foto, título e texto (resumo) das páginas filho.

O relacionamento entre o pai e os filhos é definido na árvore de menus.

Eu sei que posso usar a referência de nó, mas isso significa que toda vez que alguém cria uma página, eles precisam definir o relacionamento do menu e, em seguida, o relacionamento de referência do nó.

Também sei que poderia criar outro tipo de conteúdo, mas acho que isso é um exagero, pois todas as páginas de conteúdo são iguais.

Camsoft
fonte
1
Não há relação direta entre os nós que são exibidos no submenu de outro nó (a única conexão entre um link de menu e um nó é que um link de menu aponta para o nó / nid). Então você precisa de algo para vincular essas sub-nós juntos (e para o pai-node), poderia ser um comum taxonomia prazo, book.module, ...
Berdir

Respostas:

4

Uma solução é usar termos de taxonomia para definir os relacionamentos e, em seguida, usar o módulo Menu Taxonomia para converter esses relacionamentos em itens de menu. Em seguida, você pode usar o módulo Página personalizada e os módulos Contexto para controlar informações e regiões em todas as páginas, se não desejar usar painéis.

Adam S
fonte
16

Você pode fazer exatamente isso usando os módulos API do nó do menu e Exibições do nó do menu .

Crie uma visualização com o tipo de conteúdo necessário e escolha um filtro contextual "Menu: ID do link do menu" (isso está disponível apenas com os módulos acima instalados).

Em "Quando o valor do filtro não estiver disponível", selecione "Fornecer valor padrão" e escolha "Código PHP".

O snippet a seguir fará isso, então você apenas expõe um bloco da visualização e está lá:

if (function_exists('menu_node_get_links')){  
   $node = node_load(intval(arg(1)));  
   if (isset($node->menu_node_links)){
      foreach($node->menu_node_links as $mlid=>$data){  
         return $mlid;
      }  
   }
}
Emile Kott
fonte
3
Eu acho que o filtro deve ser "Menu: ID do link do menu principal" para obter os filhos do nó atual. E o código do argumento pode ser: $ current = end (menu_get_active_trail ()); return $ current ['mlid'];
Stefan
Obrigado por isso. Algumas melhorias (além da correção de @ Stefan). 1) Você pode usar em menu_load_object(arg(1))vez de node_load()economizar algumas despesas. 2) Você deve verificar se o item de menu é do menu que você está preocupado. No momento, você está retornando o primeiro $mlid. Dentro do foreach, você deve adicionar um condicional if ($data->menu_name == 'my-menu')para corrigir isso. e 3) convém adicionar um segundo filtro para menu: hiddenretornar apenas itens que não estão ocultos. Use o mesmo trecho, mas retorne o em $data->hidden;vez do $mlid.
Adam Balsam
2
Eu desencorajaria fortemente sugerir módulos que ainda estão em estágio de desenvolvimento.
precisa saber é o seguinte
@ Stefan está lá para conseguir todas as crianças em qualquer nível? em vez de apenas primeiro.
Eli Stone
4

O Nó Hierarquia Módulo permite esse tipo de relacionamento, além de fornecer uma integração de visualizações.

A hierarquia de nós permite que os nós sejam filhos de outros nós, criando uma hierarquia de conteúdo semelhante a uma árvore. O módulo oferece:

  • Criação com 1 clique de menus hierárquicos
  • Migalhas de pão hierárquicas
  • URLs hierárquicos automáticos usando Pathauto (e módulo de token)

    (por exemplo: q = aboutus / história / início).

  • Criação automática de menus hierárquicos, se desejado.
  • Integração de vistas opcionais.
  • Integração opcional de acesso ao nó.
CCMonkey
fonte
2

Talvez isso tenha mudado para o D7 / Views 3, mas você não precisa de PHP para realizar o comportamento desejado:

  1. instale os módulos menu_views , menu_node e menu_node_views .
  2. crie uma nova visualização do tipo "árvore de menus"
  3. adicione os campos "Menu: título do link" e "Menu: descrição"
  4. Adicionar filtro / argumento contextual "Menu: ID do nó"; Forneça o valor padrão "Content ID from URL"
  5. Adicionar relacionamento "Menu: ID do link do menu pai"

voila. Não deve funcionar , mas funciona.

Funciona bem apenas com nós, mas a vantagem de usar links de menu sobre a hierarquia de nós é que você não está limitado à construção da navegação em torno de nós. Você pode até incluir links externos na sua exibição.

aaronbauman
fonte
Essa é uma boa opção para expor links de nós (e eu adoro o fato de Aaron Bauman colocar essa amostra de exemplo para importar: pastebin.com/u2GjmWG7 ). No entanto, tive alguns problemas ao disponibilizar os campos dos nós para a exibição, como o OP estava solicitando. Como isso é realizado?
Jul1
Você deve poder expor os campos do nó adicionando um relacionamento ao "Menu: ID do nó". Você vê algo assim?
aaronbauman
2

Há um módulo relativamente novo Filtro Filhos do Nó Menu Menus que parece fazer exatamente o que você deseja:

Este módulo adiciona um filtro contextual às Visualizações que recuperam os nós filhos de um nó de acordo com a estrutura de um menu.

Nwellnhof
fonte
0

Você já pensou em usar a Referência de nós para esse fim?

  1. Forneça um campo de referência do nó ao tipo de conteúdo que você deseja exibir.
  2. Use esse campo como um filtro contextual na exibição (valor padrão: ID do conteúdo do URL ).
  3. Adicione esta exibição como um bloco ao conteúdo. O nó no qual está sendo exibido será visto como pai dos nós que fazem referência a ele, por exemplo.

Assim, você pode obter um resultado semelhante ao que provavelmente está procurando.

cptstarling
fonte
0

A resposta do Emile está certa, mas eu tive que colar o código PHP mencionado em um filtro contextual do tipo " Menu: ID do link do menu pai ".

if (function_exists('menu_node_get_links')){  
   $node = node_load(intval(arg(1)));  
   if (isset($node->menu_node_links)){
      foreach($node->menu_node_links as $mlid=>$data){  
         return $mlid;
      }  
   }
}
cptstarling
fonte
0

Se você usar a conversão de entidade e o nó estiver anexado a menus diferentes, aqui está uma adaptação do código que filtra no idioma atual. Você precisa copiar isso como código PHP para o filtro contextual (ID do link do menu pai) na sua visualização, como explicado nas outras respostas

 if (function_exists('menu_node_get_links')) {
global $language;
$lang = $language->language;
$node = node_load(intval(arg(1)));
if (isset($node->menu_node_links)) {
  foreach ($node->menu_node_links as $mlid => $data) {  
    if ($lang == $data->language) {
      return($mlid);
    }
  }
}
  }
Bendev
fonte
0

Na fila de problemas das Exibições de nós do menu , temos esta ótima solução:

  • adicione um filtro contextual com 'ID do link do menu principal',
  • selecione "Fornecer valor padrão"
  • selecione 'código php personalizado'
  • digite o seguinte código

    $menu_item = menu_get_active_trail();  
    $current_item = array_pop($menu_item);  
    $menu_item_plid = $current_item['plid'];  
    return $menu_item_plid;  
tostinni
fonte