Como posso injetar um menu de taxonomia como submenu de um item de menu padrão?


12

Eu tenho um menu principal, com uma estrutura de nível superior semelhante à seguinte:

Home - Categories - Something Else - ... - Contact

Cada um desses links de nível superior vai para uma página de nó apropriada.

Eu tenho um vocabulário para Categorias (multinível) e preciso obter esses termos de taxonomia em um submenu no item "Categorias". Eu gostaria de evitar codificar os itens no menu principal, pois o submenu deve aumentar / diminuir como o vocabulário.

No passado, escrevi um código muito elaborado para fazer isso, que se prende às operações de taxonomia e gerencia os subitens de um menu específico com base nisso (muito semelhante ao que o Taxonomy Menu faz, mas sem ter que ter um menu diferente para cada vocabulário).

Enquanto esse método funciona, não é o ideal e certamente não é genérico. Não posso simplesmente elevar esse código do projeto antigo para o novo, seria necessário uma quantidade razoável de personalização.

Não posso deixar de sentir que deve haver uma solução 'padrão' baseada em módulo para isso.

Vi algumas sugestões por aí para usar vários módulos diferentes em combinação (até algumas sugerindo o uso de módulos baseados em Views, por incrível que pareça). Estou aberto a qualquer sugestão, mas se envolver a instalação de mais de 1 ou 2 módulos e uma carga de configuração específica de contexto e codificada, provavelmente não ajudará muito nesse caso.


1
Acho que já vi ... Tópico similar contém uma idéia sobre o uso de regras para criar itens com base em taxonomia no menu, mas isso parece longe do ideal também.
Mołot 13/06

Se eu entendi corretamente, você está olhando similar como este módulo drupal.org/project/taxonomy_treemenu , ele pode integrar com menu agradável mas para D6
Bala

Você precisa ter itens de menu reais ou é viável adicionar a árvore dos termos de taxonomia ao menu quando ele é renderizado?
ROOBY

Graças @Bala, precisa de uma solução D7 embora
Clive

1
Clive, tenho uma sugestão. Como eu sei, você pode gerar um menu taxonomu com o nome do vocabulário incluído e, em seguida, basta adicionar outros links de menu diretamente no menu gerado. Os itens de taxonomia podem ser atualizados automaticamente ... Não sei se funcionará, apenas tente.
milkovsky

Respostas:


13

Opção a) A menos que eu esteja enganado, você não pode simplesmente escolher onde seu Menu de Taxonomia será pai (Localização do Menu) ao criá-lo? O único problema que acho que você pode obter com isso é que acho que é necessário reconstruir o menu toda vez que a taxonomia for atualizada

Opção b) Fiz algo razoavelmente semelhante a isso no meu site, usei o módulo Exibições de menu , para permitir que eu exibisse minha exibição no menu principal.

Se você criar uma nova visualização que lista todos os seus termos de taxonomia, como uma exibição em bloco, aplique qualquer filtragem / modificação adicional na visualização, se necessário (você pode não, mas no meu exemplo eu queria). Então, quando você adiciona um novo link ao seu menu principal, pode optar por usar uma exibição em vez de um link. A partir daí, você escolhe qual visualização deseja usar, selecione o item de menu 'Categoria' como pai e salve (depois de salvar, é necessário habilitá-lo no menu, que parece ser um bug no próprio módulo)

Não posso garantir que esta seja a melhor solução para você, mas funcionou quando eu a testei


1
Sim, acabei sendo estúpido - o Menu Taxonomia tem essa funcionalidade exata embutida (sua opção a). O menu em particular com o qual estou lidando é bem pequeno e as categorias não mudam frequentemente, portanto, a reconstrução não é um problema. Muito obrigado pela verificação de sanidade
Clive

3

Menupoly possui uma API para "fontes da árvore de menus" personalizadas. Eu realmente nunca usei isso para algo além de links de menu, por isso pode haver problemas que precisamos corrigir no caminho. Mas a arquitetura básica está lá.

