Modx Revo передача параметров чанку на кириллице
Приветствую!
Такой вопрос (может кто сталкивался)
Передаю значения чанку на кириллице (UTF8) вот так:
В чанке соответственно:
В итоге в HTML вставляется вот так:
Т.е. все вставляется в h3, если передать значения на английском то все срабатывает как надо. Видимо парсер криво парсит — то ли что то с кавычками (хотя английских нормально проходит), то ли ему кириллица не нравится.
Пробовал @CODE: — он тоже лезит в h3 (сама деректива там появляется — h3 '@CODE: ПОИСК и т.д.)
Знающие люди подскажите, в код модикса лезть не хочется.
Куда копать?
Такой вопрос (может кто сталкивался)
Передаю значения чанку на кириллице (UTF8) вот так:
[[$chunkName?
&title=`ПОИСК что то еще на русском`
&button=`искать`
]]
В чанке соответственно:
<article class="grid_[[+grid]]">
<h3>[[+title]]</h3>
<form id="form2" class="jqtransform" method="get">
...
<a class="button2">[[+button]]</a>
<div class="clear"></div>
</form>
</article>
В итоге в HTML вставляется вот так:
<h3>`ПОИСК что то еще на русском`&button=`искать`</h3>
...
<a class="button2"></a>
...
Т.е. все вставляется в h3, если передать значения на английском то все срабатывает как надо. Видимо парсер криво парсит — то ли что то с кавычками (хотя английских нормально проходит), то ли ему кириллица не нравится.
Пробовал @CODE: — он тоже лезит в h3 (сама деректива там появляется — h3 '@CODE: ПОИСК и т.д.)
Знающие люди подскажите, в код модикса лезть не хочется.
Куда копать?
Комментарии: 35
А оно надо обязательно — кастомизировать надпись на кнопке? Если нет, поправить прямо в чанке [[+button]] на «Искать», и можно спокойно искать причину такого поведения передачи параметров в чанк. Самому интересно.
Да в принципе могу чанков разных наделать :-)
И кнопку кастомизироваеть не обязательно (скорее всего везде «искать» будет), а вот заголовок надо разный! Но тут еще одна проблема: если параметр на русском то в HTML вставляется с апострофами ` — или как этот символ называется :-) (это те кавычки в которых параметр пишется).
Но на английском все четко срабатывает)
А код трогать не охота — потом если обновить версию модикса, то надо опять лезть в код, а самое главное запомнить где правил))))
И кнопку кастомизироваеть не обязательно (скорее всего везде «искать» будет), а вот заголовок надо разный! Но тут еще одна проблема: если параметр на русском то в HTML вставляется с апострофами ` — или как этот символ называется :-) (это те кавычки в которых параметр пишется).
Но на английском все четко срабатывает)
А код трогать не охота — потом если обновить версию модикса, то надо опять лезть в код, а самое главное запомнить где правил))))
Как вариант:
Получается что русские символы ломают парсер, после них парсер перестает парсить параметры)))))
Но корень проблемы не решен!
Ищу в коде мод икса место отвечающее за парсинг параметров чанка)))) посмотрим что там
[[$chankName?
&grid=`4`
&title=ПОИСК что то там
]]
Т.е. title — без апострафов, да у меня там еще grid передается — его ставить первым (выше параметра на русском) иначе он тоже в title лезет.Получается что русские символы ломают парсер, после них парсер перестает парсить параметры)))))
Но корень проблемы не решен!
Ищу в коде мод икса место отвечающее за парсинг параметров чанка)))) посмотрим что там
Нашел код:
MODX Revolution 2.2.7-pl (traditional)
../core/model/modx/modparser.class.php
со строки 280
MODX Revolution 2.2.7-pl (traditional)
../core/model/modx/modparser.class.php
со строки 280
/**
* Parses an element/tag property string and returns an array of properties.
*
* @param string $string The property string to parse.
* @param boolean $valuesOnly Indicates only the property value should be
* returned.
* @return array The processed properties in array format
*/
public function parsePropertyString($string, $valuesOnly = false) {
$properties = array();
$tagProps= xPDO :: escSplit("&", $string);
foreach ($tagProps as $prop) {
$property= xPDO :: escSplit('=', $prop);
if (count($property) == 2) {
$propName= $property[0];
if (substr($propName, 0, 4) == "amp;") {
$propName= substr($propName, 4);
}
$propValue= $property[1];
$propType= 'textfield';
$propDesc= '';
$propOptions= array();
$pvTmp= xPDO :: escSplit(';', $propValue);
if ($pvTmp && isset ($pvTmp[1])) {
$propDesc= $pvTmp[0];
if (($pvTmp[1]=='list' || $pvTmp[1]=='combo') && isset($pvTmp[3]) && $pvTmp[3]) {
if (!$valuesOnly) {
$propType = modParser::_XType($pvTmp[1]);
$options = explode(',', $pvTmp[2]);
if ($options) {
foreach ($options as $option) $propOptions[] = array('name' => ucfirst($option), 'value' => $option);
}
}
$propValue = $pvTmp[3];
}
elseif ($pvTmp[1]!='list' && $pvTmp[1]!='combo' && isset($pvTmp[2]) && $pvTmp[2]) {
if (!$valuesOnly) {
$propType = modParser::_XType($pvTmp[1]);
}
$propValue = $pvTmp[2];
} else {
$propValue = $pvTmp[0];
}
}
if ($propValue[0] == '`' && $propValue[strlen($propValue) - 1] == '`') {
$propValue= substr($propValue, 1, strlen($propValue) - 2);
}
$propValue= str_replace("``", "`", $propValue);
if ($valuesOnly) {
$properties[$propName]= $propValue;
} else {
$properties[$propName]= array(
'name' => $propName,
'desc' => $propDesc,
'type' => $propType,
'options' => $propOptions,
'value' => $propValue
);
}
}
}
return $properties;
}
Вроде оно)))
Ну в коде как то все правильно(((
static escSplit (line 2109)
Splits a string on a specified character, ignoring escaped content.
Constants
return: An array of results from the split operation, or an empty array.
access: public
static array escSplit (string $char, string $str, [string $escToken = '`'], [integer $limit = 0])
string $char: A character to split the tag content on.
string $str: The string to operate on.
string $escToken: A character used to surround escaped content; all content within a pair of these tokens will be ignored by the split operation.
integer $limit: Limit the number of results. Default is 0 which is no limit. Note that setting the limit to 1 will only return the content up to the first instance of the split character and will discard the remainder of the string.
Распил строки по "&" на param=value, после уже param и value пилятся по знаку "=", $escToken по дэфолту ` (не ', а именно такой ` ). Можно поиграть с параметрами (я именно про токены в $escToken — да да, плохой тон править сорцы, но главное причину найти).
То есть передать «другие токены» и использовать «переданные другие токены», вобщем пошел я спать)
MODX Revolution 2.2.8-pl (advanced), скопировал Ваш чанк, параметры, все, ничего не пойму — все робает)
Надо было сначала потестить, а я ж полез, Скиминочить, йопт)
Надо было сначала потестить, а я ж полез, Скиминочить, йопт)
ну у меня 2.2.7 traditional
Я не понял? работает али нет?
Я тут почитал в php5 (в php6 исправлено, но увы он еще не в релизе)))) строковые функции strlen, substr и т.д. не правильно работают с utf8 — надо использовать mb_substr, mb_strlen и т.д. с указанием кодировки в параметрах функций.
Сейчас некогда вечерком буду код править, заменять эти функции в методах классов в той же escSplit
Да и к стати тоже самое при передаче параметров сниппетам… вообщем езде где можно параметры передать такая байда)))))
Я не понял? работает али нет?
Я тут почитал в php5 (в php6 исправлено, но увы он еще не в релизе)))) строковые функции strlen, substr и т.д. не правильно работают с utf8 — надо использовать mb_substr, mb_strlen и т.д. с указанием кодировки в параметрах функций.
Сейчас некогда вечерком буду код править, заменять эти функции в методах классов в той же escSplit
Да и к стати тоже самое при передаче параметров сниппетам… вообщем езде где можно параметры передать такая байда)))))
Опа!
Интересненко!
Поставил Denwer и все заработало!
Просто я до этого на Ubunte 9.04 делал это…
Надо копать в сторону Ubuntu
Интересненко!
Поставил Denwer и все заработало!
Просто я до этого на Ubunte 9.04 делал это…
Надо копать в сторону Ubuntu
приветствую, такая же проблема на хостинге NIC.RU, в чем все таки причина?????
Приятно читать приятные разговоры приятного человека о приятных вещах приятным языком излагаемые ;0)))
Такая же хрень на хостинге NIC.RU, в чем все таки причина?? Запарился весь с этой непоняткой, в параметрах сниппетов руский текст не парсит, все ломается и с куском сниппета в HTML кидает
Роман к сожалению я так и не разобрался с этим…
Вроде и код модикса правил… использовал mb_substr, mb_strlen (см. выше) — может проблема в unix (у меня ubuntu 9.04), возможно там что-то править нужно, настройки какие… в итоге отказался от передачи параметров на русском)))))
Хотя надо бы добить эту проблему))))) может на днях еще поковыряюсь)))) — раз не один я с такой проблемой)))
у вас какая версия nix`ов?
Вроде и код модикса правил… использовал mb_substr, mb_strlen (см. выше) — может проблема в unix (у меня ubuntu 9.04), возможно там что-то править нужно, настройки какие… в итоге отказался от передачи параметров на русском)))))
Хотя надо бы добить эту проблему))))) может на днях еще поковыряюсь)))) — раз не один я с такой проблемой)))
у вас какая версия nix`ов?
Читая ваши комменты, да, вы правы и где то рядом, засада в версии PHP, я на хостинге через панель переключил с PHP5.3 на предпоследнюю PHP5.2, и проблема ушла :), так что что то не то с последней версией PHP, или ХЗ :)
Что такое nix`ов?
Что такое nix`ов?
nix`ов — ну unix какой на хостинге… ubuntu, debian, mint и т.д.
Ну вот вы нашли решение проблемы)))) PHP глючит)))
Всетаки мысль правильно у меня шла )))))
Ну вот вы нашли решение проблемы)))) PHP глючит)))
Всетаки мысль правильно у меня шла )))))
Я тут почитал в php5 (в php6 исправлено, но увы он еще не в релизе)))) строковые функции strlen, substr и т.д. не правильно работают с utf8 — надо использовать mb_substr, mb_strlen и т.д. с указанием кодировки в параметрах функций.Будем знать теперь!
тоесть переопределять в php ini эти функции?
Нет…
В коде модикса используются substr, strlen и другие строковые функции без приставки mb_
Они неправильно работают с UTF8 — и это известный факт, есть даже багрепорты об этом на сайте php
Вроде как те же функции с приставкой mb_ решают проблемы, но возможно я не весь код перелопатил… не все заменил…
На до же найти тот участок который за парсинг сниппетов отвечает…
На этой неделе поковыряю еще
Но это не очень хороший выход — даже если получится… любое обновление модикс — и править опять придется код модикса ручками))))))
В коде модикса используются substr, strlen и другие строковые функции без приставки mb_
Они неправильно работают с UTF8 — и это известный факт, есть даже багрепорты об этом на сайте php
Вроде как те же функции с приставкой mb_ решают проблемы, но возможно я не весь код перелопатил… не все заменил…
На до же найти тот участок который за парсинг сниппетов отвечает…
На этой неделе поковыряю еще
Но это не очень хороший выход — даже если получится… любое обновление модикс — и править опять придется код модикса ручками))))))
Хотя сейчас посмотрел… в денвере у меня тоже 5.3 и все работает…
кстати, у многих сниппетов такая лажа, у меня например в Formit в &emailSubject=`тема письма`, и со всеми другими параметрами с русским текстом в этом сниппете, еще в Breadcrumbs таже лажа &homeCrumbTitle=`Главная` НО бредкрумбс я заменил на pdoCrumbs c этого сайта СПАСИБО Василию, и в нем все ок с кирилицей, вот и думай тут, что глючит :) MODX Revolution 2.2.9-pl (traditional) или PHP5.3, непонятно.
А вот это интересно! Надо будет глянуть код pdoCrumbs — он значит сам парсит параметры… посмотрю как…
По поводу Formit и Breadcrumbs для них параметры парсит ядро модикса — соответственно там тоже лажа получается
И вообще любому сниппету параметры на русском = лажа, а pdoCrumbs видимо сам парсит параметры без помощи ядра модикса)))))
По поводу Formit и Breadcrumbs для них параметры парсит ядро модикса — соответственно там тоже лажа получается
И вообще любому сниппету параметры на русском = лажа, а pdoCrumbs видимо сам парсит параметры без помощи ядра модикса)))))
Да, не спешу радоваться :) но все же, пришлось вернуться в хостинг панели к PHP версии 5.3, из за соседнего сайта рядом лежащего, тот лег из того что я понизил версию php, сайт на Bitrix, разбираться не стал, вернул PHP 5.3, но решил покопаться с настройками, как вы предполагали что из за mb_substr, mb_strlen и тд, возможно вылетает косяк с кириллицей в параметрах сниппета, так вот, в настройках хостинга я выключил функцию mbstring, сохранил настройки, посмотрел сайт, все легло, я включил опять эту mbstring, сохранил, перезапустил сервер и все заработало, и глюк с кавычками и кириллице тьфу тьфу тьфу исчез :))) уже 3 форму сделал, пока тихо, надеюсь так и будет. Так что копать может в сторону mbstring?
Не получилось решить это? Такая же байда и у меня… Нельзя же сообщение об успешной отправке формы писать на английском..))
Сейчас нашел способ написать один параметр на кириллице
Сейчас нашел способ написать один параметр на кириллице
[[
...
&emailSubject=текст на кириллице
]]
если этот параметр ставить самым последним и без кавычек то нормально получается)
&emailSubject=`%language_string_key` где %language_string_key — запись словаря с нужным сообщением
Интересно вы живёте. Ради интереса попробовал. Взял пример как указано в топике
Чанк Test
П.С. Правда версия MODX 2.3.5.
Чанк Test
<article class="grid_[[+grid]]">
<h3>[[+title]]</h3>
<form id="form2" class="jqtransform" method="get">
<a class="button2">[[+button]]</a>
<div class="clear"></div>
</form>
</article>
Вызываю [[$test? &title=`ПОИСК что то еще на русском` &grid=`Класс` &button=`Искать`]]
Получаю<article class="grid_Класс">
<h3>ПОИСК что то еще на русском</h3>
<form id="form2" class="jqtransform" method="get">
<a class="button2">Искать</a>
<div class="clear"></div>
</form>
</article>
У меня только один вопрос — как вам это удается? :) П.С. Правда версия MODX 2.3.5.
в настройках сервера должно быть что-то вроде mb_func_overload=0. Смотрите в php.ini
если там не ноль, кириллица в сниппетах валится
если там не ноль, кириллица в сниппетах валится
У меня в php.ini вообще такой настройки нет.
так создайте. только синтаксис точный погуглите, и там с ней в паре вроде еще одна строка должна быть
У меня только один вопрос к вам, невнимательный читатель, мне то это зачем?
а, пардон, проморгал спросонья, что Вы здесь исключительно похвалиться, что всё хорошо )
Отвечу любезностью на любезность… Судя по комментариям Вы вообще не просыпаетесь. :)
П.С. Имею ввиду комментарии мне здесь. ;)
П.С. Имею ввиду комментарии мне здесь. ;)
я вчера хотел ответить парню, который перед Вами, и промахнулся веткой)
По моему скромному мнению, там где mb_func_overload != 0, работает говнокод.
Так что, Сергей не хвалится, а рассказывает, как должно быть. А вот у вас печалька, да.
Так что, Сергей не хвалится, а рассказывает, как должно быть. А вот у вас печалька, да.
у меня все норм. Просто некто добрый настраивал площадку под битрикс и после него все посыпалось. Полезли разбираться, обнаружили, что битрикс требует overload=2, а modx из-за этого не работает
битрикс требует overload=2Вот за такие вещи его так все и любят!
Такая же ситуация 1-в-1. Благодарю за решение.
2 дня потратил на поиск корня проблемы.
А кому-то просто поехидничать охота :)
2 дня потратил на поиск корня проблемы.
А кому-то просто поехидничать охота :)
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.