Здравствуйте! Мне повезло делать сайт для многих пользователей, то есть корпоративные блоги.
Иногда некоторые пользователи пишут название города "пробел Город", что делает их первыми в сортировке по городу на странице Вьюс пользователей с опцией сортировки по полю таблицы.
Мне нужно обойти это любым способом:
1. программно стирать из поля город все предваряющие символы не буквенные (но не обязательно во всем поле, так как можно через запятую перечислять)
2. во вьюс сделать так чтобы по буквам сортировало, даже если впереди спецсимвол - или еще проще - все спецсимволы считать ниже букв по сортировке.
Подскажите, как действовать, какой из вариантов можно реализовать и как?
Комментарии
Можно удалять регулярными выражениями (RegExp) при добавлении JS-ом (на странице создания), или после сохранения Rules'ами, или своим модулем, с помощью PHP.
мне подойдет Rules'ами. подскажите как?
Создаете правило реагирующее на сущность, в которой необходимо удалить символы.
Добавляете переменную типа Текст, в неё помещаете строку которую нужно обрабатывать.
Добавляете еще одну переменную типа Текст, и там вставляете следующее содержимое:
<?php
$str = $trimmed_field;
while(!preg_match('/^[А-ЯЁA-Z]/iu', $str)){
$str = preg_replace('/^[^А-ЯЁA-Z]/', '', $str);
};
echo $str;
?>
// $trimmed_field - Обрезаемая переменная (список доступных переменных в филдсете "PHP Evaluation", нужна созданная в первом шаге);
// /^[А-ЯЁA-Z]/iu - Выражение соответствующее всем символам русского и английского алфавитов (если нужно - модифицируете);
Устанавливаете значение из переменной с кодом в нужное поле.
Как то так...
Спасибо! И хотя это первый раз работа с рулесами а вы не все пояснили - получилось с 1го раза и работает идеально.
Также отмечу:
Event: Before saving a user account
Condition: Entity has field: Entity: [account], Поле: field_gorod
Elements:
Add a variable: [account:field-gorod]
Add a variable: Provides variables: Gorod bez spec simvolov (gorod_normal)
<?php
$str = $field_gorod;
while(!preg_match('/^[А-ЯЁA-Z0-9]/iu', $str)){
$str = preg_replace('/^[^А-ЯЁа-яёA-Za-z0-9]/', '', $str);
};
echo $str;
?>
Set a data value:
Parameter: Данные: [account:field-gorod], Значение: [gorod-normal:value]
Все работает.
Один небольшой нюанс: если удалить из регулярного выражения Ё, то изменение аккаунта не происходит: например если написать город Ёлки и сохранить - сайт тормозит, ничего не делает и отключается. А если добавить Ё в регулярное выражение, то все работает быстро без сбоев. Город Ёлки принимается и город "пробел Ёлки" тоже принимается и исправляется на Ёлки.
То есть с рулсами регулярные выражения работают необычно. Буква Ё вне области А-Я
зачем морочиться с регулярками, если есть это? А чтобы не плодить грязь в базе, разумно вставить это в hook_node_presave()
спасибо, gun_dose!
подскажите, люди, вариант с модулем?
как правильно для D7 написать функцию : какой заголовок, как правильно обратиться к полю field_gorod ?
сейчас это видится так, хотя я не смог найти подробного мануала и не знаю как изменять поля класса и даже как обратиться к полю класса.
<?php
function hook_user_presave(&$edit, $account, $category) {
$user->field_gorod = trim ($user->field_gorod);
return $user;
}
?>
как правильно это делать?
Обращение к полю скорее всего $user->field_gorod['und'][0]['value'] (правда вместо 'value' может быть будет что-то другое). А вместо "hook" должно стоять имя вашего модуля. Естественно, что нужно тестить на локалке.
на переменную $user он говорит что undefined, изменил на $account как указано в заголовке функции - ошибок нет, но не работает. Может надо не присваивать значение а как-то делать сохранение?
Код модуля НЕ РАБОТАЕТ:
<?php
/*Delete special symbols (spaces,dots,commas,tab etc) on field Gorod*/
function user_fields_check_user_presave(&$edit, $account, $category) {
$account->field_gorod['und'][0]['value'] = trim ($account->field_gorod['und'][0]['value']);
return $account;
}
?>
тестирую на локалке. если хотите помочь - код вот.
Благодаря комментарию: https://api.drupal.org/comment/51013#comment-51013
Переделал переменные правильно и теперь все работает.
Итак, я предлагаю
User Fields Check
Рабочий модуль удаления лишних пробельных символов в начале и в конце строки php-функцией trim() из поля field_gorod при редактировании профиля пользователя, а также при создании пользователя. протестировано: удаляет пробелы нв ачале и в конце строки.
Листинг файла user_fields_check.module
<?php
/*Delete special symbols (spaces,dots,commas,tab etc) on field Gorod*/
function user_fields_check_user_presave(&$edit, $account, $category) {
$edit['field_gorod']['und'][0]['value'] = trim ($edit['field_gorod']['und'][0]['value']);
}
?>
Архив в приложении Рабочий
А как же остальные символы?
string trim ( string $str [, string $character_mask = " \t\n\r\0\x0B" ] )
Эта функция возвращает строку str с удаленными из начала и конца строки пробелами. Если второй параметр не передан, trim() удаляет следующие символы:
" " (ASCII 32 (0x20)), обычный пробел.
"\t" (ASCII 9 (0x09)), символ табуляции.
"\n" (ASCII 10 (0x0A)), символ перевода строки.
"\r" (ASCII 13 (0x0D)), символ возврата каретки.
"\0" (ASCII 0 (0x00)), NUL-байт.
"\x0B" (ASCII 11 (0x0B)), вертикальная табуляция.
--------
остальные символы нужно переделать строку так (ПРОТЕСТИРОВАНО - РАБОТАЕТ):
$edit['field_gorod']['und'][0]['value'] = trim ($edit['field_gorod']['und'][0]['value'], " \t\n\r\0\x0B.,;:_\-\"'()");
кстати, мой первый модуль D7 был тоже в пару строк и он переадресовал после регистрации вместо главной на целевую страницу приветствия: http://www.drupal.ru/node/58573#comment-631716
Ок. А такой вариант ". -01 Городо-град 25" пройдет?
пройдет без точки и дефиса, и это останется на совести пользователя.
но города типа
88 Километр Выселок
должны быть
Гуд... Пригодится.
Мне больше подходит решение через Rules, задача заключается в том, чтобы удалить все символы (пробелы, дефисы, скобки и «+»), оставив только цифры. Пытаюсь применить код
<?php
$str = $field_name;
while(!preg_match('/^[0-9]/iu', $str)){
$str = preg_replace('/^[^0-9]/', '', $str);
};
echo $str;
?>
Но не работает Что я делаю не так?
Вернее, что-то работает. Но удаляется только «+», а пробелы, скобки и дефисы остаются. Как убрать и их?