Битрикс корзина, создание custom компонента корзины (sale.basket.basket)
Бывают случаи, когда нужно изменить стандартный компонент корзины (шаблон нужно вывести специальный или нужно реализовать свою логику, поля добавить или что-то подобное). Для этого стандартный компонент переносится в свое пространство имен.
Создадим в папке /local/components/ папку c названием custom (можно создать в /bitrix/components/ если шаблон находится в папке bitrix).
Далее туда перенесем стандартный компонент sale.basket.basket, изменив файл component.php.
Код компонента корзины в Битрикс будет такой:
<? if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); /** * Bitrix Framework * @package bitrix * @subpackage main * @copyright 2001-2014 Bitrix */ /** * Bitrix vars * @global CMain $APPLICATION * @global CUser $USER * @global CDatabase $DB * @global CUserTypeManager $USER_FIELD_MANAGER * @param array $arParams * @param array $arResult * @param CBitrixComponent $this */ use \Bitrix\Main, \Bitrix\Main\Localization\Loc as Loc, Bitrix\Main\Loader, Bitrix\Main\Config\Option, Bitrix\Sale\Delivery, Bitrix\Sale\PaySystem, Bitrix\Sale, Bitrix\Sale\Order, Bitrix\Sale\DiscountCouponsManager, Bitrix\Main\Context; //use Bitrix\Sale; if(CModule::IncludeModule('iblock')) { //здесь если нужно в корзине выводить свое описание или свои иконки, тогда выводим из инфоблока информацию $arSelect = Array("ID", "NAME", "PREVIEW_TEXT","PROPERTY_TEXT_en"); $arFilter = Array("IBLOCK_ID" => 16, "CODE" => "basket-descr"); $res = CIBlockElement::GetList(Array(), $arFilter, false, Array(), $arSelect); while ($ob = $res->GetNextElement()) { $arFields = $ob->GetFields(); $arResult['DESCR'] = $arFields['PREVIEW_TEXT']; } } $basket = Sale\Basket::loadItemsForFUser(Sale\Fuser::getId(), Bitrix\Main\Context::getCurrent()->getSite()); if($basket->getPrice() > 0) { $arResult['PRICE'] = $basket->getPrice(); $arResult['PRICE_FORMAT'] = CurrencyFormat($basket->getPrice(), "RUB"); $arResult['WEIGHT'] = $basket->getWeight(); foreach ($basket as $basketItem) { $p_id = $basketItem->getField('PRODUCT_ID'); $osnovnoi = CCatalogSku::GetProductInfo($p_id); $arResult['ITEMS'][$p_id]['ID'] = $p_id; $arResult['ITEMS'][$p_id]['BASKET_ID'] = $basketItem->getId(); $arResult['ITEMS'][$p_id]['NAME'] = $basketItem->getField('NAME'); $arResult['ITEMS'][$p_id]['QUANTITY'] = $basketItem->getQuantity(); $arResult['ITEMS'][$p_id]['PRICE'] = $basketItem->getPrice(); $arResult['ITEMS'][$p_id]['PRICE_FORMAT'] = CurrencyFormat($basketItem->getPrice(), "RUB"); $arResult['ITEMS'][$p_id]['ALL_PRICE'] = $basketItem->getFinalPrice(); $arResult['ITEMS'][$p_id]['ALL_PRICE_FORMAT'] = CurrencyFormat($basketItem->getFinalPrice(), "RUB"); $arResult['ITEMS'][$p_id]['WEIGHT'] = $basketItem->getWeight(); $arResult['ITEMS'][$p_id]['CAN_BAY'] = $basketItem->canBuy(); $IBLOCK_ID = (int) $arParams['CATALOG_ID'];//можно задать 4, но считается как костыльно //ID инфоблока $ID = 114; //ID товара $arInfo = CCatalogSKU::GetInfoByProductIBlock($IBLOCK_ID); $arOffersId = array(); if (is_array($arInfo)) { $rsOffers = CIBlockElement::GetList( array(), array('IBLOCK_ID' => $arInfo['IBLOCK_ID'], 'PROPERTY_'.$arInfo['SKU_PROPERTY_ID'] => intval($p_id) )); if($arOffer = $rsOffers->GetNext()) $arResult['ITEMS'][$p_id]['OFFERS_NAME'] = $arOffer['NAME']; } $arResult['ITEMS'][$p_id]['OFFERS_NAME'] = explode("(", $arResult['ITEMS'][$p_id]['NAME']); $arResult['ITEMS'][$p_id]['OFFERS_NAME'] = $arResult['ITEMS'][$p_id]['OFFERS_NAME'][1]; $arResult['ITEMS'][$p_id]['OFFERS_NAME'] = str_replace(")", "", $arResult['ITEMS'][$p_id]['OFFERS_NAME']); if($osnovnoi['ID'] > 0) { $arSelect = Array("ID", "IBLOCK_ID", "NAME", "PREVIEW_PICTURE", "DETAIL_PICTURE","DETAIL_PAGE_URL", "PROPERTY_*"); $arFilter = Array("IBLOCK_ID" => $arParams['CATALOG_ID'], "ID" => $osnovnoi['ID']); $res = CIBlockElement::GetList(Array(), $arFilter, false, Array(), $arSelect); while ($ob = $res->GetNextElement()) { $arFields = $ob->GetFields(); $arProps = $ob->GetProperties(); $arResult['ITEMS'][$p_id]['DETAIL_PAGE_URL'] = $arFields['DETAIL_PAGE_URL']; if($arFields['PREVIEW_PICTURE'] > 0){ $arResult['ITEMS'][$p_id]['PICTURE'] = CFile::GetPath($arFields['PREVIEW_PICTURE']); }elseif($arFields['DETAIL_PICTURE'] > 0){ $arResult['ITEMS'][$p_id]['PICTURE'] = CFile::GetPath($arFields['DETAIL_PICTURE']); } else{ $arResult['ITEMS'][$p_id]['PICTURE'] = "/img/no-image.png"; } $arResult['ITEMS'][$p_id]['PROP'] = $arProps; } } else{ } } } $this->IncludeComponentTemplate();
В папке /local/components/custom/templates/.default/, производим изменения файла template.php.
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die(); /** * Bitrix Framework * @package bitrix * @subpackage main * @copyright 2001-2014 Bitrix */ /** * Bitrix vars * @global CMain $APPLICATION * @var array $arParams * @var array $arResult * @var CBitrixComponentTemplate $this */ IncludeTemplateLangFile(__FILE__); $cur_lang = $_SESSION["LANG_UI"];//здесь сделан custom для языковой версии, лучше конечно разделение сделать на уровне сайта, тогда не придется так делать ?> <script > var COUNT_ADD_BASKET = '<?=COUNT_ADD_BASKET?>'; var BASKET_WEIGHT = '<?=$arResult['WEIGHT']?>'; </script> <div class="cart" <?if (!count($arResult['ITEMS'])) echo ' style="display:none"'?> cur_val="<?=GetMessage('PRICE_VAL_'.$cur_lang);?>"> <div class="wrapper basket-wrap"> <div class="cart_header"> <h2 class="header_title"><?=GetMessage('BASKET_NAME_'.$cur_lang)?></h2> <p class="header_subtitle"> <?=$arResult['DESCR']?> </p> </div> <div id="fixedBasket" class="cart_main"> <div class="cart_line"> <div class="line_img"> <img src="/img/cart_img.png" alt="cart img"></div> <p class="line_name"><?=GetMessage('TOVAR_NAME_'.$cur_lang)?></p> <div class="line_desc"> </div> <div class="line_country"><p><?=GetMessage('TOVAR_COUNTRY_'.$cur_lang)?></p></div> <div class="line_size"><p><?=GetMessage('TOVAR_RAZMER_COROBKI_'.$cur_lang)?></p></div> <div class="line_price"><p><?=GetMessage('TOVAR_PRICE_'.$cur_lang)?></p></div> <div class="line_counter"><p><?=GetMessage('TOVAR_QTY_'.$cur_lang)?></p></div> <div class="line_summary"><p><?=GetMessage('TOVAR_TOTAL_'.$cur_lang)?></p></div> </div> <? foreach ($arResult['ITEMS'] as $item) {?> <div data-productid="<?=$item['BASKET_ID']?>" data-id="<?=$item['ID']?>" class="cart_line"> <div class="line_img"> <img src="<?=$item['PICTURE']?>" alt=""></div> <p class="line_name"><a href="<?=$item['DETAIL_PAGE_URL']?>"><?=$item['NAME']?></a></p> <div class="line_desc"><p class="desc_btn"> <a href="<?=$item['DETAIL_PAGE_URL']?>"><?=GetMessage('TOVAR_DETAIL_'.$cur_lang)?></a></p> <div class="desc_desc"><div class="desc_line"><p class="desc_line_country"><?=GetMessage('TOVAR_COUNTRY_'.$cur_lang)?></p> <p class="desc_line_sizes"><?=GetMessage('TOVAR_RAZMER_COROBKI_'.$cur_lang)?></p></div> <div class="desc_line"> <p class="desc_line_country"></p> <p class="desc_line_season"></p> <p class="desc_line_sizes"></p> </div> <img src="/img/svg/cart-desc-close.svg" alt="close" class="desc_close"> </div> </div> <div class="line_country"><p><? if($_SESSION["LANG_UI"] == 'en'){ if(!empty($item['PROP']["STRANA_PROIZVODSTVA_EN"]["VALUE"])){ $STRANA_PROIZVODSTVA = $item["PROP"]["STRANA_PROIZVODSTVA_EN"]["VALUE"]; } else{ $gt = gtranslate($item['PROP']['STRANA_PROIZVODSTVA']['VALUE'], 'ru', 'en'); if(!empty($gt)) $STRANA_PROIZVODSTVA = $gt; } echo $STRANA_PROIZVODSTVA; }else echo $item['PROP']['STRANA_PROIZVODSTVA']['VALUE']; ?></p></div> <div class="line_size"><p><?=$item["OFFERS_NAME"]?></p></div> <div class="line_price cur-price" cur-price="<?=$item['PRICE']?>"><p><?=$item['PRICE']?> <?=GetMessage('PRICE_VAL_'.$cur_lang)?></p><span style="display: none;"><?=GetMessage('TOVAR_PRICE_'.$cur_lang)?></span></div> <div class="line_counter"> <span style="display: none;"><?=GetMessage('TOVAR_QTY_'.$cur_lang)?></span> <img src="/img/svg/counter_minus.svg" alt="minus" el_id="<?=$item['BASKET_ID']?>" action="minus" class="counter_minus_new"> <p class="cur-quantity"><?=$item['QUANTITY']?></p> <img src="/img/svg/counter_plus.svg" alt="plus" el_id="<?=$item['BASKET_ID']?>" action="plus" class="counter_plus_new"> </div> <div class="line_summary" summ="<?=$item['ALL_PRICE']?>"> <span style="display: none;"><?=GetMessage('TOVAR_TOTAL_'.$cur_lang)?></span> <p class="summ"><?=$item['ALL_PRICE']?> <?=GetMessage('PRICE_VAL_'.$cur_lang)?></p></div> <div class="line_delete" el_id="<?=$item['BASKET_ID']?>"> <img src="/img/svg/cart_line_delete.png" alt="delete"></div> </div> <?}?> <div class="cart_summ"> <p><?=GetMessage('TOVAR_SUM_POKUP_'.$cur_lang)?>: <span class="itog_summ" itog_summ="<?=$arResult['PRICE']?>"> <b class="all_price"><?=$arResult['PRICE']?> <?=GetMessage('PRICE_VAL_'.$cur_lang)?></b> </span> </p> </div> <a href="/personal/order/make/" class="cart_buy"><?=GetMessage('ORDER_'.$cur_lang)?></a> </div> <div class="cart_sidebar"> <?php $APPLICATION->IncludeFile(SITE_DIR.'include/basket_advantages.php') ?> </div> </div> </div> <div class="make-an-order order_success-wrap basket-empty" <?if (count($arResult['ITEMS'])) echo ' style="display:none"'?>> <div class="wrapper"> <h2 class="make-an-order_title"><?=GetMessage('BASKET_NAME_'.$cur_lang)?></h2> <h3 class="make-an-order_title"><?=GetMessage('BASKET_EMPTY_'.$cur_lang)?></h3> <div class="order_success" style="margin-bottom: 15px;display: none" > <h2 class="success_title"><?=GetMessage('BASKET_EMPTY_'.$cur_lang)?></h2> </div> </div> </div> <div class="pp__popup_basket"> <div class="pp__popup_popup_blk"> <h2 class="pp__popup_popup_blk_title"><?=GetMessage('BASKET_PRODUCT_DEL_'.$cur_lang)?></h2> <form method="post" style="display: contents;" novalidate="novalidate"> <div class="pp__popup_popup_blk_main"> <button style="width: 100%;" class="basket_del" type="submit"><?=GetMessage('BASKET_DELETE_'.$cur_lang)?></button> </div> <img src="/img/svg/all_popup_close.svg" alt="pp_close" class="pp_close close_bas_form"> </form> </div> </div> <div class="basket_quan_error"> <div class="pp__popup_popup_blk"> <h2 class="pp__popup_popup_blk_title"><?=GetMessage('BASKET_KOL_NOT_'.$cur_lang)?></h2> <form method="post" style="display: contents;" novalidate="novalidate"> <div class="pp__popup_popup_blk_main"> <button style="width: 100%;" class="quan_error_ok" type="submit"><?=GetMessage('BASKET_OK_'.$cur_lang)?></button> </div> <img src="/img/svg/all_popup_close.svg" alt="pp_close" class="pp_close close_quan_error"> </form> </div> </div>
Файл со стилями style.css в папке /local/components/custom/templates/.default/.
.basket_del , .quan_error_ok{ display: block; padding: 15px; text-align: center; background: #61A036; border-radius: 7px; font-family: "Gotham" !important; font-weight: 400 !important; color: #FFFFFF; } .pp__popup_basket , .basket_quan_error{ position: fixed; width: 100%; height: 100%; left: 0; top: 0; display: flex; justify-content: center; align-items: center; z-index: 4; background: rgba(0, 0, 0, 0.4); visibility: hidden; opacity: 0; transition: .3s; } .basket-popup-active , .quan-popup-active{ position: fixed; width: 100%; height: 100%; left: 0; top: 0; display: flex; justify-content: center; align-items: center; z-index: 4; background: rgba(0, 0, 0, 0.4); transition: .3s; visibility: visible; opacity: 1; } .line_delete{ cursor: pointer; } .line_price{ padding: 0 3vw !important; } .line_counter{ padding: 0 !important; } .line_summary{ padding-left: 2vw !important; } .wrapper{ /* padding-left: 0px !important; width: auto !important;*/ } .make-an-order_title{ font-size: 1.875vw ; } h2{ font-weight: normal !important; } h3.make-an-order_title{ font-size: 1rem !important; } @media screen and (max-width: 1920px){ .cart .wrapper .cart_main .cart_line p { font-size: 0.803vw !important; line-height: 0.781vw; } }
Также создадим файл скриптов script.js в папке /local/components/custom/templates/.default/, чтобы можно было увеличивать и уменьшать количество товара, удалять из корзины и так далее.
function numberFormat (number, decimals=' ', dec_point='', thousands_sep=' ') { number = (number + '').replace(/[^0-9+\-Ee.]/g, ''); var n = !isFinite(+number) ? 0 : +number, prec = !isFinite(+decimals) ? 0 : Math.abs(decimals), sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep, dec = (typeof dec_point === 'undefined') ? '.' : dec_point, s = '', toFixedFix = function (n, prec) { var k = Math.pow(10, prec); return '' + Math.round(n * k) / k; }; // Fix for IE parseFloat(0.55).toFixed(0) = 0; s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.'); if (s[0].length > 3) { s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep); } if ((s[1] || '').length < prec) { s[1] = s[1] || ''; s[1] += new Array(prec - s[1].length + 1).join('0'); } return s.join(dec); } $(document).ready(function () { $('.counter_plus_new , .counter_minus_new').on('click', function (e) { var cur_price_vulute = $('.cart').attr('cur_val'); var product_id = $(this).attr('el_id'); var action = $(this).attr('action'); var cur_product = $('.cart_line[data-productid="'+product_id+'"]'); var cur_quantity = Number($(cur_product).find('.cur-quantity').text()); var cur_product_price = Number($(cur_product).find('.cur-price').attr('cur-price')); var cur_product_price_all = Number($(cur_product).find('.line_summary').attr('summ')); var cur_all_price = Number($('.itog_summ').attr('itog_summ')); var raznica = cur_all_price - cur_product_price_all; function basketChange(action){ new_quantity = cur_quantity; if(action == 'plus'){ new_quantity = cur_quantity+1; }else if(action == 'minus'){ if(Number(cur_quantity) <= Number(COUNT_ADD_BASKET)){ return; } new_quantity = cur_quantity-1; } $(cur_product).find('.cur-quantity').text(new_quantity); $(cur_product).find('.line_summary').attr('summ', (new_quantity*cur_product_price)); $(cur_product).find('.summ').html(numberFormat((new_quantity*cur_product_price))+' '+cur_price_vulute); $('.itog_summ').attr('itog_summ', (raznica+(new_quantity*cur_product_price))); $('.all_price').html(numberFormat(raznica+(new_quantity*cur_product_price))+' '+cur_price_vulute); } basketChange(action); $.ajax({ url:'/local/components/custom/basket/ajax.php', type: 'POST', data: { product_id: product_id, id: cur_product.attr('data-id'), quantity: new_quantity, action: action }, }) .done(function(data) { if(data == 'done'){ basketChange(action); }else if(data == 'quantity_error'){ $('.basket_quan_error').addClass('quan-popup-active'); $('.quan-popup-active').removeClass('basket_quan_error'); basketChange('quan_error'); } }) return false; }); $('.basket_del').on('click', function (e) { product_id = $(this).attr('el_id') $.ajax({ url:'/local/components/custom/basket/ajax.php', type: 'POST', data: { product_id: product_id, action: 'del' }, }) .done(function(data) { if(parseInt(data) > 0){ $('.itog_summ').attr('itog_summ', data); $('.all_price').html(numberFormat(data)+'<i class="fa fa-rub"></i>'); cur_product = $('.cart_line[data-productid="'+product_id+'"]'); $('.basket-popup-active').addClass('pp__popup_basket'); $('.pp__popup_basket').removeClass('basket-popup-active'); $(cur_product).hide('slow', function(){ $(this).remove(); }); }else if(data == 'empty'){ $('.basket-popup-active').addClass('pp__popup_basket'); $('.pp__popup_basket').removeClass('basket-popup-active'); $('.cart').hide(); $('.basket-empty').show(); } }) return false; }); $('.line_delete').on('click', function (e) { $('.pp__popup_basket').addClass('basket-popup-active'); $('.basket-popup-active').removeClass('pp__popup_basket'); $('.basket-popup-active').find('button').attr('el_id', $(this).attr('el_id')) }); $('.close_bas_form').on('click', function (e) { $('.basket-popup-active').addClass('pp__popup_basket'); $('.pp__popup_basket').removeClass('basket-popup-active'); }); $('.close_quan_error , .quan_error_ok').on('click', function (e) { $('.quan-popup-active').addClass('basket_quan_error'); $('.basket_quan_error').removeClass('quan-popup-active'); return false; }); });
Файл '/local/components/custom/basket/ajax.php' будет таким:
require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php'); $GLOBALS['APPLICATION']->RestartBuffer(); use Bitrix\Sale; if (\Bitrix\Main\Loader::includeModule("sale") && \Bitrix\Main\Loader::includeModule("catalog") && \Bitrix\Main\Loader::includeModule("iblock")) { if ( ($_POST['action'] == 'plus' || $_POST['action'] == 'minus') && $_POST['quantity'] > 0 && $_POST['id'] > 0){ $product_res = CCatalogProduct::GetByID($_POST['id']); if($product_res['QUANTITY'] == $_POST['quantity'] || $product_res['QUANTITY'] > $_POST['quantity']){ $res= CSaleBasket::Update(intval($_POST['product_id']), array("QUANTITY" => intval($_POST['quantity']))); echo 'done'; }else{ echo 'quantity_error'; } } if ($_POST['action'] == 'del') { CSaleBasket::Delete($_POST['product_id']); $basket = Sale\Basket::loadItemsForFUser(Sale\Fuser::getId(), Bitrix\Main\Context::getCurrent()->getSite()); $basketItems = $basket->getBasketItems(); if(!$basketItems){ echo 'empty'; }else{ echo $basket->getPrice(); } } if ( ($_POST['action'] == 'catalog_plus' || $_POST['action'] == 'catalog_minus' || $_POST['action'] == 'detail_plus' || $_POST['action'] == 'detail_minus') && $_POST['quantity'] > 0 && $_POST['id'] > 0){ $product_res = CCatalogProduct::GetByID($_POST['id']); ///file_put_contents($_SERVER['DOCUMENT_ROOT'].'/CSaleBasket_my.log', print_r(array($product_res), 1), FILE_APPEND); if($product_res['QUANTITY'] == $_POST['quantity'] || $product_res['QUANTITY'] > $_POST['quantity']){ /// $res= CSaleBasket::Update(intval($_POST['product_id']), array("QUANTITY" => intval($_POST['quantity']))); echo 'done'; }else{ echo 'quantity_error'; } } } //echo json_encode($_POST);
Все содержимое папки /local/components/custom доступно по ссылке: Custom Component Basket
Также по пути в папке /local/components/custom/templates/.default/lang/ru/ создадим языковой файл template.php.
<? $MESS["BASKET_NAME_ru"] = "Корзина"; $MESS["BASKET_NAME_en"] = "Shopping cart"; $MESS["TOVAR_NAME_ru"] = "Наименование товара"; $MESS["TOVAR_NAME_en"] = "Product Name"; $MESS["TOVAR_COUNTRY_ru"] = "Страна"; $MESS["TOVAR_COUNTRY_en"] = "Country"; $MESS["TOVAR_RAZMER_COROBKI_ru"] = "Размер коробки"; $MESS["TOVAR_RAZMER_COROBKI_en"] = "Box size"; $MESS["TOVAR_PRICE_ru"] = "Цена"; $MESS["TOVAR_PRICE_en"] = "Price"; $MESS["TOVAR_QTY_ru"] = "Кол-во"; $MESS["TOVAR_QTY_en"] = "Qty"; $MESS["TOVAR_TOTAL_ru"] = "Итого"; $MESS["TOVAR_TOTAL_en"] = "Total"; $MESS["TOVAR_DETAIL_ru"] = "Подробнее о товаре"; $MESS["TOVAR_DETAIL_en"] = "More about the product"; $MESS["TOVAR_DETAIL_ru"] = "Подробнее о товаре"; $MESS["TOVAR_DETAIL_en"] = "More about the product"; $MESS["TOVAR_SUM_POKUP_ru"] = "Стоимость покупки"; $MESS["TOVAR_SUM_POKUP_en"] = "Total cost"; $MESS["ORDER_ru"] = "Оформить заказ"; $MESS["ORDER_en"] = "Place an order"; $MESS["PRICE_VAL_ru"] = "р."; $MESS["PRICE_VAL_en"] = "rub."; $MESS["BASKET_EMPTY_ru"] = "Корзина пуста"; $MESS["BASKET_EMPTY_en"] = "The shopping cart is empty"; $MESS["BASKET_PRODUCT_DEL_ru"] = "Удалить товар из корзины?"; $MESS["BASKET_PRODUCT_DEL_en"] = "Remove an item from the shopping cart?"; $MESS["BASKET_DELETE_ru"] = "Удалить"; $MESS["BASKET_DELETE_en"] = "Delete"; $MESS["BASKET_KOL_NOT_ru"] = "Количество товара не доступно"; $MESS["BASKET_KOL_NOT_en"] = "Product quantity not available"; $MESS["BASKET_OK_ru"] = "Ок"; $MESS["BASKET_OK_en"] = "Ok"; $MESS["BASKET_RUB_ru"] = "р."; $MESS["BASKET_RUB_en"] = "rub."; ?>
Рядом с файлом component.php создадим файл .parameters.php.
<?if(!defined("B_PROLOG_INCLUDED")||B_PROLOG_INCLUDED!==true)die(); $arComponentParameters = array( "PARAMETERS" => array( "CATALOG_ID" => array( "NAME" => GetMessage("CATALOG_ID"), "TYPE" => "STRING", "DEFAULT" => "4", "PARENT" => "BASE", ), ), ); ?>
В файле например /basket/index.php запустим компонент.
<? require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php"); $APPLICATION->SetPageProperty("description", "Интернет-магазин Корзина."); $APPLICATION->SetTitle("Корзина"); ?> <?$APPLICATION->IncludeComponent( "custom:basket", ".default", array( "CATEGORY_0_TITLE" => "main", "COMPONENT_TEMPLATE" => ".default", "CATALOG_ID" => "4" ), false );?> <?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>
На этом создание компонента закончено. Если не нужна английская версия, то можно убрать разделение и выводить с lang файла только нужный язык. Правильнее будет сделать определение языка через Сайты и сделать разделение и пути настроить. Здесь же сделано разделение в самом компоненте, использовать можно. Успехов в освоении!
Комментарии находятся на модерации или не добавлены.
Для добавления комментариев необходимо зарегистрироваться и авторизоваться
Также возможно авторизоваться через Социальную сеть Вконтакте (VK)