Slyweb
На разработку сайта! Скидки 50%!

Правильный Ajax в ModX Revo!

jQuery сниппеты

Ajax запросы в Modx Revo можно делать различными способами:

  • через коннектор Modx;
  • через снипет при обращении к ресурсу на сайте;
  • запросы к Modx фреймовику;

Ajax через коннектор Modx

Пример jQuery скрипта - запроса к Modx коннектору:

  • Код
  • Чистый код
  • Копировать в буфер
  1.$.ajax({
  2. url: 'assets/components/chats/connectors/connectortochat.php?action=web/gotochat&ctx=web',
  3. global: false,
  4. beforeSend:function(){
  5. },
  6. data:{ctx:'web',to:uid},
  7. success:function(data){
  8. location.href='/tet-a-tet/';
  9. }
10.
11.});

        

Коннектор - это скрипт, содержащий код для проверки прав при выполнении запросов к администраторскому разделу, но его можно переделать для запросов к сайту:

  • Код
  • Чистый код
  • Копировать в буфер
  1.<?php
  2./**
  3. * Doodles Connector
  4. *
  5. * @package doodles
  6. */
  7.require_once dirname(dirname(dirname(dirname(dirname(__FILE__))))).'/config.core.php';
  8.require_once MODX_CORE_PATH.'config/'.MODX_CONFIG_KEY.'.inc.php';
  9.require_once MODX_CONNECTORS_PATH.'index.php';
10.
11.$corePath = $modx->getOption('chats.core_path',null,$modx->getOption('core_path').'components/chats/');
12.require_once $corePath.'model/chats/chats.class.php';
13.$modx->chats = new Chats($modx);
14.
15.$modx->lexicon->load('chats:default');
16.
17.if ($_REQUEST['action'] == 'web/gotochat') {
18. $version = $modx->getVersionData();
19.
20. if (version_compare($version['full_version'],'2.1.1-pl') >= 0) {
21.
22. if ($modx->user->hasSessionContext($modx->context->get('key'))) {
23.
24. $_SERVER['HTTP_MODAUTH'] = $_SESSION["modx.{$modx->context->get('key')}.user.token"];
25. } else {
26. $_SESSION["modx.{$modx->context->get('key')}.user.token"] = 0;
27. $_SERVER['HTTP_MODAUTH'] = 0;
28. }
29. } else {
30. $_SERVER['HTTP_MODAUTH'] = $modx->site_id;
31. }
32. $_REQUEST['HTTP_MODAUTH'] = $_SERVER['HTTP_MODAUTH'];
33.}
34.
35./* handle request */
36.$path = $modx->getOption('processorsPath',$modx->chats->config,$corePath.'processors/');
37.$modx->request->handleRequest(array(
38. 'processors_path' => $path,
39. 'location' => '',
40.));

        

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

  • Код
  • Чистый код
  • Копировать в буфер
  1.require_once $corePath.'model/chats/chats.class.php';
  2.$modx->chats = new Chats($modx);

        

после подклюения класса - контроллёра, все запросы по типу "контекс/контроллёр" будут обработнны контроллёром, например "web/getchat" будет находится в директории "/core/ваш компонент/processors/web/getchat.php". Для обработки обязательно необходим следующий код:

  • Код
  • Чистый код
  • Копировать в буфер
  1./* handle request */
  2.$path = $modx->getOption('processorsPath',$modx->chats->config,$corePath.'processors/');
  3.$modx->request->handleRequest(array(
  4.'processors_path' => $path,
  5.'location' => '',
  6.));

        

После этого контроллёр может служить хорошим средством для взаимодействия с вашим ajax скриптом.

Ajax через сниппет

Второй способ считается правильнее по словам разработчиков Modx Revo:

Создайте любой сниппет:

напишите код для сниппета, он просто выводит json:

  • Код
  • Чистый код
  • Копировать в буфер
  1.return json_encode(array("1","2"));

        

