Dinamicamente adicionar páginas ao recipiente Zend_Navigation em tempo de execução
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.

















































Isso é só o que eu estava procurando - obrigado por um exemplo muito claro. Cheers. G
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.
Bem, eu uso os módulos, o meu mal. Mas você sugere autoloading deve funcionar? Bem, eu tenho que cavar um pouco mais profundo. No momento eu uso a função addPage na BaseControllers, que não é realmente o desempenho amigável ... hehe. Obrigado pela sua resposta.
Garantir o seu modelo de módulo é o nome correcto _News (Por exemplo) e ele deve pegar usando autoloading.
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.