Zend: Можно ли отправить переменные представления после перенаправления? - PullRequest
1 голос
/ 25 марта 2009

Как я могу отправить дополнительные параметры просмотра после того, как я сделал перенаправление (например, $ this -> _ redirect-> gotoSimple ();)?

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

  1. В режиме редактирования (скажем, http://localhost/product/edit), пользователь отправляет что-то неприятное
  2. При editAction () проверка на сбой вызывает перенаправление на мой обработчик ошибок / вид действия (чтобы мой URL читался как http://localhost/error/index)
  3. Error / index.phtml принимает переменную представления «errorMessage» для отображения пользовательского сообщения об ошибке, а editAction () нуждается в средствах для передачи некоторого значения этой переменной представления «errorMessage»

Быстрый фрагмент кода, вероятно, будет выглядеть так:

public function editAction() {
    //DO THINGS...

    // Upon failure
    if($fail) {
        $this->_redirector->gotoUrl('/error/index');
        //TODO: I need to be able to do something like
        //      $errorView->errorMessage = "Generic error";
    }
}

Будем весьма благодарны за любые решения или даже другие, более эффективные способы достижения этого.

Ответы [ 5 ]

5 голосов
/ 25 марта 2009

Не используйте gotoURL() для внутренних перенаправлений. Используйте gotoSimple(). Я беру до 4-х параметров:

gotoSimple($action, 
           $controller = null, 
           $module = null, 
           array $params = array())

В вашем случае это будет:

$this->_redirector->gotoSimple('index',
                               'error',
                                null,
                                array('errorMessage'=>$errMsg));

Подробнее см. Redirector Zend_Controller_Action_Helper.

4 голосов
/ 25 марта 2009

Я нигде не видел, чтобы действие (editAction) обращалось к представлению другого действия (errorView). для особого случая обработки ошибок моя идея - использовать исключения. вы бросаете разные исключения для разных плохих ситуаций, и в своем действии обработчика ошибок вы можете решить, что показывать пользователю, основываясь на типе исключения:

// file: ProductContorller.php
public function editAction() {
    // some code
    if ($badThing) {
         throw new Exception('describe the bad thing',$errorCode);
    }
    if ($badThing2) {
         throw new Exception('describe the other bad thing',$errorCode2);
    }
}

// file: ErrorController.php
public function errorAction() {
     $error = $this->_getParam('error_handler');
     $exception = $error->exception; // the original Exception object thrown by some code
     $code = $exception->getCode();
     switch ($code ) {
          // decide different things for different errors
     }
}

для получения дополнительной информации об обработке ошибок, быстрый запуск Zend Framework является отличным учебником.

для других ситуаций вы можете использовать какой-то механизм обмена сообщениями для связи между этими двумя действиями. Использование FlashMessenger Action Helper - первое, что приходит мне в голову:

// file: ProductContorller.php
public function editAction() {
    // some code
    if ($badThing) {
         $this->_helper->flashMessenger->addMessage('error1');
         $this->_redirect('error');
    }
    if ($badThing2) {
         $this->_helper->flashMessenger->addMessage('error2');
         $this->_redirect('error');
    }
}

// file: ErrorController.php
public function errorAction() {
     $errors = $this->_helper->flashmessenger->getMessages();
     if ( in_array('error1',$errors) ) {
       // do something
     } // elseif ( ...
}

, хотя помните, что flashMessenger использует сеансы, поэтому сеансы и наиболее вероятные файлы cookie будут участвовать в этом процессе обмена сообщениями.

3 голосов
/ 29 марта 2009

Стандартный способ сделать это с помощью сеанса хранения сообщения, которое вы хотите отобразить. Достаточно часто, что есть помощник на основе представления, FlashMessenger .

Помощник FlashMessenger позволяет вам передавать сообщения, которые пользователь может нужно посмотреть по следующему запросу. к Для этого FlashMessenger использует Zend_Session_Namespace для хранения сообщения для будущего или следующего запроса поиск. Это вообще хорошая идея что если вы планируете использовать Zend_Session или Zend_Session_Namespace, что вы инициализировать с помощью Zend_Session :: start () в вашем файле начальной загрузки. (См. Документация Zend_Session для более подробности его использования.)

1 голос
/ 04 ноября 2009

перейдите по этой ссылке .. она объясняет, как мы можем установить переменные представления перед _redirect

http://www.rmauger.co.uk/2009/06/creating-simple-extendible-crud-using-zend-framework/

0 голосов
/ 29 октября 2010

Я добавлю это, чтобы дать больше информации о том, как работает класс FlashMessenger (у меня были некоторые проблемы с его выяснением).

Я где-то читал, что сеанс должен быть запущен в Bootstrap.php с использованием

Zend_Session::start();

.. но мой код работал без этого, поэтому я подозреваю, что сессии уже запущены.

Мы находимся в объекте контроллера, и вызывается метод действия. Затем что-то происходит, например, вставка или редактирование в базе данных, что-нибудь действительно.

Теперь мы установили одно или несколько сообщений. Я использую следующий синтаксис.

$this->_helper->FlashMessenger("Message in a bottle.");

Что точно так же, как

$this->_helper->FlashMessenger->addMessage("Message in a bottle.");

Это устанавливает сообщение в сеансе, вы можете проверить это непосредственно, позвонив

print_r($this->_helper->FlashMessenger->getMessages());
die();

Теперь есть перенаправление на новый URL-адрес (так что в основном новый запрос), внутри контроллера + действие, которое обрабатывает запрос, мы добавим сообщения в представление следующим образом:

$this->view->flashMessages = $this->_helper->FlashMessenger->getMessages();

Теперь у нас есть выбор, куда выводить эти сообщения. Мы можем сделать это внутри представления, которое «принадлежит» определенному контроллеру, так что это может быть

views/scripts/index/index.phtml

Недостатком здесь является то, что вам нужно будет добавить код, выводящий сообщения, в каждый видовой скрипт, который его использует. Это не очень DRY .

На мой взгляд, лучшим решением является следующее. Выведите эти сообщения в файле, в котором вы определяете базовый макет вашего приложения. Это, наверное,

layouts/scripts/index.phtml

Я написал следующий код там.

<?php if( isset($this->flashMessages) && !empty($this->flashMessages) ){ ?>
    <ul id="messages">            
        <?php foreach( $this->flashMessages as $message ){?>
            <li>
                <?php echo $message;?>
            </li>    
        <?php } ?>
    </ul>
<?php } ?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...