#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