Создал маленький модуль, но где-то ошибка

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

Аватар пользователя Сергей Березин Сергей Березин 11 октября 2016 в 0:12

Создал маленький модуль, но где-то ошибка.
При попытке активации ошибку выдаёт:

Parse error: syntax error, unexpected '}' in /sites/all/modules/reserved_usernames/reserved_usernames.mod‌​ule 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'])))
  }
}

?>

Лучший ответ

Аватар пользователя negociant negociant 11 октября 2016 в 18:23
1

Потому что должно быть $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 negociant 11 октября 2016 в 2:06

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'])));
    }
  }
}
?>
Аватар пользователя Сергей Березин Сергей Березин 11 октября 2016 в 11:40

Ой, вы переделали конструкцию.
Спасибо!
Так конечно лучше, но не понимаю как добавить test.csv файл с именами, куда его поместить, как импортировать.

Аватар пользователя negociant negociant 11 октября 2016 в 18:23
1

Потому что должно быть $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 в директорию с модулем где в строку через запятую перечисляются запрещенные имена

Аватар пользователя Сергей Березин Сергей Березин 11 октября 2016 в 19:56

negociant, огромное спасибо!
Всё получилось, всё работает.

Пара замечаний:

1. Для чайников как я: список с именами писать именно через запятую и БЕЗ пробелов. Если будут пробелы - user1, user2, user3 - то работать не будет. Я сам намучался пока до меня не дошло. Нужно так - user1,user2,user3

2. У меня стоит модуль Clientside Validation и при регистрации зарезервированного имени Ajax говорит, что данное имя свободно для регистрации. И только после нажатия кнопки 'Зарегистрироваться' выводится сообщение The name %name cannot be taken. Это конечно очень некрасиво и плохо - одновременно два сообщения противоречащие друг другу. Вот бы заставить это сообщение выводиться через модуль Clientside Validation.

Аватар пользователя negociant negociant 11 октября 2016 в 22:25
1

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


<?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'])));
    }
  }
}
?>
Аватар пользователя Grayw0lf Grayw0lf 11 октября 2016 в 20:08
1

Сергей Березин wrote:

1. Для чайников как я: список с именами писать именно через запятую и БЕЗ пробелов. Если будут пробелы - user1, user2, user3 - то работать не будет. Я сам намучался пока до меня не дошло. Нужно так - user1,user2,user3

Используйте trim http://php.net/manual/ru/function.trim.php и будет вам счастье.

Аватар пользователя Сергей Березин Сергей Березин 11 октября 2016 в 20:20

Спасибо, но дело совсем не в этом. А в том, что я решил (думаю и другие так же могут решить), что должны быть пробелы.

Мне трим не нужен в данном случае.

Аватар пользователя Grayw0lf Grayw0lf 11 октября 2016 в 22:14
1

negociant wrote:

но можно если пробел попал, его предварительно очистить

в данной задаче желательно это предусмотреть что и было сделано.

Аватар пользователя Grayw0lf Grayw0lf 11 октября 2016 в 22:37
1

negociant wrote:

а в плане других валидаций можно попробывать выполнять валидацию первой

и снова верно чтобы лишнее не запускать, если конечно стоит такой приоритет в логике.

Аватар пользователя Сергей Березин Сергей Березин 11 октября 2016 в 23:46

negociant wrote:

а в плане других валидаций можно попробывать выполнять валидацию первой

К сожалению не помогло.
По прежнему сначала аяксом выводится уведомление, что имя свободно для регистрации, а после нажатия кнопки сообщается, что имя нельзя зарегистировать.

Кэш чистил конечно.

Аватар пользователя Сергей Березин Сергей Березин 12 октября 2016 в 0:26

Это не важно в данном случае.
Ведь если отключить яву, то валидация всё равно будет, просто не аяксовая, а пиашпишная. Имею в виду применительно к уже зарегистрированным именам. И я думал также будет и применительно к зарезервированным именам. Если так не будет, то мне проще все эти имена зарегистрировать (импортировать csv файл) через модуль User Import Framework.