Выбор группы пользователем из выпадающего списка при регистрации — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
Строка 1: Строка 1:
 
'''Актуально для версии 2.9.5'''
 
'''Актуально для версии 2.9.5'''
 +
 +
Данное решение рассмотрено на примере интернет-магазина "Современный", шаблон demodizzy.
  
 
== Задача ==
 
== Задача ==
Строка 31: Строка 33:
 
</source>
 
</source>
  
Теперь,
+
Теперь,идем в шаблон, по которому выводится форма регистрации(templates/demodizzy/xslt/modules/users/registration.xsl) и добавим туда вызов макроса:
 +
 
 +
<source lang="xml">
 +
 
 +
<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>
 +
 
 +
 
 
Находим файл /classes/modules/webforms/, полностью копируем оттуда метод send и вставляем в файл __custom.php, в этой же директории.  
 
Находим файл /classes/modules/webforms/, полностью копируем оттуда метод send и вставляем в файл __custom.php, в этой же директории.  
 
Переименуем его, например, в send_custom.
 
Переименуем его, например, в send_custom.

Версия 14:36, 31 января 2014

Актуально для версии 2.9.5

Данное решение рассмотрено на примере интернет-магазина "Современный", шаблон demodizzy.

Задача

Предположим, необходимо дать пользователю при регистрации возможность выбрать группу. Например, пользователь может зарегистрироваться как оптовый покупатель или розничный покупатель.

Решение

В первую очередь, необходимо написать кастомный макрос, который будет выбирать определенные группы пользователей для вывода их в выпадающем списке, так, чтобы в выборку не были включены группы "зарегистрированные пользователи" и "супервайзеры". Добавим в модуле шаблоны данных для типа "группы пользователей" поле типа чекбокс с названием, например, "для регистрации" и отметим в модуле пользователи этот чекбокс у необходимых групп.

Открываем файл /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);
}

Теперь,идем в шаблон, по которому выводится форма регистрации(templates/demodizzy/xslt/modules/users/registration.xsl) и добавим туда вызов макроса:

<div>
     <label class="required">
         <span>
	      <xsl:text>группа:</xsl:text>
	</span>
	<xsl:apply-templates select="document('udata://users/selected_groups/')/udata" />
     </label>
</div>

и шаблон обработки результатов, который будет выводить выбранные группы в выпадающем списке:

<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>


Находим файл /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