Zend: Bir yönlendirme sonra görünüm değişkenler göndermek mümkün mü?

5 Cevap php

Ben bir yönlendirme (örneğin $ this-> _redirect-> gotoSimple () ;) yaptıktan sonra nasıl ek görünüm parametreleri göndermek olabilir?

Örneğin, ben bir hata eylemciye kullanıcıyı yönlendirmek ve ben onun görünümüne özel, ayrıntılı hata iletileri göndermek mümkün istiyorum bir Düzenle eylem var diyelim. Daha net göstermek için, akış olacaktır:

  1. Düzen görünümü de (diyelim ki, http://localhost/product/edit), kullanıcı kötü bir şey gönderdiğinde
  2. EditAction at () (benim URL http://localhost/error/index gibi okurdum ki), bir fail çek benim Hata view / eylemciye bir yönlendirme tetikler
  3. Hata / index.phtml özel hata iletisi görüntülemek için bir "errorMessage" görünümü değişken alır ve editAction () o "errorMessage" view değişkene bazı değer geçmek için bir araç ihtiyacı

Hızlı bir kod parçacığı muhtemelen gibi görünecektir:

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

Bu ulaşmanın herhangi bir çözüm, hatta diğer daha iyi yollar, büyük beğeni topluyor.

5 Cevap

Ben bir eylem (editAction) başka bir eylemin görünümü (errorView) erişir yerde görmedim. Hata işleme özel durum için, benim fikrimdi İstisnalar kullanıyor. Farklı kötü durumlar için farklı istisnalar atmak, ve hata işleyicisi eylem, sen istisna türüne göre kullanıcıya göstermek için ne karar verebilirsiniz:

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

hata işleme hakkında daha fazla bilgi için, Zend Framework quick start büyük bir öğretici olduğunu.

Diğer durumlar için, bu 2 eylemler arasında iletişim kurmak için bazı mesajlaşma mekanizmasını kullanabilirsiniz. FlashMessenger eylem yardımcı kullanarak ilk şey benim denince akla:

// 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 oturumları kullanır, böylece oturumları ve büyük olasılıkla kurabiye bu mesajlaşma sürecine dahil olacak unutmayın rağmen.

gotoURL() dahili yönlendirmeler için kullanmayın. Kullan gotoSimple(). Ben 4 parametreleri alır:

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

Sizin durumunuzda bu olacak:

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

Ayrıntılar için Redirector Zend_Controller_Action_Helper bakın.

Bunu yapmanın standart yol görüntülemek istediğiniz bir mesajın bir oturum tabanlı mağaza ile. Bu görünüm tabanlı yardımcı olduğunu yeterince yaygın, FlashMessenger.

The FlashMessenger helper allows you to pass messages that the user may need to see on the next request. To accomplish this, FlashMessenger uses Zend_Session_Namespace to store messages for future or next request retrieval. It is generally a good idea that if you plan on using Zend_Session or Zend_Session_Namespace, that you initialize with Zend_Session::start() in your bootstrap file. (See the Zend_Session documentation for more details on its usage.)

bu link geçmesi .. biz _redirect önce görmek değişkenleri ayarlamak nasıl açıklıyor

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

(Ben o endam bazı sorunlar vardı) FlashMessenger sınıfı nasıl çalıştığı hakkında biraz daha bilgi vermek için bu ekleyeceğiz.

Ben bir oturum kullanarak bootstrap.php başlamış gerektiğini okumuştum

Zend_Session::start();

.. Ama benim kod bu olmadan çalıştı, bu yüzden ben seans zaten başlatılmış şüpheli.

Biz bir kontrolör-nesne konum ve bir eylem yöntemi olarak adlandırılır ediliyor. Sonra bir şey gerçekten veritabanı şey, bir ekleme veya düzenleme gibi olur.

Biz artık bir veya daha fazla mesaj olarak ayarlayın. Ben aşağıdaki sözdizimini kullanın.

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

Hangi kullanılarak exactly ile aynıdır

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

Bu oturumda bir mesajı belirler, aradığınız doğrudan kontrol edebilirsiniz

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

Şimdi şöyle görünümüne mesajları ekleyeceğiniz isteği işleyen denetleyicisi + eylem içinde yeni bir url (yani yeni bir istek temelde), bir yönlendirme var:

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

Biz şimdi çıktı bu iletilerin bir seçim var. Biz belli bir kontrolör, böylece olabilir "ait" bir görünüm içinde yapabilirsiniz

views/scripts/index/index.phtml

Burada dezavantajı bunu kullanan her viewscript için iletileri çıktısı kodu eklemek olurdu olmasıdır. Bu çok DRY değil.

Benim gözünde üstün bir çözüm şudur. Eğer uygulamanın temel düzenini tanımlamak dosyada en Çıktı bu mesajları. Bu muhtemelen

layouts/scripts/index.phtml

Orada aşağıdaki kodu yazdım.

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