|
|
Строка 40: |
Строка 40: |
| <hr> | | <hr> |
| | | |
− | Теперь,идем в шаблон, по которому выводится форма регистрации(templates/demodizzy/xslt/modules/users/registration.xsl) и добавим туда вызов макроса:
| |
| | | |
− | <source lang="xml">
| + | |
− | | + | [[Категория:API]][[Категория:Модуль Интернет-магазин]] |
− | <div>
| |
− | <label class="required">
| |
− | <span>
| |
− | <xsl:text>группа:</xsl:text>
| |
− | </span>
| |
− | <xsl:apply-templates select="document('udata://users/selected_groups/')/udata" />
| |
− | </label>
| |
− | </div>
| |
− | </source>
| |
− | | |
− | и шаблон обработки результатов, который будет выводить выбранные группы в выпадающем списке:
| |
− | | |
− | <source lang="xml">
| |
− | | |
− | <xsl:template match="udata[@module = 'users'][@method = 'selected_groups']">
| |
− | <select name = 'group' id = 'group'>
| |
− | <xsl:for-each select = "./items/item">
| |
− | <option value = "{./@id}">
| |
− | <xsl:value-of select = "./@name"/>
| |
− | </option>
| |
− | </xsl:for-each>
| |
− | </select>
| |
− | </xsl:template>
| |
− | </source>
| |
− | | |
− | | |
− | Теперь нам нужно написать метод, который обработает введенные пользователем данные и запишет его в выбранную им же группу.
| |
− | Для этого можно воспользоваться стандартным методом registrate_do, немного его изменив. Идем в /classes/modules/users/_register.php,
| |
− | полностью копируем оттуда метод registrate_do и вставляем в файл __custom.php, в этой же директории.
| |
− | Переименуем его, например, в registrate_do_custom.
| |
− | Начальный код метода:
| |
− | | |
− | <source lang="php">
| |
− | public function registrate_do_custom($template = "default") {
| |
− | if ($this->is_auth()) {
| |
− | $this->redirect($this->pre_lang . "/");
| |
− | }
| |
− | if(!($template = getRequest('template'))) {
| |
− | $template = 'default';
| |
− | }
| |
− | $objectTypes = umiObjectTypesCollection::getInstance();
| |
− | $regedit = regedit::getInstance();
| |
− | | |
− | $refererUrl = getServer('HTTP_REFERER');
| |
− | $without_act = (bool) $regedit->getVal("//modules/users/without_act");
| |
− | | |
− | $objectTypeId = $objectTypes->getBaseType("users", "user");
| |
− | if ($customObjectTypeId = getRequest('type-id')) {
| |
− | $childClasses = $objectTypes->getChildClasses($objectTypeId);
| |
− | if (in_array($customObjectTypeId, $childClasses)) {
| |
− | $objectTypeId = $customObjectTypeId;
| |
− | }
| |
− | }
| |
− | | |
− | $objectType = $objectTypes->getType($objectTypeId);
| |
− | | |
− | $this->errorSetErrorPage($refererUrl);
| |
− | | |
− | $login = $this->validateLogin(getRequest('login'), false, true);
| |
− | $password = $this->validatePassword(getRequest('password'), getRequest('password_confirm'), getRequest('login'), true);
| |
− | $email = $this->validateEmail(getRequest('email'), false, !$without_act);
| |
− | | |
− | //Captcha validation | |
− | if (isset($_REQUEST['captcha'])) {
| |
− | $_SESSION['user_captcha'] = md5((int) getRequest('captcha'));
| |
− | }
| |
− | | |
− | if (!umiCaptcha::checkCaptcha()) {
| |
− | $this->errorAddErrors('errors_wrong_captcha');
| |
− | }
| |
− | | |
− | $this->errorThrow('public');
| |
− | | |
− | $oEventPoint = new umiEventPoint("users_registrate");
| |
− | $oEventPoint->setMode("before");
| |
− | $oEventPoint->setParam("login", $login);
| |
− | $oEventPoint->addRef("password", $password);
| |
− | $oEventPoint->addRef("email", $email);
| |
− | $this->setEventPoint($oEventPoint);
| |
− | | |
− | //Creating user...
| |
− | $objectId = umiObjectsCollection::getInstance()->addObject($login, $objectTypeId);
| |
− | $activationCode = md5($login . time());
| |
− | | |
− | $object = umiObjectsCollection::getInstance()->getObject($objectId);
| |
− | | |
− | $object->setValue("login", $login);
| |
− | $object->setValue("password", md5($password));
| |
− | $object->setValue("e-mail", $email);
| |
− | | |
− | $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());
| |
− | $object->setOwnerId($objectId);
| |
− | | |
− | if ($without_act) {
| |
− | $_SESSION['cms_login'] = $login;
| |
− | $_SESSION['cms_pass'] = md5($password);
| |
− | $_SESSION['user_id'] = $objectId;
| |
− | | |
− | session_commit();
| |
− | }
| |
− | | |
− | $group_id = regedit::getInstance()->getVal("//modules/users/def_group");
| |
− | $object->setValue("groups", Array($group_id));
| |
− | | |
− | cmsController::getInstance()->getModule('data');
| |
− | $data_module = cmsController::getInstance()->getModule('data');
| |
− | $data_module->saveEditedObjectWithIgnorePermissions($objectId, true, true);
| |
− | | |
− | $object->commit();
| |
− | | |
− | if ($eshop_module = cmsController::getInstance()->getModule('eshop')) {
| |
− | $eshop_module->discountCardSave($objectId);
| |
− | }
| |
− | | |
− | //Forming mail...
| |
− | 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 = cmsController::getInstance()->getCurrentDomain()->getCurrentHostName(),
| |
− | 'activate_link' => "http://" . $domain . $this->pre_lang . "/users/activate/" . $activationCode . "/",
| |
− | 'login' => $login,
| |
− | 'password' => $password,
| |
− | '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($email, $fio);
| |
− | $registrationMail->setFrom($email_from, $fio_from);
| |
− | $registrationMail->setSubject($mailSubject);
| |
− | $registrationMail->setContent($mailContent);
| |
− | $registrationMail->commit();
| |
− | $registrationMail->send();
| |
− | | |
− | $oEventPoint = new umiEventPoint("users_registrate");
| |
− | $oEventPoint->setMode("after");
| |
− | $oEventPoint->setParam("user_id", $objectId);
| |
− | $oEventPoint->setParam("login", $login);
| |
− | $this->setEventPoint($oEventPoint);
| |
− | | |
− | if ($without_act) {
| |
− | $this->redirect($this->pre_lang . "/users/registrate_done/?result=without_activation");
| |
− | }
| |
− | else {
| |
− | $this->redirect($this->pre_lang . "/users/registrate_done/");
| |
− | }
| |
− | | |
− | }
| |
− | </source>
| |
− | | |
− | Чтобы не дать возможности пользователю зарегистрировать каким-либо образом в качестве супервайзера, перед тем как записывать пользователя в базу добавим проверку на то, не является ли переданный id группы id группы супервайзеров. Если пользователь попытался зарегистрироваться супервайзером, его будет редиректить на главную страницу, а ,на указанную при регистрации почту, будет выслано письмо с предупреждением. Находим в коде строку комментария //Creating user... и после нее вставляем следующий код:
| |
− | | |
− | <source lang="php">
| |
− | $igroup = getRequest('group');
| |
− | $objects = umiObjectsCollection::getInstance();
| |
− | $SupervisorGroupId = $objects->getObjectIdByGUID('users-users-15');
| |
− | if ($igroup != $SupervisorGroupId){
| |
− | $group_id = $igroup;
| |
− | }
| |
− | else {
| |
− | $name = 'admin';
| |
− | $email = 'admin@adress.com';
| |
− | $recipient = $email;
| |
− | $mail_body = 'Зарегистрироваться супервайзером нельзя.';
| |
− | $subject = 'Даже не пытайтесь.';
| |
− | $header = "From: ". $name . " <" . $email . ">\r\n";
| |
− | mail($recipient, $subject, $mail_body, $header);
| |
− | $this->redirect('/');
| |
− | exit();
| |
− | }
| |
− | </source>
| |
− | | |
− | Теперь находим следующие строки:
| |
− | | |
− | <source lang="php">
| |
− | | |
− | $group_id = regedit::getInstance()->getVal("//modules/users/def_group");
| |
− | $object->setValue("groups", Array($group_id));
| |
− | | |
− | </source>
| |
− | | |
− | Первую строку удаляем, а вторую вырезаем и вставляем после этих строк:
| |
− | | |
− | | |
− | <source lang="php">
| |
− | | |
− | $object->setValue("register_date", umiDate::getCurrentTimeStamp());
| |
− | $object->setOwnerId($objectId);
| |
− | | |
− | </source>
| |
− | | |
− | | |
− | Теперь, осталось только изменить в шаблоне формы регистрации action на "%pre_lang%/users/registrate_do_custom/ и добавить permissions.custom.php в директорию класса users
| |
− | | |
− | [[Категория:Написание кастомных макросов]][[Категория:Модуль Пользователи]] | |
Актуально для версии 2.9.5
Описание
Одним из классов, который необходим для работы модуля "интернет-магазин" является класс customer.
Данный класс предоставляет доступ к управлению объектами-покупателями интернет-магазина.
Исходный код класса находится в файле classes\modules\emarket\classes\customer\customer.php
Переменные
В класса объявлены две переменные.
Переменная $defaultExpiration, которая будет использована при создании cookie для указания времени ее жизни
public static $defaultExpiration = 2678400; // 31 days
Переменная $isAuth будет хранить 1, если покупатель - авторизованный пользователь, 0 в противном случае
Методы
Получить экземпляр класса можно с помощью функции get(), если покупатель не существует, то метод создаст новый экземпляр класса
Параметры:
Результат: экземпляр класса customer
Экземпляр класса создается с помощью функции __construct()
Параметры:
iUmiObject $object:
содержит в себе либо объект "зарегистрированный пользователь" либо объект "незарегистрированный покупатель"
Результат: экземпляр класса customer
Метод isUser вернет значение типа boolean, 1 или 0, в зависимости от того является ли покупатель зарегистрированным пользователем
Параметры:
Результат: boolean