Вывод способов доставки в зависимости от домена — различия между версиями
Davidov (обсуждение | вклад) |
Alelekov (обсуждение | вклад) |
||
(не показано 7 промежуточных версий 2 участников) | |||
Строка 1: | Строка 1: | ||
− | + | '''Актуально для версии 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]][[Категория:Написание кастомных макросов]][[Категория:Модуль Интернет магазин]] |
Текущая версия на 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" которых соответствует текущему домену.