我的每个页面都有一个侧边栏。侧边栏的第一个元素是a)登录表单,或b)当前用户的详细信息(取决于用户是否登录)。
我已经阅读了几种方法来实现这一目标,并计划在引导程序中初始化侧边栏占位符。
在将用户详细信息或登录表单附加到侧边栏时,我应该从Action Helper中的predispatch执行此操作吗?或者从控制器插件中的predispatch?为什么呢?
谢谢!
答案 0 :(得分:1)
我建议阅读Matthew Weier O'Phinney(ZF Lead)的Using Action Helpers To Implement Re-Usable Widgets。
在他的示例中,他在Action Helper中使用public function preDispatch()
来创建可重用的Login / User-Widget。
答案 1 :(得分:0)
我会使用 ActionStack Action Helper来堆叠对用户控制器的调用。堆叠意味着,当你完成这个当前动作时,让我们在进行布局渲染之前调用一个新动作。
然后,此用户控制器将能够(基于存储在注册表中的Auth)决定它应该从缓存生成/获取哪些内容。此用户控制器操作将使用$this->_helper->viewRenderer->setResponseSegment('myusersidebar');
让Zend_Layout主要调用<?= $this->myusersidebar ?>
来回显该块。
所以这不是一个控制器插件(除了Action Stack是一个控制器插件),而不是一个控制器预分配器,而只是通过堆叠几个动作并在最后渲染布局来循环Zend MVC堆栈的方式。
动作堆叠实际上与布局组成有关,应该避免特殊请求(如ajax请求,它们当然不需要您的用户块)。因此,您可以决定延迟在每个Actions上堆叠布局块的过程(并避免将其堆叠为ajax操作),或添加一些代码以删除Ajax上下文加载时要堆叠的操作(如Zend_Layout的方式)在AjaxContext中禁用。)
“简单”预捕获处理的问题在于,您可以执行代码来为不需要此块的请求(ajax请求,pdf请求等)准备html块。
答案 2 :(得分:0)
我实际上相信这样做不是干的。用户对象已经在ZF应用程序(Zend_Auth)中,因此额外的重复逻辑是不必要的IMO。剩下的就是让你的观点决定根据对象的状态显示什么。
哦,我强烈建议你这样做。
e.g。在你的布局中:
<?= $this->partial('userSidebar.phtml'); ?>
然后在你的部分/application/layouts/userSidebar.phtml中:
<div id="sidebar">
<?php if Zend_Auth::getInstance()->hasIdentity() : ?>
<?php $user = Zend_Auth::getInstance()->getIdentity() ?>
// do some user profiling stuffies
// if you need more information you should rather associate the user with those entities (else consider retrieving here or passing it as a parameter in the partial method)
<?php else : ?>
// not logged in
// do some login/registering stuffies
<?php endif ?>
</div>
答案 3 :(得分:0)
我会使用视图助手。这是我的第一个Zend项目。它绘制链接取决于用户是否为admin。
<?php
class TBB_View_Helper_PanelLink extends Zend_View_Helper_Abstract
{
public function panelLink($moduleName = 'customer')
{
$panelLink = "";
$auth = Zend_Auth::getInstance();
if($auth->hasIdentity()) {
$identity = $auth->getIdentity();
$username = $identity->username;
$userModel = new TBB_Model_Users();
$userID = $userModel->getUserIDByUsername($username);
if($userModel->isAdminUser($userID)) {
if($moduleName == 'customer') {
$panelLink = '<a class="span-4" href="admin/">Admin Panel</a>';
} else if($moduleName == 'admin') {
$panelLink = '<a class="span-4" href="/">Homepage</a>';
}
}
}
return $panelLink;
}
}