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

Материал из Umicms
Перейти к:навигация, поиск
 
(не показаны 4 промежуточные версии этого же участника)
Строка 4: Строка 4:
 
==Решение==
 
==Решение==
 
Для любого типа шаблонизаторов подготовительные действия будут одинаковы.  
 
Для любого типа шаблонизаторов подготовительные действия будут одинаковы.  
<ol>
+
В модуле "Шаблоны данных" необходимо найти тип данных "Способ доставки" и добавить ему поле типа "Ссылка на домен" с идентификатором "domain".
<li>В модуле "Шаблоны данных" создаём справочник "Домены для доставки", в котором указываем все домены в нашей системе.</li>
 
<li>В модуле "Шаблоны данных" находим тип "Способ доставки" и добавляем ему поле типа "Выпадающий список" с идентификатором "domain".Устанавливаем для поля справочник, который мы создали в предыдущем пункте.</li>
 
<li>Заполнить у всех способов доставки появившееся поле</li>
 
</ol>
 
  
 
===В XSLT-шаблонизаторе ===
 
===В XSLT-шаблонизаторе ===
Строка 36: Строка 32:
 
</source>
 
</source>
  
===PHP-шаблонизаторе===
+
===В PHP-шаблонизаторе===
 
В данном случае метод сравнения доменов будет немного сложнее. Всё так же - в файл '''classes/components/custom.php''' добавим следующий код:
 
В данном случае метод сравнения доменов будет немного сложнее. Всё так же - в файл '''classes/components/custom.php''' добавим следующий код:
 
<source lang="php">
 
<source lang="php">
function isCurrentDomainDelivery($delivery)
+
public function isCurrentDomainDelivery($deliveryId)
{
+
{
$objectsCollection = umiObjectsCollection::getInstance();
+
$objectsCollection = umiObjectsCollection::getInstance();
$delivery = $objectsCollection->getObject($delivery['id']);
+
$deliveryObject = $objectsCollection->getObject($deliveryId);
 
 
 
$domains = domainsCollection::getInstance();
 
$domains = domainsCollection::getInstance();
+
 
$host = $_SERVER["HTTP_HOST"];
 
$host = $_SERVER["HTTP_HOST"];
$currentDomainObject = $domains->getDomainByHost($host);
+
$currentDomainObject = $domains->getDomainByHost($host);
 +
 +
$deliveryDomainId = $deliveryObject->getValue('domain');
 +
$deliveryDomainObject = $domains->getDomain($deliveryDomainId);
 +
// Если у доставки не заполнен "Домен" - она доступна для всех доменов
 +
if(!$deliveryDomainObject)
 +
{
 +
return true;
 +
}
 +
 
$currentDomain = $currentDomainObject->getHost();
 
$currentDomain = $currentDomainObject->getHost();
+
$deliveryDomain = $deliveryDomainObject->getHost();
$deliveryDomainId = $delivery->getValue('domain');
 
$object = $objectsCollection->getObject($deliveryDomainId);
 
$deliveryDomain = $object->name;
 
 
 
 
return $currentDomain === $deliveryDomain;
 
return $currentDomain === $deliveryDomain;

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