MD MirDeveloper MIRDEVELOPER.RU
info@mirdeveloper.ru

$

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

PHP·Yii·1C-Битрикс·WordPress·JavaScript·Git·Docker·SEO· PHP·Yii·1C-Битрикс·WordPress·JavaScript·Git·Docker·SEO·
1C Битрикс

Битрикс корзина, создание custom компонента корзины (sale.basket.basket)

В данной статье будет рассмотрен пример создания кастомного (custom) компонента корзины, sale.basket.basket.

Битрикс корзина, создание 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 файла только нужный язык. Правильнее будет сделать определение языка через Сайты и сделать разделение и пути настроить. Здесь же сделано разделение в самом компоненте, использовать можно. Успехов в освоении!

Понравилось? Поделитесь с друзьями!