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 = ''

そして、私のサイトからのほとんどのリンクには、次のような 2 つのパラメーター (都道府県と市区町村) が必要です。

www.mysite.com/sp/sao-paulo/establishments
www.mysite.com/sp/sao-paulo/establishment-name
www.mysite.com/sp/sao-paulo/establishments-category

ユーザーが自分の Web サイトにアクセスしたときに、この 2 つのパラメーターが既に設定されているかどうかを確認する必要があります。そうでない場合は、都市を選択するときに特定のページにリダイレクトします。

これを達成する最善の方法は、プラグインを作成することだと思います。プラグインは既に開始しています。

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

デフォルトの都道府県/都市がないことを考えると、ユーザーが Web サイトにアクセスするときに最初に目にするのは、アクセスしようとするリンクに関係なく、場所を選択するページです。

その場合は、これらのオプションがユーザーによって既に設定されているかどうかを確認するプラグインを作成する必要があります。

<?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 に答える