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

Интересные статьи по программированию:

Уважаемый читатель!

Ты можешь сделать проект Mirdeveloper.ru лучше!

Написание статей требует много затрат, времени и сил, ресурсов, в том числе и денежных.

Оставь чаевые, и будут новые статьи, и появятся видео.

Это даст новые возможности в улучшении сайта

Спасибо за то, что Вы с нами!


Комментарии находятся на модерации или не добавлены.

Для добавления комментариев необходимо зарегистрироваться и авторизоваться

Также возможно авторизоваться через Социальную сеть Вконтакте (VK)