ZF>View>Helper>Nav deletes active branch, no breadcrumbs.

For programming and general questions on Zend Framework

ZF>View>Helper>Nav deletes active branch, no breadcrumbs.

Postby penetal on Sat Jun 30, 2012 2:36 am

Hey, I have tried several places this is the last one I know of to ask, I really need help here as I am completely confused by, and stuck on this. I want a layout in my header where I have the global menu, then the page menu and then breadcrumbs. To do this I, mostly, took away from this answer: http://stackoverflow.com/questions/3496763/rendering-active-branch-of-zend-navigation-without-top-level

This works great, except the active branch gets removed form the Zend_Navigation_Container that is registered. (The whole, and the reduced containers are printed out further down.)

This is how I do it:

Code: Select all
   
<nav>
<?php
//Create top level menu
echo $this->navigation()->menu()
      ->setUlClass('main')
      ->setMaxDepth(0)
      ->setIndent(4)
      . PHP_EOL;

//Set to get the whole active branch
$this->navigation()
      ->setMinDepth(0)
      ->setMaxDepth(0);

//Retrive the active branch
$activeBranchTopLvl =
   $this->navigation()->findActive(
      $this->navigation()->getContainer());

//Get the 2nd level pages for the active page
$activeBranch = $activeBranchTopLvl['page']->getPages();

$subMenu = new Zend_Navigation();

//This is the line that removes the active branch
$subMenu->setPages($activeBranch);

//Render 2nd level menu
echo $this->navigation()->menu($subMenu)
      ->setUlClass('sub')
      . PHP_EOL;

//Set up for breadcrumbs
$this->navigation()->breadcrumbs()->setMinDepth(0);
$this->navigation()->setMaxDepth(null);
$this->navigation()->breadcrumbs()->setRenderInvisible(true);

?>
</nav>
<p id="breadcrumbs"><?php echo $this->navigation()->breadcrumbs()->render(); ?></p>


The result is that the breadcrumbs are non-existant:

Code: Select all
   
<nav>
   <ul class="main">
      <li class="active">
         <a href="/auth">Auth</a>
      </li>
   </ul>
   <ul class="sub">
      <li class="active">
         <a href="/auth/login">Log In</a>
      </li>
      <li>
         <a href="/auth/logout">Log Out</a>
      </li>
   </ul>
</nav>
<p id="breadcrumbs"></p>


The active branch have been cut off to the top level, here is the Zend_Navigation_Container before its cut:

Code: Select all
   
...
$subMenu = new Zend_Navigation();

print_r($this->navigation()->getContainer()->toArray());

//This is the line that removes the active branch
$subMenu->setPages($activeBranch);

//Render 2nd level menu
...


This Outputs the whole Container:

Code: Select all
   
...
Array
(
   [0] => Array
      (
         [label] => Auth
         [fragment] =>
         [id] =>
         [class] =>
         [title] =>
         [target] =>
         [accesskey] =>
         [rel] => Array
            (
            )

         [rev] => Array
            (
            )

         [order] =>
         [resource] =>
         [privilege] =>
         [active] =>
         [visible] => 1
         [type] => Zend_Navigation_Page_Mvc
         [pages] => Array
            (
               [0] => Array
                  (
                     [label] => Log In
                     [fragment] =>
                     [id] =>
                     [class] =>
                     [title] =>
                     [target] =>
                     [accesskey] =>
                     [rel] => Array
                        (
                        )

                     [rev] => Array
                        (
                        )

                     [order] =>
                     [resource] =>
                     [privilege] =>
                     [active] => 1
                     [visible] => 1
                     [type] => Zend_Navigation_Page_Mvc
                     [pages] => Array
                        (
                        )

                     [action] => login
                     [controller] => auth
                     [module] =>
                     [params] => Array
                        (
                        )

                     [route] =>
                     [reset_params] => 1
                     [encodeUrl] => 1
                  )

               [1] => Array
                  (
                     [label] => Log Out
                     [fragment] =>
                     [id] =>
                     [class] =>
                     [title] =>
                     [target] =>
                     [accesskey] =>
                     [rel] => Array
                        (
                        )

                     [rev] => Array
                        (
                        )

                     [order] =>
                     [resource] =>
                     [privilege] =>
                     [active] =>
                     [visible] => 1
                     [type] => Zend_Navigation_Page_Mvc
                     [pages] => Array
                        (
                        )

                     [action] => logout
                     [controller] => auth
                     [module] =>
                     [params] => Array
                        (
                        )

                     [route] =>
                     [reset_params] => 1
                     [encodeUrl] => 1
                  )

            )

         [action] =>
         [controller] => auth
         [module] =>
         [params] => Array
            (
            )

         [route] =>
         [reset_params] => 1
         [encodeUrl] => 1
      )

)
...


