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

Материал из Umicms
Перейти к:навигация, поиск
Строка 1: Строка 1:
'''Актуально для версии 2.9'''
+
'''Актуально для версии 20'''
 +
==Задача==
 +
В мультисайтовой системе выводить способы доставки при оформлении заказа в зависимости от домена.
 +
==Решение==
 +
Для любого типа шаблонизаторов подготовительные действия будут одинаковы.
 +
<ol>
 +
<li>В модуле "Шаблоны данных" создаём справочник "Домены для доставки", в котором указываем все домены в нашей системе.</li>
 +
<li>В модуле "Шаблоны данных" находим тип "Способ доставки" и добавляем ему поле типа "Выпадающий список" с идентификатором "domain".Устанавливаем для поля справочник, который мы создали в предыдущем пункте.</li>
 +
<li>Заполнить у всех способов доставки появившееся поле</li>
 +
</ol>
  
Иногда может возникнуть ситуация, когда в мультисайтовой системе требуется выводить разный список способов доставки при оформлении заказа в зависимости от домена. При использовании XSLT шаблонизатора, задача решается довольно просто. Для начала стоит произвести некоторые приготовления. Идём в модуль "Шаблоны данных" находим тип "Способ доставки" и добавляем ему поле типа "Выпадающий список" с идентификатором domain. В качестве справочника для этого списка нужно выбрать созданный заранее справочник в котором перечислены домены. Теперь для облегчения задачи можно написать простой кастом с примерно следующим кодом:
+
===В XSLT-шаблонизаторе ===
 +
Для облегчения жизни создадим в файле '''classes/components/custom.php''' следующий метод:
 
<source lang='php'>
 
<source lang='php'>
 
public function domain() {
 
public function domain() {
Строка 25: Строка 35:
 
</xsl:if>
 
</xsl:if>
 
</source>
 
</source>
 +
 +
===PHP-шаблонизаторе===
 +
В данном случае метод сравнения доменов будет немного сложнее. Всё так же - в файл '''classes/components/custom.php''' добавим следующий код:
 +
<source lang="php">
 +
function isCurrentDomainDelivery($delivery)
 +
{
 +
$objectsCollection = umiObjectsCollection::getInstance();
 +
$delivery = $objectsCollection->getObject($delivery['id']);
 +
 +
$domains = domainsCollection::getInstance();
 +
 +
$host = $_SERVER["HTTP_HOST"];
 +
$currentDomainObject = $domains->getDomainByHost($host);
 +
$currentDomain = $currentDomainObject->getHost();
 +
 +
$deliveryDomainId = $delivery->getValue('domain');
 +
$object = $objectsCollection->getObject($deliveryDomainId);
 +
$deliveryDomain = $object->name;
 +
 +
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]][[Категория:Написание кастомных макросов]][[Категория:Модуль Интернет магазин]]

Версия 16:01, 26 июня 2019

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

Задача

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

Решение

Для любого типа шаблонизаторов подготовительные действия будут одинаковы.

  1. В модуле "Шаблоны данных" создаём справочник "Домены для доставки", в котором указываем все домены в нашей системе.
  2. В модуле "Шаблоны данных" находим тип "Способ доставки" и добавляем ему поле типа "Выпадающий список" с идентификатором "domain".Устанавливаем для поля справочник, который мы создали в предыдущем пункте.
  3. Заполнить у всех способов доставки появившееся поле

В 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 добавим следующий код:

function isCurrentDomainDelivery($delivery)
{			
	$objectsCollection = umiObjectsCollection::getInstance();
	$delivery = $objectsCollection->getObject($delivery['id']);	

	$domains = domainsCollection::getInstance();
		
	$host = $_SERVER["HTTP_HOST"];
	$currentDomainObject = $domains->getDomainByHost($host);	
	$currentDomain = $currentDomainObject->getHost();	
			
	$deliveryDomainId = $delivery->getValue('domain');
	$object = $objectsCollection->getObject($deliveryDomainId);
	$deliveryDomain = $object->name;
			
	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" которых соответствует текущему домену.