Ajax getPage

Здравствуйте. Есть обычный обработчик ajax запросов. Там вызывается сниппет getPage и выскакивает ошибка <b>Fatal error</b>: Call to a member function getParameters() on a non-object in <b>M:\OpenServer\domains\localhost\API\core\cache\includes\elements\modsnippet\1.include.cache.php</b> on line <b>75</b> Нарыл в руководстве Боба Рэя ответ Обычно это означает, что объект $modx не доступен в данном месте вашего кода. Если это код внутри функции, вам следует передать данный объект как: global $modx; в начале функции для того, чтобы дать PHP знать, что вы хотите использовать объект $modx извне функции, вместо создания нового. Если это не сработало, иногда нужно передать $modx в функцию в качестве аргумента. Вот мой код, куда это вставить? Пробовал в самом начале — не работает. <?php header('Content-Type: text/html; charset=utf-8');

function getData($action, $id){ // global $modx; $res;

$mtime = microtime();
$mtime = explode(" ", $mtime);
$mtime = $mtime[1] + $mtime[0];
$tstart = $mtime;

/* /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// */
if(!defined('MODX_API_MODE')){
	define('MODX_API_MODE', true);
}

$modx_cache_disabled = true;

// подключаем настройки и определим базовый путь для MODX
require_once '../../config.core.php';

if(!defined('MODX_CORE_PATH')) define('MODX_CORE_PATH', $_SERVER['DOCUMENT_ROOT'].'/core/');

// подключаем класс modX
if(!include_once (MODX_CORE_PATH . "model/modx/modx.class.php")){
	$errorMessage = 'Site temporarily unavailable';
	include(MODX_CORE_PATH . 'error/unavailable.include.php');
	header('HTTP/1.1 503 Service Unavailable');
	echo "<html><title>Error 503: Site temporarily unavailable</title><body><h1>Error 503</h1><p>{$errorMessage}</p></body></html>";
	exit();
}

// вывод данных из буфера
ob_start();

if(empty($options) || !is_array($options)) $options = array();
$modx = new modX('',$options);
if(!is_object($modx) || !($modx instanceof modX)){
	ob_end_flush();
	$errorMessage = '<a href="setup/">MODx not installed. Install now?</a>';
	include(MODX_CORE_PATH . 'error/unavailable.include.php');
	header('HTTP/1.1 503 Service Unavailable');
	echo "<html><title>Error 503: Site temporarily unavailable</title><body><h1>Error 503</h1><p>{$errorMessage}</p></body></html>";
	exit();
}

$modx -> startTime = $tstart;
$modx -> setLogLevel(modX::LOG_LEVEL_ERROR);
$modx -> setLogTarget('FILE');
$modx -> setDebug(E_ALL & ~E_NOTICE);
$modx -> initialize('web');

$modx -> resource = $modx -> getObject('modResource', $id); //ОЧЕНЬ ВАЖНЫЯ СТРОКА (ПОЛУЧАЕМ ССЫЛКУ НА ТЕКУЩИЙ ОБЪЕКТ ИЗ AJAX ВЫЗОВА)
/* /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// */

// Вызов нужного метода
switch($action){
	case 'paging':
		$params['parents'] = $id;
		$params['tpl'] = 'ajaxResources';
		$params['includeTVs'] = 1;
		$params['processTVs'] = 1;
		$params['showHidden'] = 1;
		$params['element'] = 'getResources';
		$params['limit'] = 1;
		$res = $modx -> runSnippet('getPage', $params);
	break;
}

if(!empty($res)) {
  return $res;
}

}

// Откликаться будет ТОЛЬКО на ajax запросы
if($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest'){
	return;
}

// сниппет будет обрабатывать не один вид запросов, поэтому работать будем по запрашиваемому действию
$action = $_GET['action'];

// Если в массиве POST нет действия - выход
if (empty($action)){
	return;
}
else{
	echo getData($action,(int) $_POST['id']);
}

?>

Здравствуйте. Fatal error:  Call to a member function getParameters() on a non-object in M:\OpenServer\domains\localhost\API\core\cache\includes\elements\modsnippet\1.include.cache.php on line 75 Вам в ошибке четко указано где и почему она лезет. Смотреть надо сам getPage, а не ваш код. github.com/opengeek/getPage/blob/master/core/components/getpage/snippet.getpage.php#L70 У вас нет объекта $modx->request, то есть modRequest. Сделайте лучше чистый документ с пустым шаблоном, и в него уже вставьте вызов своего сниппета, так как getPage-у еще и объект текущего ресурса нужен, без него он тоже будет разваливаться. Вообще этот вопрос скорее всего будет довольно сложным, и скорее всего зря вы на него замахнулись. Здесь довольно много подводных камней. Я вас не научу программировать, а за решением этой задачки возможно вы потратите не один час.

Так ведь текущий объект я получаю $modx -> resource = $modx -> getObject('modResource', $id); Это в коде выше есть. Значит как то можно прикрутить и modRequest? Или я ошибаюсь? И как же про выдержку о global $modx;? Может получится малой кровью обойтись?

У вас нет объекта $modx->request, то есть modRequest. modRequest != modResource modRequest — это совершенно другой объект, обрабатывающий запросы. Я вам дал наводку как это решать, уже для вас большую часть работы сделал. Хотите понимать что это такое и с чем его кушать — индивидуальные уроки по скайпу 1000 рублей/час. Или самостоятельно поизучайте php ООП. Учитывая то, что вы по всей видимости даже области видимости пропустили, то еще раз повторюсь — вы не на ту задачу замахнулись. Мы тут конечно помогаем чем можем, но не тогда, когда разрыв между задачей и знаниями огромный. Или объявляйте заказ на разработку модуля, или оплачивайте уроки, или учитесь самостоятельно. Здесь халявы нет. А то получается, что научились баранку крутить, и уже хотите в гонках F1 выиграть.

Вообщем сделал так. Работает, но выводит не отработанные тэги. [[+first]][[+prev]]1 2 3 >> Last Так впринципе правильно? <?php header('Content-Type: text/html; charset=utf-8');

require_once '../../config.core.php'; require_once MODX_CORE_PATH.'model/modx/modx.class.php'; require_once MODX_CORE_PATH.'/model/modx/modrequest.class.php'; //нужен для getPage

$modx = new modX();

// Включаем обработку ошибок $modx -> getService('error','error.modError'); $modx -> setLogLevel(modX::LOG_LEVEL_INFO); $modx -> setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');

$modx -> initialize('web');

$id = $_POST['id'];

$modx -> resource = $modx -> getObject('modResource', $id); $modx -> request = new modRequest($modx); //передаём объект $modx в класс modRequest

//запуск getPage
$params['parents'] = $id;
$params['tpl'] = 'ajaxResources';
$params['includeTVs'] = 1;
$params['processTVs'] = 1;
$params['showHidden'] = 1;
$params['element'] = 'getResources';
$params['limit'] = 1;
$params['total'] = 3;
$params['pageNavVar'] = 'paging';

$res = $modx -> runSnippet('getPage', $params);

echo "$res<ul class='pager'>{$modx -> getPlaceholder('paging')}</ul>";

В общих чертах да. Не отрабатывает, потому что вы просто создали modRequest-объект, но не использовали его для обработки ответа (что в вашем случае и не получится). Надо просто перед отправкой ответ обработать нормально парсером. github.com/modxcms/revolution/blob/develop/core/model/modx/modresponse.class.php#L83 /* collect any uncached element tags in the content and process them */ $this->modx->getParser(); $maxIterations= intval($this->modx->getOption('parser_max_iterations', $options, 10)); $this->modx->parser->processElementTags('', $this->modx->resource->_output, true, false, '[[', ']]', array(), $maxIterations); $this->modx->parser->processElementTags('', $this->modx->resource->_output, true, true, '[[', ']]', array(), $maxIterations);

И еще раз: все-таки правильней в вашем случае делать это через документ с пустым шаблоном. Нагрузки на сервер не на много будет больше, точнее, практически никак не больше.

switch($action){ case 'paging':

	$res .= "<ul class=\"work-thumbs\">".$modx -> runSnippet('getPage@paging', $params)."</ul>";
	break;
}

$str = $modx -> getPlaceholder('paging');

//обработка парсером пагинации
$modx -> getParser();
$maxIterations = intval($modx -> getOption('parser_max_iterations', NULL, 10));
$modx -> parser -> processElementTags('', $str , true, false, '', array(), $maxIterations);
$modx -> parser -> processElementTags('', $str, true, true, '', array(), $maxIterations);

return "$res<ul class='pager'>{$str}</ul><p>Всего записей: {$modx -> getPlaceholder('pageCount')}</p>"; Спасибо за помощь! Без Вас ничего бы не сделал. Оказалось не так всё сложно. И узнал для себя новое! Это черновик, потом перепишу.

Не все так сложно, когда есть кому подсказать. Пожалуйста.