Содержание


Menu Helper


Menu Helper,навигация, ZF2, Zend Framework 2, меню



Помощник  Menu используется для отображения меню из контейнера навигации.  По умолчанию меню будет создаваться с использованием тегов UL и LI. Возможно использование вспомогательных скриптов видов.


Методы помощника Menu

1) {get|set}UlClass() gets/sets(получить/установить) класс (class) CSS, который будет использоваться при рендеринге.

2) {get|set}OnlyActiveBranch() gets/sets (получить/установить) флаг, определяющий, должна ли выводиться только активная ветка из контейнера или нет.

3) {get|set}RenderParents() gets/sets (получить/установить) флаг, определяющий, должны ли выводиться родители, если рендериться только активная ветка в контейнера. Если установить «FALSE», то рендериться будет только самое глубокое активное меню.

4) {get|set}Partial() gets/sets (получить/установить) дополнительный скрипт вида, который должен быть использован для построения меню. Если скрипт установлен, то будет использоваться метод  renderPartial(). Если не установлен то используется метод renderMenu(). В метод нужно передать  String (строку) или Array (массив) из двух элементов. Если передана строка -  то это имя скрипта. Если массив, то первый элемент должен быть имя дополнительного скрипта вида, второй -  имя модуля, где располагается этот скрипт.

5)  htmlify() - переопределяет метод от абстрактного класса, чтобы вернуть диапазон элементов, если страница не имеет HREF.

6) renderMenu($container = null, $options = array()) - является методом отображения по-умолчанию. Строит меню используя тег Ul. Если $container не указан, то будет использован при рендеринге контейнер, переданный в помощник. $options используется для переопределения параметров, указанных временно без перезаписи значений в экземпляре помощника. Представляет собой массив, каждый ключ которого соответствует опции помощника.

 

Возможные опции:

1) indent; отступ. Строка или целочисленное значение.

2) minDepth; минимальная глубина. Целочисленное значение или NULL (минимальная глубина).

3) maxDepth; максимальная глубина. Целочисленное значение или NULL (максимальная глубина).

4) ulClass; CSS класс (class) для элемента «ul». Строка.

5) onlyActiveBranch; Отображать только активную ветвь. Логическое значение.

6) renderParents; Отображать родителей или нет, если выбрано отображение только активной ветви. Логическое значение.

 

Если опции не указаны, то будут использованы те, что установлены в помощнике.

Рендеринг меню

Меню формируется из контейнера, указанного в помощнике.

Обратите внимание, как фильтруются страницы на основе ACL.

In a view script or layout:
<?php echo $this->navigation()->menu()->render() ?>
 
Or simply:
<?php echo $this->navigation()->menu() ?>
 
Output:
<ul class="navigation">
    <li>
        <a title="Go Home" href="/">Home</a>
    </li>
    <li class="active">
        <a href="/products">Products</a>
        <ul>
            <li class="active">
                <a href="/products/server">Foo Server</a>
                <ul>
                    <li class="active">
                        <a href="/products/server/faq">FAQ</a>
                    </li>
                    <li>
                        <a href="/products/server/editions">Editions</a>
                    </li>
                    <li>
                        <a href="/products/server/requirements">System Requirements</a>
                    </li>
                </ul>
            </li>
            <li>
                <a href="/products/studio">Foo Studio</a>
                <ul>
                    <li>
                        <a href="/products/studio/customers">Customer Stories</a>
                    </li>
                    <li>
                        <a href="/products/studio/support">Support</a>
                    </li>
                </ul>
            </li>
        </ul>
    </li>
    <li>
        <a title="About us" href="/company/about">Company</a>
        <ul>
            <li>
                <a href="/company/about/investors">Investor Relations</a>
            </li>
            <li>
                <a class="rss" href="/company/news">News</a>
                <ul>
                    <li>
                        <a href="/company/news/press">Press Releases</a>
                    </li>
                    <li>
                        <a href="/archive">Archive</a>
                    </li>
                </ul>
            </li>
        </ul>
    </li>
    <li>
        <a href="/community">Community</a>
        <ul>
            <li>
                <a href="/community/account">My Account</a>
            </li>
            <li>
                <a class="external" href="http://forums.example.com/">Forums</a>
            </li>
        </ul>
    </li>
</ul>

Вызов renderMenu () напрямую

Меню рендериться без регистрации в помощнике с помощью renderMenu() напрямую и назначением нескольких опций.

<?php
// render only the 'Community' menu
$community = $this->navigation()->findOneByLabel('Community');
$options = array(
    'indent'  => 16,
    'ulClass' => 'community'
);
echo $this->navigation()
          ->menu()
          ->renderMenu($community, $options);
?>
Output:
                <ul class="community">
                    <li>
                        <a href="/community/account">My Account</a>
                    </li>
                    <li>
                        <a class="external" href="http://forums.example.com/">Forums</a>
                    </li>
                </ul>

Отображение самого глубокого активного меню

Отображение самого глубокого активного подменю в активной ветке с помощью  renderSubMenu().

Вызов renderSubMenu($container, $ulClass, $indent) эквивалентен вызову renderMenu($container, $options) со следующими опциями:

array(
    'ulClass'          => $ulClass,
    'indent'           => $indent,
    'minDepth'         => null,
    'maxDepth'         => null,
    'onlyActiveBranch' => true,
    'renderParents'    => false
);
<?php
echo $this->navigation()
          ->menu()
          ->renderSubMenu(null, 'sidebar', 4);
?>
 