после этого создайте ресурс с именем Ajax:

после этого создайте новый тип содержимого json:

сейчас, когда у Вас есть новый тип к нему можно делать запросы:

  • Код
  • Чистый код
  • Копировать в буфер
  1.<script>
  2.$(document).ready(function () {
  3.
  4. $.getJSON("http://{сайт}/ajax.json");
  5.});
  6.</script>

        

будьте внимательны в содержимомо ресурса не должно быть тегов для формата json:

Ещё способ делать ajax запросы к Modx

Запросы можно делать ещё одним способом кторый для меня более удобен, чем предыдущие - запросы на прямую к Modx фреймовику.

Для этого кладём в корневой каталог сайта файл следующего содержимого:

  • Код
  • Чистый код
  • Копировать в буфер
  1.<?php
  2./*
  3. * MODx Revolution
  4. *
  5. * Copyright 2006-2010 by the MODx Team.
  6. * All rights reserved.
  7. *
  8. * This program is free software; you can redistribute it and/or modify it under
  9. * the terms of the GNU General Public License as published by the Free Software
10. * Foundation; either version 2 of the License, or (at your option) any later
11. * version.
12. *
13. * This program is distributed in the hope that it will be useful, but WITHOUT
14. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15. * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
16. * details.
17. *
18. * You should have received a copy of the GNU General Public License along with
19. * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
20. * Place, Suite 330, Boston, MA 02111-1307 USA
21. *
22. */
23.$mtime= microtime();
24.$mtime= explode(" ", $mtime);
25.$mtime= $mtime[1] + $mtime[0];
26.$tstart= $mtime;
27.
28.error_reporting(E_ALL & ~E_NOTICE);
29.
30./**
31. * @deprecated 2.0.0
32. * For backward compatibility with MODx 0.9.x
33. */
34.define("IN_PARSER_MODE", "true");
35./**
36. * @deprecated 2.0.0
37. * For backward compatibility with MODx 0.9.x
38. */
39.define("IN_MANAGER_MODE", false);
40.
41./* define this as true in another entry file, then include this file to simply access the API
42. * without executing the MODx request handler */
43.if (!defined('MODX_API_MODE')) {
44. define('MODX_API_MODE', false);
45.}
46.
47./* this can be used to disable caching in MODx absolutely */
48.$modx_cache_disabled= false;
49.
50./* include custom core config and define core path */
51.@include('config.core.php');
52.if (!defined('MODX_CORE_PATH')) define('MODX_CORE_PATH', $_SEVER['DOCUMENT_ROOT'].'/core/');
53.
54./* include the modX class */
55.if (!@include_once (MODX_CORE_PATH . "model/modx/modx.class.php")) {
56. $errorMessage = 'Site temporarily unavailable';
57. @include(MODX_CORE_PATH . 'error/unavailable.include.php');
58. header('HTTP/1.1 503 Service Unavailable');
59. echo "<html><title>Error 503: Site temporarily unavailable</title><body><h1>Error 503</h1><p>{$errorMessage}</p></body></html>";
60. exit();
61.}
62.
63./* start output buffering */
64.ob_start();
65.
66./* Create an instance of the modX class */
67.if (empty($options) || !is_array($options)) $options = array();
68.$modx= new modX('', $options);
69.if (!is_object($modx) || !($modx instanceof modX)) {
70. @ob_end_flush();
71. $errorMessage = '<a href="setup/">MODx not installed. Install now?</a>';
72. @include(MODX_CORE_PATH . 'error/unavailable.include.php');
73. header('HTTP/1.1 503 Service Unavailable');
74. echo "<html><title>Error 503: Site temporarily unavailable</title><body><h1>Error 503</h1><p>{$errorMessage}</p></body></html>";
75. exit();
76.}
77.header('Content-Type: text/html; charset=utf-8');
78./* Set the actual start time */
79.$modx->startTime= $tstart;
80.
81./* Set additional logging options including level and target: */
82.$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
83.$modx->setLogTarget('FILE');
84.
85./* Set debugging mode (i.e. error_reporting): */
86.$modx->setDebug(E_ALL & ~E_NOTICE);
87.
88./* Initialize the default 'web' context */
89.$modx->initialize('web');
90.
91.$modx->runsnippet('SimpleSearch');
92.
93.echo '<?xml version=\'1.0\' encoding=\'utf-8\' ?><ul>
94. <li><a href="http://rathersplendid.net/home/site-launch-soho-fixed">Site Launch: Soho Fixed</a></li>
95.</ul>';
96.
97.
98.?>

        

