ajax ile bir php denetleyicisi (düzenini nasıl devre dışı bırakılacağı) çağrı

4 Cevap php

Yeterince açık olmayabilir, çünkü daha fazla açıklayacağım

I want to set the ajax url to: www.domain/controller/method I already have everything in place for this with normal php.

But if I have to do this with ajax, I am not getting the intended result. The result should be some json variable being echo'd back to me. It is not entirely clear to me why.

In firebug I can see that the requestheader is not the same as the responseheader. I see the layout view in the response. I do not know yet how to bypass that. The basecontroller creates the view for the layout, but I have not extended the ajaxcontroller with the basecontroller?? For now I am running it threw another script that I call, but I would like it more if I could do it by the first method.

Herkes bazı öneriler lütfen vardır?

EDIT

Ben düzenini devre dışı bırakmak için bazı mantık sağlamak için gereken aşağıda Bu önerilerden sonra görünüyor?

first attempt:

class testController extends baseController implements IController
{

    public function testit()
    {
    $this->disableLayout = TRUE;
    $check='testit';
    $data =array();
    header('Content-type: application/json');

    		$output = array(
    		"check" => $check,
    		"user" => $data
    		);

    		$this->content = json_encode($output);

    		exit(0); // Stop script.

    }
}

teşekkürler, Richard

4 Cevap

Ben burada bir tahmin yapıyorum, ama ben bunu talep nasıl bağlı, aynı eylem farklı içerik sunmak için çalışıyoruz düşünüyorum.

Hava algılamak için sayfası tarayıcı tarafından gönderilen özel başlığını kullanabilirsiniz Ajax tarafından talep edildi.

Genellikle en son JavaScript kütüphaneleri gönderin

X-Requested-With:XMLHttpRequest

Onların ajax isteği ile birlikte header. Senin kolayca yapabilir yoksa bu gibi bir şey kullanarak göndermek için:

//Just example using raw XMLHttpRequest
var request = new XMLHttpRequest();     
request.setRequestHeader("X-Requested-With", "XMLHttpRequest");
//If you use Javascript library, see the documentation how to set custom request headers.
//But as I said most modern libraries already send X-Requested-With

Sonra PHP zaman isteği bu kod bloğu ile Ajax kullanılarak yapılmış olup olmadığını kontrol olabilir:

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) &&
           strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { 
   //Send JSON.
} else {
   //Send HTML.
}

EDIT: As Elzo Valugi mentioned, don't forget to use correct content type when outputing JSON in your action by using:

header('Content-type: application/json');

before sending any JSON or else you might have some problems with some JavaScript libraries.


http://i47.tinypic.com/o5we91.jpg

Bu, daha fazla ya da istek + yanıt başlıkları gibi görünmelidir nasıl azdır. Aslında Prototip versiyonu, vb gibi burada bazı gereksiz olanları yolluyorum unutmayın

Görünümünde çerçeve bağlı olarak json başlıkları ile ve düzen modelden diğer bilgileri olmadan görünümü dönmelidir.

header('Content-type: application/json');

Ayrıca nasıl size 'json' için tepki türünü ayarlamak gerekebilir AJAX isteği sonucu ayrıştırmak bağlı.

Ajax istekleri ile çalışan ve JSON olduğunda ben Zend Framework ne

$this->_helper->layout->disableLayout();

<?php echo $this->json($this->data) ?>

json helper başlıklarını katacak.

Ben genellikle Ajax istekleri işlemek için ayrı bir denetleyici oluşturun. Örneğin, /ajax/getusers/?page=2 bir paginated kullanıcıların ızgarasının iki sayfa için HTML döndürebilir. Benim uygulama mantığı tutmak ve UI bina mantık ayırmak hatırlatıyor çünkü bu yaklaşım gibi.

Alternatif olarak, sadece gibi her ajax isteği ile bir sorgu dizesi olarak geçebileceği: www.domain.com/controller/method/?ajax=1 ve sonra bu mevcut zaman düzen bileşenleri gizlemek.

Sen basecontroller sınıfının yıkıcı geçersiz kılmak gerekir. Lütfen controllerclass yılında yıkıcı kopyalayın ve şablon dosyasını değiştirin. Belki boş bir dosya kullanın. Gerekli hiçbir hack yok