0

我想创建一个 ajax 页面,我想知道如何正确地做到这一点?本质上,我只需要获取页面数据并阻止内容。

现在,我通过在 ipBeforeResponceSent 事件中打印 json 并退出来解决这个问题的快速而肮脏的解决方案,但它很难看..

class Event{
    public static function ipBeforeResponseSent($event){
        $ajax =  ipRequest()->getQuery('ajax');
        if ($ajax){
            $page = ipContent()->getCurrentPage();

            $data['status'] = 'success';
            $data['url'] = $page->getLink();
            $data['page'] = ipContent()->getBlockContent('main');
            $data['title'] = $page->getTitle();
            $data['id'] = $page->getId();

            $data['pageorder'] = $page->getOrder();
            $data['parent'] = $page->getParentId();
            $data['timestamp'] = time();

            exit(json_encode($data, true));
        }
    }
}

Javascript方面:

$.getJSON(PAGE_URL, {ajax: 'true'}, function(responce) {
    if (responce.status == 'success'){
        /***/
    }
});

也许最干净的解决方案是将链接发送到我的插件控制器?

4

2 回答 2

1

AJAX的正确使用:

传递两个参数:

sa: 'Plugin.Action' securityToken: ip.securityToken (如果你在 javascript 中)

然后创建控制器动作并返回 json 响应对象:

返回新的 \Ip\Response\Json($data);

以下是详细信息http://www.impresspages.org/docs/controller

于 2014-06-19T20:04:33.240 回答
0

我假设如果你有PAGE_URL,你应该也可以使用page id

如果此功能仅与此特定网站相关,请使用Application插件及其PublicController.php已经存在的插件。

public function getPageAjax()
{
    // Allowing only post actions
    ipRequest()->mustBePost();

    // Getting page ID from posted data
    $pageId = ipRequest()->getPost('pageId');

    // Get page object
    $page = ipContent->getPage($pageId);

    if ($page != null) {
        $data = array();

        // Do what you need

        return \Ip\Response\JsonRpc::result(array('data' => $data));
    } else {
        return \Ip\Response\JsonRpc::error("Page not found");
    }
}

Javascript 看起来像这样:

function applicationGetPageAjax(pageId) {
    var postData = {
        'pa': 'Application.getPageAjax',
        'pageId': pageId,
        'jsonrpc': '2.0'
    };

    $.ajax({
        url: ip.baseUrl,
        data: postData,
        dataType: 'json',
        type: 'POST',
        success: function (response) {
            if (response && response.result) {


                // Do what you want with response
                alert(response.result.data);


            } else if (response && response.error && response.error.message) {
                alert(response.error.message);
            } else {
                alert('Unknown response.');
            }
        },
        error: function (response) {
            alert('Unexpected error.' + response.responseText);
        }
    });
}

我没有测试过。以此为原则。您可以在核心中找到多个类似 AJAX 操作的示例。

于 2014-06-19T08:52:25.617 回答