Тема: Вывести название основной комплектации в карточке товара

Проблема с отображением размера обуви при выгрузке из 1С. Если размеров хотя бы два, то всё отображается правильно, а если один, то показывается только артикул и модель без размера. Я так понимаю, что в шаблоне нужно что-то подправить, чтобы даже если комплектация одна, то всё равно должна отображаться.
https://demo.obuv-it.ru/12.jpg
https://demo.obuv-it.ru/112.jpg
https://demo.obuv-it.ru/1142.jpg

Повысить оценку Понизить оценку

Re: Вывести название основной комплектации в карточке товара

Если у Вас комплектация всего одна и ещё не будет, то нулевая комплектация это и есть товар. Мы ожидаем что для простого товара размер должен быть указан в свойствах 1С. Тогда у нас он попадет в характеристики. Также можно как вариант размер писать в названии товара.
У вас для нулевой комплектации размеры прописаны? Ато на скрине не видно.

3 Отредактировано Роман (24.05.2019 13:39:01)

Re: Вывести название основной комплектации в карточке товара

Размер - это характеристика в 1С. Размер попадает в комплектации, а не характеристики сайта. Дополнительные реквизиты 1с попадают в характеристики сайта. Не путайте - о каких свойствах вы говорите?
Для нулевой комплектации размер прописан (указан в скобках названия основной комплектации)
В шаблоне product_offers.tpl где-то идёт проверка и если одна комплектация, то она не пишется. Что подправить, чтобы отображалось название основной комплектации?
Размеры были, но проданы. Как вариант можно выгружать нулевые остатки, но тогда выпадает длинный список отсутствующих размеров и это тоже не есть хорошо.

Писать размер в названии 1000 позиций вручную не хотелось бы - смысл выгрузки из 1с пропадает

Повысить оценку Понизить оценку

4 Отредактировано Закусило Александр (27.05.2019 19:49:33)

Re: Вывести название основной комплектации в карточке товара

Размер - это характеристика в 1С. Размер попадает в комплектации, а не характеристики сайта. Дополнительные реквизиты 1с попадают в характеристики сайта. Не путайте - о каких свойствах вы говорите?
----
Я говорю о свойствах. Отличие от характеристик в комплектациях в том, что они распространяются на весь товар и уходит это значение всему товару.
Судя из описания я так понял, что вы вообще не показываете других комлпектаций, которых нет в наличии. У нас сценарий прописан иначе, мы ожидаем, что если размеры есть, то мы их ожидаем в товаре, хоть их может и не быть в наличии.

Я думаю, что раз Вы другие скрываете, то у комплектаций в наличии можно, получить характеристики комплектации через подмассив объекта offer propsdata_arr.

Посмотрите, что у Вас в $offer.propsdata_arr через

<pre>{var_dump($offer.propsdata_arr)}</pre>

. Названия комплектациям нужны, т.к. в нашей системе используется в большинстве случаев для вывода именно название.

Т.е. получаете все комплектации проверяете у них значение num поля. И если у Вас комплектация всего одна, то можно извлечь значение через propsdata_arr

Re: Вывести название основной комплектации в карточке товара

Александр Здравствуйте!
Подскажите пожалуйста поподробнее.
Хочу вывести одну простую комплектацию с условием:
Если простых комплектаций больше одной - вывести стандартно.
Или
Если простая комплектация одна - вывести ее название.

В шаблоне product.tpl подгружается через этот блок шаблон product_offers.tpl:
<div class="page-product_offers">
  {hook name="catalog-product:offers" title="{t}Карточка товара:комплектации{/t}"}
    {include "%catalog%/product_offers.tpl"}
  {/hook}
</div>

Повысить оценку Понизить оценку

Re: Вывести название основной комплектации в карточке товара

