@EvgeniyRava

Как сделать ссылку для каждого SKU в Bitrix?

При выгрузке каталога в Яндекс, вылилась ошибка что для каждого SKU нужна уникальная ссылка, при переходе по которой будет сразу активным торговое предложение. Т.к. шаблон индивидуальный то решения которые есть на форуме Bitrix не помогает. Есть ссылка к примеру магазин.ру/машина но у этой машины есть свойства (красная, зеленая, синяя) и каждое свойство имеет свой ид. Мне нужно чтобы при переходе по ссылке магазин.ру/машина/?pid=111 знатоки Битрикса меня поймут. Я нашел кусок кода который отвечает за все эти действия, но ничего не получается. Вот кусок кода модуля
<div class="offers">
      <ul class="offer-list">
      <? foreach ($arResult['OFFERS'] as $iKey => $arOffer): ?>
         <li data-id="<?= $arOffer['ID']; ?>"<?= ($iKey == 0) ? ' class="active"' : ''; ?>>
         <? if ($arOffer['PRICES'][$sPriceCode]['CAN_BUY'] == 'Y' && $arOffer['CATALOG_AVAILABLE'] == 'Y'): ?>
             <span><?= $arOffer['PRICES'][$sPriceCode]['PRINT_DISCOUNT_VALUE']; ?></span>
      <? endif; ?>
       <?= $arOffer['NAME']; ?>
        </li>
       <? endforeach; ?>
         </ul>
       </div>
       <?$this->setFrameMode(true);?>
                    </div>


Вот кусок кода скрипт js который отвечает за выбор SKU

var offers = $('.b-element .offer-list li');

    offers.on('click', function(){
        var element = $(this).closest('.b-buy'),
            id = $(this).data('id');

        offers.removeClass('active');
        $(this).addClass('active');
        $('.offer', element).hide().removeClass('active');
        $('.offer-' + id, element).show();
    });
});


Пытался сделать как-то так
var offers = $('.b-element .offer-list li');

    offers.on('click', function(){
        var element = $(this).closest('.b-buy'),
            id = $(this).data('id');

        offers.removeClass('active');
        $(this).addClass('active');
        loc = '?pid=' + this.offers[this.offerNum].ID;
        history.pushState({}, '', loc);
        $('.offer', element).hide().removeClass('active');
        $('.offer-' + id, element).show();
    });
});


Но ничего не выходит, на форуме Битрикса есть решения для стандартного шаблона и выглядит оно так
{
   var i = 0,
      j = 0,
      strName = '',
      arShowValues = false,
      arCanBuyValues = [],
      arFilter = {},
      tmpFilter = [],
      current = this.offers[this.offerNum].TREE,
   //CUSTOM START
      paramsUrl = window.location.search,
      pidRegExp = new RegExp(/[?&]pid=(\d+)/),
      pid = pidRegExp.exec(paramsUrl);
      

   if (pid && pid[1]) {
      for (i = 0; i < this.offers.length; i++)
      {
         if (this.offers[i].ID == pid[1]) {
            current = this.offers[i].TREE;
         }
      }  
   }
   //CUSTOM END


Но как переписать его под мои нужды знаний не хватает, может кто что подскажет буду очень благодарен.
  • Вопрос задан
  • 5152 просмотра
Решения вопроса 1
no_one_safe
@no_one_safe
Причем тут js? У вас выбор торгового предложения должен на сервере уже происходить.
Компонент какой используете? Судя по коду шаблону catalog.element (catalog комплексный)
Так вот в $arResult есть ключ $arResult["SELECTED_OFFER"] (или как то так). Он обычно равен 0.
И также есть список предложений:
$arResult['OFFERS'] = array(
0=>array(...),
1=>array(...),
2=>array(...),
 и т.д.
);

Для решения задачи вам необходимо учесть 2 проблемы:
1. Кеширование компонента.
2. Выбор активного торгового предложения.

При вызове компонента catalog вы в настройки компонента добавьте переменную $_GET["pid"] - т.о образом для каждого торгового предложения у вас будет свой кеш.
например:
<?$APPLICATION->IncludeComponent(
    "bitrix:catalog",
    "",
Array(
        "TEMPLATE_THEME" => "blue",
        "IBLOCK_TYPE" => "catalog",
        "IBLOCK_ID" => "2",
"SELECTED_OFFER_ID"=>(isset($_GET["pid"]) && intval($_GET["pid"]) > 0 ?$_GET["pid"]:0),
.............

И затем в шаблоне в файле element.php:
<?$APPLICATION->IncludeComponent(
    "bitrix:catalog.element",
    "",
    Array(
        "SELECTED_OFFER_ID" => $arParams["SELECTED_OFFER_ID"],

в шаблоне bitrix:catalog.element создаете файл result_modifier, там пробегаетесь по всем $arResult['OFFERS'] - и если ID совпадает - делаете ключ выбранным торговым предложением:
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
foreach($arResult['OFFERS'] as $offer_key=>$arOffer){
   if(intval($arParams["SELECTED_OFFER_ID"]) == intval($arOffer['ID'])){
      $arResult["SELECTED_OFFER"] = $offer_key;
      break;
   }
}


в шаблоне:
<ul class="offer-list">
      <? foreach ($arResult['OFFERS'] as $iKey => $arOffer): ?>
         <li data-id="<?= $arOffer['ID']; ?>"<?= ($iKey == $arResult["SELECTED_OFFER"]) ? ' class="active"' : ''; ?>>
         <? if ($arOffer['PRICES'][$sPriceCode]['CAN_BUY'] == 'Y' && $arOffer['CATALOG_AVAILABLE'] == 'Y'): ?>
             <span><?= $arOffer['PRICES'][$sPriceCode]['PRINT_DISCOUNT_VALUE']; ?></span>
      <? endif; ?>
       <?= $arOffer['NAME']; ?>
        </li>
       <? endforeach; ?>
         </ul>
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы