[REVO] miniShop и мои кривые руки

Modx 2.2.6
miniShop 1.9.4
Суть проблемы: miniShop установлен, товары импортируются из XML выгрузки 1С (своё решение), всё работает.
Не работает только миникорзина, вызываю её вот так
[[!miniShop?action=`getMiniCart`&tplMiniCart=`miniCart`]]

Содержание чанка miniCart

<div id="miniCart">
	<div id="cart_1" [[+count:gt=`0`:then=`style="display:none"`]]>
		Корзина (0)
	</div>

	<div id="cart_2" [[+count:lt=`1`:then=`style="display:none"`]]>
		Корзина (<strong id="cart_count">[[+count]]</strong>шт.) 
		<strong id="cart_total">[[+total]]</strong> руб.
		<p><a href="[[~92]]" class="right">Оформить заказ</a></p>
	</div>
</div>


На что у меня начинают сыпаться нотисы:

Notice: Undefined index: HTTP_X_REQUESTED_WITH in /home/*****/****/www/core/cache/includes/elements/modsnippet/7.include.cache.php on line 11

Notice: Undefined index: HTTP_X_REQUESTED_WITH in /home/*****/****/www/core/cache/includes/elements/modsnippet/7.include.cache.php on line 44

Notice: Undefined index: HTTP_X_REQUESTED_WITH in /home/*****/****/www/core/cache/includes/elements/modsnippet/7.include.cache.php on line 56


Не исключаю что всему виной мои кривые руки, но всё же хотелось бы найти в чём трабл и его исправить

16 комментариев

avatar
Там все просто! Дайте код сниппета minishop я вам поправлю всё
avatar
Код минишопа


<?php
// Defining action. If no action in $_REQUEST - set default (getCart)
if (empty($_REQUEST['action']) || $scriptProperties['action'] == 'getMiniCart') {$action = $modx->getOption('action', $scriptProperties, 'getCart');}
else {$action = $_REQUEST['action'];}

if ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' && $action == 'getMiniCart') {return;}

// Load class
$modx->miniShop = $modx->getService('minishop','miniShop', $modx->getOption('core_path').'components/minishop/model/minishop/', $scriptProperties);
if (!($modx->miniShop instanceof miniShop)) return '';
$modx->miniShop->config = array_merge($modx->miniShop->config, $scriptProperties);

// Load needed method
switch ($action) {
	case 'getCart': $res = $modx->miniShop->getCart(); break;
	case 'getMiniCart': $res = $modx->miniShop->getMiniCart(); break;
	case 'addToCart': $res = $modx->miniShop->addToCart($_POST['gid'], $_POST['num'], $_POST['data']); break;
	case 'remFromCart': $res = $modx->miniShop->remFromCart($_POST['key']); break;
	case 'changeCartCount': $res = $modx->miniShop->changeCartCount($_POST['key'], $_POST['val']); break;
	case 'getCartStatus': $res = $modx->miniShop->getCartStatus(); break;
	case 'getDelivery': $res = $modx->miniShop->getDelivery(); break;
	case 'getPayments': $res = $modx->miniShop->getPayments(); break; 
	case 'submitOrder': $res = $modx->miniShop->submitOrder(); break;
	case 'getMyOrdersList': $res = $modx->miniShop->getMyOrdersList(); break;
	case 'redirectCustomer': $res = $modx->miniShop->redirectCustomer($_REQUEST['oid'], $_REQUEST['email']); break;
	case 'receivePayment': $res = $modx->miniShop->receivePayment($_REQUEST); break;

	//ExtJS connectors
	case 'orders/getlist': echo $modx->runProcessor('web/orders/getlist', $_REQUEST, array('processors_path' => $modx->miniShop->config['processorsPath']))->response; die;
	case 'status/getcombo': echo $modx->runProcessor('web/status/getcombo', $_REQUEST, array('processors_path' => $modx->miniShop->config['processorsPath']))->response; die;
	case 'orders/get': $res = $modx->runProcessor('web/orders/get', $_REQUEST, array('processors_path' => $modx->miniShop->config['processorsPath'])); echo json_encode($res->response); die;
	case 'orderedgoods/getlist': echo $modx->runProcessor('web/orderedgoods/getlist', $_REQUEST, array('processors_path' => $modx->miniShop->config['processorsPath']))->response; die;
	case 'log/getlist': echo $modx->runProcessor('web/log/getlist', $_REQUEST, array('processors_path' => $modx->miniShop->config['processorsPath']))->response; die;
	//
    default: $res = '';
}

// Returning results, according to request typea
if ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' && !empty($res)) {
	if (!$_REQUEST['json_encode']) {
		echo json_encode($res);
	}
	else {
		$maxIterations= (integer) $modx->getOption('parser_max_iterations', null, 10);
		$modx->getParser()->processElementTags('', $res, false, false, '[[', ']]', array(), $maxIterations);
		$modx->getParser()->processElementTags('', $res, true, true, '[[', ']]', array(), $maxIterations);
		echo $res;
	}
	die;
}
else if ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' && empty($res)) {}
else {
	return $res;
}
avatar
avatar
Но я обычно объявляю функцию is_ajax()
function is_ajax(){
    return (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest');
}

И везде вместо
isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'
пишу is_ajax()
avatar
Можно еще попробовать так
$is_ajax = function(){
    return (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest');
}

Будет ли работать не знаю. Или так
$is_ajax = (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest');


Кстати может кто подскажет какая запись в контексте сниппета miniShop самая удачная и работоспособная?
avatar
ещё один прикол есть: не работают оповещения sticr.js
avatar
Смотри в консоле браузера ошибки и подключен скрипт stickr.js или нет
avatar
эт естественно, он как раз таки подключён 0_о а усё равно не работает
avatar
Смотри в консоле браузера какой ответ приходит от сервера на ajax запрос, т.е. чтобы в нем не было ошибок типа Notice
avatar
Вот чего пишет

Uncaught TypeError: Object function (a,b){return new e.fn.init(a,b,h)} has no method 'stickr' minishop.js:98
success minishop.js:98
showResponse minishop.js:77
(anonymous function) minishop.js:23
f.Callbacks.o jquery.min.js:2
f.Callbacks.p.fireWith jquery.min.js:2
w jquery.min.js:4
f.support.ajax.f.ajaxTransport.send.d
avatar
не подключен stickr
avatar
в личку написал
avatar

if (method_exists($this->miniShop,$action)
    $res = $this->miniShop->{$action}


Или через call_user_func_array
avatar
Это куда писать?
avatar
Это не в тему про фигурные скобки habrahabr.ru/qa/3846/#answer_16592?
avatar
Нужно изменить уровень вывода ошибок на сервере.

Попробуйте просто добавить в начало сниппетов, или сразу в /index.php
ini_set('error_reporting', 1);
ini_set('display_errors', 0);

Когда я начинал писать miniShop — просто не парился про E_NOTICE — на моём сервере они не отображались =)

А сейчас надо полностью переписывать компонент, чтобы убрать эти уведомления. В версии 2.0 будет как надо, если когда-нибудь напишу её.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.