Selaa lähdekoodia

merge r25112 to release-1.12

git-svn-id: http://framework.zend.com/svn/framework/standard/branches/release-1.12@25113 44c647ce-9c0f-0410-b52a-842ac1e357ba
rob 13 vuotta sitten
vanhempi
commit
e6999400e8

+ 101 - 9
library/Zend/View/Helper/Navigation/Menu.php

@@ -74,8 +74,17 @@ class Zend_View_Helper_Navigation_Menu
 
     /**
      * Expand all sibling nodes of active branch nodes
+     *
+     * @var bool
      */
     protected $_expandSiblingNodesOfActiveBranch = false;
+
+    /**
+     * Adds CSS class from page to li element
+     *
+     * @var bool
+     */
+    protected $_addPageClassToLi = false;
     
     /**
      * View helper entry point:
@@ -260,6 +269,46 @@ class Zend_View_Helper_Navigation_Menu
         return $this->_partial;
     }
 
+    /**
+     * Adds CSS class from page to li element
+     *
+     * Before:
+     * <code>
+     * <li>
+     *     <a href="#" class="foo">Bar</a>
+     * </li>
+     * </code>
+     *
+     * After:
+     * <code>
+     * <li class="foo">
+     *     <a href="#">Bar</a>
+     * </li>
+     * </code>
+     *
+     * @param bool $flag                        [optional] adds CSS class from
+     *                                          page to li element
+     *
+     * @return Zend_View_Helper_Navigation_Menu fluent interface, returns self
+     */
+    public function addPageClassToLi($flag = true)
+    {
+        $this->_addPageClassToLi = (bool) $flag;
+
+        return $this;
+    }
+
+    /**
+     * Returns a flag indicating whether the CSS class from page to be added to
+     * li element
+     *
+     * @return bool
+     */
+    public function getAddPageClassToLi()
+    {
+        return $this->_addPageClassToLi;
+    }
+
     // Public methods:
 
     /**
@@ -291,9 +340,12 @@ class Zend_View_Helper_Navigation_Menu
         $attribs = array(
             'id'     => $page->getId(),
             'title'  => $title,
-            'class'  => $page->getClass()
         );
 
+        if (false === $this->getAddPageClassToLi()) {
+            $attribs['class'] = $page->getClass();
+        }
+
         // does page have a href?
         if ($href = $page->getHref()) {
             $element              = 'a';
@@ -371,6 +423,10 @@ class Zend_View_Helper_Navigation_Menu
             $options['renderParents'] = $this->getRenderParents();
         }
 
+        if (!isset($options['addPageClassToLi'])) {
+            $options['addPageClassToLi'] = $this->getAddPageClassToLi();
+        }
+
         return $options;
     }
 
@@ -381,13 +437,14 @@ class Zend_View_Helper_Navigation_Menu
      * from {@link renderMenu()})
      *
      * @param  Zend_Navigation_Container $container  container to render
-     * @param  array                     $active     active page and depth
      * @param  string                    $ulClass    CSS class for first UL
      * @param  string                    $indent     initial indentation
      * @param  int|null                  $minDepth   minimum depth
      * @param  int|null                  $maxDepth   maximum depth
      * @param  string|null               $ulId       unique identifier (id) for
      *                                               first UL
+     * @param  bool                      $addPageClassToLi  adds CSS class from
+     *                                                      page to li element
      * @return string                                rendered menu
      */
     protected function _renderDeepestMenu(Zend_Navigation_Container $container,
@@ -395,7 +452,8 @@ class Zend_View_Helper_Navigation_Menu
                                           $indent,
                                           $minDepth,
                                           $maxDepth,
-                                          $ulId)
+                                          $ulId,
+                                          $addPageClassToLi)
     {
         if (!$active = $this->findActive($container, $minDepth - 1, $maxDepth)) {
             return '';
@@ -435,7 +493,19 @@ class Zend_View_Helper_Navigation_Menu
             if (!$this->accept($subPage)) {
                 continue;
             }
-            $liClass = $subPage->isActive(true) ? ' class="active"' : '';
+
+            $liClass = '';
+            if ($subPage->isActive(true) && $addPageClassToLi) {
+                $liClass = $this->_htmlAttribs(
+                    array('class' => 'active ' . $subPage->getClass())
+                );
+            } else if ($subPage->isActive(true)) {
+                $liClass = $this->_htmlAttribs(array('class' => 'active'));
+            } else if ($addPageClassToLi) {
+                $liClass = $this->_htmlAttribs(
+                    array('class' => $subPage->getClass())
+                );
+            }
             $html .= $indent . '    <li' . $liClass . '>' . self::EOL;
             $html .= $indent . '        ' . $this->htmlify($subPage) . self::EOL;
             $html .= $indent . '    </li>' . self::EOL;
@@ -459,6 +529,8 @@ class Zend_View_Helper_Navigation_Menu
      *                                                branch nodes?
      * @param  string|null               $ulId        unique identifier (id) for
      *                                                first UL
+     * @param  bool                      $addPageClassToLi  adds CSS class from
+     *                                                      page to li element
      * @return string
      */
     protected function _renderMenu(Zend_Navigation_Container $container,
@@ -468,7 +540,8 @@ class Zend_View_Helper_Navigation_Menu
                                    $maxDepth,
                                    $onlyActive,
                                    $expandSibs,
-                                   $ulId)
+                                   $ulId,
+                                   $addPageClassToLi)
     {
         $html = '';
 
@@ -574,7 +647,18 @@ class Zend_View_Helper_Navigation_Menu
             }
 
             // render li tag and page
-            $liClass = $isActive ? ' class="active"' : '';
+            $liClass = '';
+            if ($isActive && $addPageClassToLi) {
+                $liClass = $this->_htmlAttribs(
+                    array('class' => 'active ' . $page->getClass())
+                );
+            } else if ($isActive) {
+                $liClass = $this->_htmlAttribs(array('class' => 'active'));
+            } else if ($addPageClassToLi) {
+                $liClass = $this->_htmlAttribs(
+                    array('class' => $page->getClass())
+                );
+            }
             $html .= $myIndent . '    <li' . $liClass . '>' . self::EOL
                    . $myIndent . '        ' . $this->htmlify($page) . self::EOL;
 
@@ -628,7 +712,8 @@ class Zend_View_Helper_Navigation_Menu
                                               $options['indent'],
                                               $options['minDepth'],
                                               $options['maxDepth'],
-                                              $options['ulId']);
+                                              $options['ulId'],
+                                              $options['addPageClassToLi']);
         } else {
             $html = $this->_renderMenu($container,
                                        $options['ulClass'],
@@ -637,7 +722,8 @@ class Zend_View_Helper_Navigation_Menu
                                        $options['maxDepth'],
                                        $options['onlyActiveBranch'],
                                        $options['expandSiblingNodesOfActiveBranch'],
-                                       $options['ulId']);
+                                       $options['ulId'],
+                                       $options['addPageClassToLi']);
         }
 
         return $html;
