编辑原帖更清晰。现在有一个新的麻烦领域,我认为是纯语法。
我是OOP和Zend Framework 2的新手。试图了解局部的使用。我还扩展了一个由其他人首先启动的应用程序。因此,Entity / Gateway / Controller / View的命名约定确保对于指定的操作,返回正确的模板。
我正在尝试使用“partial('/ nav / index.phtml');”作为在索引页面的标题中插入一个片段的方法。但我想在其他页面上使用不同的部分。
根据Marshall的建议,在TemplateController中,我将一个变量(nav_template)添加到viewModel,指定用于导航的部分:
<?php
namespace Application\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
class TplController extends AbstractActionController
{
public function topicAviewAction()
{
$viewModel = new ViewModel();
$viewModel->setTerminal(true);
$viewModel->setVariable('nav_template', 'nav/topica.phtml');
return $viewModel;
}
public function topicBviewAction()
{
$viewModel = new ViewModel();
$viewModel->setTerminal(true);
$viewModel->setVariable('nav_template', 'nav/topicb.phtml');
return $viewModel;
}
}
我使用下面的命令来验证我的变量是否包含在对象中,它是
echo $viewModel->nav_template;
但是,当我使用以下内容在layout.phtml中包含partial时:
<?php echo $this->partial(isset($nav_template) ? $nav_template : 'nav/index'); ?>
显然没有使用/找到$ nav_template的值。我哪里出错了?
答案 0 :(得分:2)
您可以在Module类中使用onBootstrap事件。确保在路由事件中处理它,否则在onBootstrap中此时您将不会有路径匹配。例如:
public function onBootstrap(MvcEvent $e)
{
$e->getApplication()->getEventManager()->attach(
\Zend\Mvc\MvcEvent::EVENT_ROUTE,
function($e) {
$viewModel = $e->getViewModel();
$nav = new \Zend\View\Model\ViewModel();
$routeMatch = $e->getRouteMatch();
switch ($routeMatch->getMatchedRouteName())
{
case 'home':
$template = 'your/template';
break;
default:
break;
}
$nav->setTemplate($template);
$viewModel->addChild($nav, 'nav');
},
-1000
);
...
在您的布局中,您只需使用:echo $ nav;
请注意,您还必须在'view_manager'=&gt;中的module.config.php中定义您使用的模板。 'template_map'键。
答案 1 :(得分:0)
在您的布局模板中,使用如下默认回退调用动态部分:
<?php echo $this->partial(isset($nav_template) ? $nav_template : 'nav/index'); ?>
然后在你想要更改布局导航的控制器中:
$this->layout()->setVariable('nav_template', 'nav/other');
应该有效。 (另)
答案 2 :(得分:0)
FWIW,干得好,Ruben,但如果您使用默认路由设置(例如来自Skeleton App),当您使用'application\default'
$routeMatch->getMatchedRouteName()
之类的内容
这是一个可以使用正则表达式段路由的轻微mod:
public function onBootstrap(MvcEvent $e)
{
$e->getApplication()->getEventManager()->attach(
\Zend\Mvc\MvcEvent::EVENT_ROUTE,
function($e) {
$viewModel = $e->getViewModel();
$nav = new \Zend\View\Model\ViewModel();
$routeMatch = $e->getRouteMatch();
$routeMatchParams = $routeMatch->getParams(); // <-- added this
switch ($routeMatchParams['controller']) // // <-- switch on invokable alias of your controller(s)
{
case 'Application\Controller\YourController':
$template = 'your/custom-template';
break;
default:
$template = 'your/default-template';
break;
}
$nav->setTemplate($template);
$viewModel->addChild($nav, 'nav');
},
-1000
);
...
答案 3 :(得分:0)
简单地说,我认为您需要做的就是使用......
$this->nav_template
取代......
$nav_template
其他框架以不同的方式做事,但在ZF2中,变量设置为viewmodel本身,因此可以使用魔术getter方法从布局/视图中调用,并从View / View模型中的$ data变量中获取它类。
指出......
使用...
$this->nav_template