Dinamicamente adicionar páginas ao recipiente Zend_Navigation em tempo de execução

Por , quinta-feira 7 de janeiro de 2010 22:50

Em uma continuação do meu último post sobre Zend_Navigation, pedidos de rotas para sitemap.xml para o controlador custom / ação , este post é sobre dymnamically adicionar páginas a um contêiner de Zend_Navigation em tempo de execução / script execução.

Sua tudo muito bem especificando suas páginas em uma ini ou xml arquivo, mas em algum momento você vai ter muda de página em seu site que você quer como parte de um menu, sitemap, ou para ser incluído na sua trilha de migalhas. Portanto, o que precisamos fazer é adicionar páginas ao nosso container Zend_Navigation em tempo de execução. Exemplos para isso seria em notícias acrescentando, posts ou comentários da página, etc

Neste exemplo vou adicionar alguns posts notícia para minha configuração ini estaticamente definido. Para obter notícias minhas configurações de página de post eu usei uma classe que retorna uma matriz com o seguinte formato:

 $ PagesToAdd = array (0 => array ('label' => 'notícia Falso # 5 ...',' módulo '=>' www ',' rota '=>' www-index ',' action '= > 'ver', 'controller' => 'notícias', 'params' => array ('id' => '5-Fake-news-história - 5 ')), 1 => array (/ página * Mais detalhes * /),); 

Como você vai notar que a função retornou um array em que estão contidos matrizes que compõem as matrizes de configuração para Zend_Navigation_Page_Mvc. Portanto, ao looping sobre a matriz páginas Zend_Navigation novo pode ser criado a partir da matriz de configuração. A próxima coisa a fazer como parte do ciclo é a de adicionar as páginas na posição correta (alternativamente páginas podem ser adicionadas na massa usando -> addPages (método)).

Para fazer isso, localize a página que você deseja adicionar as páginas e sub-para simplesmente adicionar as páginas. Neste caso eu usei o seguinte código ao encontrar a minha página:

  $ Container-> findOneBy ('label', 'Últimas Notícias') -> addPage ($ page); 

Meu inicialização de navegação global no bootstrap, portanto, parecido com este:

  / **
      * Utilizado para o tratamento de alto nível de navegação
      *
      * @ Return Zend_Navigation
      * /
     _initNavigation função protegida ()
     {
         $ This-> bootstrap ('layout');
         $ Layout = $ this-> getResource ('layout');
         $ View = $ layout-> getView ();
         $ Config = new Zend_Config_Ini (
             APPLICATION_PATH.  '/ Configs / navigation.ini, APPLICATION_ENV);

         $ Container = Zend_Navigation novo ($ config-> padrão);
         / / Agora adicione os últimos 25 notícias
         $ Notícias = new Notícias ();
         $ Pages = $ notícias> getNavigationEntries ();
         foreach ($ páginas AS $ page) {
        	 $ Page = new Zend_Navigation_Page_Mvc ($ page);
        	 $ Container-> findOneBy ('label', 'Últimas Notícias') -> addPage ($ page);
         }
         $ View-> navegação ($ container);
     } 

Em coisa que precisa ser adicionado é alguma forma de cache (usando Zend_Cache presumivelmente;)) de outra forma é que isto vai ser muito caro a cada carregamento da página.

6 Responses to "dinamicamente adicionar páginas ao recipiente Zend_Navigation em tempo de execução"

  1. Mr Man diz:

    Isso é só o que eu estava procurando - obrigado por um exemplo muito claro. Cheers. G

  2. A387 diz:

    Bom post! Eu tenho alguns problemas para iniciar uma classe de modelo no bootstrap. Qualquer indício porque application / modelo de classes não estão disponíveis no bootstrap? Sua classe é chamado de 'notícias novas ()', ao invés disso eu gostaria de adicionar as páginas de navegação, obtendo uma árvore de navegação a partir de uma classe de modelo. Se você tem uma idéia, por favor me avise! ;)

    • Meu modelo foi editado para o cargo, seu nome correto no código é Pro_News e é captado pelo autoloader.

      Supondo que você não está usando módulos? Mas se assim for o seu modelo deve ser chamado para _News ZF para pegar por padrão (eu não uso este sistema a mim mesmo).

      Sugiro verificar o caminho de inclusão a partir do seu método de bootstrap para ver se ele contém "application / models", ou incluir o arquivo manualmente.

  3. Meu modelo foi editado para o cargo, seu nome correto no código é Pro_News e é captado pelo autoloader.

    Supondo que você não está usando módulos? Mas se assim for o seu modelo deve ser chamado _News Para ZF para pegar por padrão (eu não uso este sistema a mim mesmo).

    Sugiro verificar o caminho de inclusão a partir do seu método de bootstrap para ver se ele contém "application / models", ou incluir o arquivo manualmente.

Deixe uma resposta













Tema por Panorama Themocracy

15 visitantes online agora
10 pessoas, 5 bots, 0 membros
Max visitantes hoje: 15 em 04:18 UTC
Este mês: 16 em 2011/04/08 12:59 UTC
Este ano: 130 em 28-03-2011 22:40 UTC
Todos os tempos: 130 em 28-03-2011 10:40 UTC