2

我有这样的路线:

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 {
      // ...
    }

  }

}

问题是我不知道该怎么做,如果这真的是最好的方法。

这是正确的路径吗?如果没有,我该怎么做才能解决我的问题?如果是,这个插件还需要什么?

我希望我说清楚了。我很感激任何帮助。

谢谢你。

4

1 回答 1

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;
        }
    }
}

选择后,您将再次将用户重定向到他刚刚尝试访问的页面。为此,您将获取州/城市页面 ( LocationController) 上的 URI:

$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);
}

再次检查插件代码,看看如何在视图中设置变量。

于 2012-09-13T14:43:01.610 回答