Custom Walker: comment obtenir un identifiant dans la fonction start_lvl

11

Je fais mon premier marcheur personnalisé pour construire un menu en accordéon. Pour commencer, j’ai utilisé cet exemple: enlace

Il y a deux fonctions. Commencez par start_lvl, puis start_el.

Dans start_el, l'identifiant get est implémenté par $ item- > ID. Est-ce que quelqu'un sait comment je peux faire cela dans start_lvl également? Je dois donner un identifiant à la navigation (de niveau inférieur environnant) pour que je puisse le déclencher pour qu'il s'effondre dans le menu accordéon.

Ce que je tente de générer ressemble à ceci:

<a href="#collapse2">Titel 2</a>
<ul id="collapse2">Lower Level Menu 2</ul>
<a href="#collapse3">Titel 3</a>
<ul id="collapse3">Lower Level Menu  3</ul>

Mon code pour la fonction start_lvl:

// add id's and classes to ul sub-menus
function start_lvl( &$output, $depth, $item ) {
    // depth dependent classes
    $indent = ( $depth > 0  ? str_repeat( "\t", $depth ) : '' ); // code indent
    $display_depth = ( $depth + 1); // because it counts the first submenu as 0
    $pgid = ; // How to get ID in here??
    $classes = array(
        'sub-menu',
        ( $display_depth == 1  ? 'accordion-body collapse' : '' ),
        ( $display_depth % 2  ? 'menu-odd' : 'menu-even' ),
        ( $display_depth >=2 ? 'sub-sub-menu' : '' ),
        'menu-depth-' . $display_depth
        );
    $ids = array(
        'collapse' . $pgid
        );
    $class_names = implode( ' ', $classes );
    $id_name = implode( ' ', $ids );

    // build html
    $output .= "\n" . $indent . '<ul id="' . $id_name . '" class="' . $class_names . '">' . "\n";
}
    
posée Robert Bouten 16.08.2012 - 21:57

4 réponses

27

Il me suffisait de le faire dans l'un de mes thèmes ... Etant donné que vous n'avez pas accès à la variable $ item à ce stade du Walker, vous souhaiterez stocker votre élément actuel dans un champ plus global à l'adresse suivante: le moment où vous y avez accès. Le code suivant aura plus de sens ... Remarque: j'ai tout dépouillé sauf le code correspondant.

class ThemeTruck_Nav_Walker extends Walker_Nav_Menu {
   private $curItem;

  // retrieve the curItem
  function start_lvl(&$output, $depth = 0, $args = array()) {
    var_dump($this->curItem );
  }

  // store the curItem
  function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0) {
    $this->curItem = $item;
  }

 }
    
réponse donnée Lane 03.01.2013 - 06:34
3

J'ai eu un problème similaire que j'ai résolu en utilisant une variable statique à l'intérieur de la classe:

static protected $menu_lvl; 

Et puis dans l'élément "display_element", j'ai incrémenté la variable:

self::$menu_lvl++;

Dans mon code, j'ai ensuite référencé dans la fonction start_lvl quelque chose comme ceci:

$output .= "<ul id='level". self::$menu_lvl ."'>";

Ceci n'utilise pas l'ID de page, mais un identifiant unique pour les instructions UL pouvant être référencé par le javascript.

BTW - C’est vraiment utile pour les accordéons imbriqués ou les menus déroulants imbriqués sur le thème Roots utilisant Bootstrap pour les applications mobiles.

    
réponse donnée Sean Donovan 13.10.2012 - 20:26
2

Vous pouvez utiliser le filtre suivant dans votre fonction start_el et grub votre argument dans start_lvl fonction.

apply_filters( 'walker_nav_menu_start_lvl', $item_output, $item, $depth, $args->myarg=$item->title );

Faites-moi savoir si cela fonctionne.

    
réponse donnée Nabajit Roy 16.09.2012 - 11:43
0

Vous pouvez simplement ajouter $ page à l'argument du lecteur personnalisé:

class My_Custom_Walker extends Walker_page {
    function start_el(&$output, $page, $depth, $args, $current_page) {
        if ( $depth )
            $indent = str_repeat("\t", $depth);
        else
            $indent = '';

        extract($args, EXTR_SKIP);

        $output .= $indent . 
            '<li>
            <a style="color:red" href="' . get_page_link($page->ID) . '" title="' . 
            esc_attr( wp_strip_all_tags( apply_filters( 'the_title', $page->post_title, $page->ID ) ) ) . '">' . 
            $link_before . apply_filters( 'the_title', $page->post_title, $page->ID ) . $link_after . '</a>';

Essayez ce qui précède puis, avant d'appeler wp_list_pages (), ajoutez la classe de promeneur personnalisée:

$MyWalker = new My_Custom_Walker();

Ensuite, dans les arguments de wp_list_pages:

  

wp_list_pages ('walker' = > $ MyWalker)

Vérifiez si la sortie du déambulateur est rouge.

    
réponse donnée AlxVallejo 16.08.2012 - 22:29

Lire d'autres questions sur les étiquettes