Вывод способов доставки в зависимости от домена — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
 
(не показано 6 промежуточных версий 2 участников)
Строка 1: Строка 1:
Иногда может возникнуть ситуация, когда в мультисайтовой системе требуется выводить разный список способов доставки при оформлении заказа в зависимости от домена. При использовании XSLT шаблонизатора, задача решается довольно просто. Для начала стоит произвести некоторые приготовления. Идём в модуль "Шаблоны данных" находим тип "Способ доставки" и добавляем ему поле типа "Выпадающий список" с идентификатором domain. В качестве справочника для этого списка нужно выбрать созданный заранее справочник в котором перечислены домены. Теперь для облегчения задачи можно написать простой кастом с примерно следующим кодом:
+
'''Актуально для версии 20'''
 +
==Задача==
 +
В мультисайтовой системе выводить способы доставки при оформлении заказа в зависимости от домена.
 +
==Решение==
 +
Для любого типа шаблонизаторов подготовительные действия будут одинаковы.  
 +
В модуле "Шаблоны данных" необходимо найти тип данных "Способ доставки" и добавить ему поле типа "Ссылка на домен" с идентификатором "domain".
 +
 
 +
===В XSLT-шаблонизаторе ===
 +
Для облегчения жизни создадим в файле '''classes/components/custom.php''' следующий метод:
 
<source lang='php'>
 
<source lang='php'>
 
public function domain() {
 
public function domain() {
Строка 23: Строка 31:
 
</xsl:if>
 
</xsl:if>
 
</source>
 
</source>
 +
 +
===В PHP-шаблонизаторе===
 +
В данном случае метод сравнения доменов будет немного сложнее. Всё так же - в файл '''classes/components/custom.php''' добавим следующий код:
 +
<source lang="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;
 +
}
 +
</source>
 +
</li>
 +
Осталось только отредактировать шаблон вывода способов доставки. Следующие действия делаем на примере шаблона Demomarket.
 +
В файле '''templates/demomarket/php/emarket/delivery/choose/list.phtml''' происходит вывод способов доставки. Добавим в уже имеющийся там код проверку домена, указанного в способе доставки, используя написанный нами метод. Итоговый код в файле будет вот таким:
 +
<source lang="php">
 +
<?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; ?>
 +
</source>
 +
 +
== Итог ==
 
Теперь при оформлении доставки, на этапе выбора способа доставки будут показаны те способы, поле "domain" которых соответствует текущему домену.
 
Теперь при оформлении доставки, на этапе выбора способа доставки будут показаны те способы, поле "domain" которых соответствует текущему домену.
[[Категория:Верстка в XSLT]]
+
[[Категория:Верстка в XSLT]][[Категория:Написание кастомных макросов]][[Категория:Модуль Интернет магазин]]

Текущая версия на 08:39, 27 июня 2019

Актуально для версии 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" которых соответствует текущему домену.