Вывод способов доставки в зависимости от домена — различия между версиями
Mad grant (обсуждение | вклад) |
Alelekov (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
− | '''Актуально для версии | + | '''Актуально для версии 20''' |
+ | ==Задача== | ||
+ | В мультисайтовой системе выводить способы доставки при оформлении заказа в зависимости от домена. | ||
+ | ==Решение== | ||
+ | Для любого типа шаблонизаторов подготовительные действия будут одинаковы. | ||
+ | <ol> | ||
+ | <li>В модуле "Шаблоны данных" создаём справочник "Домены для доставки", в котором указываем все домены в нашей системе.</li> | ||
+ | <li>В модуле "Шаблоны данных" находим тип "Способ доставки" и добавляем ему поле типа "Выпадающий список" с идентификатором "domain".Устанавливаем для поля справочник, который мы создали в предыдущем пункте.</li> | ||
+ | <li>Заполнить у всех способов доставки появившееся поле</li> | ||
+ | </ol> | ||
− | + | ===В 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
Задача
В мультисайтовой системе выводить способы доставки при оформлении заказа в зависимости от домена.
Решение
Для любого типа шаблонизаторов подготовительные действия будут одинаковы.
- В модуле "Шаблоны данных" создаём справочник "Домены для доставки", в котором указываем все домены в нашей системе.
- В модуле "Шаблоны данных" находим тип "Способ доставки" и добавляем ему поле типа "Выпадающий список" с идентификатором "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" которых соответствует текущему домену.