Вывод способов доставки в зависимости от домена — различия между версиями
Alelekov (обсуждение | вклад) |
Alelekov (обсуждение | вклад) |
||
(не показаны 4 промежуточные версии этого же участника) | |||
Строка 4: | Строка 4: | ||
==Решение== | ==Решение== | ||
Для любого типа шаблонизаторов подготовительные действия будут одинаковы. | Для любого типа шаблонизаторов подготовительные действия будут одинаковы. | ||
− | + | В модуле "Шаблоны данных" необходимо найти тип данных "Способ доставки" и добавить ему поле типа "Ссылка на домен" с идентификатором "domain". | |
− | |||
− | |||
− | |||
− | |||
===В XSLT-шаблонизаторе === | ===В XSLT-шаблонизаторе === | ||
Строка 36: | Строка 32: | ||
</source> | </source> | ||
− | ===PHP-шаблонизаторе=== | + | ===В PHP-шаблонизаторе=== |
В данном случае метод сравнения доменов будет немного сложнее. Всё так же - в файл '''classes/components/custom.php''' добавим следующий код: | В данном случае метод сравнения доменов будет немного сложнее. Всё так же - в файл '''classes/components/custom.php''' добавим следующий код: | ||
<source lang="php"> | <source lang="php"> | ||
− | function isCurrentDomainDelivery($ | + | public function isCurrentDomainDelivery($deliveryId) |
− | { | + | { |
− | $objectsCollection = umiObjectsCollection::getInstance(); | + | $objectsCollection = umiObjectsCollection::getInstance(); |
− | $ | + | $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(); | |
− | $ | ||
− | |||
− | |||
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" которых соответствует текущему домену.