Ваял формы с помощью модуля 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 отправил.
Комментарии
Как раз сегодня сам с этим столкнулся. Попробовал приведенный способ — на почту не приходят варианты ответа.
Если вообще стереть линии со str_replace и preg_replace, то тогда и на почту нормальные варианты приходят. Правда не разбирался — может это открывает дырку?
--
beauty is in the eyes of the beholder
А вот этот вариант работает (php не пишу, ибо фильтр не работает:
function _webform_safe_name($name) {
return base64_encode($name);
}
Не-а, не работает. На почту все равно пустое значение приходит вместо вписанного. Она ведь его конвертирует безбожно…
--
beauty is in the eyes of the beholder
Домой приду - поковыряюсь.
Мне кажется, что единственный способ — включить в регулярное выражение русские буквы, но из-за различия систем наверное лучше указать в нем запрещенные символы вместо разрешенных. Что-нибудь вроде: '/["\'\/\\#]/'… А вообще я спецом в регулярных выражениях никогда не был
Подтверждаю. Баг с отправкой мыла имеется. Решения пока не вижу. Будем думать.
Регулярное выражение можно просто убрать, а именно строчку
$new = preg_replace('/[^a-z0-9_]/', '', $new);
и все замечательно работает.
INPUTам присваиваются нормальные VALUE и тогда на почту приходят нормальные письма с нормальными значениями. Для проверки можно заполнить форму без отправки на e-mail и просмотреть код страницы, устанавливается ли VALUE у инпутов. Если да, то все GREAT, ну а если нет, то нужно еще порыться в модуле, заодно можно письмо, которое отправляется на имейл, привести в удобочитаемый вид, а то там много лишней информации.
Да, работает!
Спасибо!
А это нормально, что идентификатор блока имеет название по русски?
<div class="webform-component-textfield" id="webform-component-телефон">
люди, этот патч актуален для 5-й версии?
Глюк с селектами (по количеству выборов остался)
вроде подстановка впереди цифр помогает
А если так?
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;
}
я сейчас подставляю цифры перед строками
так даже удобнее, для дальнешей обработки