2009-09-30 11 views
7

Zend Framework MVC uygulamasını kullanarak bir projeye başlayacağım.MVC: ajax nasıl?

nasıl ajax ile çalışır? Yani, tüm ajax kodunu kontrolöre yerleştirmeli miyim? Ya da bakış açısına?

Örneğin, ben bir sayfada gösterilecek yazarın 'Ivan' dan mesajları almak istiyorum.

Normalde, '/ posts/author/ivan' ya da onun gibi bir bağlantı oluşturarak, Yayınlar denetleyicisinde (veya nerede olursanız olun, Kullanıcılar denetleyicisinde) 'byAuthorAction()' gibi yeni bir Eylem oluşturun, bunun için görüntüleyin (ve modelden gelen mesajların alındığı tüm kodlar oraya gider) ve yeni bir Rota yaratır.

Nasıl ajax, json içinde herhangi bir kullanıcının mesajları almak için xml biçimleri işlevi eklemek ve belki API, KURU prensibini tutmak ve ben mümkün olduğunca akıllı kod yapısını tasarlama?

-

Cevabınız için teşekkürler! MVC'yi tasarlama hakkındaki yorumlarımın benimki gibi durumlarda görmekten memnuniyet duyarım. Temel MVC prensiplerinde biraz tecrübem var ama daha karmaşık durumlarda değil. Belki bazı yararlı bağlantılar?

cevap

13

Gerçekten ContextSwitch Eylem Yardımcısı ile ilgili manuel bölüm okumalısınız. Ama burada kısa bir özet aşağıda verilmiştir:

  • görünümünüzü komut (aksiyon name.phtml)

    thay can böylece denetleyicisi bazı eylemler için bir bağlam anahtarı başlatabilir normal HTML çıktısı
  • için kullanılan örneğin çıkış XML - xml içeriği varsayılan olarak desteklenir ve xml içeriği için görünüm komut dosyanızı (action-name.xml.phtml) içine koyarsınız; xml bağlamı da
  • json da desteklenmektedir düzeni oluşturulmasını devre dışı bırakır bağlam anahtarı ve varsayılan seçenek düzeni ve görünümü ve çıkışa JSON biçiminde kontrolör eylemden görünümüne atanan tüm değişkenler hem devre dışı bırakmaktır inşa Bu seçenek, içerik anahtarının setAutoJsonSerialization (false) yöntemini kullanarak değiştirilebilir; ama eğer değiştirirseniz, bir görünüm komut dosyası action-name.json oluşturmanız gerekir.phtml ve JSON biçimindeki değişkenleri el ile

Bu iki bağlam arasında geçiş yapmak için URL'nize bir biçim parametresi eklemeniz gerekir, örn./posts/yazar/ivan/format/json veya/posts/yazar/ivan/format/xml. Biçimi belirtmezseniz, uygulamanız düz html çıkarır.

Bağlam anahtarının özel sürümü AjaxContext'dir ve ayrıca bunu bir el ile yapılandırmanız gerekir. Çıktı için hangi biçimi kullanması gerektiğini tanımlamak için 'format' parametresini kullanmaz, ancak isteğinize gönderilen başlığı inceler ve 'X-Requested With: XmlHttpRequest' başlığını arar ve varsa AjaxContext incelenir. AjaxContext eylem yardımcısını kullanarak, isteğin AJAX kullanılarak kovulması durumunda belirli eylemler için hangi bağlamın kullanılması gerektiğini belirtebilirsiniz.

8

Normal olanlardan ajax istekleri ayırt edememek böylece ajax istekleri tespit tarafından, XML, JSON ya da her neyse dönmek için aynı işlemleri yararlanabilirler. Örneğin:

public function fooAction() 
{ 
    if($this->getRequest->isXmlHttpRequest()) { 
     echo json_encode($someData); 
    } else { 
     echo 'This is the normal output'; 
    } 
} 
+0

xml ve json arasında nasıl seçim yapılır? formatlar için/gibi/posts/yazar/ivan urt gibi html, /posts/author/ivan.xml, /posts/author/ivan.json, /posts/author/ivan.rss için biçimlendirmeli miyim? –

+0

Hayır, URL aynı olurdu. İçeriği JSON biçiminde çıkarmak için json_encode() öğesini kullanabilirsiniz. http://ar2.php.net/json_encode –

