Сниппет регистрации юзера [РЕШЕНО]


Добрый вечер! есть сниппет, который вроде бы и выполняется, но в эррор лог пишется только ошибка при создании пользователя [2012-11-30 19:40:57] (ERROR @ /index.php) register user error. Username: 8901008031, Message:
Ну и пользователи не создаются… Прошу наставить на путь истинный.
<?php
$modx->addPackage('leleko-cdb', $modx->getOption('core_path').'components/leleko-cdb/model/','modx_leleko_');
$users_data_arr = $modx->getCollection('CdbOrg');
foreach($users_data_arr as $usr_data) {
 $username = $usr_data->get('inn');
 $password = $usr_data->get('passwd');
}
$new_users_arr = array(
 'username' => '$username',
 'password' => '$password'
 );
 $write_usr_data = $modx->runProcessor('/security/user/create', $new_users_arr);
if ($write_usr_data->isError()) {
    $modx->log(modX::LOG_LEVEL_ERROR, 'register user error. Username: '.$username.', Message: '.$write_usr_data->getMessage());
}
Сергей Лелеко
30 ноября 2012, 19:53
modx.pro
5 363
0

Комментарии: 9

Ваня
01 декабря 2012, 05:16
0
У вас тут грубые ошибки

Должно быть как-то так:

<?php
$modx->addPackage('leleko-cdb', $modx->getOption('core_path').'components/leleko-cdb/model/','modx_leleko_');
$users_data_arr = $modx->getCollection('CdbOrg');

foreach ($users_data_arr as $usr_data) {
	$username = $usr_data->get('inn');
	$password = $usr_data->get('passwd');

	$write_usr_data = $modx->runProcessor('/security/user/create', array(
		'username' => $username,
		'password' => $password
	));
	if ($write_usr_data->isError()) {
		$modx->log(modX::LOG_LEVEL_ERROR, 'register user error. Username: '.$username.', Message: '.$write_usr_data->getMessage());
	}
}
    Сергей Лелеко
    01 декабря 2012, 14:46
    0
    Спасибо большое! Теперь хотя бы пользователи пытаются все создаться… Щас буду смотреть в чем именно ошибка при создании и почему она пустая.
      Сергей Лелеко
      01 декабря 2012, 15:14
      0
      Нашел вот какой момент, пользователи не регистрировались пока не внес такие изменения:
      foreach ($users_data_arr as $usr_data) {
      $username = $usr_data->get('inn');
      $org_name = $usr_data->get('organization');
      $password = $usr_data->get('passwd');
      $response = $modx->runProcessor('/security/user/create', array(
      'username' => $username,
      'fullname' => $org_name,
      'email' => 'test@com.ru',
      'newpassword' => TRUE,
      'specifiedpassword' => $password,
      'confirmpassword' => $password,
      'passwordnotifymethod' => 'e'
      ));
      И 3 пользователя на ура создаются!!! Правда только 3 и дальше ошибки пишутся в лог но ошибка пустая также, так что теперь я в замешательстве… Почему же 3 пользователя все-таки создаются? Значит решение работает но чего-то не хватает толи памяти толи времени выполнения.
        Сергей Лелеко
        01 декабря 2012, 15:29
        0
        совсем забыл что есть пользователи с 0000000000 вместо уникального номера, которых мне обрабатывать не нужно. Видимо как раз при попытке создать второго пользователя с таки же логином и выдается ошибка и дальнейшее создание пользователей уже не происходит.
          Илья Уткин
          01 декабря 2012, 17:47
          0
          Если не хватает времени или памяти, попробуйте такое решение — пусть создает по три пользователя за запрос.
            Сергей Лелеко
            01 декабря 2012, 21:03
            0
            Ваше решение пока не пробовал ибо не разобрался до конца, но максимум чего удалось достигнуть так это регистрации 137 пользователей (всего 390). И в эррор логе системы пусто не могу понять чего не хватает.
          Сергей Лелеко
          02 декабря 2012, 00:48
          0
          Долго ковырял создание через процессор, в итоге выяснил что пользователи не все создаются и время работы скрипта затягивается до отсечки изза того что каждому пользователю пытаются отправится еmail собщения с паролем. Пробовал
          'passwordnotifymethod' => 'e'
          выставить
          'passwordnotifymethod' => 's'
          , но в таком случае создается только 1 пользователь, а информация о том что созданы все остальные только падает в эррор лог modx.
          Так что решение какое-то полурабочее получилось.

          Единственное что нашел тут вариант создания пользователя через апи. Пользователи создаются на лету, но не получается их добавить в группу сразу же из сниппета. Надеюсь с этим разобраться.
            Алексей Марунин
            03 декабря 2012, 00:49
            1
            0
            Да, я помню в свое время долго ломал голову, пока не добрался до этого пресловутого 'passwordnotifymethod' :) Сожалею, что не увидел ваш вопрос вовремя. Тем не менее, пару моментов все же отмечу:

            Для начала корректно обрабатываем ошибки при регистрации:

            // Запускаем стандартный процессор регистрации
            $response = $this->modx->runProcessor( 'security/user/create', $options );
            if ( $response->isError() ) {
            	// Получаем весь набор ошибок (например, не задано имя пользователя, пустой пароль и т.д.)
                    $errors = $response->response['errors'];
            	foreach ( $errors as $error ) {
            		$errorMsg = $error['msg'];
            		// Выводим сообщение об ошибке в лог или плейсхолдер
            	}
            }
            else {
            	// А здесь все замечательно, получаем массив 
            	// с параметрами пользователя (не объект типа modUser!)
            	$userArray = $response->getObject();
            }


            Далее. Добавление в группу при регистрации тоже простое:

            // Получаем идентификаторы групп и ролей, используемых по умолчанию
            // Группу Registered заменить на нужную (она должна быть заранее создана!)
            $group = $this->modx->getObject( 'modUserGroup', array( 'name' => 'Registered' ) ); 
            $userGroup = $group->get( 'id' );
            $role = $this->modx->getObject( 'modUserGroupRole', array( 'name' => 'Member' ) );
            $userRole = $role->get( 'id' );
            
            ...
            // При вызове процессора обратите внимание на второй параметр - $options.
            // В него нужно добавить следующий элемент:
            $options['groups'] = array( array( 'usergroup' => $userGroup , 'role' => $userRole ) );
            // По аналогии можете созданного пользователя добавлять сразу в несколько групп с различными ролями

            Надеюсь, помог :) Ибо сам буквально недавно «варился» в этом очень основательно :)
            Сергей Лелеко
            08 декабря 2012, 15:09
            0
            Алексей, спасибо большое за предложенное решение! обязательно им воспользуюсь.
              Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
              9