0 Пользователей и 1 Гость просматривают эту тему.
  • 49 Ответов
  • 2596 Просмотров
*

AlekVolsk

  • Гуру
  • 6916
  • 410 / 4
Имею логин, пароль и email. Как программно создать/добавить пользователя, в группе Registered, сразу разблокированным, установив ему получение системный писем и не требовать сброс пароля при первом входе? Это нужно для синхронизации пользователей с 1С (в 1С добавляют нового, потом выгружают его на сайт), при импорте данных из XML.
*

varX

  • Живу я здесь
  • 2265
  • 134 / 5
  • разработка компонентов
Создаете объект
$user = new JUser;

Создаете массив данных
$data = array();
$data['email'] ='email';
$data['password'] ='password';
и т.д.

Дальше, если очень упрощенно:
$user->bind($data);
$user->save();
*

AlekVolsk

  • Гуру
  • 6916
  • 410 / 4
Спс, попробую. Другие поля - аналогично, это понятно, а с группой доступа как?
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Не пробовал но возможно:
Код: php
JUserHelper::addUserToGroup('userid', 2);

Сработало вроде:
Код: php
$user = new JUser('id');
$user->sendEmail = 1;
$user->requireReset = 1;
$user->save();
JUserHelper::addUserToGroup('id', 2);
« Последнее редактирование: 13.11.2014, 01:59:09 от zomby6888 »
интернет-блог: http://websiteprog.ru
*

varX

  • Живу я здесь
  • 2265
  • 134 / 5
  • разработка компонентов
Спс, попробую. Другие поля - аналогично, это понятно, а с группой доступа как?
Аналогично. По памяти, не глядя (мож изменилось уже что-то)
$data['groups'] =array($group);
*

AlekVolsk

  • Гуру
  • 6916
  • 410 / 4
Аналогично. По памяти, не глядя (мож изменилось уже что-то)
$data['groups'] =array($group);
$data['groups'] =array(2); - пойдет?
*

varX

  • Живу я здесь
  • 2265
  • 134 / 5
  • разработка компонентов
$data['groups'] =array(2); - пойдет?
Попробуйте, должно.
*

AlekVolsk

  • Гуру
  • 6916
  • 410 / 4
Сработало вроде:
Код: php
$user = new JUser('id');
$user->sendEmail = 1;
$user->requireReset = 1;
$user->save();
JUserHelper::addUserToGroup('id', 2);
Спс, попробую.
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
requireReset возможно наоборот в 0 надо установить..
интернет-блог: http://websiteprog.ru
*

varX

  • Живу я здесь
  • 2265
  • 134 / 5
  • разработка компонентов
Не пробовал но возможно:
Код: php
JUserHelper::addUserToGroup('userid', 2);

Сработало вроде:
Код: php
$user = new JUser('id');
$user->sendEmail = 1;
$user->requireReset = 1;
$user->save();
JUserHelper::addUserToGroup('id', 2);
Речь, насколько я понял, идет о создании нового пользователя. У него нет id. Впрочем, если не ошибаюсь, $user->save(); возвращает id созданного пользователя, поэтому можно и так приспособиться.
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Ну да, если нового создавать то как-то так:
Код: php
$user = new JUser;
$user->sendEmail = 1;
$user->requireReset = 0;
$user->name = 'Вася';
$user->username = 'vasya';
$user->password = 'password';
$user->email = 'test@test.ru';
$user->save();
JUserHelper::addUserToGroup($user->id, 2);


Можно его еще авторизовать и залогинить для прикола)
интернет-блог: http://websiteprog.ru
*

AlekVolsk

  • Гуру
  • 6916
  • 410 / 4
А как быстро (без запроса) проверить, существует ли пользователь с указанным логином, и если да - вернуть его id? Чтобы гарантированно добавлять только несуществующего.
С запросом - не проблема, но хотелось бы по максимуму с использованием имеющихся встроенных средств api J.
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Мне кажется что никак, только запрос. Встроенные средства это лишние данные и более медленная обработка, в таких ситуациях гораздо полезнее ими пренебречь
интернет-блог: http://websiteprog.ru
*

AlekVolsk

  • Гуру
  • 6916
  • 410 / 4
Пичально, но все же, как? протестирую скорость заодно )
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
А что тут тестировать прямой запрос всегда быстрее будет это же очевидно. Как будто методы api для получения данных не используют запросы. Что может быть быстрее чем:
Код: php
$db = JFactory::getDBO();
$query = "SELECT id FROM #__users WHERE username = ".$db->quote('vasya');
$db->setQuery($query);
if($id = $db->loadResult())
{
//делаем что -то с $id
}
интернет-блог: http://websiteprog.ru
*

AlekVolsk

  • Гуру
  • 6916
  • 410 / 4
ок, спс.
*

AlekVolsk

  • Гуру
  • 6916
  • 410 / 4
Код: php
$user = new JUser;
$user->sendEmail = 1;
$user->requireReset = 0;
$user->name = 'Vasya';
$user->username = 'vasya';
$user->password = 'password';
$user->email = 'test@test.ru';
$user->save();
JUserHelper::addUserToGroup($user->id, 2);
Это, к сожалению, не прокатило.

Код: php
          $user = new JUser;
          $data = array();
          $data['username'] = $item_login;
          $data['name'] = $item_name;
          $data['password'] = $item_pss;
          $data['email'] = $item_email;
          $data['sendEmail'] = 1;
          $data['requireReset'] = 0;
          $data['params'] = '{"admin_style":"","admin_language":"","language":"","editor":"","helpsite":"","timezone":""}';
          $user->bind($data);
          $user->save();
          JUserHelper::addUserToGroup($user->id, 2);
