Zend добавление параметра в URL перед генерацией представления - PullRequest
0 голосов
/ 07 марта 2012

Название может вводить в заблуждение, но я пытаюсь сделать что-то очень простое, но не могу понять.

Допустим, у меня есть контроллер вопросов, и показывать действие и идентификатор вопроса - это первичный ключ, с которым япосмотрите детали вопроса - чтобы URL выглядел следующим образом

http://www.example.com/question/show/question_id/101

Это прекрасно работает - поэтому, когда представление генерируется - URL выглядит так, как показано выше.

Теперь в действии show я хочу добавить заголовок вопроса (который я получаю из базы данных) к URL-адресу - поэтому при создании представления URL-адрес отображается как

http://www.example.com/question/show/question_id/101/how-to-make-muffins

Это похоже на переполнение стека - если вы берете любую страницу с вопросом - скажем

/6289323/sdelaite-seo-chuvstvitelnyi-url-izbegaite-identifikatora-zend-framework

и нажимаете ввод. Заголовок вопроса добавляется к URL как

/6289323/sdelaite-seo-chuvstvitelnyi-url-izbegaite-identifikatora-zend-framework

Спасибомного

Ответы [ 2 ]

2 голосов
/ 07 марта 2012

Вам нужно будет добавить собственный маршрут к маршрутизатору, если вы не можете жить с URL-адресом вроде:

www.example.com/question/show/question_id/101/{paramName}/how-to-make-muffins

Вам также, если вы хотите убедиться, что этот параметр всегда отображается, нужночтобы проверить, установлен ли параметр в контроллере, и выполнить редирект, если он отсутствует.

Итак, в вашем файле начальной загрузки:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
  public function _initRoutes ()
  {
    // Ensure that the FrontController has been bootstrapped:
    $this->bootstrap('FrontController');
    $fc = $this->getResource('FrontController');
    /* @var $router Zend_Controller_Router_Rewrite */
    $router = $fc->getRouter();

    $router->addRoutes( array ( 
      'question' => new Zend_Controller_Router_Route (
        /* :controller and :action are special parameters, and corresponds to
         * the controller and action that will be executed.
         * We also say that we should have two additional parameters:
         * :question_id and :title. Finally, we say that anything else in
         * the url should be mapped by the standard {name}/{value}
         */
        ':controller/:action/:question_id/:title/*',
        // This argument provides the default values for the route. We want
        // to allow empty titles, so we set the default value to an empty
        // string
        array (
           'controller' => 'question',
           'action' => 'show',
           'title' => ''
        ),
        // This arguments contains the contraints for the route parameters.
        // In this case, we say that question_id must consist of 1 or more
        // digits and nothing else.
        array (
           'question_id' => '\d+'
        )
      )
    ));
  }
}

Теперь, когда у вас есть этот маршрут, вы можетеиспользуйте его в своих представлениях следующим образом:

<?php echo $this->url(
         array(
            'question_id' => $this->question['id'], 
            'title' => $this->question['title']
         ),
         'question'
      );
      // Will output something like: /question/show/123/my-question-title 
?>

В вашем контроллере вы должны убедиться, что параметр title установлен, или перенаправить на себя с набором title, если нет:

public function showAction ()
{
  $question = $this->getQuestion($this->_getParam('question_id'));
  if(!$this->_getParam('title', false)) {
     $this->_helper->Redirector
        ->setCode(301) // Tell the client that this resource is permanently 
                       // residing under the full URL
        ->gotoRouteAndExit(
           array(
             'question_id' => $question['id'],
             'title' => $question['title']
           )
        );
  }
  [... Rest of your code ...]
}
0 голосов
/ 07 марта 2012

Это делается с помощью перенаправления 301.

Извлеките вопрос, отфильтруйте и / или замените недопустимые символы URL, затем создайте новый URL. Передайте его помощнику Redirector (в вашем контроллере: $this->_redirect($newURL);)

...