Битрикс корзина, создание 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)