Alterando el contenido de la ruta de navegación

13

Estoy tratando de usar este gancho para alterar un enlace de ruta de navegación:

hook_menu_breadcrumb_alter(&$active_trail, $item)

El gancho no parece ser llamado.

He intentado :

  • Usando el gancho en un tema
  • Usar el gancho en un módulo personalizado (breadcrumb_finder_fix)
  • Borrar todas las cachés con Drush

Tengo el módulo Devel instalado y activado, y lo siguiente no produce ningún resultado.

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

Algunas ideas ? Direcciones ? Por favor avise.

OBS: He leído esta respuesta: /drupal//a/7659/12647

Jean-Michel Garcia
fuente
Estoy teniendo el mismo problema. Creé la función de enlace MYMODULE_menu_breadcrumb_alter (), habilité el módulo, borré el caché y parece que nunca se llama al enlace en las páginas de usuario. Irónicamente, parece que se llama en las páginas de administración (obtengo la salida de krumo en las páginas de administración). El nivel _breadcrumb () del tema parece ser el lugar equivocado para hacer esto.
Peter Murray

Respuestas:

4

Aquí hay un fragmento para mostrar cómo puede alterar las migas de pan.

Tenga en cuenta lo siguiente:

  • Este método cambia las migas de pan a nivel de tema, que es el último lugar para cambiar cualquier cosa antes de que llegue a los archivos de plantilla, por lo que cambiar aquí no permitirá que otro módulo cambie las migas de pan más adelante.
  • Considere esta manera como la última opción para alterar sus migas de pan.
  • Agregue este fragmento al archivo template.php de su 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
fuente
@jean He hecho algunos cambios, échale un vistazo (no en el fragmento), pero en el descargo de responsabilidad
arpitr
13

Probablemente un poco tarde para responder, pero me encontré con este hilo esta mañana mientras buscaba una forma de anular la ruta de navegación en Drupal 7, me ayudó un poco, así que pensé que agregaría mi solución.

Esto crea migajas adicionales basadas en tipos de contenido y agrega la página actual a la miga. Estoy usando esto para agregar una migaja a una vista de filtrado vista antes del nodo dado.

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
fuente
2
Esta parece ser la forma correcta, pero no está funcionando para mí. Irónicamente, esto funciona en las páginas de administración, pero no funciona en el contenido general del usuario. ¿Sugerencias sobre cómo depurar?
Peter Murray
Tengo el mismo problema que @PeterMurray. Todavía no lo he resuelto completamente, pero por lo que puedo decir en este momento, esto es causado por el módulo custom_breadcrumbs que de alguna manera anula los enlaces. Mis 2 centavos, de todos modos.
Pax
9

hook_menu_breadcrumb_alter () no funciona en páginas donde se ha llamado antes a drupal_set_breadcrumb ().

hook_menu_breadcrumb_alter () se invoca desde menu_get_active_breadcrumb () . Esto se llama desde drupal_get_breadcrumb () , pero solo si no se ha establecido previamente una ruta de exploración con drupal_set_breadcrumb () .

No parece que se llame a drupal_set_breadcrumb () desde la página del usuario. Pero tal vez hay un módulo contrib que hace eso. Puede poner un dpm () o ddebug_backtrace () en drupal_set_breadcrumb () para ver si este es el caso (necesita que el módulo de desarrollo esté habilitado y tiene permiso para ver la información de desarrollo).

En su lugar, puede usar hook_preprocess_breadcrumb (), pero esto requiere analizar el enlace de ruta de exploración que desea modificar. Debido a que en este enlace los enlaces de ruta de navegación ya se representan como html, por lo que necesita expresiones regulares (preg_match ()) o similares para determinar, por ejemplo, la url.

Una solución mucho mejor es usar uno de los diversos módulos de personalización de migas de pan que están disponibles para Drupal.

Don Quijote
fuente
2

Esta puede no ser la forma más eficiente, pero intente:

function THEME_breadcrumb($variables)

y luego lee las variables.

... también Dios mío, odio las migas de pan. tanto.

jdu
fuente
1
Yo vi esto. Pero no parece la "forma Drupal". Este es un gancho de tema y, por lo tanto, no debe usarse para modificar la entrada
Jean-Michel Garcia
Voy por esto porque la otra forma no está funcionando. Estoy votando tu pregunta, pero no acepto. Esperando que alguien encuentre el "camino correcto".
Jean-Michel Garcia
1

Si solo necesita modificar la ruta de exploración en una página específica, tal vez la siguiente solución pueda ayudarlo. El ejemplo actualiza la ruta de exploración para un formulario de edición.

$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);

Otra forma de Drupal es usar el usuario, hook_menu_breadcrumb_alterpero asegúrese de nombrarlo YOUR_MODULE_menu_breadcrumb_altery borrar el caché después de agregar la función.

O también theme_breadcrumbes una forma de Drupal para actualizar la ruta de exploración, pero en este enlace solo debe cambiar el marcado de la ruta de exploración, no los enlaces.

Bogtan
fuente
0

El THEME_NAME_breadcrumbno funcionó para mí. Sin embargo, logré anular la ruta de navegación con esta función:

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);
  }
}

el crédito va a: /programming/10087168/how-to-add-breadcrumb

Turtletrail
fuente
0

function 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
        );
    }
}

}

este código es suficiente para modificar la URL de la ruta de exploración.

Nayana
fuente