Ajax запрос к экшину плагина.

Если я делаю запрос через $.load то получаю ответ. А функция ls.ajaxForm по тому же урлу (именно при изменении урла) выдает ошибку. Даю запрос на site.my/mainpreview/upload-mainpreview/ физически файл находится /plugins/mainpreview/classes/actions/ActionMain.class.php
Консоль дебага выдает следующее:
"parsererror" 
SyntaxError
arguments: Array[1]
get message: function () { [native code] }
get stack: function () { [native code] }
set message: function () { [native code] }
set stack: function () { [native code] }
type: "unexpected_token"
__proto__: Error
arguments: undefined
constructor: function SyntaxError() { [native code] }
name: "SyntaxError"
stack: undefined
type: undefined
__proto__: SetUpError.d

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

avatar
up!
avatar
Посылать запрос можно на любой url, главное что бы там был обработчик.
Обработчик пишется через регулярки также на любой вид url'а, и вызывает твою функцию. А уже в функции получаешь параметры вызова через requet «getRequest('sText');»
И отвечаешь назад через
"$this->Viewer_SetResponseAjax('json');" + $this->Viewer_AssignAjax('myVar','bar');

В скрипте уже ловишь ответ, и получаешь нужный результат из переменной. В нашем случае мы отправили ему переменную myVar со строкой 'bar'. Послать можно сколько угодно переменных.
avatar
Спасибо, буду обкатывать.
avatar
Ок. Имею следующий тестовый js код:

$.ajax({
	url: aRouter['mainpreview']+"upload-mainpreview/",
	type: "post",
	dataType: "json",
	timeout: 3000,
	success: function(answer){
		alert("Загружены данные: " + answer);
	},
	error: function(XMLHttpRequest, textStatus, errorThrown){
		$('.avatar-change').text('Text status: '+textStatus+'errorThrow: '+errorThrown+' XHRStatus: '+XMLHttpRequest.status);
	}
});

Если в методе указываю:
$json = '{"foo-bar": 12345}';
$obj = json_decode($json);

Аджакс отрабатывает, т.е. alert выдает.
Если в методе:
$this->Viewer_SetResponseAjax('json');
$this->Viewer_AssignAjax('myVar','bar');

Получаю ошибку:
Text status: parsererror errorThrow: SyntaxError: Unexpected token H XHRStatus: 200
WTF?
avatar
Ты используешь системную функцию с именем $.ajax? )
Посмотри как сделаны скрипты в \engine\lib\internal\template\js
avatar
нет, это чистый JQuery.ajax.
avatar
К стати можно даже проще:

ls.ajax(aRouter['mainpreview']+"upload-mainpreview/",{},function(answer){alert("Загружены данные: " + answer)});
avatar
Все дело в том что $this->Viewer_AssignAjax('myVar','bar'); присваивает переменной myVar значение bar и, внимание!, передает ее в шаблон., т.е. ответ в js мы получаем не из экшина, а из шаблона.
avatar
Не обязательно — для простых случаев можно шаблон не использовать, переменные возвращаются в AJAX респонсе.

(если я тебя правильно понял, что надо обязательно обрабатывать в шаблоне переменные, прежде чем они вернутся)
avatar
Сейчас сложно сказать в чем именно была проблема. В последнем плагине делал запрос прямо из шаблона, екшин возвращает результат через:
$this->Viewer_AssignAjax('myVar','bar');

и я ловлю результат тем же скриптом.
В чем была проблема до этого уж и не пойму теперь, возможно в том что js был в отдельном файле, а может я в будущем опять столкнусь с этой проблемой и уже более подробно ее изучу.
avatar
Ок :) Просто я дочитал до этого места, и подумал — ёлки, ещё и темплейт нужен, а мне всего-то два значения вернуть! Но попробовал так, навпростець, и всё прекрасно заработало без темплейтов.

Поэтому я для полноты информации и дописал. Рад, что у тебя тоже работает!
avatar

	this.Add = function(sText) {

	    var url = aRouter['shoutbox']+'add/';
            // request['sText']; <- in php code actions sb/add (=15)
	    var params = {sText: 15};

	    ls.ajax(url, params, function(result) {
		ls.shoutbox.DoUpdate();
                // $this->Viewer_AssignAjax('iFooBarVar',10); <- in php code actions sb/add
                var resultbar = result.iFooBarVar;
                // resultbar = 10
	    }.bind(this));

	    return false;
	};
avatar
В ls.ajax есть вывод ошибок в консоль, в принципе мне выдавало примерно тоже — Unexpected token.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.