@@ -673,12 +759,15 @@ class Zend_View_Helper_Navigation_Menu
      *                                               {@link getIndent()}.
      * @param  string|null               $ulId       [optional] Unique identifier
      *                                               (id) use for UL element
+     * @param  bool                      $addPageClassToLi  adds CSS class from
+     *                                                      page to li element
      * @return string                                rendered content
      */
     public function renderSubMenu(Zend_Navigation_Container $container = null,
                                   $ulClass = null,
                                   $indent = null,
-                                  $ulId   = null)
+                                  $ulId   = null,
+                                  $addPageClassToLi = false)
     {
         return $this->renderMenu($container, array(
             'indent'           => $indent,
@@ -688,6 +777,7 @@ class Zend_View_Helper_Navigation_Menu
             'onlyActiveBranch' => true,
             'renderParents'    => false,
             'ulId'             => $ulId,
+            'addPageClassToLi' => $addPageClassToLi,
         ));
     }
 
@@ -712,6 +802,8 @@ class Zend_View_Helper_Navigation_Menu
      *                                               and the module where the
      *                                               script can be found.
      * @return string                                helper output
+     *
+     * @throws Zend_View_Exception   When no partial script is set
      */
     public function renderPartial(Zend_Navigation_Container $container = null,
                                   $partial = null)

+ 68 - 0
tests/Zend/View/Helper/Navigation/MenuTest.php

@@ -704,4 +704,72 @@ class Zend_View_Helper_Navigation_MenuTest
             $this->_helper->renderSubMenu(null, null, null, 'foo')
         );
     }
+
+    /**
+     * @group ZF-7212
+     */
+    public function testRenderingDeepestMenuWithUlId()
+    {
+        $this->assertContains(
+            '<ul class="navigation" id="foo">',
+            $this->_helper->renderMenu(null, array('ulId' => 'foo'))
+        );
+    }
+
+    /**
+     * @group ZF-7003
+     */
+    public function testSetAddPageClassToLi()
+    {
+        $this->_helper->addPageClassToLi();
+        $this->assertTrue($this->_helper->getAddPageClassToLi());
+    }
+
+    /**
+     * @group ZF-7003
+     */
+    public function testRenderingWithPageClassToLi()
+    {
+        $this->_helper->addPageClassToLi();
+
+        // Add css class
+        $container = $this->_helper->getContainer();
+        $container->findBy('href', 'page1')->setClass('foo');
+
+        // Tests
+        $this->assertContains(
+            '<li class="foo">',
+            $this->_helper->renderMenu()
+        );
+        $this->assertNotContains(
+            '<a class="foo" href="page1">Page 1</a>',
+            $this->_helper->renderMenu()
+        );
+    }
+
+    /**
+     * @group ZF-7003
+     */
+    public function testRenderDeepestMenuWithPageClassToLi()
+    {
+        // Add css class
+        $container = $this->_helper->getContainer();
+        $container->findBy('label', 'Page 2.3.3.1')->setClass('foo');
+
+        // Tests
+        $options = array(
+            'onlyActiveBranch' => true,
+            'renderParents'    => false,
+            'addPageClassToLi' => true,
+        );
+
+        $this->assertContains(
+            '<li class="active foo">',
+            $this->_helper->renderMenu(null, $options)
+        );
+        $this->assertNotContains(
+            '<a class="foo" href="page1">Page 1</a>',
+            $this->_helper->renderMenu(null, $options)
+        );
+    }
 }