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

Главные вкладки

Аватар пользователя Dan Dan 10 ноября 2006 в 9: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 beholder 16 ноября 2006 в 16:07

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

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

--
beauty is in the eyes of the beholder

Аватар пользователя Dan Dan 16 ноября 2006 в 16:18

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

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

Аватар пользователя beholder beholder 16 ноября 2006 в 16:29

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

--
beauty is in the eyes of the beholder

Аватар пользователя beholder beholder 16 ноября 2006 в 17:08

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

Аватар пользователя tati tati 21 ноября 2006 в 14:14

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

Аватар пользователя Dan Dan 21 ноября 2006 в 19:08

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

Аватар пользователя Valeratal Valeratal 21 августа 2007 в 22:05

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

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

Аватар пользователя 4matic 4matic 30 ноября 2007 в 3: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;
}