Alteração do conteúdo da farinha de rosca

13

Estou tentando usar esse gancho para alterar um link de trilha de navegação:

hook_menu_breadcrumb_alter(&$active_trail, $item)

O gancho não parece ser chamado.

Eu tentei :

  • Usando o gancho em um tema
  • Usando o gancho em um módulo personalizado (breadcrumb_finder_fix)
  • Limpando todos os caches usando Drush

Eu tenho o módulo Devel instalado e ativado, e o seguinte não produz nenhuma saída.

function breadcrumb_finder_fix_menu_breadcrumb_alter(&$active_trail, $item) {
    drupal_set_message(krumo($active_trail));
}

Alguma ideia ? Instruções ? Por favor informar.

OBS: Eu li esta resposta: /drupal//a/7659/12647

Jean-Michel Garcia
fonte
Estou tendo o mesmo problema. Criei a função de gancho MYMODULE_menu_breadcrumb_alter (), habilitei o módulo, limpei o cache e o gancho nunca parece ser chamado nas páginas do usuário. Ironicamente, parece ser chamado nas páginas de administração (recebo a saída do krumo nas páginas de administração). O nível _breadcrumb () do tema parece ser o lugar errado para fazer isso.
Peter Murray

Respostas:

4

Aqui está um trecho para mostrar como você pode alterar a farinha de rosca.

Lembre-se do seguinte:

  • Esse método altera as trilhas de navegação no nível do tema, que é o último lugar para alterar qualquer coisa antes de chegar aos arquivos de modelo, portanto, alterar aqui não permitirá que outro módulo altere as trilhas de navegação posteriormente.
  • Considere esta maneira como a última opção para alterar sua farinha de rosca.
  • Adicione esse trecho ao arquivo template.php do seu tema.

    function THEME_NAME_breadcrumb($variables) {
      $breadcrumb = $variables['breadcrumb'];
    
      // check to ensure this is the one you want to alter
      // Custom rebuild process of breadcrumb with custom links.
      if ($breadcrumb[1] == 'your_breadcrumb_id') {
        // linking to home page
        $links[0] = l(t('Home'), '<front>');
    
        // Keeping the trail/current page as non linked
        $links[1] = ('your desired breadcrumb');
        drupal_set_breadcrumb($links);
      }
    }
arpitr
fonte
@jean eu fiz algumas mudanças, ter um olhar para ele (não no snippet), mas no aviso legal
arpitr
13

Provavelmente um pouco tarde para responder, mas me deparei com esse tópico esta manhã enquanto procurava uma maneira de substituir a trilha de navegação no Drupal 7, ajudou um pouco, então pensei em adicionar minha solução.

Isso cria migalhas extras com base nos tipos de conteúdo e adiciona a página atual à migalha. Estou usando isso para adicionar uma migalha a uma exibição de filtragem vista antes do nó especificado.

function MYMODULE_menu_breadcrumb_alter(&$active_trail, $item) {

    //STORE THE LAST ITEM
    $end = end($active_trail);

    foreach ($active_trail as $key => $crumb){

        //CHECK AGAINST NODE TYPE
        if($crumb['map'][1]->type == 'NODE_MACHINE_NAME'){

            //INSERT THE REPLACEMENT CRUMB
            $active_trail[$key] = array( 
                'title' => t("Title"),
                'href' => 'PATH',
                'link_path' => 'PATH', 
                'localized_options' => array(),
                'type' => 0
            );
            //RECREATE ITEM
            $active_trail[] = $crumb;
        }

    }


    //SHOW CURRENT PAGE IN BREADCRUMB BY DUPLICATING THE LAST ARRAY ITEM IN ACTIVE_TRAIL

    if (!drupal_is_front_page()) {
        if ($item['href'] == $end['href']) {
            $active_trail[] = $end;
        }       
    }

}
andrew_hoffi
fonte
2
Este parece ser o caminho certo, mas não está funcionando para mim. Ironicamente, isso funciona nas páginas de administração, mas não no conteúdo geral do usuário. Sugestões sobre como depurar?
Peter Murray
Eu tenho o mesmo problema que @PeterMurray. Ainda não o resolvi completamente, mas pelo que posso dizer agora, isso é causado pelo módulo custom_breadcrumbs de alguma forma substituindo os links. Meus 2 centavos, de qualquer maneira.
Pax
9

