Modx Revo передача параметров чанку на кириллице

Приветствую!
Такой вопрос (может кто сталкивался)

Передаю значения чанку на кириллице (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: ПОИСК и т.д.)

Знающие люди подскажите, в код модикса лезть не хочется.
Куда копать?
Александр Либерг
14 июня 2013, 12:47
modx.pro
1
9 368
0

Комментарии: 35

Алексей
16 июня 2013, 12:15
0
А оно надо обязательно — кастомизировать надпись на кнопке? Если нет, поправить прямо в чанке [[+button]] на «Искать», и можно спокойно искать причину такого поведения передачи параметров в чанк. Самому интересно.
    Александр Либерг
    16 июня 2013, 12:53
    0
    Да в принципе могу чанков разных наделать :-)
    И кнопку кастомизироваеть не обязательно (скорее всего везде «искать» будет), а вот заголовок надо разный! Но тут еще одна проблема: если параметр на русском то в HTML вставляется с апострофами ` — или как этот символ называется :-) (это те кавычки в которых параметр пишется).

    Но на английском все четко срабатывает)
    А код трогать не охота — потом если обновить версию модикса, то надо опять лезть в код, а самое главное запомнить где правил))))
      Александр Либерг
      16 июня 2013, 14:16
      0
      Как вариант:
      [[$chankName?
      		  	&grid=`4`
      		  	&title=ПОИСК что то там
      		  ]]
      Т.е. title — без апострафов, да у меня там еще grid передается — его ставить первым (выше параметра на русском) иначе он тоже в title лезет.

      Получается что русские символы ломают парсер, после них парсер перестает парсить параметры)))))
      Но корень проблемы не решен!

      Ищу в коде мод икса место отвечающее за парсинг параметров чанка)))) посмотрим что там
        Александр Либерг
        16 июня 2013, 14:32
        0
        Нашел код:

        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;
            }
        Вроде оно)))
          Александр Либерг
          16 июня 2013, 14:46
          0
          Ну в коде как то все правильно(((
          Алексей
          17 июня 2013, 08:34
          0
          Сперто взято с http://xpdo.org/api/xpdo/xPDO.html#escSplit

          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 — да да, плохой тон править сорцы, но главное причину найти).

          То есть передать «другие токены» и использовать «переданные другие токены», вобщем пошел я спать)
            Алексей
            17 июня 2013, 12:52
            0
            MODX Revolution 2.2.8-pl (advanced), скопировал Ваш чанк, параметры, все, ничего не пойму — все робает)

            Надо было сначала потестить, а я ж полез, Скиминочить, йопт)
              Александр Либерг
              17 июня 2013, 13:08
              0
              ну у меня 2.2.7 traditional

              Я не понял? работает али нет?
              Я тут почитал в php5 (в php6 исправлено, но увы он еще не в релизе)))) строковые функции strlen, substr и т.д. не правильно работают с utf8 — надо использовать mb_substr, mb_strlen и т.д. с указанием кодировки в параметрах функций.

              Сейчас некогда вечерком буду код править, заменять эти функции в методах классов в той же escSplit

              Да и к стати тоже самое при передаче параметров сниппетам… вообщем езде где можно параметры передать такая байда)))))
              Александр Либерг
              17 июня 2013, 15:25
              0
              Опа!

              Интересненко!

              Поставил Denwer и все заработало!

              Просто я до этого на Ubunte 9.04 делал это…
              Надо копать в сторону Ubuntu
                Роман
                09 октября 2013, 01:08
                0
                приветствую, такая же проблема на хостинге NIC.RU, в чем все таки причина?????
                СикретНаме
                24 июня 2013, 00:26
                0
                Приятно читать приятные разговоры приятного человека о приятных вещах приятным языком излагаемые ;0)))
                  Роман
                  09 октября 2013, 01:09
                  0
                  Такая же хрень на хостинге NIC.RU, в чем все таки причина?? Запарился весь с этой непоняткой, в параметрах сниппетов руский текст не парсит, все ломается и с куском сниппета в HTML кидает
                    Александр Либерг
                    09 октября 2013, 01:26
                    0
                    Роман к сожалению я так и не разобрался с этим…

                    Вроде и код модикса правил… использовал mb_substr, mb_strlen (см. выше) — может проблема в unix (у меня ubuntu 9.04), возможно там что-то править нужно, настройки какие… в итоге отказался от передачи параметров на русском)))))

                    Хотя надо бы добить эту проблему))))) может на днях еще поковыряюсь)))) — раз не один я с такой проблемой)))

                    у вас какая версия nix`ов?
                      Роман
                      09 октября 2013, 01:43
                      0
                      Читая ваши комменты, да, вы правы и где то рядом, засада в версии PHP, я на хостинге через панель переключил с PHP5.3 на предпоследнюю PHP5.2, и проблема ушла :), так что что то не то с последней версией PHP, или ХЗ :)

                      Что такое nix`ов?
                        Александр Либерг
                        09 октября 2013, 01:49
                        0
                        nix`ов — ну unix какой на хостинге… ubuntu, debian, mint и т.д.

                        Ну вот вы нашли решение проблемы)))) PHP глючит)))

                        Всетаки мысль правильно у меня шла )))))
                        Я тут почитал в php5 (в php6 исправлено, но увы он еще не в релизе)))) строковые функции strlen, substr и т.д. не правильно работают с utf8 — надо использовать mb_substr, mb_strlen и т.д. с указанием кодировки в параметрах функций.
                        Будем знать теперь!
                          Роман
                          09 октября 2013, 01:53
                          0
                          тоесть переопределять в php ini эти функции?
                            Александр Либерг
                            09 октября 2013, 01:59
                            0
                            Нет…
                            В коде модикса используются substr, strlen и другие строковые функции без приставки mb_
                            Они неправильно работают с UTF8 — и это известный факт, есть даже багрепорты об этом на сайте php

                            Вроде как те же функции с приставкой mb_ решают проблемы, но возможно я не весь код перелопатил… не все заменил…
                            На до же найти тот участок который за парсинг сниппетов отвечает…
                            На этой неделе поковыряю еще

                            Но это не очень хороший выход — даже если получится… любое обновление модикс — и править опять придется код модикса ручками))))))

                          Александр Либерг
                          09 октября 2013, 01:53
                          0
                          Хотя сейчас посмотрел… в денвере у меня тоже 5.3 и все работает…
                            Роман
                            09 октября 2013, 01:57
                            0
                            кстати, у многих сниппетов такая лажа, у меня например в Formit в &emailSubject=`тема письма`, и со всеми другими параметрами с русским текстом в этом сниппете, еще в Breadcrumbs таже лажа &homeCrumbTitle=`Главная` НО бредкрумбс я заменил на pdoCrumbs c этого сайта СПАСИБО Василию, и в нем все ок с кирилицей, вот и думай тут, что глючит :) MODX Revolution 2.2.9-pl (traditional) или PHP5.3, непонятно.
                              Александр Либерг
                              09 октября 2013, 02:04
                              0
                              А вот это интересно! Надо будет глянуть код pdoCrumbs — он значит сам парсит параметры… посмотрю как…

                              По поводу Formit и Breadcrumbs для них параметры парсит ядро модикса — соответственно там тоже лажа получается
                              И вообще любому сниппету параметры на русском = лажа, а pdoCrumbs видимо сам парсит параметры без помощи ядра модикса)))))
                                Роман
                                09 октября 2013, 03:48
                                0
                                Да, не спешу радоваться :) но все же, пришлось вернуться в хостинг панели к PHP версии 5.3, из за соседнего сайта рядом лежащего, тот лег из того что я понизил версию php, сайт на Bitrix, разбираться не стал, вернул PHP 5.3, но решил покопаться с настройками, как вы предполагали что из за mb_substr, mb_strlen и тд, возможно вылетает косяк с кириллицей в параметрах сниппета, так вот, в настройках хостинга я выключил функцию mbstring, сохранил настройки, посмотрел сайт, все легло, я включил опять эту mbstring, сохранил, перезапустил сервер и все заработало, и глюк с кавычками и кириллице тьфу тьфу тьфу исчез :))) уже 3 форму сделал, пока тихо, надеюсь так и будет. Так что копать может в сторону mbstring?
                      Антон Матвеев
                      22 июля 2015, 10:53
                      0
                      Не получилось решить это? Такая же байда и у меня… Нельзя же сообщение об успешной отправке формы писать на английском..))
                      Сейчас нашел способ написать один параметр на кириллице
                      [[
                         ...
                         &emailSubject=текст на кириллице 
                      ]]
                      если этот параметр ставить самым последним и без кавычек то нормально получается)
                        Владимир
                        22 июля 2015, 11:45
                        0
                        &emailSubject=`%language_string_key` где %language_string_key — запись словаря с нужным сообщением
                          Сергей Шлоков
                          22 июля 2015, 13:20
                          +2
                          Интересно вы живёте. Ради интереса попробовал. Взял пример как указано в топике
                          Чанк 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.
                            mngatoff
                            22 июля 2015, 23:36
                            1
                            0
                            в настройках сервера должно быть что-то вроде mb_func_overload=0. Смотрите в php.ini
                            если там не ноль, кириллица в сниппетах валится
                              Сергей Шлоков
                              23 июля 2015, 07:18
                              0
                              У меня в php.ini вообще такой настройки нет.
                                mngatoff
                                23 июля 2015, 09:35
                                -1
                                так создайте. только синтаксис точный погуглите, и там с ней в паре вроде еще одна строка должна быть
                                  Сергей Шлоков
                                  23 июля 2015, 09:44
                                  +1
                                  У меня только один вопрос к вам, невнимательный читатель, мне то это зачем?
                                    mngatoff
                                    23 июля 2015, 10:12
                                    -1
                                    а, пардон, проморгал спросонья, что Вы здесь исключительно похвалиться, что всё хорошо )
                                      Сергей Шлоков
                                      23 июля 2015, 10:25
                                      0
                                      Отвечу любезностью на любезность… Судя по комментариям Вы вообще не просыпаетесь. :)
                                      П.С. Имею ввиду комментарии мне здесь. ;)
                                        mngatoff
                                        23 июля 2015, 10:46
                                        0
                                        я вчера хотел ответить парню, который перед Вами, и промахнулся веткой)
                                        Василий Наумкин
                                        23 июля 2015, 10:45
                                        +1
                                        По моему скромному мнению, там где mb_func_overload != 0, работает говнокод.

                                        Так что, Сергей не хвалится, а рассказывает, как должно быть. А вот у вас печалька, да.
                                          mngatoff
                                          23 июля 2015, 10:48
                                          0
                                          у меня все норм. Просто некто добрый настраивал площадку под битрикс и после него все посыпалось. Полезли разбираться, обнаружили, что битрикс требует overload=2, а modx из-за этого не работает
                                            Василий Наумкин
                                            23 июля 2015, 10:50
                                            0
                                            битрикс требует overload=2
                                            Вот за такие вещи его так все и любят!
                                              Сергей С.
                                              27 июля 2017, 16:46
                                              +1
                                              Такая же ситуация 1-в-1. Благодарю за решение.
                                              2 дня потратил на поиск корня проблемы.
                                              А кому-то просто поехидничать охота :)
                              Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                              35