Zend Framework - bir ajax arama için bir denetleyici içinde bir değişken Passing

5 Cevap php

Orada Stackland hi! İşte benim sorunum:

Ben bir veritabanından bir dizi yüklemek için benim Zend denetleyicisi kullanın, ve sonra javascript onu geçmek istiyorum. Bu, bu en dizisinin denetleyici sormak json kodlamak, ve sonra aşağı geçmek için ajax kullanmak için yapmak en iyi yolu karar verdik. Ancak, ben bu ajax denilen aldığında aşağı geçecek eylem benim ilk eylem yüklenen değişken geçirmek için nasıl bilmiyorum.

Görünüm üretir orijinal bir eylem

public function indexAction()
    {
            $storeid = $this->getStoreId();

            if(!$storeid)
            {
                 $this->_forward('notfound');
                 return;
            }

            $store = $this->_helper->loadModel('stores');
            $store->getByPrimary($storeid);
    }

Ajax denilen edilecek eylem

public function getdataAction()
        {
            $this->_helper->Layout->disableLayout(); // Will not load the layout
            $this->_helper->viewRenderer->setNoRender(); //Will not render view

            $jsonResponse = json_encode($store);
            $this->getResponse()->setHeader('Content-Type', 'application/json')
                                ->setBody($jsonResponse);

        }

Ne istiyorsun jsonResponse olarak mağaza göndermek böylece getdataAction için indexAction dolar mağaza geçmektir. Not, bu iki farklı zamanlarda denir.

Çalışmadım ben denedim şeyler:

  1. ayarını $ this-> getRequest () -> setParam ('mağaza', $ store) indexAction yılında, ve sonra $ kullanarak bu-> getRequest () -> GetParam ('mağaza'), getdataAction içinde. Ben bu farklı http isteklerini çünkü çalışmış, bu yüzden yeni bir param takmak işe yaramaz değil sanırım.

  2. , kontrol cihazının kendisi de $ _store korunur ve daha sonra indexAction ile buna tasarrufu ve getdataAction bunu kullanarak kullanarak. Ben bu çalışmıyor neden gerçekten emin değilim.

Bu şekilde bir değişken geçmek için iyi bir yolu var mı? Farklı denetleyiciler arasında bir değişken geçmek için bir yolu var mı? (Ben birine cevap varsayalım diğer cevaptır). Ben bir kontrolör yardımcısı depolamak misiniz? Ben çalışmak istiyorum biliyorum ama gereksiz gibi görünen bir oturumu, kullanmak zorunda mı? Javascript değişkenler geçmek için daha iyi bir yolu var mı? Ben çok soru soruyorum? Herhangi bir yardım olağanüstü olurdu. Teşekkürler.

5 Cevap

Belki yanlış soruyu okuyorum, ama sadece yapıcı $ mağaza taşımak gerekir:

public function __construct() {
    $store = $this->_helper->loadModel('stores');
    $store->getByPrimary($storeid);
}

ve tüm * Eylem yöntemleri erişilebilir var. Oturumları kullanarak bu ayarsız görünüyor.

(disclaimer: I'm pretty new to ZF, so I'm interested in other answers found here, and have not tested the below!)

Eğer ajax arama koymak nerede görünümünde, muhtemelen gibi ele alacaktır:

(ZF Documentation bak)

<?= $this->ajaxLink("Example 2",
                    "/YourController/getdata",
                    array('update' => '#content',
                          'class' => 'someLink'),
                    array('store' => $this->store)); ?>

Sizin indexAction, sen aracılığıyla mağaza mağaza dikkat edin:

 $this->view->store = $storeid;

Tabii ki, bir URL üzerinden geçirilir gibi bir web-kullanıcı mağaza parametre değiştirebilir dikkat etmelisiniz.

Bu sadece Store bir örneğini döndürür yere IndexController, bir yardımcı, ya da, bir yöntem eklemek için daha iyi mimarlık olurdu. Lütfen indexAction içinde bu yöntemi kullanın, ve getdataAction (ajaxAction aramak için daha anlamlı olurdu). Ayrıca, (, devre dışı autoRender hatırlıyorum)) sendResponse (çağırmak unutuyorsun:

    private function indexAction()
    {
        $this->getStore();
        //blah blah
    }

    private function getStore()
    {
        $storeid = $this->getStoreId();
        if(!$storeid)
        {
             $this->_forward('notfound');
             return;
        }
        $store = $this->_helper->loadModel('stores');
        $store->getByPrimary($storeid);
        return $store;
    } 

    public function ajaxAction()
    {
        $this->_helper->Layout->disableLayout(); // Will not load the layout
        $this->_helper->viewRenderer->setNoRender(); //Will not render view

        $jsonResponse = json_encode($this->getStore());
        $this->getResponse()->setHeader('Content-Type', 'application/json')
                            ->setBody($jsonResponse)
                            ->sendResponse();

    }

The manual says:

To send the response output, including headers, use sendResponse().

http://framework.zend.com/manual/en/zend.controller.response.html

Tamam, ben de bunun cevabını istiyorum kim o sizin için, ben sadece o kadar emdi ve oturumu kullanılır. Ben bootstrap bir Zend_Session-> start () koymak. Daha sonra her bir denetleyiciye özel bir değişken $ oturumu eklemek için bir eklenti hazırlandı. Sonra Zend_Session_Namespace bu-> oturum $ ayarlayın. Bir şey geçmek için, ben oturumu geçirin, bu yüzden $ this-> session-> store = $ depoyu kullanın. Sonra $ this-> session-> mağaza ile başka bir yere alabilirsiniz. Yardım etmeye çalıştı edenlere teşekkürler!

Yorumlar için sadece hızlı bir ektir. Çıkışı bir kontrol içinde JSON gibi bir dizi için kullanın:

$array = array('hi' => array('Hello' => 'World');
$this->_helper->json($array);

Bu yanıt gönderir ve JSON yanıt için özel başlıklarını belirler