{elseif $product->isOffersUse()}
    {* Простые комплектации *}
    <div class="product-offers new_checkbox">
        <span class="product-offers_pname">{$product.offer_caption|default:t('Выберите вариант')}</span>
        <div class="product-offers_values">
            {if count($product.offers.items)>4}
                {* Если комплектаций много, то отобразим их в виде списка *}
                <select class='select' name="offer" style="margin-bottom: 10px;">
                    {foreach from=$product.offers.items key=key item=offer name=offers}
                        <option value="{$key}" {if $offer.num <= 0}class="nullComplects"{/if}{if $smarty.foreach.offers.first}checked{/if} data-num="{$offer.num}" {if $catalog_config.use_offer_unit}data-unit="{$offer->getUnit()->stitle}"{/if} data-change-cost='{ ".offerBarcode": "{$offer.barcode|default:$product.barcode}", ".myCost": "{$product->getCost(null, $key)}", ".lastPrice": "{$product->getOldCost($key)}", ".Cost-general": "{$product->getCost('Цена продажи', $key)}"}' data-images='{$offer->getPhotosJson()}' data-offer-id='{$offer.id}' data-sticks='{$offer->getStickJson()}'>{$offer.title}</option>
                    {/foreach}
                </select>
            {else}
                {* Если комплектаци мало, то отобразим их в виде радиокнопок *}
                {foreach $product.offers.items as $key => $offer}
                    <div class="product-offers_item">
                        <input value="{$key}" type="radio" name="offer" {if $offer@first}checked{/if} id="offer_{$key}" data-num="{$offer.num}" {if $catalog_config.use_offer_unit}data-unit="{$offer->getUnit()->stitle}"{/if} data-change-cost='{ ".offerBarcode": "{$offer.barcode|default:$product.barcode}", ".myCost": "{$product->getCost(null, $key)}", ".lastPrice": "{$product->getOldCost($key)}", ".Cost-general": "{$product->getCost('Цена продажи', $key)}"}' data-images='{$offer->getPhotosJson()}' data-offer-id='{$offer.id}' data-sticks='{$offer->getStickJson()}'>
                        <label {if $offer.num <= 0}class="nullComplects"{/if} for="offer_{$key}">{$offer.title}</label>
                    </div>
                {/foreach}
            {/if}
        </div>
    </div>
{/if}

Повысить оценку Понизить оценку

Re: Вывести название основной комплектации в карточке товара

Попробовал так, даже не знаю верно или нет.

{elseif $product->isOffersUse()}
    {* Простые комплектации *}
    <div class="product-offers new_checkbox">
        <span class="product-offers_pname">{$product.offer_caption|default:t('Выберите вариант')}</span>
        <div class="product-offers_values">
            {if count($product.offers.items)>4}
                {* Если комплектаций много, то отобразим их в виде списка *}
                <select class='select' name="offer" style="margin-bottom: 10px;">
                    {foreach from=$product.offers.items key=key item=offer name=offers}
                        <option value="{$key}" {if $offer.num <= 0}class="nullComplects"{/if}{if $smarty.foreach.offers.first}checked{/if} data-num="{$offer.num}" {if $catalog_config.use_offer_unit}data-unit="{$offer->getUnit()->stitle}"{/if} data-change-cost='{ ".offerBarcode": "{$offer.barcode|default:$product.barcode}", ".myCost": "{$product->getCost(null, $key)}", ".lastPrice": "{$product->getOldCost($key)}", ".Cost-general": "{$product->getCost('Цена продажи', $key)}"}' data-images='{$offer->getPhotosJson()}' data-offer-id='{$offer.id}' data-sticks='{$offer->getStickJson()}'>{$offer.title}</option>
                    {/foreach}
                </select>
            {else}
                {* Если комплектаци мало, то отобразим их в виде радиокнопок *}
                {foreach $product.offers.items as $key => $offer}
                    <div class="product-offers_item">
                        <input value="{$key}" type="radio" name="offer" {if $offer@first}checked{/if} id="offer_{$key}" data-num="{$offer.num}" {if $catalog_config.use_offer_unit}data-unit="{$offer->getUnit()->stitle}"{/if} data-change-cost='{ ".offerBarcode": "{$offer.barcode|default:$product.barcode}", ".myCost": "{$product->getCost(null, $key)}", ".lastPrice": "{$product->getOldCost($key)}", ".Cost-general": "{$product->getCost('Цена продажи', $key)}"}' data-images='{$offer->getPhotosJson()}' data-offer-id='{$offer.id}' data-sticks='{$offer->getStickJson()}'>
                        <label {if $offer.num <= 0}class="nullComplects"{/if} for="offer_{$key}">{$offer.title}</label>
                    </div>
                {/foreach}
            {/if}
        </div>
    </div>
    {else}
    {foreach $product.offers.items as $key => $offer}
      <div class="product-offers new_checkbox">
          <span class="product-offers_pname">{t}Модификация:{/t}</span>
          <div class="product-offers_item">
            <label for="offer_{$key}">{$offer.title}</label>
          </div>
      </div>
    {/foreach}
{/if}