This is after I add the pages to the new container:

Code: Select all
   
...
$subMenu = new Zend_Navigation();

//This is the line that removes the active branch
$subMenu->setPages($activeBranch);

print_r($this->navigation()->getContainer()->toArray());

//Render 2nd level menu
...


The Output:

Code: Select all
   
...
Array
(
   [0] => Array
      (
         [label] => Auth
         [fragment] =>
         [id] =>
         [class] =>
         [title] =>
         [target] =>
         [accesskey] =>
         [rel] => Array
            (
            )

         [rev] => Array
            (
            )

         [order] =>
         [resource] =>
         [privilege] =>
         [active] =>
         [visible] => 1
         [type] => Zend_Navigation_Page_Mvc
         [pages] => Array
            (
            )

         [action] =>
         [controller] => auth
         [module] =>
         [params] => Array
            (
            )

         [route] =>
         [reset_params] => 1
         [encodeUrl] => 1
      )

)
...


I don't know why this happens as I create the new container and add the pages to it, it seems they are being removed from the container I have in Zend_Registry under the key Zend_Navigation.

Quickly, if I comment out that line the breadcrumbs works again and the container stays intact, but I lose the 2nd level menu of course:

Code: Select all
   
...
$subMenu = new Zend_Navigation();

//This is the line that removes the active branch
//$subMenu->setPages($activeBranch);

//Render 2nd level menu
...


Output:

Code: Select all
   
...
<nav>
   <ul class="main">
      <li class="active">
         <a href="/auth">Auth</a>
      </li>
   </ul>

</nav>
<p id="breadcrumbs"><a href="/auth">Auth</a> &gt; Log In</p>
...
penetal
 
Posts: 4
Joined: Sat Jun 30, 2012 2:27 am

Re: ZF>View>Helper>Nav deletes active branch, no breadcrumbs

Postby penetal on Sun Jul 01, 2012 9:49 pm

Edit: here is the question on stackoverflow as well, with the same answer as below http://stackoverflow.com/questions/11233691/zend-view-helper-navigation-removes-active-branch-so-breadcrumbs-dont-show-up/11285471#11285471

Well I got it working. Since no one has replied with a better solution I will post mine.

Although not pretty I used a custom function to get the array of Zend_Navigation_Page objects that was returned into an array of arrays which then kept the main navigation container intact so both menu levels and the breadcrumbs work.

header.phtml:

Code: Select all
<nav id="global">
<?php
//Create top level menu
echo $this->navigation()->menu()
        ->setUlClass('main navigation')
        ->setMaxDepth(0)
        ->setIndent(4)
        . PHP_EOL;

//Set to get the top level active branch
$this->navigation()
        ->setMinDepth(0)
        ->setMaxDepth(0)
        ->setRenderInvisible(true)
        ;

//Retrive the active branch
$activeBranchTopLvl =
    $this->navigation()->findActive(
        $this->navigation()->getContainer());

//Get the 2nd level pages for the active page
$activeBranch = $activeBranchTopLvl['page']->getPages();

//create a function to make the array of page objects
//into an array of arrays, accomplished by modifying it as a reference
$arrayify = create_function(
        '&$value, $key',
        '$value = $value->toArray();'   
    );

//go through the array with the custom function
array_walk($activeBranch, $arrayify);

$subMenu = new Zend_Navigation();

//This is the line that removes the active branch
$subMenu->setPages($activeBranch);

//Render 2nd level menu
echo $this->navigation()->menu($subMenu)
        ->setUlClass('sub navigation')
        ->setRenderInvisible(false)
        . PHP_EOL;

//Set up for breadcrumbs
$this->navigation()->breadcrumbs()->setMinDepth(0);
$this->navigation()->setMaxDepth(null);
$this->navigation()->breadcrumbs()->setRenderInvisible(true);

?>
</nav>
<p id="breadcrumbs"><?php echo $this->navigation()->breadcrumbs()->render(); ?></p>
penetal
 
Posts: 4
Joined: Sat Jun 30, 2012 2:27 am


Return to Zend Framework

Who is online

Users browsing this forum: Google [Bot] and 5 guests