Есть ли способ иметь навигационную запись без ссылки в Zend Navigation? - PullRequest
3 голосов
/ 06 августа 2011

Я уверен, что мой вопрос довольно прост, и я искал ответ на этот вопрос, но я не могу заставить его работать. Я хочу сделать что-то вроде этого:

<?xml version="1.0" encoding="UTF-8"?>
<configdata>
<dashboard>
    <label>Dashboard</label>
    <controller>dashboard</controller>
    <action>index</action>
    <module>global</module>
</dashboard>
<bills>
    <label>Bills</label>
    <pages>
        <create-bill>
            <label>Create New Bill</label>
            <controller>bill</controller>
            <action>create</action>
            <module>global</module>
        </create-bill>
    </pages>
</bills>
</configdata>

Обратите внимание, что в разделе <bills> я хочу, чтобы в категории была только метка, поэтому, когда я добавлю стилизацию позже, я могу навести курсор на «Счета» и «Создать новый счет», и другие ссылки будут показано, но нажатие на «Счета» ничего не должно делать, потому что это просто заголовок категории.

Надеюсь, это имеет смысл.

Mockup of menu. Bill is not a link.

Ответы [ 5 ]

3 голосов
/ 24 февраля 2012

Существует еще один способ решить эту проблему.

Вы можете установить пользовательские свойства для всех страниц Zend_Navigation_Page, просто указав дополнительные параметры конфигурации в вашем xml / array /...

Затем с помощью выделенного партиала для рендеринга меню / хлебных крошек вы можете полностью пропустить рендеринг тега <a> или отрисовку совершенно другой разметки на основе этих свойств.

<!-- ... -->
    <page1>
        <label>Page 1</label>
        <uri>page1</uri>
        <link>false</link> <!-- Custom property -->
        <pages>
            <page1_1>
                <label>Page 1.1</label>
                <uri>page1/page1_1</uri>
            </page1_1>
            <page1_2>
                <label>Page 1.2</label>
                <uri>page1/page1_2</uri>
            </page1_2>
            <page1_3>
                <label>Page 1.3</label>
                <uri>page1/page1_3</uri>
            </page1_3>
        </pages>
    </page1>
<!-- ... -->

Примечание: здесь я использую пример хлебных крошек, но большинство навигационных View_Helpers имеют метод setPartial (), включая помощник меню.

Тогда в вашем скрипте вида или макете вы просто указываете, что вашему помощнику хлебных крошек нужно использовать частичное.

<?php
echo $this->navigation()->breadcrumbs()->setPartial('my_breadcrumbs.phtml');

А в своей части вы перебираете страницы в годовой цепочке и проверяете пользовательские свойства для каждой страницы.

<?php
foreach($this->pages as $page)
{
    $properties = $page->getCustomProperties();

    // Check if we need to render the link tag
    if($properties['link'] !== false){
        echo '<a href="' . $page->getHref() . '">';
    }

    // Render the label
    echo $page->getLabel();

    // And check if we need to render the closing tag
    if($properties['link'] !== false){
        echo '</a>';
    }

}

Примечание: при использовании частичного вы потеряете некоторые функциональные возможности Breadcrumb View_Helper по умолчанию, такие как setLinkLast, setSeparator, ... но это не должно создавать особых проблем.

3 голосов
/ 06 августа 2011

Вы должны указать тип своей страницы, в противном случае Zend_Navigation выдаст исключение. В таких случаях, как ваш, я всегда использую Zend_Navigation_Page_Uri в качестве типа страницы и задаю его uri для #. Чтобы применить это к вашему конфигурационному файлу, вы можете сделать это

<bills>
    <label>Bills</label>
    <uri>#</uri>
    <pages>
        <create-bill>
            <label>Create New Bill</label>
            <controller>bill</controller>
            <action>create</action>
            <module>global</module>
        </create-bill>
    </pages>
</bills>

Сгенерированная разметка по-прежнему содержит ссылку, но нигде не будет указывать.

Более того, поскольку вам нужно привязать к нему некоторый javascript для отображения меню, вы можете даже отключить его, вернув false в обработчике кликов для этих ссылок.

Чтобы прикрепить обратные вызовы javascript (или некоторые CSS) к ссылкам такого типа, вам может быть полезно прикрепить класс к этим ссылкам. В том же файле конфигурации вы можете с этим кодом

<bills>
    <label>Bills</label>
    <uri>#</uri>
    <class>fakelink</class>
    <pages>
        <create-bill>
            <label>Create New Bill</label>
            <controller>bill</controller>
            <action>create</action>
            <module>global</module>
        </create-bill>
    </pages>
</bills>

В этом случае сгенерированная разметка будет

<li class="fakelink>
  <a href="#">Bills</a>
  <ul>submenu here</ul>
</li>

и вы можете легко выбирать ссылки такого рода с помощью библиотеки JavaScript. Например, с помощью jQuery вы можете сделать это:

$(function() { $('.fakelinks > a').click(function () { return false; }); });
2 голосов
/ 30 марта 2012

Если вы довольны тем, что ярлыки вашей категории имеют интервалы, тогда достаточно указать пустой URI. Zend_View_Helper_Navigation_Menu :: htmlify () - это то, что отображает Zend_Navigation_Page:

/**
 * Returns an HTML string containing an 'a' element for the given page if
 * the page's href is not empty, and a 'span' element if it is empty
 *
 * Overrides {@link Zend_View_Helper_Navigation_Abstract::htmlify()}.
 *
 * @param  Zend_Navigation_Page $page  page to generate HTML for
 * @return string                      HTML string for the given page
 */
public function htmlify(Zend_Navigation_Page $page)

Пример вывода:

<ul class="navigation">
    <li>
        <span id="menu-staff">Staff</span>
        <ul>
            <li>
                <a href="/staff/holiday/book-holiday" id="menu-staff-holiday-book">Book Holiday</a>
            </li>
            <li>
                <a href="/staff/holiday/view-holidays" id="menu-staff-holiday-view-booked">View Booked and Remaining Holiday</a>
            </li>
        </ul>
    </li>
</ul>
0 голосов
/ 22 марта 2018
<page_bills>
   <label>Bills</label>
   <type>uri</type>
   <pages>

   </pages>
</page_bills>
0 голосов
/ 15 декабря 2012

Я пошел по-другому:

nav:

  User:
    label: Account Services
    uri: @fakeUri

Тогда в моем шаблоне код:

<?php foreach ($navSettings as $navSetting): ?>
    <?php if ('@fakeUri' === $navSetting->getUri()): ?>
        <?php echo $navSetting->getLabel() ?>
    <?php else: ?>
        <a href="<?php echo $navSetting->getUri() ?>"><?php echo $navSetting->getLabel()) ?>
    <?php endif ?>
<?php endforeach ?>
...