Регистрация пользователя при оформлении заказа в один шаг — различия между версиями
Stexe (обсуждение | вклад) |
Mad grant (обсуждение | вклад) |
||
(не показаны 4 промежуточные версии 2 участников) | |||
Строка 1: | Строка 1: | ||
[[category:Написание кастомных макросов]] | [[category:Написание кастомных макросов]] | ||
+ | '''Для использования на версии 2.9.6 метод saveinfo() методы из статей по оформлению заказа нужно переименовать, так как в системе появились одноименный методы''' | ||
'''Задача:''' Реализовать возможность регистрации пользователя при оформлении заказа в один шаг.<br><br> | '''Задача:''' Реализовать возможность регистрации пользователя при оформлении заказа в один шаг.<br><br> | ||
Строка 15: | Строка 16: | ||
В файл classes\modules\emarket\__custom.php добавим определения метода регистрации пользователя и генерации случайного пароля: | В файл classes\modules\emarket\__custom.php добавим определения метода регистрации пользователя и генерации случайного пароля: | ||
<source lang="php"> | <source lang="php"> | ||
− | + | protected function registerUser($customer_id){ | |
− | + | $obj_coll = umiObjectsCollection::getInstance(); | |
− | + | $customer_obj = $obj_coll->getObject($customer_id); | |
− | + | $customer = array ('email' => '', 'fname' => '', 'lname' => '', 'father_name' => ''); | |
− | + | $oUsersMdl = cmsController::getInstance()->getModule("users"); | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | if ($oUsersMdl instanceof def_module){ | |
− | + | if ($oUsersMdl->is_auth()){ | |
− | + | return false; | |
− | + | } | |
− | + | } | |
− | + | ||
− | + | foreach ($customer as $key=>$value){ | |
− | + | if ($customer_obj->getValue($key)){ | |
− | + | $customer[$key] = $customer_obj->getValue($key); | |
− | + | } | |
− | + | } | |
− | + | if (!$customer['email']){ | |
+ | return false; | ||
+ | } | ||
+ | |||
+ | $objectTypes = umiObjectTypesCollection::getInstance(); | ||
+ | $regedit = regedit::getInstance(); | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | $objectTypeId = $objectTypes->getBaseType("users", "user"); | |
− | + | $without_act = (bool) $regedit->getVal("//modules/users/without_act"); | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | $customer['email'] = $oUsersMdl->validateEmail($customer['email'], false, !$without_act); | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | $customer['login'] = $customer['email']; | |
− | + | $customer['pass'] = self::randomPassword(); | |
− | + | if (isset($_REQUEST['captcha'])) { | |
+ | $_SESSION['user_captcha'] = md5((int) getRequest('captcha')); | ||
+ | } | ||
− | + | if (!umiCaptcha::checkCaptcha()) { | |
− | + | $this->errorAddErrors('errors_wrong_captcha'); | |
+ | } | ||
+ | if (strpos($customer['email'],'@') === false){ | ||
+ | $this->redirect(getServer('HTTP_REFERER')); | ||
+ | } | ||
+ | $oUsersMdl->errorThrow('public'); | ||
− | + | //Creating user... | |
− | + | $objectId = $obj_coll->addObject($customer['login'], $objectTypeId); | |
− | + | $activationCode = md5($customer['login'] . time()); | |
− | + | ||
− | + | $object = $obj_coll->getObject($objectId); | |
− | + | ||
− | + | $object->setValue("login", $customer['login']); | |
− | + | $object->setValue("password", md5($customer['pass'])); | |
− | + | $object->setValue("e-mail", $customer['email']); | |
− | + | $object->setValue("fname", $customer['fname']); | |
− | + | $object->setValue("lname", $customer['lname']); | |
− | + | $object->setValue("father_name", $customer['fname']); | |
− | + | ||
− | + | ||
− | + | $object->setValue("is_activated", $without_act); | |
− | + | $object->setValue("activate_code", $activationCode); | |
− | + | $object->setValue("referer", urldecode(getSession("http_referer"))); | |
− | + | $object->setValue("target", urldecode(getSession("http_target"))); | |
− | + | $object->setValue("register_date", umiDate::getCurrentTimeStamp()); | |
− | + | ||
− | + | $group_id = regedit::getInstance()->getVal("//modules/users/def_group"); | |
− | + | $object->setValue("groups", Array($group_id)); | |
− | + | ||
− | + | $data_module = cmsController::getInstance()->getModule('data'); | |
+ | $data_module->saveEditedObject($objectId, true); | ||
+ | |||
+ | $object->commit(); | ||
+ | |||
+ | $template = 'default'; | ||
+ | list( | ||
+ | $template_mail, $template_mail_subject, $template_mail_noactivation, $template_mail_subject_noactivation | ||
+ | ) = def_module::loadTemplatesForMail("users/register/".$template, | ||
+ | "mail_registrated", "mail_registrated_subject", "mail_registrated_noactivation", "mail_registrated_subject_noactivation" | ||
+ | ); | ||
+ | |||
+ | if ($without_act && $template_mail_noactivation && $template_mail_subject_noactivation) { | ||
+ | $template_mail = $template_mail_noactivation; | ||
+ | $template_mail_subject = $template_mail_subject_noactivation; | ||
+ | } | ||
+ | |||
+ | $mailData = array( | ||
+ | 'user_id' => $objectId, | ||
+ | 'domain' => $domain = $_SERVER['HTTP_HOST'], | ||
+ | 'activate_link' => "http://" . $domain . $this->pre_lang . "/users/activate/" . $activationCode . "/", | ||
+ | 'login' => $customer['login'], | ||
+ | 'password' => $customer['pass'], | ||
+ | 'lname' => $object->getValue("lname"), | ||
+ | 'fname' => $object->getValue("fname"), | ||
+ | 'father_name' => $object->getValue("father_name"), | ||
+ | ); | ||
+ | |||
+ | $mailContent = def_module::parseTemplateForMail($template_mail, $mailData, false, $objectId); | ||
+ | $mailSubject = def_module::parseTemplateForMail($template_mail_subject, $mailData, false, $objectId); | ||
+ | |||
+ | $fio = $object->getValue("lname") . " " . $object->getValue("fname") . " " . $object->getValue("father_name"); | ||
+ | |||
+ | $email_from = regedit::getInstance()->getVal("//settings/email_from"); | ||
+ | $fio_from = regedit::getInstance()->getVal("//settings/fio_from"); | ||
+ | |||
+ | |||
+ | $registrationMail = new umiMail(); | ||
+ | $registrationMail->addRecipient($customer['email'], $fio); | ||
+ | $registrationMail->setFrom($email_from, $fio_from); | ||
+ | $registrationMail->setSubject($mailSubject); | ||
+ | $registrationMail->setContent($mailContent); | ||
+ | $registrationMail->commit(); | ||
+ | $registrationMail->send(); | ||
+ | |||
+ | return $objectId; | ||
+ | } | ||
+ | private function randomPassword(){ | ||
+ | $alphabet = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789"; | ||
+ | $pass = array(); | ||
+ | $alphaLength = strlen($alphabet) - 1; | ||
+ | for ($i = 0; $i < 8; $i++) { | ||
+ | $n = rand(0, $alphaLength); | ||
+ | $pass[] = $alphabet[$n]; | ||
+ | } | ||
+ | return implode($pass); | ||
+ | } | ||
</source> | </source> | ||
Строка 147: | Строка 148: | ||
<source lang="php"> | <source lang="php"> | ||
public function saveinfo() { | public function saveinfo() { | ||
− | + | $order = $this->getBasketOrder(false); | |
− | + | //сохранение регистрационных данных | |
− | + | $cmsController = cmsController::getInstance(); | |
− | + | $data = $cmsController->getModule('data'); | |
− | + | $data->saveEditedObject(customer::get()->id, false, true); | |
− | + | ||
− | + | $need_reg = getRequest('need_reg'); | |
− | + | ||
− | + | if (isset($need_reg) && $need_reg=='on') { | |
− | + | $user_id = self::registerUser(customer::get()->id); | |
− | + | } | |
− | + | ||
− | + | //сохранение способа доставки | |
− | + | $deliveryId = getRequest('delivery-id'); | |
− | + | if ($deliveryId) { | |
− | + | $delivery = delivery::get($deliveryId); | |
− | + | $deliveryPrice = (float) $delivery->getDeliveryPrice($order); | |
− | + | $order->setValue('delivery_id', $deliveryId); | |
− | + | $order->setValue('delivery_price', $deliveryPrice); | |
− | + | $order->commit(); | |
− | + | } | |
− | + | ||
− | + | //меняем у заказа покупателя на созданного | |
− | + | if($user_id){ | |
− | + | $order->setValue('customer_id', $user_id); | |
− | + | $order->commit(); | |
− | + | } | |
− | + | ||
− | + | //сохранение адреса доставки | |
− | + | $addressId = getRequest('delivery-address'); | |
− | + | if ($addressId == 'new') { | |
− | + | $collection = umiObjectsCollection::getInstance(); | |
− | + | $types = umiObjectTypesCollection::getInstance(); | |
− | + | $typeId = $types->getBaseType("emarket", "delivery_address"); | |
− | + | $customer = customer::get(); | |
− | + | ||
− | + | if ($user_id){ | |
− | + | $addressId = $collection->addObject("Address for customer #" . $user_id, $typeId); | |
− | + | $user = $collection->getObject($user_id); | |
− | + | } | |
− | + | else { | |
− | + | $addressId = $collection->addObject("Address for customer #" . $customer->id, $typeId); | |
− | + | } | |
− | + | $dataModule = $cmsController->getModule("data"); | |
− | + | if ($dataModule) { | |
+ | $dataModule->saveEditedObject($addressId, true, true); | ||
+ | } | ||
+ | if (!$user_id){ | ||
+ | $customer->delivery_addresses = array_merge($customer->delivery_addresses, array($addressId)); | ||
+ | }else{ | ||
+ | $user->delivery_addresses = array_merge($user->delivery_addresses, array($addressId)); | ||
+ | } | ||
+ | } | ||
+ | $order->delivery_address = $addressId; | ||
+ | $order->commit(); | ||
+ | |||
+ | //сохранение способа оплаты и редирект на итоговую страницу, либо страницу подтверждения оплаты. | ||
+ | $order->setValue('payment_id', getRequest('payment-id')); | ||
+ | $order->refresh(); | ||
+ | $order->commit(); | ||
+ | |||
+ | $paymentId = getRequest('payment-id'); | ||
+ | if (!$paymentId) { | ||
+ | $this->errorNewMessage(getLabel('error-emarket-choose-payment')); | ||
+ | $this->errorPanic(); | ||
+ | } | ||
+ | $payment = payment::get($paymentId); | ||
− | + | if ($payment instanceof payment) { | |
− | + | $paymentName = $payment->getCodeName(); | |
− | |||
− | + | $url = "{$this->pre_lang}/" . cmsController::getInstance()->getUrlPrefix() . "emarket/purchase/payment/{$paymentName}/"; | |
− | + | } else { | |
− | + | $url = "{$this->pre_lang}/" . cmsController::getInstance()->getUrlPrefix() . "emarket/cart/"; | |
− | + | } | |
− | + | $this->redirect($url); | |
− | + | } | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
</source> | </source> |
Текущая версия на 09:48, 18 апреля 2014
Для использования на версии 2.9.6 метод saveinfo() методы из статей по оформлению заказа нужно переименовать, так как в системе появились одноименный методы
Задача: Реализовать возможность регистрации пользователя при оформлении заказа в один шаг.
Реализация:
Для создания формы оформления заказа в один шаг воспользуемся статьей Оформление заказа в один шаг – xslt шаблонизатор.
В шаблоне <xsl:template match="udata[@module='emarket'][@method='fast_purchasing_xslt']"> добавим кнопку-флажок для регистрации пользователя по его желанию.
<xsl:if test="not($user_auth)">
Зарегистрироваться на сайте <input name="need_reg" type="checkbox"/>
</xsl:if>
В основной файл шаблона нужно добавить переменную user_auth:
<xsl:variable name="user_auth" select="/result/user/@status" />
В файл classes\modules\emarket\__custom.php добавим определения метода регистрации пользователя и генерации случайного пароля:
protected function registerUser($customer_id){
$obj_coll = umiObjectsCollection::getInstance();
$customer_obj = $obj_coll->getObject($customer_id);
$customer = array ('email' => '', 'fname' => '', 'lname' => '', 'father_name' => '');
$oUsersMdl = cmsController::getInstance()->getModule("users");
if ($oUsersMdl instanceof def_module){
if ($oUsersMdl->is_auth()){
return false;
}
}
foreach ($customer as $key=>$value){
if ($customer_obj->getValue($key)){
$customer[$key] = $customer_obj->getValue($key);
}
}
if (!$customer['email']){
return false;
}
$objectTypes = umiObjectTypesCollection::getInstance();
$regedit = regedit::getInstance();
$objectTypeId = $objectTypes->getBaseType("users", "user");
$without_act = (bool) $regedit->getVal("//modules/users/without_act");
$customer['email'] = $oUsersMdl->validateEmail($customer['email'], false, !$without_act);
$customer['login'] = $customer['email'];
$customer['pass'] = self::randomPassword();
if (isset($_REQUEST['captcha'])) {
$_SESSION['user_captcha'] = md5((int) getRequest('captcha'));
}
if (!umiCaptcha::checkCaptcha()) {
$this->errorAddErrors('errors_wrong_captcha');
}
if (strpos($customer['email'],'@') === false){
$this->redirect(getServer('HTTP_REFERER'));
}
$oUsersMdl->errorThrow('public');
//Creating user...
$objectId = $obj_coll->addObject($customer['login'], $objectTypeId);
$activationCode = md5($customer['login'] . time());
$object = $obj_coll->getObject($objectId);
$object->setValue("login", $customer['login']);
$object->setValue("password", md5($customer['pass']));
$object->setValue("e-mail", $customer['email']);
$object->setValue("fname", $customer['fname']);
$object->setValue("lname", $customer['lname']);
$object->setValue("father_name", $customer['fname']);
$object->setValue("is_activated", $without_act);
$object->setValue("activate_code", $activationCode);
$object->setValue("referer", urldecode(getSession("http_referer")));
$object->setValue("target", urldecode(getSession("http_target")));
$object->setValue("register_date", umiDate::getCurrentTimeStamp());
$group_id = regedit::getInstance()->getVal("//modules/users/def_group");
$object->setValue("groups", Array($group_id));
$data_module = cmsController::getInstance()->getModule('data');
$data_module->saveEditedObject($objectId, true);
$object->commit();
$template = 'default';
list(
$template_mail, $template_mail_subject, $template_mail_noactivation, $template_mail_subject_noactivation
) = def_module::loadTemplatesForMail("users/register/".$template,
"mail_registrated", "mail_registrated_subject", "mail_registrated_noactivation", "mail_registrated_subject_noactivation"
);
if ($without_act && $template_mail_noactivation && $template_mail_subject_noactivation) {
$template_mail = $template_mail_noactivation;
$template_mail_subject = $template_mail_subject_noactivation;
}
$mailData = array(
'user_id' => $objectId,
'domain' => $domain = $_SERVER['HTTP_HOST'],
'activate_link' => "http://" . $domain . $this->pre_lang . "/users/activate/" . $activationCode . "/",
'login' => $customer['login'],
'password' => $customer['pass'],
'lname' => $object->getValue("lname"),
'fname' => $object->getValue("fname"),
'father_name' => $object->getValue("father_name"),
);
$mailContent = def_module::parseTemplateForMail($template_mail, $mailData, false, $objectId);
$mailSubject = def_module::parseTemplateForMail($template_mail_subject, $mailData, false, $objectId);
$fio = $object->getValue("lname") . " " . $object->getValue("fname") . " " . $object->getValue("father_name");
$email_from = regedit::getInstance()->getVal("//settings/email_from");
$fio_from = regedit::getInstance()->getVal("//settings/fio_from");
$registrationMail = new umiMail();
$registrationMail->addRecipient($customer['email'], $fio);
$registrationMail->setFrom($email_from, $fio_from);
$registrationMail->setSubject($mailSubject);
$registrationMail->setContent($mailContent);
$registrationMail->commit();
$registrationMail->send();
return $objectId;
}
private function randomPassword(){
$alphabet = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789";
$pass = array();
$alphaLength = strlen($alphabet) - 1;
for ($i = 0; $i < 8; $i++) {
$n = rand(0, $alphaLength);
$pass[] = $alphabet[$n];
}
return implode($pass);
}
Код метода saveinfo(),который находится в том же файле, должен выглядеть следующим образом:
public function saveinfo() {
$order = $this->getBasketOrder(false);
//сохранение регистрационных данных
$cmsController = cmsController::getInstance();
$data = $cmsController->getModule('data');
$data->saveEditedObject(customer::get()->id, false, true);
$need_reg = getRequest('need_reg');
if (isset($need_reg) && $need_reg=='on') {
$user_id = self::registerUser(customer::get()->id);
}
//сохранение способа доставки
$deliveryId = getRequest('delivery-id');
if ($deliveryId) {
$delivery = delivery::get($deliveryId);
$deliveryPrice = (float) $delivery->getDeliveryPrice($order);
$order->setValue('delivery_id', $deliveryId);
$order->setValue('delivery_price', $deliveryPrice);
$order->commit();
}
//меняем у заказа покупателя на созданного
if($user_id){
$order->setValue('customer_id', $user_id);
$order->commit();
}
//сохранение адреса доставки
$addressId = getRequest('delivery-address');
if ($addressId == 'new') {
$collection = umiObjectsCollection::getInstance();
$types = umiObjectTypesCollection::getInstance();
$typeId = $types->getBaseType("emarket", "delivery_address");
$customer = customer::get();
if ($user_id){
$addressId = $collection->addObject("Address for customer #" . $user_id, $typeId);
$user = $collection->getObject($user_id);
}
else {
$addressId = $collection->addObject("Address for customer #" . $customer->id, $typeId);
}
$dataModule = $cmsController->getModule("data");
if ($dataModule) {
$dataModule->saveEditedObject($addressId, true, true);
}
if (!$user_id){
$customer->delivery_addresses = array_merge($customer->delivery_addresses, array($addressId));
}else{
$user->delivery_addresses = array_merge($user->delivery_addresses, array($addressId));
}
}
$order->delivery_address = $addressId;
$order->commit();
//сохранение способа оплаты и редирект на итоговую страницу, либо страницу подтверждения оплаты.
$order->setValue('payment_id', getRequest('payment-id'));
$order->refresh();
$order->commit();
$paymentId = getRequest('payment-id');
if (!$paymentId) {
$this->errorNewMessage(getLabel('error-emarket-choose-payment'));
$this->errorPanic();
}
$payment = payment::get($paymentId);
if ($payment instanceof payment) {
$paymentName = $payment->getCodeName();
$url = "{$this->pre_lang}/" . cmsController::getInstance()->getUrlPrefix() . "emarket/purchase/payment/{$paymentName}/";
} else {
$url = "{$this->pre_lang}/" . cmsController::getInstance()->getUrlPrefix() . "emarket/cart/";
}
$this->redirect($url);
}