ImpressPages 4: правильный способ отправки данных страницы через ajax

#php #ajax #json #impresspages

#php #ajax #json #impresspages

Вопрос:

Я хочу создать страницу ajax, и мне было интересно, как это сделать правильно? По сути, мне просто нужно получить данные страницы и заблокировать содержимое.

На данный момент у меня есть быстрое и грязное решение проблемы, путем печати json в событии ipBeforeResponceSent и выхода, но это некрасиво..

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

Может быть, самым чистым решением было бы просто отправить ссылку на контроллер моего плагина?

Комментарии:

1. Пожалуйста, добавьте более подробную информацию о ситуации. Откуда отправляется этот AJAX? Какие данные страницы вы должны отправить через AJAX (идентификатор страницы?)? И т.д.

2. Добавлен javascrpt, о котором идет речь. @AudriusJankauskas

Ответ №1:

Правильное использование AJAX:

передайте два параметра:

sa: ‘Плагин.Действие ‘SecurityToken: ip.SecurityToken (если вы используете javascript)

затем создайте действие контроллера и верните объект ответа json:

возвращает new IpResponseJson($data);

Вот вся эта информация в деталях http://www.impresspages.org/docs/controller

Ответ №2:

Я предполагаю, что если у вас есть 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 IpResponseJsonRpc::result(array('data' => $data));
    } else {
        return IpResponseJsonRpc::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 amp;amp; response.result) {


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


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

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

Комментарии:

1. Проблема в том, что я не знаю идентификатор страницы.

2. Вот как вы можете получить идентификатор страницы ipContent()-> getCurrentPage()-> getId()

3. @TheFobas, откуда вы берете PAGE_URL? Если это текущая страница, то у Mangirdas есть фрагмент для получения идентификатора.

4. @AudriusJankauskas Ну, я немного покопался в CMS и обнаружил, что могу сменить контроллер в задании ipRouteAction на свой контроллер, практически заменив исходное задание …. gist.github.com/TheFOBas/f25226b45adb71176032