Повысить оценку +1 Понизить оценку

8

Re: Вывести название основной комплектации в карточке товара

Владимир пишет:

Попробовал так, даже не знаю верно или нет.

{elseif $product->isOffersUse()}
    {* Простые комплектации *}
    <div class="product-offers new_checkbox">
        <span class="product-offers_pname">{$product.offer_caption|default:t('Выберите вариант')}</span>
        <div class="product-offers_values">
            {if count($product.offers.items)>4}
                {* Если комплектаций много, то отобразим их в виде списка *}
                <select class='select' name="offer" style="margin-bottom: 10px;">
                    {foreach from=$product.offers.items key=key item=offer name=offers}
                        <option value="{$key}" {if $offer.num <= 0}class="nullComplects"{/if}{if $smarty.foreach.offers.first}checked{/if} data-num="{$offer.num}" {if $catalog_config.use_offer_unit}data-unit="{$offer->getUnit()->stitle}"{/if} data-change-cost='{ ".offerBarcode": "{$offer.barcode|default:$product.barcode}", ".myCost": "{$product->getCost(null, $key)}", ".lastPrice": "{$product->getOldCost($key)}", ".Cost-general": "{$product->getCost('Цена продажи', $key)}"}' data-images='{$offer->getPhotosJson()}' data-offer-id='{$offer.id}' data-sticks='{$offer->getStickJson()}'>{$offer.title}</option>
                    {/foreach}
                </select>
            {else}
                {* Если комплектаци мало, то отобразим их в виде радиокнопок *}
                {foreach $product.offers.items as $key => $offer}
                    <div class="product-offers_item">
                        <input value="{$key}" type="radio" name="offer" {if $offer@first}checked{/if} id="offer_{$key}" data-num="{$offer.num}" {if $catalog_config.use_offer_unit}data-unit="{$offer->getUnit()->stitle}"{/if} data-change-cost='{ ".offerBarcode": "{$offer.barcode|default:$product.barcode}", ".myCost": "{$product->getCost(null, $key)}", ".lastPrice": "{$product->getOldCost($key)}", ".Cost-general": "{$product->getCost('Цена продажи', $key)}"}' data-images='{$offer->getPhotosJson()}' data-offer-id='{$offer.id}' data-sticks='{$offer->getStickJson()}'>
                        <label {if $offer.num <= 0}class="nullComplects"{/if} for="offer_{$key}">{$offer.title}</label>
                    </div>
                {/foreach}
            {/if}
        </div>
    </div>
    {else}
    {foreach $product.offers.items as $key => $offer}
      <div class="product-offers new_checkbox">
          <span class="product-offers_pname">{t}Модификация:{/t}</span>
          <div class="product-offers_item">
            <label for="offer_{$key}">{$offer.title}</label>
          </div>
      </div>
    {/foreach}
{/if}

Попробовал этот вариант - есть минус: в корзине размер(модификация) потом не отображается, но уже лучше, чем дописывать вручную к названию, как предлагал Александр. Но было бы лучше от него услышать подробнее про "propsdata_arr" - думаю многим пригодиться. Скажу спасибо за кусок кода с "propsdata_arr" который нужно вставить в шаблон))