+0

json, daha hafiftir ve IMO ile çalışmak daha kolaydır. Bir JSON görünümü oluşturabilir veya json_encode() öğesini veri görünümü kullanmadan ekleyebilir, muhtemelen otomatik görünüm oluşturmayı kapatmanız gerekir. – karim79

2

Kişisel Görünüm HTML dışında bir şey olabilir ve her iki boru hattı bir ajax sonrası olmak isteğine tepki verebilir veya kontrolör tepki verebilir. Her iki durumda da, farklı bir Görünüm döndürmek kadar basit olmalı.

1

AjaxContext Eylem Yardımcısı'na (veya uzandığı ContextSwitch öğesine) bir göz atın ve aynı denetleyici kodunu ayrı bir görüntüleme komut dosyasına (foo.json) geçirerek tam olarak kullanmanıza izin verecektir. phtml veya foo.ajax.phtml, vs. - bir? format parametresinden otomatik olarak alınır) veya görünüme atadığınız tüm değişkenleri içeren bir nesneyi döndüren JSON Action-Helper'ı kullanırsınız. Kontrolörünüzden yankılanmalı (bu, eğer varsa, birim testlerini dağıtacaktır).

+0

oh, elbette. Bunu nasıl göremedim? –

0

Benim sözdizimi eski olabilir ama benim Endeksi Denetleyicisi'nden benim DİNLENME eylem bu bir kroki:

/** 
* REST Action for this application. 
* 
* @return void 
*/ 
public function restAction() 
{ 
    $this->_helper->viewRenderer->setNoRender(true); 

    $parameters = (func_num_args() > 0) ? array($key => func_get_arg(0)) : $this->getRequest()->getParams(); 

    $key = 'restCommand'; 
    if(!array_key_exists($key, $parameters)) throw new Exception('Request for “' . $key . '” not found.'); 
    $restCommand = $parameters[$key]; 

    $xmlString = IndexModel::getEmptyXmlSet($restCommand); 
    $xslFile = IndexModel::getModelFilePath('index'); 

    //Handle OPML-driven REST commands: 
    if(stripos($restCommand, 'opml-') === 0) 
    { 
     $opmlCall = explode('-', $restCommand); 
     if(count($opmlCall) != 3) 
     { 
      $xmlString = Songhay_SimpleXml::getXmlMessage('OPML Call Not Recognized', array('The number of parameters are incorrect.')); 
     } 
     else 
     { 
      $opmlSet = $opmlCall[1]; 
      $opmlId = $opmlCall[2]; 
      $xmlString = IndexModel::getRssFragmentWithOpml($opmlSet, $opmlId); 
     } 
    } 

    //Handle general REST commands: 
    switch($restCommand) 
    { 
     case 'deeplink': 
      $key = 'id'; 
      if(!array_key_exists($key, $parameters)) throw new Exception('Request for “' . $key . '” not found.'); 
      $url = $parameters[$key]; 
      $xmlString = IndexModel::getRssFragment($url); 
      $xmlString = Songhay_SimpleXml::loadXslString($restCommand, $xmlString, $xslFile); 
      break; 
     case 'index': 
      $opmlFile = IndexModel::getModelFilePath('index', '.xml'); 
      $xmlString = Songhay_SimpleXml::loadXmlAndStripNamespaces($opmlFile); 
      $xmlString = Songhay_SimpleXml::loadXslString($restCommand, $xmlString, $xslFile); 
      break; 
     default: 
      $xmlString = Songhay_SimpleXml::loadXslString($restCommand, $xmlString, $xslFile); 
    } 

    $response = $this->getResponse(); 
    $response->setHeader('Content-Type', 'text/xml'); 
    $response->setBody($xmlString); 

    return; 
} 
0

Kodlayıcı ile ajax kullandığımda, denetleyiciden dışarı çıkıyorum.

İşaretleme, sık kullanılanlar vb. Gibi basit ajax istekleri için ayrı denetleyici de kullanıyorum. Giriş, iletişim vb. Gibi ajax istekleri için normal yolla (ör. Domain.com/contact) mantık ekleyebilirim. ajax isteği. Daha sonra json çıkışı alıyorum ve komut dosyasını çalıştırıyorum.