Создал маленький модуль, но где-то ошибка.
При попытке активации ошибку выдаёт:
Parse error: syntax error, unexpected '}' in /sites/all/modules/reserved_usernames/reserved_usernames.module on line 18
Я не вижу ошибку в модуле, вроде всё правильно, все скобки на месте:
<?php
function reserved_usernames_form_user_register_form_alter(&$form, &$form_state, $form_id) {
$form['validate'][] = 'reserved_usernames';
}
function
reserved_usernames ($form, &$form_state) {
$reserved = array();
$reserved[] = 'reserved_name';
$reserved[] = 'reserved_name_1';
$reserved[] = 'reserved_name_2';
$reserved[] = 'reserved_name_3';
$reserved[] = 'reserved_name_4';
$reserved[] = 'reserved_name_5';
if (
in_array($form_state['values']['name'], $reserved)) {
form_set_error('name', t('The name %name cannot be taken.', array('%name' => $form_state['values']['name'])))
}
}
?>
Комментарии
PHP требует окончания инструкций точкой запятой в конце каждой инструкции http://php.net/manual/ru/language.basic-syntax.instruction-separation.php, а вызов функции (form_set_error) - это инструкция.
P.S. Если имена записаны в файле в строку через запятую (csv https://ru.wikipedia.org/wiki/CSV), то код можно написать так
<?php
function reserved_usernames_form_user_register_form_alter(&$form, &$form_state, $form_id) {
$form['validate'][] = 'reserved_usernames';
}
function reserved_usernames ($form, &$form_state) {
if (($handle = fopen('test.csv', 'r')) !== false && ($data = fgetcsv($handle)) !== false) {
if (in_array($form_state['values']['name'], $data)) {
form_set_error('name', t('The name %name cannot be taken.', array('%name' => $form_state['values']['name'])));
}
}
}
?>
Ой, вы переделали конструкцию.
Спасибо!
Так конечно лучше, но не понимаю как добавить test.csv файл с именами, куда его поместить, как импортировать.
Всё равно ошибка после активации модуля:
Fatal error: Unsupported operand types in /includes/form.inc on line 1815
Потому что должно быть $form['#validate'] а не $form['validate']
<?php /**
* Implements hook_form_FORM_ID_alter()
*/
function reserved_usernames_form_user_register_form_alter(&$form, &$form_state, $form_id) {
$form['#validate'][] = 'reserved_usernames';
}
function
reserved_usernames ($form, &$form_state) {if (($handle = fopen(__DIR__ . '/reserved-usernames.csv', 'r')) !== false && ($data = fgetcsv($handle)) !== false) {
if (in_array($form_state['values']['name'], $data)) {
form_set_error('name', t('The name %name cannot be taken.', array('%name' => $form_state['values']['name'])));
}
}
}
?>
и файл reserved-usernames.csv в директорию с модулем где в строку через запятую перечисляются запрещенные имена
negociant, огромное спасибо!
Всё получилось, всё работает.
Пара замечаний:
1. Для чайников как я: список с именами писать именно через запятую и БЕЗ пробелов. Если будут пробелы - user1, user2, user3 - то работать не будет. Я сам намучался пока до меня не дошло. Нужно так - user1,user2,user3
2. У меня стоит модуль Clientside Validation и при регистрации зарезервированного имени Ajax говорит, что данное имя свободно для регистрации. И только после нажатия кнопки 'Зарегистрироваться' выводится сообщение The name %name cannot be taken. Это конечно очень некрасиво и плохо - одновременно два сообщения противоречащие друг другу. Вот бы заставить это сообщение выводиться через модуль Clientside Validation.
Сам формат как бы подразумевает перечисление через запятую без пробелов, но можно если пробел попал, его предварительно очистить
а в плане других валидаций можно попробывать выполнять валидацию первой
<?php /**
* Implements hook_form_FORM_ID_alter()
*/
function reserved_usernames_form_user_register_form_alter(&$form, &$form_state, $form_id) {
// Добавить валидацию первой.
array_unshift($form['#validate'], 'reserved_usernames');
//$form['#validate'][] = 'reserved_usernames';
}
function
reserved_usernames ($form, &$form_state) {if (($handle = fopen(__DIR__ . '/reserved-usernames.csv', 'r')) !== false && ($data = fgetcsv($handle)) !== false) {
// Убрать пробелы возможные между именами.
$data = array_map('trim', $data);
if (in_array($form_state['values']['name'], $data)) {
form_set_error('name', t('The name %name cannot be taken.', array('%name' => $form_state['values']['name'])));
}
}
}
?>
Используйте trim http://php.net/manual/ru/function.trim.php и будет вам счастье.
Спасибо, но дело совсем не в этом. А в том, что я решил (думаю и другие так же могут решить), что должны быть пробелы.
Мне трим не нужен в данном случае.
в данной задаче желательно это предусмотреть что и было сделано.
и снова верно чтобы лишнее не запускать, если конечно стоит такой приоритет в логике.
К сожалению не помогло.
По прежнему сначала аяксом выводится уведомление, что имя свободно для регистрации, а после нажатия кнопки сообщается, что имя нельзя зарегистировать.
Кэш чистил конечно.
Clientside Validation любой пользователь может банально обойти выключив в браузере javascript
Это не важно в данном случае.
Ведь если отключить яву, то валидация всё равно будет, просто не аяксовая, а пиашпишная. Имею в виду применительно к уже зарегистрированным именам. И я думал также будет и применительно к зарезервированным именам. Если так не будет, то мне проще все эти имена зарегистрировать (импортировать csv файл) через модуль User Import Framework.