Русские кодировки в XAJAX
Задача элементарная:
вывести окно авторизации (логин, пароль - как положено), авторизоваться (или НЕ авторизоваться) не отходя от кассы.
Возникли проблемы с кодировкой данных POST.
Короче, вот кусок кода:
define("XAJAX_DEFAULT_CHAR_ENCODING", "windows-1251");
require_once("./xajax/xajax.inc.php");
function testForm($formData)
{
$objResponse = new xajaxResponse("windows-1251");
$objResponse->addAssign("login-form", "innerHTML", "Принятые данные: ".nl2br(print_r($formData, true)), true);
return $objResponse->getXML();
}
$xajax = new xajax();
$xajax->registerFunction("testForm");
$xajax->processRequests();
$xajax->printJavascript("/xajax/");
?>
<!-- форма регистрации в системе -->
<div id="login-form" style="display: none;">
<form id="form1" onsubmit="return false;">
<div id="close" onclick="changeDisplay('login-form')" title="закрыть окно">x</div>
<table width="100%" align="center" class="MainTableForm">
<tbody>
<tr>
<td class="Column2"><label>
<div align="center"><strong>Логин:</strong><br>
<input class="InputBox" name="login" type="text" id="login" value="<?=$userinfo[login]?>" />
</div>
</label></td>
</tr>
<tr>
<td class="Column2"><label>
<div align="center"><strong>Пароль:</strong><br>
<input name="password" type="password" class="InputBox" id="password" value="<?=$userinfo[password]?>" />
</div>
</label></td>
</tr>
<tr>
<td class="Column2"><div align="center">
<input type="submit" style="width: 100px;" value="Войти" onclick="xajax_testForm(xajax.getFormValues('form1')); return false;" />
</div></td>
</tr>
<tr>
<td style="text-align: center;"><a href="#">Регистрация</a><br /><a href="#">Забыли пароль?</a>
</td>
</tr>
</tbody>
</table>
</form>
</div>
<!-- конец формы -->
testForm($formData) возвращает:
Array
(
[login] => фыва
[password] => фыва
)
то есть массив $formData - в UTF, хотя для всего XAJAX установлено 1251.
цель - привести все POST данные к 1251.
iconv и другие извращения не помогают, одни глюки.
Сделал я так:
{
return iconv("utf-8", "windows-1251", $str);
}
function testForm($formData)
{
$a = cyrconv($formData[login])
$objResponse = new xajaxResponse("windows-1251");
$objResponse->addAssign("login-form", "innerHTML", "Логин: $a");
return $objResponse->getXML();
}
аналогично iconv использовалось в нескольких разных вариантах.
главный глюк такой - в месте выхова этого куска вывод просто ОСТАНАВЛИВАЕТСЯ. без единого намёка на ошибки. просто - как ножницами отрезало. опции вывод ошибок настроены везде, где только можно. может быть давно бы уже сам разобрался, но отсутсвие error ввело меня в замешательство...
пытаюсь применить $xajax->decodeUTF8InputOn(); - такой же "эффект ножниц". просто вырубается на этом месте и всё.
комментирую строку $a = cyrconv($formData[login]) - всё работает.
такое ощущение, что function testForm($formData) не даёт как либо модифицировать данные в самой функции.
мистика...
пожалуйста, покажите ваши примеры работы с формами, если кто этим занимался.
курил маны http://wiki.xajaxproject.org/Documentation:xajax.inc.php - тоже никак. грешу на кривые настройки Апача и ПХП...
Интересно!
Вот этот код
define("XAJAX_DEFAULT_CHAR_ENCODING", "windows-1251");
include_once("../xajax/xajax.inc.php");
function testForm($formData)
{
//$buf = "Принятые данные: ".nl2br(print_r($formData, true));
if ($formData[login] == "Вася") $buf = "Здравствуйте, $formData[login]!<br />Вы успешно вошли в систему.";
else $buf = "Такой учётной записи не существует.";
$objResponse = new xajaxResponse();
$objResponse->addAssign("login-form", "innerHTML", $buf);
return $objResponse->getXML();
}
$xajax = new xajax();
$xajax->decodeUTF8InputOn();
$xajax->registerFunction("testForm");
$xajax->processRequests();
$xajax->printJavascript("../xajax/");
?>
<!-- my form... -->
нормально работат на моём хостинге!! Но не работает на localhost...
Кто нибудь знает почему? Мне кажется дело в настройках PHP...
ЗЫ подозреваю что на локалхосте стоит венда а на хостинге никс...
ЗЫ подозреваю что на локалхосте стоит венда а на хостинге никс...
Так оно и есть. Анализировал заголовки HTTP, в обоих случаях идентичные, значит Apache отпадает.
Остаётся PHP. Как думаете, где там могу быть потенциальные проблемы? На серве и локале - mod_php.
Кстати, если у меня mod_php - где должен лежать php.ini? у меня в C:\windows\
вопрос: а как там корректно передать POST в функцию?
скрипт правильно отрабатывает имя Вася
а на локале выдаёт:
Такой учётной записи Вася не существует.
java script: encodeURI()
PHP: urldecode()
вопрос: а как там корректно передать POST в функцию?
не очень понял вопроса... Там есть параметр, отвечающий за метод передачи данных: $sajax_request_type = 'POST';
Все экспортированные в Sajax РНР-функции получают свое "отражение" в виде js-функций в странице (насколько я помню в xajax такая же модель)
скрипт правильно отрабатывает имя Вася
а на локале выдаёт:
Такой учётной записи Вася не существует.
Вместо всего этого геммороя можешь перейти на utf8 и все заработает. По крайней мере у меня все работает на локальном сервере (виндовом).
Или windows-1251 - это критично?
по поводу sajax - имхо это игрушка... документации нет. на сайте есть только пример с умножением цифр. плюс для более менее вменяемой интеграции почти весь интерфейс к серверным функциям надо дописывать на JavaScript. хотя не спорю, для простых задач пойдёт.
по поводу sajax - имхо это игрушка... документации нет. на сайте есть только пример с умножением цифр. плюс для более менее вменяемой интеграции почти весь интерфейс к серверным функциям надо дописывать на JavaScript. хотя не спорю, для простых задач пойдёт.
Твое мнение ошибочно. У меня есть как минимум два мощных проекта, где использован Sajax. Главное прямые руки и работающая голова.
а можно ссылки посмотреть?
Кстати, решил я свою проблему с кодировками. На стороне сервера вообще ничего перекодировать не надо, на локале применяю mb_convert(), всё работает без глюков, менеджер проекта счастлив )))
Пока работает система "авторизация/забыли пароль", но уже видно, что дальше дело пойдёт!
sajax - ИМХО штука хорошая, но рутинных операций делать приходится много. архитектура xajax более абстрактна и понятна мне, хороший форум поддержки, полная документация, доступ к SVN. будет необходимость - применю sajax.
AJAX я применяю ТОЛЬКО в панелях администрирования. Так что показать проблема, к сожалению. К тому же местами интерфейс таких панелей является коммерческой тайной (я имею ввиду игровые проекты).