MVC: ajax nasıl?

6 Cevap php

Zend Framework MVC uygulamasını kullanarak bir proje başlatmak için gidiyorum.

Nasıl ajax ile çalışır? Yani, kontrolör içine tüm ajax kodu yerleştirmek gerekir? Veya Görünüm?

Örneğin, ben bir sayfada göstermek için yazar 'ivan' den mesajları almak istiyorum.

Normalde, ben Mesajlar denetleyicisi (ya da belki Kullanıcılar kontrolörü, her yerde), bunun için görünüm (ve tüm kodu ') (byAuthorAction' böyle, böyle yeni bir eylem oluşturmak '/ ileti / yazar / ivan' veya ettirmek için bir bağlantı oluşturmak ne model mesajları alır oraya gider) ve kendisine yeni bir rota oluşturmak.

DRY prensibi tutmak ve ben gibi akıllı kod yapısını tasarlama, ajax ve belki API için json, xml biçimlerinde herhangi bir kullanıcının mesajları almak için işlevsellik eklemek nasıl?

-

Thanks for answers! I will be very glad to see comments about designing MVC in situations like mine. I have some experience in basic MVC principles but not in more complicated cases. Maybe some useful links?

6 Cevap

Eğer gerçekten ContextSwitch Eylem Yardımcısı hakkında manuel bölüm okumalısınız. Ama burada kısa bir özet olduğunu:

  • sizin bakış komut (eylem-name.phtml) normal HTML çıkışı için kullanılır
  • ; xml içerik varsayılan olarak desteklenen ve (aksiyon-name.xml.phtml) in xml bağlam için görünüm komut vereceğini - geçtim örnek XML için çıktı böylece denetleyicisi bazı eylemler için bir bağlam anahtarı başlatılamıyor xml bağlamı da düzeni işlemeyi devre dışı bırakır
  • json da içerik anahtarı ve varsayılan seçeneği düzenini ve görünümü ve çıkış JSON formatında denetleyici eylem görünümüne atanan tüm değişkenleri hem devre dışı bırakmak için yerleşik, bu seçenek (setAutoJsonSerialization kullanılarak açılabilinir tarafından desteklenmektedir Bağlam anahtarının false) yöntemi; Eğer geçerseniz ama bir görünüm script eylem-name.json.phtml ve çıkış elle JSON biçiminde değişkenleri oluşturmak zorunda

URL'nize bir biçimi parametresini eklemeniz sahip bu iki bağlamı arasında geçiş yapmak için, örneğin / Ileti / yazar / ivan / format / json veya / ileti / yazar / ivan / format / xml. Eğer biçimi uygulama irade çıktı düz html belirtmek yoksa.

Bağlam anahtarın özel versiyon AjaxContext ve ayrıca elle bu bir yapılandırmak zorunda. Bu çıkış için kullanmak hangi biçimi tanımlamak için 'format' parametresini kullanmak değil ancak sizin istek gönderilen başlığını inceler ve arar 'X-Talep-With: XMLHttpRequest' başlığı ve varsa AjaxContext incelenmiştir. Eğer istek AJAX kullanarak ateş eğer belirli eylemler için kullanılması gerektiğini, hangi bağlam belirtebilirsiniz AjaxContext eylem yardımcı kullanarak.

Sen ajax istekleri tespit ve dolayısıyla, normal olanlardan ajax isteklerini ayırt edememek, XML, JSON veya ne olursa olsun geri 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';
    }
}

Your View HTML başka bir şey olabilir, ve boru hattı ya da isteği ajax sonrası olmanın tepki verebilir, ya da denetleyici tepki verebilir. Farklı bir return View olarak iki şekilde de, o kadar basit olmalıdır.

AjaxContext Aksiyon Yardımcısı (ya da genişleten ContextSwitch biri) bir göz atın, ve bu da ayrı bir görünüm komut (foo.json.phtml veya foo geçiş, tam olarak aynı denetleyicisi kod kullanmanızı sağlayacak . ajax.phtml vb -?) bir format parametresi otomatik olarak aldı, ya görünümüne atamak tüm değişkenleri içeren bir nesne döndürür JSON Eylem-Yardımcı faydalanmak - böylece yankılanan olması gerekmez controller (hangi irade pisliği birim testleri, onlara sahip olmalı).

Benim sözdizimi büyük olabilir ama bu benim Endeksi Kontrolörü benim DİNLENME eylem bir kroki olabilir:

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

I düz kontrolörün dışında CodeIgniter i çıkışı ile ajax kullanın.

Ben de giriş, iletişim, vb i (örn. domain.com / kontak) bir ajax isteği ile anlaşma yapmak, normal yoluna mantığı eklersiniz gibi ajax istekleri için, vb sık işaretleme gibi basit ajax istekleri için ayrı denetleyicisi kullanın. Sonra çıktı json ve komut yürütme öldürmek.