Отображение доставки в карточке товара


#1

Здравствуйте, на сайте включено 2 способа доставки, и где-то в настройках включена функция отображения стоимости доставки в карточке товара, и по умолчанию отображается вариант “Обсудить с менеджером”, как сделать, чтобы в карточке товара отображался по умолчанию стоимость доставки почтой россии?

выяснил только то, что за эту функциональность отвечает модуль “Карты и геолокация”
а шаблон, отвечающий за отображение стойомости находится по пути
/design/themes/responsive/templates/addons/geo_maps/views/geo_maps/shipping_estimation.tpl

похоже, что логика отображения стоимости находится в этом коде

                    {foreach $shippings_summary as $shipping_type => $shipping}
                    <div class="ty-geo-maps-shipping__item">
                        <div class="ty-geo-maps-shipping__label">
                            {strip}
                                <a class="cm-dialog-opener cm-dialog-auto-size ty-geo-maps-shipping__link" data-ca-target-id="geo_maps_shipping_methods_list_{$product_id}">
                                    {if $shipping_type == "pickup"}
                                        {include_ext file="common/icon.tpl" class="ty-icon-pointer"}
                                    {elseif $shipping_type == "courier"}
                                        {include_ext file="common/icon.tpl" class="ty-icon-courier"}
                                    {else}
                                        {include_ext file="common/icon.tpl" class="ty-icon-shipping"}
                                    {/if}
                                    <span class="ty-geo-maps-shipping__link-text">
                                        {__("geo_maps.shipping_group_`$shipping_type`")}
                                    </span>
                                </a>
                                {if $shipping.number_of_pickup_points}
                                    {__("geo_maps.from_pickup_points", [$shipping.number_of_pickup_points, "[shipping]" => $shipping.shipping])}
                                {/if}
                                <span class="ty-geo-maps-shipping__value-separator">:</span>
                            {/strip}
                        </div>
                        <div class="ty-geo-maps-shipping__value">
                            {if $shipping.delivery_time}
                                {__("geo_maps.shipping_about")}
                                {$shipping.delivery_time},
                            {/if}
                            {__("geo_maps.shipping_from")}
                            {include file="common/price.tpl" value=$shipping.rate class="ty-geo-maps-shipping__price"}
                        </div>
                    </div>
                {/foreach}

переменная $shipping.rate передается для отображения, но никак не пойму что заставляет выбрать вариант для отображения по умолчанию “обсудить с менеджером”, а не любой другой

проверил содержимое массива $shippings_summary из которого вытаскиваются стоймости доставки и в нем оказалось всего 1 элемент, видимо надо искать функции, которые его передают в шаблон…

Array

(
[delivery] => Array
(
[rate] => 0
[delivery_time] =>
)

)

нашел функцию, которая заполняет массив значением стоймости доставки
app/addons/geo_maps/Tygh/Addons/GeoMaps/ShippingEstimator.php

   protected static function prepareShippingsSummary($shipping_methods)
{
    $shippings_summary = (new Collection($shipping_methods))
        ->map(function ($shipping) use (&$shipping_methods) {
            $shipping_id = $shipping['shipping_id'];

            $type = $shipping_methods[$shipping_id]['type'] =
                self::isPickupShipping($shipping) ? ShippingGroupTypes::PICKUP : ShippingGroupTypes::DELIVERY;

            return [
                'rate'                    => $shipping['rate'],
                'type'                    => $type,
                'delivery_time'           => !empty($shipping['service_delivery_time']) ? $shipping['service_delivery_time'] : $shipping['delivery_time'],
                'number_of_pickup_points' => $shipping['number_of_pickup_points'],
            ];
        })
        ->groupBy('type')
        ->map(function ($group) {
            return $group->reduce(function ($group_summary, $shipping) {
                if (empty($group_summary) || $shipping['rate'] < $group_summary['rate']) {
                    $group_summary = [
                        'rate'          => $shipping['rate'],
                        'delivery_time' => $shipping['delivery_time'],
                    ];
                    if ($shipping['type'] == ShippingGroupTypes::PICKUP) {
                        $group_summary['number_of_pickup_points'] = $shipping['number_of_pickup_points'];
                    }
                }

                return $group_summary;
            }, []);
        })
        ->toArray();

    return [$shipping_methods, $shippings_summary];
}

вся магия происходит тут, стоймость как-то вытаскивается из какого-то массива (похоже на карту функций) и сразу же возвращается первый элемент

->map(function ($shipping) use (&$shipping_methods) {
            $shipping_id = $shipping['shipping_id'];

            $type = $shipping_methods[$shipping_id]['type'] =
                self::isPickupShipping($shipping) ? ShippingGroupTypes::PICKUP : ShippingGroupTypes::DELIVERY;

            return [
                'rate'                    => $shipping['rate'],
                'type'                    => $type,
                'delivery_time'           => !empty($shipping['service_delivery_time']) ? $shipping['service_delivery_time'] : $shipping['delivery_time'],
                'number_of_pickup_points' => $shipping['number_of_pickup_points'],
            ];

не пойму как туда вечно попадает вариант цены “обсудить с менеджером”
популярность доставок менял бесполезно…


выяснил только одну закономерность, стоймость берется из способа доставки по порядку значения “расчет тарифа”
%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%202022-08-17%20193307

т.е. получается если 5 способов доставки, то они все отсортируются согласно этому списку в порядке убывания и на сайте как раз отображается самый первый согласно этому списку т.е. “Обсудить с менеджером” т.к. у него в расчете тарифа используется значение “по адресу покупателя” а раз он находится выше других тарифов, то он и отображается в карточке товара первее всех, причем игнорирую популярность, настроенную в админке, может разработчик может это как-то исправить, а то у всех людей я заметил отображается по умолчанию вариант “обсудить с менеджером” и в основном там стоит цена 0р. и выглядит это странно и не понятно для посетителя сайта

может как-то можно по своему отсортировать этот список а то я не нашел где он хранится?


#2

Этот вариант самый дешёвый из списка.

В массиве $shippings_summary, как я понял, уже лежит самый дешёвый вариант из каждого типа доставки (курьер - courier, ПВЗ - pickup). У вас тип, похоже только один - ПВЗ, т.е. ни в одном способе доставки не стоит галка, что нужно обязательно указать адрес.


#3

пвз все выключены, галочки на обязательный адрес стоят во всех двух способах доставки.


#4

Если вы уберёте галку из способа доставки Обсудить с менеджером, то они разделятся на 2 типа в массиве $shippings_summary и в карточке товара выведутся 2 разных строки с суммой и сроком доставки.


#5

галочки такой не нашел, т.е. получается надо вообще убрать способ доставки “обсудить с менеджером”? это конечно сработает, но этот способ так же важен, правда после всех других способов доставки, только очень не удобно, что он идет в массиве всегда первым элементом…


#6

Я про эту галку
image


#7

все сработало, спасибо!
теперь это выглядит в карточке товара куда информативнее)


#8

Лично мне наоборот не нравится эта группировка. Она не отделяет почтовые доставки от курьерских (в обоих случаях нужно указывать адрес). Поэтому я сделал вывод только самого дешёвого способа доставки одной строкой. Но пришлось переписать хук