Отправка пароля пользователю при оформлении заказа
        Здравствуйте!
Необходимо осуществить отправку пароля пользователю при оформлении заказа в minishop2. По умолчанию такого функционала нет, в связи с чем менял класс minishop2.class.php, указав
Никто не реализовывал отправку пароля при офрмлении заказа незареганным пользователем? Может у кого-то есть идеи?
    
    
                                                                                
            Необходимо осуществить отправку пароля пользователю при оформлении заказа в minishop2. По умолчанию такого функционала нет, в связи с чем менял класс minishop2.class.php, указав
$pass=rand();
$user = $this->modx->newObject('modUser', array('username' => $email, 'password' => md5($pass)));
$profile = $this->modx->newObject('modUserProfile', array('email' => $email, 'fullname' => $order['receiver'],'mobilephone'=>$pass));Тоесть, по сути, сохранял пароль в профиле пользователя в открытом виде. Это, конечно, плохо, но собирался повесить плагин на msOnCreateOrder, который бы сразу при отправке письма этот пароль стер из профиля. Но при попытке войти с данным паролем, выскакиеват сообщение что неправильны пароль. Может это из-за того, что хеш-класс пользователя modPBKDF2, а пароль шифруется в md5? Я не смог разобраться точно…Никто не реализовывал отправку пароля при офрмлении заказа незареганным пользователем? Может у кого-то есть идеи?
Комментарии: 5
                а может в это место повесить runProcessor(/security/user/update) со сменой пароля и высылкой его юзеру? Не пробовал, только сейчас в голову пришло. И у тебя md5 идет от rand() — что вернет тебе хэш от 8ми символов, а проверка пароля должна вроде как еще использует salt            
                    
                А как можно нужно использовать salt? Простите, не разбираюсь в этом…            
                    
                Сделал следующим образом, может кому-то пригодится. 
Правил файл /core/components/minishop2/model/minishop2/minishop2.class.php, функция getCustomerId теперь выглядит следующим образом:
                    Правил файл /core/components/minishop2/model/minishop2/minishop2.class.php, функция getCustomerId теперь выглядит следующим образом:
public function getCustomerId() {
		$order = $this->order->get();
		if (empty($order['email'])) {return false;}
		if ($this->modx->user->isAuthenticated()) {
			$profile = $this->modx->user->Profile;
			if (!$email = $profile->get('email')) {
				$profile->set('email', $order['email']);
				$profile->save();
			}
			$uid = $this->modx->user->id;
		}
		else {
			/* @var modUser $user */
			$email = $order['email'];
			if ($user = $this->modx->getObject('modUser', array('username' => $email))) {
				$uid = $user->get('id');
			}
			else {
				$pass=rand();
				$user = $this->modx->newObject('modUser', array('username' => $email, 'password' => md5($pass)));
				$profile = $this->modx->newObject('modUserProfile', array('email' => $email, 'fullname' => $order['receiver']));
				$user->addOne($profile);
				$user->set('password', $pass);
				$user->save();
				$url=$this->modx->getOption('site_url');
				$name=$this->modx->getOption('site_name');
				$subjectTheme='Вы зарегистрировались на сайте '.$name;
				$bodyTheme='<html><body><p>Здравствуйте, '.$order['receiver'].'!</p><p>Сделав заказ, вы зарегистрировались на сайте <a href="'.$url.'">'.$name.'</a>. Ваши данные для входа:</p><p>Логин: '.$email.'</p><p>Пароль: '.$pass.'</p></body></html>';
				$this->sendEmail($email, $subjectTheme, $bodyTheme);
				if ($groups = $this->modx->getOption('ms2_order_user_groups', null, false)) {
					$groups = array_map('trim', explode(',', $groups));
					foreach ($groups as $group) {
						$user->joinGroup($group);
					}
				}
				$uid = $user->get('id');
			}
		}
		return $uid;
	}Наверняка есть лишние моменты, но пример рабочий.            
                Для вашего алгоритма код будет выглядеть так:
Но лучше, конечно, создать плагин на событие, например, msOnChangeOrderStatus:
Только еще нужно где-то отмечать, что пароль пользователю выслан, чтобы ему после каждого изменения статуса новый пароль не устанавливать.
                    $pass=md5(rand());
$user = $this->modx->newObject('modUser', array('username' => $email, 'password' => $pass));
$profile = $this->modx->newObject('modUserProfile', array('email' => $email, 'fullname' => $order['receiver'],'mobilephone'=>$pass));Но лучше, конечно, создать плагин на событие, например, msOnChangeOrderStatus:
// Генерируем пароль
$count_ch = 10;
$pass = '';
$accepted = '0987654321zyxwvutsrqponmlkjihgfedcba';
srand(((int)((double)microtime()*1000000)));
for ($i=0; $i<=$count_ch; $i++) {
  $random = rand(0, (strlen($accepted) -1));
  $pass .= $accepted[$random];
}
// Устанавливаем пароль пользователю
$user = $modx->getObject('modUser', $order->get('user_id'));
$user->set('password',$pass);
$user->save();
// Меняем текст письма пользователю
$status = $modx->getObject('msOrderStatus', array('id' => $status, 'active' => 1));
$body = $status->get('body_user');
$body .= '<p>Ваш пароль для входа на сайт: '.$pass.'</p>';
$status->set('body_user', $body);
$status->save();Только еще нужно где-то отмечать, что пароль пользователю выслан, чтобы ему после каждого изменения статуса новый пароль не устанавливать.
                Илья, первые 8 строк кода можно заменить таким:
Естественно, код будет работать только после этого:
                    $pass = $user->generatePassword();по умолчанию генерит пароль в 10 символов.Естественно, код будет работать только после этого:
$user = $modx->getObject('modUser', $order->get('user_id'));            
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.