在同一控制器下更改不同视图中的布局 - zend 框架



我有一个带有许多视图/操作的控制器。我正在使用zend_navigation和面包屑进行主导航。但是,当呈现某些视图/操作时,我想在这组视图/操作中添加一个带有本地导航的"控制面板"。添加面板没有问题,这是决定我处于哪个视图/操作的逻辑。

我可以从控制器级别识别视图/操作

    $controller = $this->getRequest()->getControllerName();
    $action = $this->getRequest()->getActionName();

但是我可以将其传递给布局,还是需要或可以检测我在布局中的位置?我想一种选择是在单独的控制器中使用控制面板创建视图,但这似乎是一种愚蠢的方法。

我认为你必须结合ArneRie和Acherer所说的话:

在/application/configs/cp.ini 中:

cp[] = "moduleA.controllerB.actionC"
cp[] = "moduleA.controllerD.actionE"

在您的引导程序内:

protected function _initCp()
{
  $ini = new Zend_Config_Ini(APPLICATION_PATH . '/configs/cp.ini');
  Zend_Registry::set('cp', $ini->toArray());
}

在布局内:

<?= $this->partial('cp.phtml') ?>

在你的部分:/application/layouts/cp.phtml:

<?php
$request = Zend_Controller_Front::getInstance()->getRequest();
$module = $request->getModuleName();
$controller = $request->getControllerName();
$action = $request->getActionName();
if (in_array(implode('.', array($module, $controller, $action)), Zend_Registry::get('cp')) : ?>
    // display cp html here
<?php endif ?>

你可能想仔细检查 ini 数组,但这是 Zend Jedi :p 的路径

只是一个想法,我会在控制器插件中执行此操作

public function preDispatch()
{
    $controller = $this->getRequest()->getControllerName();
    $action = $this->getRequest()->getActionName();
    $layout = Zend_Layout::getMvcInstance();
    $layoutView = $layout->getView();
    $whereIam = $controller. '.' .$action;
    switch ($whereIam) {
        case 'index.showuser':
            $layoutView->showPanel = true;
            $layoutView->controlPanel = $this->view->render('myPanel.phtml');
            break;
        default:
            break;
    }
}

   //layout.phtml
    if ($this->showPanel === true) {
        echo $this->controlPanel;
    }
可以

工作,或者只是传递需要它的操作$this->view->cp = true;,并在layout.phtml文件中检查其设置和true。

最新更新