Zend2导航

时间:2014-04-05 16:45:21

标签: php zend-framework2

我想在我的视图中制作导航按钮,例如index.phtml,但它不起作用。我确实知道如何在Zend1中做到这一点,但在Zend2中我遇到了问题。我的代码看起来像这样(文件index.phtml):

$container = new \Zend\Navigation\Navigation($tableActions);
var_dump($container);
echo '<div class="table-column">';
echo $this->navigation($container)->menu();
echo '</div>';

变量$ tableAction如下所示:

public $tableActions = array(
    array(
        'label' => 'On/Off',
        'module' => 'import',
        'controller' => 'import',
        'action' => 'setstatus',
        'params' => array('id' => null),
    ),
);

我没有得到任何错误,只是整个网站都死在这条线上。 var_dump返回对象(Zend \ Navigation \ Navigation),所以到目前为止它很好。问题是,如何展示......

1 个答案:

答案 0 :(得分:0)

导航页面具有仅通过在视图中创建new容器类而无法满足的依赖项。 Mvc页面需要RouteStackInterface(路由器)实例和RouteMatch实例。同样,Uri个页面需要当前的Request个实例。

如果您查看Zend\Navigation\Service\AbstractNavigationFactory及其preparePagesinjectComponents方法,可以清楚地看到这一点。

视图不是实例化菜单的正确位置,而是将菜单配置规范放在module.config.php ...

<?php
return array(
    'navigation' => array(
        'table_actions' => array(
            array(
                'label' => 'On/Off',
                'module' => 'import',
                'controller' => 'import',
                'action' => 'setstatus',
                'params' => array('id' => null),
            ),
        ),
    ),
);

编写一个扩展AbstractNavigationFactory类的工厂并实现getName()方法,该方法返回菜单规范键的名称(在此示例中为table_actions

<?php
namespace Application\Navigation\Service;

use Zend\Navigation\Service\AbstractNavigationFactory;

class TableActionsFactory extends AbstractNavigationFactory
{
    /**
     * @return string
     */
    protected function getName()
    {
        return 'table_actions';
    }
}

将工厂映射到service_manager的{​​{1}}规范中的服务名称...

module.config.php

现在,您可以使用刚刚映射的服务名称<?php return array( 'navigation' => array(// as above ... ) 'service_manager' => array( 'factories' => array( 'TableActionsMenu' => 'Application\Navigation\Service\TableActionsFactory', ), ), ); 来调用视图助手

TableActionsMenu

最后,如果我怀疑你需要根据视图更改页面的属性,你也可以这样做,导航容器有find* methods,可以从导航助手访问并习惯检索页面。

这是一个寻找具有匹配页面标签的页面的示例,然后在渲染之前更改它(显然不是理想的搜索参数,但它可以为您提供想法)

<div class="table-column">
    <?php echo $this->navigation('TableActionsMenu')->menu(); ?>
</div>