Это добавило пользователя и послало ему на почту письмо с логином и паролем, вот только пароль в базу не записался...
$item_pss содержит строку из латинских символов и цифр, 11 знаков, без пробелов и прочих знаков препинания.
*

AlekVolsk

  • Гуру
  • 6916
  • 410 / 4
Пробовал указать $data['password'] = md5($item_pss); - пароль в базу записался, однако авторизация не проходит
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
может надо подтверждение пароля указать? var_dump($user->getErrors()) что выводит?
« Последнее редактирование: 14.11.2014, 11:53:47 от zomby6888 »
интернет-блог: http://websiteprog.ru
*

AlekVolsk

  • Гуру
  • 6916
  • 410 / 4
посмотрел bind() в JUser, там действительно идет проверка:
Код: php
			if (isset($array['password2']) && $array['password'] != $array['password2'])
{
JFactory::getApplication()->enqueueMessage(JText::_('JLIB_USER_ERROR_PASSWORD_NOT_MATCH'), 'error');

return false;
}


ок.
указываю:
Код: php
          $data['password'] = $item_pss;
          $data['password2'] = $item_pss;
а вот фигвам: в базе пустое поле
*

AlekVolsk

  • Гуру
  • 6916
  • 410 / 4
Warning: password_hash(): Password must be a string in F:\home\inform.local\www\libraries\compat\password\lib\password.php on line 30

а у меня в data['password'] == object(SimpleXMLElement)#375 (1) {
  • => string(11) "mfo20140206" }

ппц
« Последнее редактирование: 14.11.2014, 12:01:40 от AlekVolsk »
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
)) Поэтому наверное и не работал первый вариант. У меня он срабатывал..
интернет-блог: http://websiteprog.ru
*

AlekVolsk

  • Гуру
  • 6916
  • 410 / 4
У меня же импорт из XML идет в цикле ))) так работает:
Код: php
          $data['password'] = (string)$item_pss;
          $data['password2'] = $data['password'];

И ошибку не сразу видел, поскольку контроллер редирект делал обратно на вьюху
*

AlekVolsk

  • Гуру
  • 6916
  • 410 / 4
Окончательный рабочий вариант:
          $user = new JUser;
          
$data = array();
          
$data['username'] = (string)$item_login;
          
$data['name'] = (string)$item_name;
          
$data['password'] = (string)$item_pss;
          
$data['password2'] = $data['password'];
          
$data['email'] = (string)$item_email;
          
$data['sendEmail'] = 1;
          
$data['requireReset'] = 0;
          
var_dump($data['password']);
          
$user->bind($data);
          
$user->save();
          
JUserHelper::addUserToGroup($user->id2);
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 427 / 4
Окончательный рабочий вариант:
Так лучше:
Код: php
$user = new JUser;
$userData = array( 'name' => (string)$item_name,
'username' => (string)$item_login,
'password' => (string)$item_pss,
'password2' => $data['password'],
'email' => (string)$item_email,
'sendEmail' => 1,
'requireReset' => 0,
'groups' => array( 2 )
);
$user->bind( $userData );
if ( $user->save() ) {
echo 'Пользователь ' . $user->username . ' успешно зарегестрирован!';
}
*

AlekVolsk

  • Гуру
  • 6916
  • 410 / 4
При добавлении более 250 пользователей (импорт данных из XML, в цикле):
Fatal error: Maximum execution time of 30 seconds exceeded in F:\home\inform.local\www\libraries\compat\password\lib\password.php on line 127

Можно этого избежать, делая паузу в выполнении цикла после, скажеи так, каждых 100 интераций цикла, чтобы избежать появления ошибки?
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 427 / 4
set_time_limit(0);
*

AlekVolsk

  • Гуру
  • 6916
  • 410 / 4
В цикле или перед ним?
+ перед циклом вставил, работает, спс

+
При регистрации пользователя пишу:
$user = new JUser;
$userData = array( 'name' => (string)$item_name,
   'username' => (string)$item_login,
   'password' => (string)$item_pss,
   'password2' => (string)$item_pss,
   'email' => (string)$item_email,
   'sendEmail' => 0,
   'requireReset' => 0,
   'groups' => array( 2 )
);
$user->bind( $userData );
В настройках менеджера пользователей: Отсылать пароль    Нет
А письмо с паролем при регистрации все равно отсылается, как избежать?
« Последнее редактирование: 20.11.2014, 19:32:12 от AlekVolsk »
*

AlekVolsk

  • Гуру
  • 6916
  • 410 / 4
Если пользователь не добавился, как отловить ошибку, почему не добавился? А именно: отловить совпадающий email и некорректный логин
Код: php
$user->bind($userData);
if (!$user->save()) {
  // ?
}
*

AlekVolsk

  • Гуру
  • 6916
  • 410 / 4
В общем-то вышел из положения, выводя $user->_errors[0], но это системное сообщение, а хотелось бы свое.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Условия вывода блока div, поля пользователя?

Автор warlocksp

Ответов: 28
Просмотров: 249
Последний ответ 10.12.2020, 14:05:36
от gartes
Выбор группы пользователя при регистрации (аутентификации)

Автор Bartleby

Ответов: 10
Просмотров: 1423
Последний ответ 05.06.2013, 14:20:36
от Bartleby