Повысить оценку Понизить оценку

9 Отредактировано Владимир (20.06.2019 11:06:49)

Re: Вывести название основной комплектации в карточке товара

Ах да, я не написал как реализовал у себя в корзине.
В моей теме это шаблон - cartpage_page.tpl

Также добавил блок с проверкой и выводом:

{if $product->isOffersUse()}
    {foreach $product.offers.items as $key => $offer}
        <input id="offer_{$key}" type="hidden" name="hidden_offers" class="hidden_offers" value="{$key}" data-info='{$offer->getPropertiesJson()}' data-num="{$offer.num}"/>
        {if $cartitem.offer==$key}
            <input type="hidden" name="products[{$index}][offer]" value="{$key}"/>
        {/if}
    {/foreach}
{/if}

</div>

{elseif $product->isOffersUse()}

    <div class="card-product_offers">
        <select name="products[{$index}][offer]" class="select rs-offer">
            {foreach $product.offers.items as $key => $offer}
                <option value="{$key}" {if $cartitem.offer==$key}selected{/if}>{$offer.title}</option>
            {/foreach}
        </select>
    </div>
    
      {else}
      {foreach $product.offers.items as $key => $offer}
        <div class="card-product_offers">
            <label for="offer_{$key}">{$offer.title}</label>
        </div>
      {/foreach}
{/if}

Но, все равно жду оценки Александра. Что он скажет на такое решение.

Повысить оценку Понизить оценку

Re: Вывести название основной комплектации в карточке товара

{if $product->isOffersUse()}

и

{elseif $product->isOffersUse()}

Это одно и тоже, т.е. у Вас всё время будет срабатывать один и тотже код, если комплектаций больше чем одна у товара. Соответственно второй участок кода бесполезен.

Третий участок кода else сработает, если у товара будет 1 комплектация.
Т.к. Вам нужно её получить, то лучше всего сделать так. Через https://readyscript.ru/dev-manual/dev_s … tatic_call