Se você seguir esse caminho, você

  • Use o menu principal existente, sem links de termos de taxonomia além da página "Categorias".
  • Crie sua árvore de taxonomia independente disso.
  • Escreva uma "origem da árvore de menus" personalizada que busque links de menu normalmente, mas quando encontra um termo de taxonomia, busca uma taxonomia.
    Então, de alguma forma, você precisa detectar que o link "Categorias" está relacionado à taxonomia.
  • Se um link de menu estiver relacionado à taxonomia e, ao mesmo tempo, tiver um submenu regular, você precisará misturar os dois tipos de filhos de alguma forma.

Essa rota seria um pouco trabalhosa, mas poderia ser útil para outras pessoas e provavelmente é mais elegante e reutilizável que a lógica específica do site.

Atualmente, nem mesmo existe uma "fonte da árvore de menus" apenas para taxonomia, portanto, talvez esse seja um primeiro passo razoável antes de iniciar um plug-in misto.


Dito isto, a resposta aceita por Andrew Morris pode ser perfeitamente boa o suficiente. E isso significa menos trabalho para mim :) Ainda queria postar isso para quem achar útil.
Donquixote

V. interessante, obrigado. A resposta aceita é fazer o trabalho muito bem, mas também estou muito interessado em obter soluções de código. Posso assumir que, se é um dos seus módulos, tudo baseado na bondade do PSR-0? :)
Clive

Este usa o modo de compatibilidade do PHP 5.2 do xautoload, que é parecido com o PEAR, mas com diretórios rasos. Portanto, não PSR aprovado. Eu poderia ir PSR-0 algum dia ..
Donquixote

embora eu estou muito interessado em PSR-X (que nunca poderia entrar em D8, infelizmente)
Donquixote

2

Os Menus do Metro atendem às suas necessidades e ainda possuem skins integradas e podem criar os seus próprios, que funcionam da mesma maneira que menus agradáveis. Com este módulo, você pode selecionar qualquer subitem com qualquer profundidade no menu ou taxonomia e não o estou usando antes.

Compatibilidade com tela sensível ao toque (iPad, iPhone e etc.).

insira a descrição da imagem aqui


2

Você pode usar o módulo de menu Om Maxi para o mesmo. Isso permitirá que o administrador crie menus com blocos que você deseja como anexos, módulos como visualizações, apresentação de slides, menu, usuário, menus agradáveis, guias rápidas e blocos personalizados com tabelas, listas, imagens, vídeos, etc.

Você pode criar um menu separado usando o Menu Taxonomia e pode anexá-lo como sublink ao menu gerado pelo menu om maxi.

obrigado


2

Recentemente, fiz algo semelhante para um menu de categoria de produto. Isso foi apenas para um nível de profundidade, mas pode ser facilmente modificado para mostrar outros níveis.

/**
 * Implements theme_menu_link().
 */
function THEME_menu_link__main_menu($variables) {

  $sub_menu = '';
  $element = $variables['element'];
  $menu_string = $element['#title'];

  if (module_load_include('inc','pathauto','pathauto') !== FALSE) {
    $menu_string =  pathauto_cleanstring($menu_string);
  }

  if ($menu_string == 'categories') {
    $sub_menu = get_categories_menu();
  }

  if ($sub_menu) {
    $element['#attributes']['class'][] = 'haschildren';
  }

  $output = l($element['#title'], $element['#href'], $element['#localized_options']);
  return '<li' . drupal_attributes($element['#attributes']) . '>' . $output . $sub_menu . "</li>\n";
}

function get_categories_menu() {

  $current_category = arg(2); // Get current category from path
  $volcab = taxonomy_vocabulary_machine_name_load('product-categories');
  $tree = taxonomy_get_tree($volcab->vid,0,1);

  $output = '<ul class="menu product-category">';
  foreach ($tree as $term) {
    $safe_term = pathauto_cleanstring($term->name);
    $class = ($current_category==$safe_term) ? ' class="active"' : '';
    $output .= '<li><a' . $class . ' href="/drupal//path/to/' . $safe_term . '">' . $term->name . '</a></li>';
  }
  $output .= '</ul>';

  return $output;
}

A função get_category_menu é melhor como um bloco, mas mostrada aqui como outra função no template.php por conveniência.

Espero que ajude ou seja pelo menos um passo em direção a uma solução.

Paulo

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.