Вывод способов доставки в зависимости от домена

Материал из Umicms
Версия от 08:39, 27 июня 2019; Alelekov (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к:навигация, поиск

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

Задача

В мультисайтовой системе выводить способы доставки при оформлении заказа в зависимости от домена.

Решение

Для любого типа шаблонизаторов подготовительные действия будут одинаковы. В модуле "Шаблоны данных" необходимо найти тип данных "Способ доставки" и добавить ему поле типа "Ссылка на домен" с идентификатором "domain".

В XSLT-шаблонизаторе

Для облегчения жизни создадим в файле classes/components/custom.php следующий метод:

public function domain() {
	return $_SERVER["HTTP_HOST"];
}

Этот макрос будет просто возвращать текущий домен. Идём модуль "Интернет магазин"и на вкладке "Доставка" редактируем созданное поле "domain" в соответствии с потребностями. После проделанных подготовительных операций, можно приступить непосредственно к XSLT шаблону. Открываем шаблон в котором выводится список способов доставки и обрамляем вывод способа доставки в условие (в demodizzy данный код находится в файле /xsltTpls/modules/emarket/purchase/delivery.xsl).

<xsl:if test="document('udata://custom/domain')=document(concat('uobject://',@id,'.domen'))/udata/property/value/item/@name " >
		<div>
			<label>
				<input type="radio" name="delivery-id" value="{@id}">
					<xsl:apply-templates select="." mode="delivery-choose-first" />
				</input>
				<xsl:value-of select="@name" />
				
				<xsl:call-template  name="delivery-price" >
					<xsl:with-param name="price" select="$delivery-price"/>
				</xsl:call-template >
			</label>
		</div>
</xsl:if>

В PHP-шаблонизаторе

В данном случае метод сравнения доменов будет немного сложнее. Всё так же - в файл classes/components/custom.php добавим следующий код:

public function isCurrentDomainDelivery($deliveryId)
{					
	$objectsCollection = umiObjectsCollection::getInstance();			
	$deliveryObject = $objectsCollection->getObject($deliveryId);			
	$domains = domainsCollection::getInstance();
			
	$host = $_SERVER["HTTP_HOST"];
	$currentDomainObject = $domains->getDomainByHost($host);				
			
	$deliveryDomainId = $deliveryObject->getValue('domain');			
	$deliveryDomainObject = $domains->getDomain($deliveryDomainId);												
	// Если у доставки не заполнен "Домен" - она доступна для всех доменов
	if(!$deliveryDomainObject)
	{
		return true;
	}			
			
	$currentDomain = $currentDomainObject->getHost();	
	$deliveryDomain = $deliveryDomainObject->getHost();						
			
	return $currentDomain === $deliveryDomain;
}

Осталось только отредактировать шаблон вывода способов доставки. Следующие действия делаем на примере шаблона Demomarket. В файле templates/demomarket/php/emarket/delivery/choose/list.phtml происходит вывод способов доставки. Добавим в уже имеющийся там код проверку домена, указанного в способе доставки, используя написанный нами метод. Итоговый код в файле будет вот таким:

<?php foreach ($deliveryList as $delivery): ?>	
	<? if ($this->macros('custom', 'isCurrentDomainDelivery', $delivery)): ?>
		<?php if ($this->isApiShipDelivery($delivery)): ?>
			<?= $this->render($delivery, 'emarket/delivery/choose/apiship') ?>
		<?php else: ?>	
			<?= $this->render($delivery, 'emarket/delivery/choose/item') ?>
		<?php endif; ?>
	<? endif; ?>
<?php endforeach; ?>

Итог

Теперь при оформлении доставки, на этапе выбора способа доставки будут показаны те способы, поле "domain" которых соответствует текущему домену.