Pergunta

Eu estou usando Zend_Navigation (adição doce para o enquadramento, btw) para construir o meu menu, após o qual ele deve ser processado na página (evidentemente). I definir primeiro a algum lugar recipiente no controlador:

// $pages is the array containing all page information
$nav = new Zend_Navigation($pages);
$this->view->navigation($nav);

Em seguida, no layout, ele é processado como esta:

echo $this->navigation()->menu();

que funciona perfeitamente. Agora: Eu quero que o menu a ser prestado um pouco diferente. A página que eu estou construindo usa o jQuery Fisheye-plugin para construir um Mac-like dock-menu. No entanto, este plugin precisa de um específico de marcação ...

Na verdade, leva uma lista de elementos <a> que contêm um <img> (o ícone) e um <span> (para a dica de ferramenta). O padrão ajudante Vista menu torna tudo dentro de uma lista não ordenada (logicamente), com o parâmetro 'label' como o texto do link.

Parece que o conteúdo transmitido ao parâmetro 'label' escapou antes da renderização, então inserir o html não me fará nenhum bem. Além disso, a Fisheye geralmente não parecem levar seus itens contidos em uma tag <li>, com toda a coisa embrulhada em <ul></ul>, mas apenas uma lista de um nível de elementos <a>.

Eu estava pensando em escrever um ajudante exibição personalizada para a doca, o que seria capaz de cuidar de inserir o <img> eo <span>, mas eu estou tendo um tempo muito difícil a obtenção de um auxiliar de visualização personalizado anexado à classe de navegação . Eu só não consigo descobrir onde colocá-lo e de que maneira, apesar de todas as minhas outras classes personalizadas (modelos e tal) são docemente atendidos pelo carregador automático. Todas as ideias sobre isso?

Então, novamente, mesmo se eu conseguir este ponto de vista auxiliar para o trabalho, eu ainda estou à esquerda com a lista não ordenada HTML - Sei que posso perder essa também usando o ajudante exibição personalizada, mas eu sempre fui um fã de conter principais menus de navegação dentro de uma lista, por uma questão de semântica.

Se alguém puder me ajudar um pouco, eu agradeceria muito. Se a Fisheye simplesmente não se destina a trabalhar com <ul> de, isso seria muito ruim ... poderia haver uma boa razão para perder Zend_Navigation completamente neste caso?

Foi útil?

Solução

Eu não vi o caminho ainda quer em termos de fazer um renderizador personalizado. Aqui está o que eu acabei fazendo no entanto:

Primeiro, em vez de tornar a chamada menu padrão (), criar uma parcial para tornar-se em:

// menu.phtml is partial, cms is module
$partial = array('menu.phtml', 'cms');
$this->navigation()->menu()->setPartial($partial);
echo $this->navigation()->menu()->render();

Em seguida (a partir dos docs), você pode criar uma "custom" render assim:

// -- inside menu.phtml
foreach ($this->container as $page) 
{
    // this just prints a "<a>" or "<span>" tag
    // depending on whether the page has a uri
    echo $this->menu()->htmlify($page), PHP_EOL;
}

acabei fazendo o que eu tinha originalmente (um menu com um nível de submenus) com este script:

// -- another menu.phtml
<ul class="navigation">

<?php

$html = array();

foreach ($this->container as $page) 
{
    $html[] = "<li>";
    $html[] = $this->menu()->htmlify($page) . PHP_EOL;

    if (!empty($page->pages))
    {
        $html[] = "<ul>";
        foreach ($page->pages as $subpage) 
        {
            $html[] = "<li>";
            if ($href = $subpage->getHref()) $html[] = "<a href=\"{$href}\">";
            else $html[] = "<span>";
            $html[] = "<img src=\"/ui/cms/img/icons/edit.png\" alt=\"\"/>";
            $html[] = $subpage->getLabel();
            if ($href) $html[] = "</a>";
            else $html[] = "</span>";            
            $html[] = "</li>";
        }
        $html[] = "</ul>";
    }

    $html[] = "</li>";
}

echo join(PHP_EOL, $html);

?>
</ul>

Você pode simplesmente mudar a marcação na parcial e adicionar suas imagens / ícones lá.

Outras dicas

Infelizmente, para o problema de formatação no post anterior

Para adicionar o seu costume ajudante fazer o seguinte, em seu bootstrap:

protected function _initNavigation()
{
    $this->bootstrap('view');           // make sure we have a view
    $view = $this->getResource('view');     // get the view resource
    $config = new Zend_Config_Xml(APPLICATION_ROOT . '/config/navigation.xml','nav');
    $container = new Zend_Navigation($config);
    $view->navigation($container);

    // Tell Zend were it can find your custom helpers and what
    // the prefix is going to be.

   $view->addHelperPath(
          APPLICATION_ROOT . '/library/MyApp/View/Helper/Navigation',
          'MyApp_View_Helper_'
          );

}

Em seguida, crie o seu costume vista ajudante e colocá-lo no caminho ‘addHelperPath’. Dependendo do que você quer fazer o que você precisa para implementar pelo menos a sua própria função htmlify. Dê uma olhada em Zend / View / Ajuda / Navegação / menu.php como um exemplo.

class MyApp_View_Helper_MyMenu extends Zend_View_Helper_Navigation_Menu
{
    public function myMenu(Zend_Navigation_Container $container = null)
    {
        if (null !== $container) {
            $this->setContainer($container);
        }
        return $this;
    }

    protected function htmlify(Zend_Navigation_Page $page ) 
    {
        ...
    }
}

Em seguida, no seu script phtml:

   <?php echo $this->navigation()->myMenu()->setMaxDepth(0); ?>

ou apenas

   <?php echo $this->navigation()->myMenu(); ?>

Agora, se você quiser adicionar suas próprias propriedades personalizadas para o HTML gerado, você pode adicioná-los aos seus ini navegação ou arquivo xml. Por exemplo:

<home>
  <label>Home</label>
  <uri>/</uri>
  <img>
      <src>/images/MyIcon.gif</src>
  <img>
</home>

O <img> costume xml tag será armazenado como uma propriedade da página de navegação e pode ser obtida como:

foreach ($iterator as $page) {

    ...

    $properties = new Zend_Config($page->GetCustomProperties());
    $myPicture = $properties->img->src;

    ...
}

Espero que isso ajude. Peter

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top