Как построить запрос Zend_Dojo xhrPost - PullRequest
0 голосов
/ 02 марта 2010

Я новичок в Додзё.

Пожалуйста, как мне создать запрос xhrPost в Zend?

Ответы [ 2 ]

0 голосов
/ 24 августа 2011

У меня есть намного более простой метод.

В сценарии просмотра

<?php $this->dojo()->javascriptCaptureStart() ?>
function ajaxUpdate(url, targetNode, p1, p2) {
    // remove old content, prevents id clashing when generating new content.
    dojo.forEach(dijit.findWidgets(targetNode), function(win) {
        win.destroyRecursive();   
    });
    var xhrArgs = {
        url: url,
        handleAs: "text",
        content: {
            p1: p1,
            p2: p2
        },
        load: function(data) {
            dojo.html.set(targetNode, data, {parseContent: true});
        },
        error: function(error) {
            alert("An unexpected error occurred: " + error);
        }
    }
    dojo.xhrPost(xhrArgs);
}
<?php $this->dojo()->javascriptCaptureEnd() ?>

Вы также можете добавить это в скрипт макета или даже в файл начальной загрузки, если вы используете AJAX и хотите, чтобы он отображался в каждом представлении.

Теперь у вас есть кнопка с id = "show-message" в вашем представлении, и вы хотите загрузить собственную базу html для значений поля ввода (id = "field1") и флажок (id = "box1"). ") в div (id =" put-message-here "). Тогда вы также установите следующее в скрипте вида:

<?php $this->dojo()->onLoadCaptureStart() ?>
 function() {
    var field1 = dojo.byId("field1").value;
    var box1 = dojo.byId("box1").value;
    var url = "/module/controller/action/format/html";
    var targetNode = dojo.byId("put-message-here");

    dojo.connect(dojo.byId("show-message"), 'onclick', function() {
        ajaxUpdate(url, targetNode, field1, box1);
    });
 }
<?php $this->dojo()->onLoadCaptureEnd() ?>

В URL-адресе будут заменены модуль, контроллер, действие на те, которые указывают на ваше действие для обработки вызова ajax. Если у вас нет настроенных модулей, тогда нужно установить значение «по умолчанию», опуская его, похоже, не работает.

Так что, если мы установили url = "/ default / index / ajaxform / format / html", то в нашем indexController:

class IndexController extends Zend_Controller_Action
{
    public function init()
    {
        // set actions for use with AJAX call.
        $ajaxContext = $this->_helper->getHelper('AjaxContext');
        $ajaxContext->addActionContext('ajaxform', 'html')
                    ->initContext();
    }

    public function ajaxformAction()
    {
        $field = $this->getRequest()->getParam('p1');
        $box = $this->getRequest()->getParam('p2');

        // logic goes here

        $this->view->some_var = $whatever;
    }

    ....

Как видите, наше действие похоже на любое другое действие в Zend. Единственное отличие состоит в том, что вместо того, чтобы отправлять свои выходные данные в ajaxform.phtml, он отправляет их в ajaxform.ajax.phtml (из-за помощника, используемого в init (). Так что теперь в ajaxform.ajax.phtml у вас есть все код, который вы хотите отобразить в нашей целевой div.

<p><?php echo $this->some_var; ?></p>

Снова выглядит как любой другой видскрипт.

Единственный улов, который я нашел, заключается в том, что любые новые додзит додзё, которые я хочу создать, должны создаваться декларативно, то есть я не могу использовать помощники вида додзё.

0 голосов
/ 05 января 2011

Некоторое время я использовал 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 , но этот код (как и мой) уже довольно старый: /

...