The output will be the same if 'FAQ' or 'Foo Server' is active:
    <ul class="sidebar">
        <li class="active">
            <a href="/products/server/faq">FAQ</a>
        </li>
        <li>
            <a href="/products/server/editions">Editions</a>
        </li>
        <li>
            <a href="/products/server/requirements">System Requirements</a>
        </li>
    </ul>

Рендеринг (отображение, формирование) меню с максимальной глубиной

<?php
echo $this->navigation()
          ->menu()
          ->setMaxDepth(1);
?>
 
Output:
<ul class="navigation">
    <li>
        <a title="Go Home" href="/">Home</a>
    </li>
    <li class="active">
        <a href="/products">Products</a>
        <ul>
            <li class="active">
                <a href="/products/server">Foo Server</a>
            </li>
            <li>
                <a href="/products/studio">Foo Studio</a>
            </li>
        </ul>
    </li>
    <li>
        <a title="About us" href="/company/about">Company</a>
        <ul>
            <li>
                <a href="/company/about/investors">Investor Relations</a>
            </li>
            <li>
                <a class="rss" href="/company/news">News</a>
            </li>
        </ul>
    </li>
    <li>
        <a href="/community">Community</a>
        <ul>
            <li>
                <a href="/community/account">My Account</a>
            </li>
            <li>
                <a class="external" href="http://forums.example.com/">Forums</a>
            </li>
        </ul>
    </li>
</ul>

Рендеринг(отображение, формирование) меню с минимальной глубиной

<?php
echo $this->navigation()
          ->menu()
          ->setMinDepth(1);
?>
 
Output:
<ul class="navigation">
    <li class="active">
        <a href="/products/server">Foo Server</a>
        <ul>
            <li class="active">
                <a href="/products/server/faq">FAQ</a>
            </li>
            <li>
                <a href="/products/server/editions">Editions</a>
            </li>
            <li>
                <a href="/products/server/requirements">System Requirements</a>
            </li>
        </ul>
    </li>
    <li>
        <a href="/products/studio">Foo Studio</a>
        <ul>
            <li>
                <a href="/products/studio/customers">Customer Stories</a>
            </li>
            <li>
                <a href="/products/studio/support">Support</a>
            </li>
        </ul>
    </li>
    <li>
        <a href="/company/about/investors">Investor Relations</a>
    </li>
    <li>
        <a class="rss" href="/company/news">News</a>
        <ul>
            <li>
                <a href="/company/news/press">Press Releases</a>
            </li>
            <li>
                <a href="/archive">Archive</a>
            </li>
        </ul>
    </li>
    <li>
        <a href="/community/account">My Account</a>
    </li>
    <li>
        <a class="external" href="http://forums.example.com/">Forums</a>
    </li>
</ul>

Отображение только активной ветви

<?php
echo $this->navigation()
          ->menu()
          ->setOnlyActiveBranch(true);
?>
 
Output:
<ul class="navigation">
    <li class="active">
        <a href="/products">Products</a>
        <ul>
            <li class="active">
                <a href="/products/server">Foo Server</a>
                <ul>
                    <li class="active">
                        <a href="/products/server/faq">FAQ</a>
                    </li>
                    <li>
                        <a href="/products/server/editions">Editions</a>
                    </li>
                    <li>
                        <a href="/products/server/requirements">System Requirements</a>
                    </li>
                </ul>
            </li>
        </ul>
    </li>
</ul>

Отображение только активной ветви с минимальной глубиной

<?php
echo $this->navigation()
          ->menu()
          ->setOnlyActiveBranch(true)
          ->setMinDepth(1);
?>
 
Output:
<ul class="navigation">
    <li class="active">
        <a href="/products/server">Foo Server</a>
        <ul>
            <li class="active">
                <a href="/products/server/faq">FAQ</a>
            </li>
            <li>
                <a href="/products/server/editions">Editions</a>
            </li>
            <li>
                <a href="/products/server/requirements">System Requirements</a>
            </li>
        </ul>
    </li>
</ul>

Отображение только активной ветви с максимальной глубиной

<?php
echo $this->navigation()
          ->menu()
          ->setOnlyActiveBranch(true)
          ->setMaxDepth(1);
?>
 
Output:
<ul class="navigation">
    <li class="active">
        <a href="/products">Products</a>
        <ul>
            <li class="active">
                <a href="/products/server">Foo Server</a>
            </li>
            <li>
                <a href="/products/studio">Foo Studio</a>
            </li>
        </ul>
    </li>
</ul>

Отображение только активной ветви с минимальной глубиной и без родителей

<?php
echo $this->navigation()
          ->menu()
          ->setOnlyActiveBranch(true)
          ->setRenderParents(false)
          ->setMaxDepth(1);
?>
 
Output:
<ul class="navigation">
    <li class="active">
        <a href="/products/server">Foo Server</a>
    </li>
    <li>
        <a href="/products/studio">Foo Studio</a>
    </li>
</ul>

Отображение пользовательского меню используя вспомогательный скрипт вида

Вызвав setPartial() Вы имеете возможность указать вспомогательный скрипт вида (partial view script).

В layout:

$partial = array('menu.phtml', 'default');
$this->navigation()->menu()->setPartial($partial);
echo $this->navigation()->menu()->render();

В application/modules/default/views/menu.phtml:

foreach ($this->container as $page) {
    echo $this->navigation()->menu()->htmlify($page), PHP_EOL;
}

Выведет:

<a title="Go Home" href="/">Home</a>
<a href="/products">Products</a>
<a title="About us" href="/company/about">Company</a>
<a href="/community">Community</a>

Автор статьи: DuB