{static_call var=offer callback=['\Catalog\Model\Orm\Offer', 'loadByWhere'] params=[['product_id'=>$product.id, 'sortn => 0]]}

Где уже в $offer будет объект нулевой комплектации.
Соответственно {$offer.title}

Re: Вывести название основной комплектации в карточке товара

Попробовал этот вариант - есть минус: в корзине размер(модификация) потом не отображается, но уже лучше, чем дописывать вручную к названию, как предлагал Александр. Но было бы лучше от него услышать подробнее про "propsdata_arr" - думаю многим пригодиться. Скажу спасибо за кусок кода с "propsdata_arr" который нужно вставить в шаблон))

Не совсем понял, что Вы хотите получить от propsdata_arr. Это просто массив ключ=>значение с параметрами комплектации.

12 Отредактировано Владимир (20.06.2019 12:43:16)

Re: Вывести название основной комплектации в карточке товара

Закусило Александр пишет:
{if $product->isOffersUse()}

и

{elseif $product->isOffersUse()}

Это одно и тоже, т.е. у Вас всё время будет срабатывать один и тотже код, если комплектаций больше чем одна у товара. Соответственно второй участок кода бесполезен.

Третий участок кода else сработает, если у товара будет 1 комплектация.
Т.к. Вам нужно её получить, то лучше всего сделать так. Через https://readyscript.ru/dev-manual/dev_s … tatic_call

{static_call var=offer callback=['\Catalog\Model\Orm\Offer', 'loadByWhere'] params=[['product_id'=>$product.id, 'sortn => 0]]}

Где уже в $offer будет объект нулевой комплектации.
Соответственно {$offer.title}

Александр подскажите пожалуйста поподробнее, как исправить.
Получается у меня в шаблоне эта ошибка первого и второго участка. Этот код я не трогал, он в дефолтный в шаблоне.
Я добавил только третий участок else. И если можно, с ним тоже поподробнее.

Повысить оценку Понизить оценку

Re: Вывести название основной комплектации в карточке товара

Если честно, то я запутался немного в Вашей задачке. Поэтому давайте ещё раз сначала, желательно с примерами. Вам на какой странице и какую информацию нужно получить?

14 Отредактировано Владимир (20.06.2019 13:56:44)

Re: Вывести название основной комплектации в карточке товара

Хочу вывести в карточке товара одну простую комплектацию с условием:
Если простых комплектаций больше одной - вывести стандартно.
Или
Если простая комплектация одна - вывести ее название.

Повысить оценку Понизить оценку

15 Отредактировано Владимир (20.06.2019 13:54:05)

Re: Вывести название основной комплектации в карточке товара

Сделал так:

{if $product->isVirtualMultiOffersUse()}
        {* Сведения по виртуальным многомерным Выберите вариантм *}
        {foreach $product.virtual_multioffers.items as $product_id => $offer}
            <input value="{$product_id}" type="hidden" name="hidden_multioffers" class="hidden_offers" id="offer_{$product_id}" data-url='{$offer.url}' data-info='{json_encode($offer.values)}'/>
        {/foreach}

    {else}
        {* Сведения по простым Выберите вариантм, связанным с многомерными для изменения цены и остатка *}
        {foreach $product.offers.items as $key => $offer}
            {* В data-info подменяем двойную ковычку на специальную конструкцию во избежание проблемы jquery с json *}
            <input value="{$key}" type="hidden" name="hidden_offers" class="hidden_offers" {if $offer@first}checked{/if} id="offer_{$key}" data-info='{str_replace('&quot;', '*`*', {$offer->getPropertiesJson()})}' data-num="{$offer.num}" {if $catalog_config.use_offer_unit}data-unit="{$offer->getUnit()->stitle}"{/if} data-change-cost='{ ".rs-product-barcode": "{$offer.barcode|default:$product.barcode}", ".rs-price-new": "{$product->getCost(null, $key)}", ".rs-price-old": "{$product->getOldCost($key)}", ".Cost-general": "{$product->getCost('Цена продажи', $key)}"}' data-images='{$offer->getPhotosJson()}' data-offer-id='{$offer.id}' data-sticks='{$offer->getStickJson()}' {if !$product->isOffersUse()}data-type-offer="notExist"{/if}/>
        {/foreach}
        {if $product->isOffersUse()}
            <input value="{count($product.offers.items)}" type="hidden" name="hidden_offers" class="hidden_offers" id="offer_{count($product.offers.items)}" data-type-offer="notExist" data-info=" " data-num="0" {if $catalog_config.use_offer_unit}data-unit="{$product.offers.items.0->getUnit()->stitle}"{/if} data-change-cost='{ ".offerBarcode": "{$product.barcode}", ".myCost": "{t}нет цены{/t}", ".lastPrice": " ", ".myCurrency": " "}' data-offer-id='0' data-sticks="[]"/>
        {/if}
        <input type="hidden" name="offer" value="0"/>
    {/if}

{elseif $product->isOffersUse()}
    {* Простые комплектации *}
    <div class="product-offers new_checkbox">
        <span class="product-offers_pname">{$product.offer_caption|default:t('Выберите вариант')}</span>
        <div class="product-offers_values">
            {if count($product.offers.items)>4}
                {* Если комплектаций много, то отобразим их в виде списка *}
                <select class='select' name="offer" style="margin-bottom: 10px;">
                    {foreach from=$product.offers.items key=key item=offer name=offers}
                        <option value="{$key}" {if $offer.num <= 0}class="nullComplects"{/if}{if $smarty.foreach.offers.first}checked{/if} data-num="{$offer.num}" {if $catalog_config.use_offer_unit}data-unit="{$offer->getUnit()->stitle}"{/if} data-change-cost='{ ".offerBarcode": "{$offer.barcode|default:$product.barcode}", ".myCost": "{$product->getCost(null, $key)}", ".lastPrice": "{$product->getOldCost($key)}", ".Cost-general": "{$product->getCost('Цена продажи', $key)}"}' data-images='{$offer->getPhotosJson()}' data-offer-id='{$offer.id}' data-sticks='{$offer->getStickJson()}'>{$offer.title}</option>
                    {/foreach}
                </select>
            {else}
                {* Если комплектаци мало, то отобразим их в виде радиокнопок *}
                {foreach $product.offers.items as $key => $offer}
                    <div class="product-offers_item">
                        <input value="{$key}" type="radio" name="offer" {if $offer@first}checked{/if} id="offer_{$key}" data-num="{$offer.num}" {if $catalog_config.use_offer_unit}data-unit="{$offer->getUnit()->stitle}"{/if} data-change-cost='{ ".offerBarcode": "{$offer.barcode|default:$product.barcode}", ".myCost": "{$product->getCost(null, $key)}", ".lastPrice": "{$product->getOldCost($key)}", ".Cost-general": "{$product->getCost('Цена продажи', $key)}"}' data-images='{$offer->getPhotosJson()}' data-offer-id='{$offer.id}' data-sticks='{$offer->getStickJson()}'>
                        <label {if $offer.num <= 0}class="nullComplects"{/if} for="offer_{$key}">{$offer.title}</label>
                    </div>
                {/foreach}
            {/if}
        </div>
    </div>
-------------------- Этот блок ниже я добавил.
    {else}
    {foreach $product.offers.items as $key => $offer}
      <div class="product-offers new_checkbox">
          <span class="product-offers_pname">{t}Доступный вариант{/t}</span>
          <div class="product-offers_item">
            <label for="offer_{$key}">{$offer.title}</label>
          </div>
      </div>
    {/foreach}
--------------------------
{/if}

Вроде все работает нормально. Но хотел чтобы Вы проверили. И Вы говорите что лучше по другому. И говорите что код выводится дважды.

Повысить оценку Понизить оценку

Re: Вывести название основной комплектации в карточке товара

Владимир пишет:

Ах да, я не написал как реализовал у себя в корзине.
В моей теме это шаблон - cartpage_page.tpl

Также добавил блок с проверкой и выводом:

{if $product->isOffersUse()}
    {foreach $product.offers.items as $key => $offer}
        <input id="offer_{$key}" type="hidden" name="hidden_offers" class="hidden_offers" value="{$key}" data-info='{$offer->getPropertiesJson()}' data-num="{$offer.num}"/>
        {if $cartitem.offer==$key}
            <input type="hidden" name="products[{$index}][offer]" value="{$key}"/>
        {/if}
    {/foreach}
{/if}

</div>

{elseif $product->isOffersUse()}

    <div class="card-product_offers">
        <select name="products[{$index}][offer]" class="select rs-offer">
            {foreach $product.offers.items as $key => $offer}
                <option value="{$key}" {if $cartitem.offer==$key}selected{/if}>{$offer.title}</option>
            {/foreach}
        </select>
    </div>
    
      {else}
      {foreach $product.offers.items as $key => $offer}
        <div class="card-product_offers">
            <label for="offer_{$key}">{$offer.title}</label>
        </div>
      {/foreach}
{/if}

Но, все равно жду оценки Александра. Что он скажет на такое решение.

Потом. Здесь я показываю как вывел в корзине. И тут Вы тоже говорите что повторяется и лучше реализовать по другому.

Повысить оценку Понизить оценку

17 Отредактировано Закусило Александр (26.06.2019 12:18:48)

Re: Вывести название основной комплектации в карточке товара

Владимир пишет:

Хочу вывести в карточке товара одну простую комплектацию с условием:
Если простых комплектаций больше одной - вывести стандартно.
Или
Если простая комплектация одна - вывести ее название.

Ну соответственно.

{if !$product->isOffersUse()}
   {static_call var=offer callback=['\Catalog\Model\Orm\Offer', 'loadByWhere'] params=[['product_id'=>$product.id, 'sortn => 0]]}
   {$offer.title}
{else}
   {* Здесь кусок кода из стандартного шаблона product_offers.tpl или просто подключение этого шаблона через include, как и было раньше например в теме по умолчанию *} 
{/if}