我有这样的路线:
resources.router.routes.home.route = /:state/:city
resources.router.routes.home.defaults.module = default
resources.router.routes.home.defaults.controller = index
resources.router.routes.home.defaults.action = index
resources.router.routes.home.defaults.state = ''
resources.router.routes.home.defaults.city = ''
我网站上的大多数链接都需要这两个参数(州和城市),比如
www.mysite.com/sp/sao-paulo/establishments
www.mysite.com/sp/sao-paulo/establishment-name
www.mysite.com/sp/sao-paulo/establishments-category
我需要检查用户访问我的网站时是否已经设置了这两个参数。如果没有,我会在他选择一个城市时将他重定向到特定页面。
我认为实现这一目标的最佳方法是创建一个我已经开始使用的插件。
class App_Controller_Plugin_CheckCity extends Zend_Controller_Plugin_Abstract {
protected $_session;
public function preDispatch(Zend_Controller_Request_Abstract $request) {
$this->_session = new Zend_Session_Namespace('locationInformation');
if (!isset($this->_session->state) || !isset($this->_session->city)) {
// ...
} else {
// ...
}
}
}
问题是我不知道该怎么做,如果这真的是最好的方式。
这是正确的路径吗?如果没有,我该怎么做才能解决我的问题?如果是,该插件还需要什么?
我希望自己清楚明白。 我感谢任何帮助。
谢谢。
答案 0 :(得分:1)
考虑到你没有默认的州/城市,那么用户在访问网站时会看到的第一件事就是他将选择其位置的页面,无论他试图访问哪个链接。
如果是这种情况,那么你需要编写一个插件来检查这些选项是否已经由用户设置:
<?php
class App_Controller_Plugin_CheckCity extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
// Gets the session
$session = new Zend_Session_Namespace('locationInformation');
// Checks if the state/city are set and
// if not set, checks if those params are set in the URI
if( (!isset($session->state) || !isset($session->city))
&& ($request->has('state') && $request->has('city')) ) {
// If yes, then saves it in the session
$session->state = $request->getParam('state');
$session->city = $request->getRequest()->getParam('city');
} elseif(!isset($session->state) || !isset($session->city)) {
// If not, forward the user to the controller/page where he'll choose his location
$request->setControllerName('location')
->setActionName('choose-location')
->setModuleName('default');
}
if(isset($session->state) && isset($session->city)) {
// Sets the params for use within your views
$view = Zend_Registry::get('view');
$view->state = $session->state;
$view->city = $session->city;
}
}
}
选择后,您将再次将用户重定向到他刚尝试访问的页面。
为此,您将获取州/城市页面上的URI(LocationController
):
$session->redirectTo = 'http://' . $this->getRequest()->getHttpHost() . $this->getRequest()->getRequestUri();
设置用户的位置后,您将使用此功能在LocationController
中执行重定向:
$this->_redirect($session->redirecTo);
为了能够访问您的视图对象,请将其保存在注册表中:
/**
* Initializes the layout and view
*/
protected function _initView() {
/**
* @var \Zend_View $view
* @var \Zend_Layout $layout
*/
$layout = $this->bootstrap('layout')->getResource('layout');
$view = $layout->getView();
$view->doctype('XHTML1_STRICT');
$view->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf-8');
// Adds to the registry
Zend_Registry::set('view', $view);
}
再次检查插件代码,了解如何在视图中设置变量。