Выбор группы пользователем из выпадающего списка при регистрации
Актуально для версии 2.9.5
Задача
Предположим, необходимо дать пользователю при регистрации возможность выбрать группу. Например, пользователь может зарегистрироваться как оптовый покупатель или розничный покупатель.
Решение
В первую очередь, необходимо написать кастомный макрос, который будет выбирать определенные группы пользователей для вывода их в выпадающем списке, так, чтобы в выборку не были включены группы "зарегистрированные пользователи" и "супервайзеры". Добавим в модуле шаблоны данных для типа "группы пользователей" поле типа чекбокс с названием, например, "для регистрации" и отметим в модуле пользователи этот чекбокс у необходимых групп.
Открываем файл /classes/modules/users/_custom.php и вставляем туда следующий метод:
public function selected_groups($template = 'default'){
$groups = new selector('objects');
$groups->types('object-type')->id('36');
$groups->where('for_registration')->equals('1');
list($itemsTemplate, $itemTemplate) = def_module::loadTemplates("users/{$template}", "items", "item");
$item = array();
$items = array();
foreach($groups as $group){
$item['attribute:id'] = $group->getId();
$item['attribute:name'] = $group->getValue('nazvanie');
$items[] = def_module::parseTemplate($itemTemplate, $item);
}
$items = array('subnodes:items' => $items);
return def_module::parseTemplate($itemsTemplate, $items);
}
Теперь, Находим файл /classes/modules/webforms/, полностью копируем оттуда метод send и вставляем в файл __custom.php, в этой же директории. Переименуем его, например, в send_custom. Начальный код метода:
public function send_custom() {
// Check captcha to know we should do anything
if (isset($_REQUEST['captcha'])) {
$_SESSION['user_captcha'] = md5((int) $_REQUEST['captcha']);
}
if (!umiCaptcha::checkCaptcha()) {
$this->errorNewMessage("%errors_wrong_captcha%");
$this->errorPanic();
}
if (defined('CURRENT_VERSION_LINE') && CURRENT_VERSION_LINE=='demo') {
$url = getRequest('ref_onsuccess');
if (!$url) $url = $this->pre_lang . "/webforms/posted/";
$this->redirect($url);
}
//-------------------------------------------------------------------
// Get necessary data
$sMsgBody = '';
$oTypes = umiObjectTypesCollection::getInstance();
$iBaseTypeId = $oTypes->getBaseType("webforms", "form");
$iFormTypeId = getRequest('system_form_id');
$sSenderIP = getServer('REMOTE_ADDR');
$iTime = new umiDate( time() );
$aAddresses = getRequest('system_email_to');
if(!is_array($aAddresses)) $aAddresses = array($aAddresses);
$aRecipients = array();
foreach($aAddresses as $address){
$sEmailTo = $this->guessAddressValue($address);
$sAddress = $this->guessAddressName($address);
$aRecipients[] = array('email'=>$sEmailTo, 'name'=>$sAddress);
}
if(!$oTypes->isExists($iFormTypeId) || $oTypes->getParentClassId($iFormTypeId) != $iBaseTypeId) {
$this->errorNewMessage("%wrong_form_type%");
$this->errorPanic();
}//
if(($ef = $this->checkRequiredFields($iFormTypeId)) !== true) {
$this->errorNewMessage(getLabel('error-required_list').$this->assembleErrorFields($ef));
}
//-------------------------------------------------------------------
// Saving message and preparing it for sending
$_REQUEST['data']['new']['sender_ip'] = $sSenderIP; // Hack for saving files-only-forms
$oObjectsCollection = umiObjectsCollection::getInstance();
$iObjectId = $oObjectsCollection->addObject($sAddress, $iFormTypeId);
cmsController::getInstance()->getModule('data')->saveEditedObject($iObjectId, true);
$oObject = $oObjectsCollection->getObject($iObjectId);
$oObject->setValue('destination_address', $sEmailTo);
$oObject->setValue('sender_ip', $sSenderIP);
$oObject->setValue('sending_time', $iTime);
$aMessage = $this->formatMessage($iObjectId, true);
//--------------------------------------------------------------------
// Make an e-mail
$oMail = new umiMail();
//--------------------------------------------------------------------
// Determine file fields
$aFTypes = array('file', 'img_file', 'swf_file');
$aFields = $oTypes->getType($oObject->getTypeId())->getAllFields();
$aFileFields = array();
foreach($aFields as $oField) {
$oType = $oField->getFieldType();
if(in_array($oType->getDataType(), $aFTypes)) {
$oFile = $oObject->getValue($oField->getName());
if($oFile instanceof umiFile) {
$oMail->attachFile($oFile);
} /*else {
$this->errorNewMessage("%errors_wrong_file_type%");
$this->errorPanic();
}*/
}
}
$recpCount = 0;
foreach($aRecipients as $recipient) {
foreach(explode(',', $recipient['email']) as $sAddress) {
if(strlen(trim($sAddress))) {
$oMail->addRecipient( trim($sAddress), $recipient['name'] );
$recpCount++;
}
}
}
if(!$recpCount) {
$this->errorNewMessage(getLabel('error-no_recipients'));
}
$oMail->setFrom($aMessage['from_email_template'], $aMessage['from_template']);
$oMail->setSubject($aMessage['subject_template']);
$oMail->setContent($aMessage['master_template']);
$oMail->commit();
$oMail->send();
//--------------------------------------------------------------------
// Send autoreply if should
if(strlen($aMessage['autoreply_template'])) {
$oMailReply = new umiMail();
$oMailReply->addRecipient( $aMessage['from_email_template'], $aMessage['from_template'] );
$oMailReply->setFrom($aMessage['autoreply_from_email_template'], $aMessage['autoreply_from_template']);
$oMailReply->setSubject($aMessage['autoreply_subject_template']);
$oMailReply->setContent($aMessage['autoreply_template']);
$oMailReply->commit();
$oMailReply->send();
}
//--------------------------------------------------------------------
// Process events
$oEventPoint = new umiEventPoint("webforms_post");
$oEventPoint->setMode("after");
$oEventPoint->setParam("email", $aMessage['from_email_template']);
$oEventPoint->setParam("message_id", $iObjectId);
$oEventPoint->setParam("form_id", $iFormTypeId);
$oEventPoint->setParam("fio", $aMessage['from_template']);
$this->setEventPoint($oEventPoint);
//--------------------------------------------------------------------
// Redirecting
$sRedirect = getRequest('ref_onsuccess');
if($sRedirect) $this->redirect($sRedirect);
//--------------------------------------------------------------------
// Or showing the message
$sTemplateName = getRequest('system_template');
if($sTemplateName) {
list($sSuccessString) = def_module::loadTemplates("data/reflection/".$sTemplateName, "send_successed");
if(strlen($sSuccessString)) return $sSuccessString;
}
//--------------------------------------------------------------------
// If we're still here
if(isset($_SERVER['HTTP_REFERER'])) $this->redirect($_SERVER['HTTP_REFERER']);
return '';
}
Так как на сайте может использоваться много форм, а нам необходимо, чтобы адреса менялись только у одной, добавим проверку на принадлежность сообщения к форме после строки:
$iTime = new umiDate( time() );
Если идентификатор формы обратной связи тот, который необходим, то, далее метод проверяет значение поля и, в зависимости от значения, выбирает нужный адрес и получателя:
if($iFormTypeId=='id_формы_обратной_связи'){
$apteca = $_REQUEST['data']['new']['идентификатор_поля_выпадающего_списка'];
if($value=='id_позиции в справочнике'){
$AdressObject = umiObjectsCollection::getObject('id_объекта_список_адресов');
$sEmailTo=$AdressObject->getValue('address_list');
$sAddress=$AdressObject->getName();
trim($sEmailTo);
}
else if($value=='id_позиции в справочнике'){
$AdressObject = umiObjectsCollection::getObject('id_объекта_список_адресов');
$sEmailTo=$AdressObject->getValue('address_list');
$sAddress=$AdressObject->getName();
trim($sEmailTo);
}
......//продолжите, если необходимо
}
Стандартное получение адреса заключим в else{}:
else{
$aAddresses = getRequest('system_email_to');
if(!is_array($aAddresses)) $aAddresses = array($aAddresses);
$aRecipients = array();
foreach($aAddresses as $address){
$sEmailTo = $this->guessAddressValue($address);
$sAddress = $this->guessAddressName($address);
$aRecipients[] = array('email'=>$sEmailTo, 'name'=>$sAddress);
}
}
Далее, добавим проверку на то, каким образом мы получаем адрес, и смену адреса, в случае, если сообщение отправлено с "нужной" формы, после строки:
$recpCount = 0;
Проверка:
if (isset($aRecipients)){
foreach($aRecipients as $recipient) {
foreach(explode(',', $recipient['email']) as $sAddress) {
if(strlen(trim($sAddress))) {
$oMail->addRecipient( trim($sAddress), $recipient['name'] );
$recpCount++;
}
}
}
}
else{
$oMail->addRecipient( $sEmailTo, $sAddress );
if(!empty($sEmailTo)){
$recpCount++;
}
}
Теперь, осталось только изменить в шаблоне формы обратной связи action на "%pre_lang%/webforms/send_custom/ и добавить permissions.custom.php в директорию класса webforms