hook_menu_breadcrumb_alter () não funciona em páginas onde drupal_set_breadcrumb () já foi chamado anteriormente.

hook_menu_breadcrumb_alter () é chamado em menu_get_active_breadcrumb () . Isso é chamado de drupal_get_breadcrumb () , mas apenas se nenhuma trilha de navegação tiver sido definida anteriormente com drupal_set_breadcrumb () .

Não parece que drupal_set_breadcrumb () seja chamado na página do usuário. Mas talvez haja um módulo contrib que faça isso. Você pode colocar um dpm () ou ddebug_backtrace () em drupal_set_breadcrumb () para ver se esse é o caso (precisa que o módulo devel esteja ativado e você tenha permissão para ver informações sobre o devel).

Você pode usar hook_preprocess_breadcrumb (), mas isso requer a análise do link da trilha de navegação que você deseja alterar. Como neste gancho, os links de trilha de navegação já são renderizados como html, então você precisa de expressões regulares (preg_match ()) ou similares para determinar, por exemplo, o URL.

Uma solução muito melhor é usar um dos vários módulos de personalização de trilhas disponíveis para o Drupal.

Don Quixote
fonte
2

essa pode não ser a maneira mais eficiente, mas tente:

function THEME_breadcrumb($variables)

e depois leia as variáveis.

... também meu deus, eu odeio migalhas de pão. muito.

jdu
fonte
1
Eu vi isso. Mas não parece o "caminho drupal". Este é um gancho tema e, portanto, não deve ser usado para modificar a entrada
Jean-Michel Garcia
Vou fazer isso porque o outro caminho não está funcionando. Estou votando sua pergunta, mas não estou aceitando. Esperando que alguém encontre o "caminho certo".
Jean-Michel Garcia
1

Se você precisar alterar apenas a trilha de navegação em uma página específica, talvez a solução a seguir possa ajudá-lo. O exemplo atualiza a trilha de navegação para um formulário de edição.

$breadcrumb = array();
$breadcrumb[] = l(t('Home'), '<front>');
$breadcrumb[] = l(t('Nodes listing'), 'nodes/listing');
# Update breadcrumb on the edit form
if (isset($form['nid']) && (is_numeric($form['nid']['#value']))) {
    $breadcrumb[] = l($form['#node']->title, 'node/' . $node->nid);
}

drupal_set_breadcrumb($breadcrumb);

Outra maneira do Drupal é o usuário, hook_menu_breadcrumb_altermas certifique-se de nomeá-lo YOUR_MODULE_menu_breadcrumb_altere limpar o cache após adicionar a função.

Ou também theme_breadcrumbé uma maneira Drupal de atualizar a trilha de navegação, mas neste gancho você deve alterar apenas a marcação da trilha de navegação, não os links.

bogtan
fonte
0

o THEME_NAME_breadcrumbnão funcionou para mim. No entanto, consegui substituir a trilha de navegação por esta função:

function MODULE_node_view_alter(&$build) {
  $node = $build['#node'];
  if ($build['#view_mode'] == 'full' && $node->type == 'CONTENT_TYPE') {
    $breadcrumb = array();
    $breadcrumb[] = l('Home', '<front>');
    $breadcrumb[] = l('People', 'group/node/' . arg(2) . '/people');
    $breadcrumb[] = l('Attendance', 'group/node/' . arg(2) . '/people/attendance');
    drupal_set_breadcrumb($breadcrumb);
  }
}

o crédito vai para: /programming/10087168/how-to-add-breadcrumb

Turtletrail
fonte
0

função MODULE_menu_breadcrumb_alter (& $ active_trail, $ item) {

//STORE THE LAST ITEM
$end = end($active_trail);
foreach ($active_trail as $key => $crumb){
    //CHECK AGAINST NODE TYPE
    if($crumb['map'][1]->type == 'CONTENT_TYPE' && $crumb['link_path'] == 'node/%'){
       //INSERT THE REPLACEMENT CRUMB
        //INSERT THE REPLACEMENT CRUMB
        $active_trail[$key] = array( 
            'title' => t("Title"),
            'href' => 'PATH',
            'link_path' => 'PATH', 
            'localized_options' => array(),
            'type' => 0
        );
    }
}

}

esse código é suficiente para modificar o URL da trilha de navegação.

Nayana
fonte