Некоторое время я использовал dojo для XhrPost, это действительно приятно. В руководстве по ZF ничего особенного, но я решил эту проблему, выполняя клиентскую часть, как предлагает руководство по dojo .
Немного упрощён мой класс ajax:
dojo.declare('fetch_dom_node_contents', null, {
handleAs: "json",
load: function(response, ioArgs){
this.ajax_response = response;
this._loadModules();
var dom_node = dojo.byId(response.node_name)
dojo.html.set(dom_node, response.content);
return response;
},
/**
* Since modules might be needed for the new element they should be loaded
*/
_loadModules: function(){
if(this.ajax_response.dojo_modules){
dojo.forEach(this.ajax_response.dojo_modules,
function(mod){
dojo.require(mod);
});
}
}
});
Мой контроллер прост, благодаря использованию контекстного переключателя у меня есть преимущество в том, что всякий раз, когда в режиме AJAX JSON все переменные представления автоматически преобразуются в формат JSON:
class IndexController extends Zend_Controller_Action
{
public function init()
{
$this->view->headScript()->appendFile('/js/application/my_classes.js');
$contextSwitch = $this->_helper->getHelper('contextSwitch');
$contextSwitch
->addActionContext('get-content', array('json'))
->setAutoJsonSerialization( true )
->initContext();
}
public function indexAction()
{
//Stuff here ...
}
public function getContentAction(){
$this->view->node_name = "my_node";
$this->view->content = "Awesome content";
$this->view->dojo_modules = $this->view->dojo()->getModules();
}
}
Последний звонок для get-content:
dojo.xhrGet(new fetch_dom_node_contents("/index/get-content/format/json"));
Это я обычно вставляю в событие сома или кнопки onClick (). Важно иметь:
event.preventDefault();
event.stopPropagation();
До xhrGet () или xhrPost (). Если вам необходимо заполнить формы публикации, добавьте форму: dojo.byId ("myform") в класс fetch_dom_node_contents, и форма будет отправлена вашему контроллеру, где вы просто обрабатываете ее как "обычная работа".
Поскольку отправленная форма ajax обычно перенаправляет или делает что-то еще, вы должны прикрепить "/ format / json" или что-то похожее на подсказку к действию, что он должен возвращать json в качестве ответа, а не просто сделать перенаправление. У меня есть этот простой помощник действий для проверки, если я нахожусь в вызове ajax или нет:
<?php
/**
* Action Helper for checking if context is of json type
*
* @uses Zend_Controller_Action_Helper_Abstract
*/
class Action_Helper_IsJson extends Zend_Controller_Action_Helper_Abstract
{
/**
* Checks if the format parameter is set to json
* if so it returns true
*
*/
public function isJson(){
$format = $this->getRequest()->getParam('format', false);
if (strtolower($format) == "json"){
return true;
}else{
return false;
}
}
public function direct()
{
return $this->isJson();
}
}
Когда моя форма успешно проанализирована, у меня есть другой помощник, который удобен, когда есть перенаправление:
<?php
/**
*
* @uses Zend_Controller_Action_Helper_Abstract
*/
class Action_Helper_SendReloadResponse extends Zend_Controller_Action_Helper_Abstract
{
/**
*/
public function sendReloadResponse($url){
echo Zend_Json_Encoder::encode(array(
'success' => true,
'reloadHTTP' => $url)
);
die();
}
/**
* @return boolean
*/
public function direct($url)
{
return $this->sendReloadResponse($url);
}
}
У меня есть тогда в моей загрузочной части ajax a:
if (responseData.reloadHTTP) {
// Probably first element or last element
window.location = responseData.reloadHTTP;
}
Хм ... Я не знаю, является ли это лучшим способом работы с xhrGet / Post, но он отлично работает, и, возможно, вы можете поиграть с ним, найти лучшие решения и поделиться - я не нашел этого много, когда хотел начать с ajax, dojo и zend. Тот, который заставил меня начать, был nanaeu , но этот код (как и мой) уже довольно старый: /