Ответы пользователя по тегу 1С-Битрикс
  • Как сделать так чтобы в карточке товара цена выводилась в рублях, а сами цены в каталоге были в долларах?

    @PetrPo
    В админ. панели в настройках есть курсы валют
    5f2e5bdbd2c34114339655.jpeg
    В параметрах компонента есть галка
    5f2e5be523eae564388708.jpeg
    Для корзины и оформления заказа в настройках интернет-магазина есть валюта сайта
    5f2e5bf36ca74576589482.jpeg
    Ответ написан
    Комментировать
  • Умный фильтр ,значения "От","До" заменить на значения минимум и максимум?

    @PetrPo
    Снова привет)
    В шаблоне компонента фильтра в template.php в value ты правильно сделал, только round убери и добавь к инпутам соответствующие data параметры
    data-price="<?=$arItem["VALUES"]["MIN"]["VALUE"];?>"
    data-price="<?=$arItem["VALUES"]["MAX"]["VALUE"];?>"

    Дальше в script.js
    1. В самом начале в функцию function JCSmartFilter добавь
    this.inputsPrice = {};

    2. После этой функции добавь
    JCSmartFilter.prototype.setInputsPrice = function() {
    	if(!this.form)
    		return;
    	
    	if(!Object.keys(this.inputsPrice).length) {
    		var inputs = BX.findChildren(this.form, {'tag': new RegExp('^(input)$', 'i'), 'attribute': {'data-price': new RegExp('^(.*)$', 'i')}}, true);
    		
    		inputs.forEach(function(item, i) {
    			this.inputsPrice[item.name] = item.dataset.price;
    		}, this);
    	}
    }

    3. Найди функцию JCSmartFilter.prototype.reload там есть проверка if (this.form) внутри нее добавь
    this.setInputsPrice();

    4. Найди функцию JCSmartFilter.prototype.values2post перед нее добавь функцию
    JCSmartFilter.prototype.values = function(values) {
    	values.forEach(function(item, i) {
    		if(Object.keys(this.inputsPrice).indexOf(item.name) !== -1) {
    			values[i].value = parseFloat(item.value) !== parseFloat(this.inputsPrice[item.name]) ? item.value : '';
    		}
    	}, this);
    }

    5. А внутри функции JCSmartFilter.prototype.values2post добавь
    this.values(values);

    6. Найди функцию SmartFilter.prototype.recountMinPrice в ней убери
    if (newMinPrice != this.minPrice)
    	this.minInput.value = newMinPrice;
    else
    	this.minInput.value = "";

    оставь просто
    this.minInput.value = newMinPrice;

    7. Тоже самое с функцией SmartFilter.prototype.recountMaxPrice
    Ответ написан
  • Как вывести стоимость товара в начальном количестве?

    @PetrPo
    Пример с catalog.element стандартный шаблон bootstrap_v4 файл script.js

    функция setPrice: function() в самом конце есть поверка
    if (price && this.obQuantity && this.obQuantity.value != this.stepQuantity)

    меняешь на (для ТП этого будет достаточно)
    if (price && this.obQuantity)

    Для простых товаров, добавляешь свою функцию, что-то типа
    initPriceTotal: function() {
    	if(this.obPrice && this.obQuantity) {
    		this.obQuantity.value = this.stepQuantity;
    		this.setPrice();
    	}
    },

    в функции init: function() ищешь проверку if (this.productType === 3) после нее добавляешь
    else {
    	this.initPriceTotal();
    }


    Можешь еще php в шаблон добавить, чтобы от js дергания при загрузке не было
    Ответ написан
    1 комментарий
  • Вывод нужного количества элементов на странице Битрикс?

    @PetrPo
    В сессию пишется, проверил, только не понятно зачем именно в сессию писать и логика в целом...

    По умолчанию $pageElementCount = "10", далее
    Если в $_REQUEST есть showBy, то 
            Если showBy соответствует значению 18, 36, 54, 72,
                    pageElementCount = $_REQUEST['showBy']
                    пишем в $_SESSION
            Если не соответствует
                     pageElementCount = $_SESSION['showBy']


    Ну записали в $_SESSION showBy, затем переходим на другую страницу каталога или убираем из адресной строки параметр showBy, тогда $pageElementCount становится снова 10.
    Вопрос. Какой тогда смысл записывать в сессию?

    А в целом хоть и код не красивый и с непонятной логикой, но работает)))

    Мой вариант:
    $arAvailableCounts = array(18, 36, 54, 72);
    
    $pageElementCount = isset($_COOKIE['showBy']) && intval($_COOKIE['showBy']) ? $_COOKIE['showBy'] : $arParams['PAGE_ELEMENT_COUNT'];
    
    if(isset($_GET['showBy']) && $_GET['showBy'] && in_array($_GET['showBy'], $arAvailableCounts)) {
    	$pageElementCount = $_GET['showBy'];
    	setcookie('showBy', $_GET['showBy'], 0, SITE_DIR);
    }

    <div class="text-right">
    	<span class="show_title">Показать по </span>
    	<span class="number_list">
    		<?foreach($arAvailableCounts as $value):?>
    			<a class="<?=($value == $pageElementCount ? 'current' : '');?>" href="<?=$APPLICATION->GetCurPageParam('showBy='.$value, array('showBy'));?>" rel="nofollow"><span><?=$value;?></span></a>
    		<?endforeach;?>
    	</span>
    </div>
    Ответ написан
  • Разная сортировка при нажатии?

    @PetrPo
    1. Атрибут href в ссылке лучше заменить на битриксовую функцию, это позволит сохранить другие GET параметры, если они есть
    <?=$APPLICATION->GetCurPageParam('sort=указываешь поле для сортировки, в твоем случае catalog_PRICE_1&method=указываешь направление сортировки (ASC, DESC)', array('sort', 'method'))?>

    !! method лучше замени на order, логичнее будет)

    2. Если компонент комплексный:
    идешь в файл где подключаешь простой компонент и подставляешь параметры из $_GET
    $sort = !empty($_GET['sort']) ? $_GET['sort'] : $arParams['SORT_BY1'];
    $method = !empty($_GET['method']) ? $_GET['method'] : $arParams['SORT_ORDER1'];

    компонент news:
    "SORT_BY1" => $sort,
    "SORT_ORDER1" => $method,

    компонент catalog:
    "ELEMENT_SORT_FIELD" => $sort,
    "ELEMENT_SORT_ORDER" =>	$method,

    P.S. лучше добавить массив возможных полей для сортировки и проверять что параметр из $_GET соответствует тому что есть в этом массиве, чтобы даже если подставить ручками в адресную строку фигню какую-нибудь, то сработала сортировка по умолчанию
    Ответ написан
    6 комментариев