- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在努力实现带有动态 URL 参数的 Zend_Navigation
面包屑。
简单场景:想象一个带有 viewAction()
的 CompanyController
,它从 URL 中获取一个 id
参数来获取有关特定公司的信息.
URL: example.com/company/view/id/4
Desired breadcrumb: Home > Companies > [ Company name ]
我在网上做了一些研究并提出了以下解决方案:在 predispatch()
Hook 中,我从 $_SERVER[ 中获取了
(我们不能为此使用请求对象,因为调度尚未开始)并从数据库中获取该记录。然后我简单地将这个页面添加到它在 id
参数'REQUEST_URI']Zend_Navigation
容器中的根页面。您可以在本文底部看到它的实现。
我发现这种方法的问题是它不可扩展:
如果每个公司有多个操作怎么办?
除了查看
公司记录外,我们可能还想编辑
(example.com/company/edit/id/4
) 或对其执行其他操作。当然,我们可以创建一个 switch 语句来检查 URL 中的操作,但我觉得这是不可扩展的。
如果 URL 中有多个动态参数怎么办?
对于每个公司
,我们还需要管理其联系人
(公司所有者、财务人员等),因此我们创建了一个ContactsController
它还包含一个 viewAction
和 editAction
。由于联系人与公司直接相关,我们希望在 URL 和面包屑中也能体现这一点:
URL: example.com/company/company-id/4/contacts/contact-id/2
Desired breadcrumb: Home > Companies > [Company name] > Contacts of [Company name] > [Contact name]
我们可以很容易地为此设置一条路线。但是现在我们必须从 URL 中获取多个 id
。随着 URL 变得越来越复杂,此过程更容易出错。
到目前为止,我提出了两个看似合理的解决方案:
扩展 Plugin_Navigation::preDispatch()
钩子(Hook)
一个可能的解决方案是使用详细的 URL 参数(如 company-id
和 contact-id
)。这样我们就可以提取名称(即company
)并通过相应的模型类获取记录。
在我们的操作方法中将页面添加到导航容器
这将是我认为最灵活的选择,但这也意味着我们不能再从一个中心点管理我们的面包屑,这是一个严重的缺点。
我已经进行了大量研究,但似乎没有针对此问题的现成解决方案。非常感谢任何帮助。
前面提到的Plugin_Navigation::preDispatch()
钩子(Hook):
class Plugin_Navigation extends Zend_Controller_Plugin_Abstract
{
public function preDispatch()
{
$view = Zend_Controller_Action_HelperBroker::getExistingHelper('ViewRenderer')->view;
$config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml','nav');
$container = new Zend_Navigation($config);
$urlParts = explode('/', ltrim($_SERVER['REQUEST_URI'], '/'));
$pos = array_search('id', $urlParts);
if ($pos !== FALSE)
{
$id = $urlParts[$pos + 1];
$model = new Model_Company();
$company = $model->fetchOne($id);
$rootPage = $container->findOneBy('controller', 'company');
$rootPage->addPage(new Zend_Navigation_Page_Mvc(array(
'controller' => 'company',
'action' => 'view',
'label' => $company->name
)));
$view->navigation($container);
}
}
}
有关此主题的一些引用资料:
最佳答案
您可以通过在 bootstrap.php 文件中引导前端 Controller 简单地解决这个问题
在 bootstrap.php 文件中添加:
public function _initRequest()
{
$this->bootstrap('frontController');
$front = $this->getResource('frontController');
$front->setRequest(new Zend_Controller_Request_Http());
$request = $front->getRequest();
}
然后在插件的preDispatch函数中传递请求对象:
class Your_Controller_Plugin_PluginName extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$MyController =$request->getControllerName();
$MyAction =$request->getActionName();
$MyParams =$request->getParams();
//now you can go ahead with implementing your breadcrumb
}
}
关于zend-framework - 带动态 URL 参数的 Zend_Navigation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13862818/
我是一名优秀的程序员,十分优秀!