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