Русский язык и webform

Прислано: Dan

пт, 10/11/2006 - 06:49

Ваял формы с помощью модуля webform и обнаружил глюк - некоректную работу с полями содержащими только русские буквы. Если быть точным, то с полями, не содержащими цифр и букв латинского алфавита.

Воспроизведение глюка:
- создаём новый компонент select
- В опциях пишем: Проба раз, Проба два, Проба три, Проба четыре, Проба пять (в несколько строк)
- остальные опции неважны
Результат:
- доступен только пункт "Проба пять"

Если в опциях написать:
1 Проба раз
2 Проба два
3 Проба три...
...то всё работает

Всё дело в функции _webform_safe_name:

<?php
function _webform_safe_name($name) {
  
$new drupal_strtolower(trim($name));
  
$new str_replace(' ''_'$new);
  
$new preg_replace('/[^a-z0-9_]/'''$new);
  
// If the string contains NO safe characters, base64 encode the answer
  
if ($new == '') {
    
$new base64_encode($name);
  }
  return 
$new;
}
?>

Видно, что в нашем случае все пункты заменяются на '_' и становятся одинаковыми. Недолго думая, сократил функцию до:

<?php
function _webform_safe_name($name) {
  return 
base64_encode($name);
}
?>

Всё заработало. Но такое решение не понравится англоязычным пользователям (баловни они). Для овец и волков такой вариант:

<?php
function _webform_safe_name($name) {
  
$new drupal_strtolower(trim($name));
  
$new str_replace(' ''_'$new);
  
$new preg_replace('/[^a-z0-9_]/'''$new);
  return 
$new.'_'.base64_encode($name);
}
?>

Баг-репорт на drupal.org отправил.

Комментарии


Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Применить"
Опубликовано beholder в чт, 16/11/2006 - 13:07.

Как раз сегодня сам с этим столкнулся. Попробовал приведенный способ — на почту не приходят варианты ответа.

Если вообще стереть линии со str_replace и preg_replace, то тогда и на почту нормальные варианты приходят. Правда не разбирался — может это открывает дырку?

--
beauty is in the eyes of the beholder


Опубликовано Dan в чт, 16/11/2006 - 13:18.

А вот этот вариант работает (php не пишу, ибо фильтр не работает:

function _webform_safe_name($name) {
return base64_encode($name);
}


Опубликовано beholder в чт, 16/11/2006 - 13:29.

Не-а, не работает. На почту все равно пустое значение приходит вместо вписанного. Она ведь его конвертирует безбожно…

--
beauty is in the eyes of the beholder


Опубликовано Dan в чт, 16/11/2006 - 13:56.

Домой приду - поковыряюсь.


Опубликовано beholder в чт, 16/11/2006 - 14:08.

Мне кажется, что единственный способ — включить в регулярное выражение русские буквы, но из-за различия систем наверное лучше указать в нем запрещенные символы вместо разрешенных. Что-нибудь вроде: '/["\'\/\\#]/'… А вообще я спецом в регулярных выражениях никогда не был =)


Опубликовано Dan в пт, 17/11/2006 - 11:10.

Подтверждаю. Баг с отправкой мыла имеется. Решения пока не вижу. Будем думать.


Опубликовано tati в вт, 21/11/2006 - 11:14.

Регулярное выражение можно просто убрать, а именно строчку
$new = preg_replace('/[^a-z0-9_]/', '', $new);
и все замечательно работает.
INPUTам присваиваются нормальные VALUE и тогда на почту приходят нормальные письма с нормальными значениями. Для проверки можно заполнить форму без отправки на e-mail и просмотреть код страницы, устанавливается ли VALUE у инпутов. Если да, то все GREAT, ну а если нет, то нужно еще порыться в модуле, заодно можно письмо, которое отправляется на имейл, привести в удобочитаемый вид, а то там много лишней информации.


Опубликовано Dan в вт, 21/11/2006 - 16:08.

Да, работает!
Спасибо!
А это нормально, что идентификатор блока имеет название по русски?
<div class="webform-component-textfield" id="webform-component-телефон">


Опубликовано Valeratal в вт, 21/08/2007 - 18:05.

люди, этот патч актуален для 5-й версии?

Глюк с селектами (по количеству выборов остался)
вроде подстановка впереди цифр помогает


Опубликовано 4matic в пт, 30/11/2007 - 00:17.

А если так?
function _webform_safe_name($name) {
$new = drupal_strtolower(trim($name));
$new = str_replace(' ', '_', $new);
$new = preg_replace('/[^a-z0-9_]/', '', $new);
// If the string contains NO safe characters, base64 encode the answer
if ($new == '' || (substr_count($new, '_')==strlen($new) && $new!=$name)) {
$new = base64_encode($name);
}
return $new;
}


Опубликовано Valeratal в пт, 30/11/2007 - 09:44.

я сейчас подставляю цифры перед строками
так даже удобнее, для дальнешей обработки


Ссылки партнёров