После этого все запросы к этому файлу будут выполнятся с использованием Modx Revo. В нашем примере мы выводим поле для поиска через сниппет "SimpleSearch".

Рассмотрите допонительный пример подключения Modx Revo, с выводом содержимого статьи через ajax запрос!

  • Код
  • Чистый код
  • Копировать в буфер
  1. <?php
  2.
  3.$mtime = microtime();
  4.$mtime = explode(" ", $mtime);
  5.$mtime = $mtime[1] + $mtime[0];
  6.$tstart = $mtime;
  7.error_reporting(E_ALL & ~E_NOTICE);
  8./**
  9. * @deprecated 2.0.0
10. * For backward compatibility with MODx 0.9.x
11. */
12.define("IN_PARSER_MODE", "true");
13./**
14. * @deprecated 2.0.0
15. * For backward compatibility with MODx 0.9.x
16. */
17.define("IN_MANAGER_MODE", false);
18./* define this as true in another entry file, then include this file to simply access the API
19. * without executing the MODx request handler */
20.if (!defined('MODX_API_MODE')) {
21. define('MODX_API_MODE', false);
22.}
23./* this can be used to disable caching in MODx absolutely */
24.$modx_cache_disabled = false;
25./* include custom core config and define core path */
26.@include('config.core.php');
27.if (!defined('MODX_CORE_PATH'))
28. define('MODX_CORE_PATH', $_SEVER['DOCUMENT_ROOT'] . '/core/');
29./* include the modX class */
30.if (!@include_once(MODX_CORE_PATH . "model/modx/modx.class.php")) {
31. $errorMessage = 'Site temporarily unavailable';
32. @include(MODX_CORE_PATH . 'error/unavailable.include.php');
33. header('HTTP/1.1 503 Service Unavailable');
34. echo "<html><title>Error 503: Site temporarily unavailable</title><body><h1>Error 503</h1><p>{$errorMessage}</p></body></html>";
35. exit();
36.}
37./* start output buffering */
38.ob_start();
39./* Create an instance of the modX class */
40.if (empty($options) || !is_array($options))
41. $options = array();
42.$modx = new modX('', $options);
43.if (!is_object($modx) || !($modx instanceof modX)) {
44. @ob_end_flush();
45. $errorMessage = '<a href="setup/">MODx not installed. Install now?</a>';
46. @include(MODX_CORE_PATH . 'error/unavailable.include.php');
47. header('HTTP/1.1 503 Service Unavailable');
48. echo "<html><title>Error 503: Site temporarily unavailable</title><body><h1>Error 503</h1><p>{$errorMessage}</p></body></html>";
49. exit();
50.}
51.header('Content-Type: text/html; charset=utf-8');
52./* Set the actual start time */
53.$modx->startTime = $tstart;
54./* Set additional logging options including level and target: */
55.$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
56.$modx->setLogTarget('FILE');
57./* Set debugging mode (i.e. error_reporting): */
58.$modx->setDebug(E_ALL & ~E_NOTICE);
59./* Initialize the default 'web' context */
60.$modx->initialize('web');
61.//выбираем ресурсы по заданному условию
62.$holder = $modx->getObject('modResource', array(
63. 'id' => 3
64.));
65.echo $holder->get('content');
66.?>
67.

        

Удачи и успехов!

Поделись статьёй: 
Александр Ермаков