Ответы пользователя по тегу 1С-Битрикс
  • Как отслеживать событие подписки на отсутствующий товар в 1С-Битрикс?

    @PetrPo
    $eventManager = \Bitrix\Main\EventManager::getInstance();
    $eventManager->addEventHandler('catalog', '\Bitrix\Catalog\Subscribe::onAfterAdd', ['СatalogEvents', 'onAfterAddSubscribe']);

    Создаешь шаблон письма, в событии его отправляешь
    Ответ написан
    9 комментариев
  • Bitrix как написать новый метод для работы с полями бд в ORM?

    @PetrPo
    @method - это не метод, это аннотация, которая нужна для ide.
    setDescription - все подобные вызовы обрабатываются через магический метод __call

    Как создать еще одно своё поле

    Так же как для любой сущности битрикс orm

    прописать такие методы чтобы они работали по типу ->setDescription($ob->description)

    Ничего прописывать не надо (достаточно добавить поле в сущность), только как указал выше, аннотации для ide (можно сгенерировать через консольную утилиту) - но это не обязательное условие, работать будет и без них.

    Все описано в документации
    Ответ написан
    Комментировать
  • Как Получить данные из вкладки "Параметры заказа"?

    @PetrPo
    \Bitrix\Main\Loader::includeModule('sale');
    
    $orderId = 1;
    
    $dbRes = \Bitrix\Sale\Internals\OrderTable::getList(array(
    	'filter' => array(
    		'ORDER_ID' => $orderId
    	),
    	'select' => array('SOURCE_NAME' => 'TRADING_PLATFORM.NAME')
    ));
    
    if($tpOrder = $dbRes->fetch())
    	$sourceName = $tpOrder['SOURCE_NAME'];
    Ответ написан
  • Как сделать страницу с вложенным URL в каталоге на Битрикс?

    @PetrPo
    На всякий случай напишу, как это сделать.

    1. В параметры комплексного компонента, в SEF_URL_TEMPLATES надо добавить свой ключ, который должен совпадать с "element" + нужная приставка
    "SEF_URL_TEMPLATES" => array(
    	//...........
    	"element" => "#SECTION_CODE_PATH#/#ELEMENT_CODE#/",
    	"manual" => "#SECTION_CODE_PATH#/#ELEMENT_CODE#/myprotectionproduct/manual/",
    )

    2. В шаблон комплексного компонента надо добавить файл manual.php, в котором в массиве $arResult['VARIABLES'] будет доступен ID/CODE элемента, по которому можно понять в каком элементе находимся, дальше можно делать на этой странице все тоже что и на других, например в element.php

    3. там же есть файл .parameters.php, добавь в конце
    $arTemplateParameters['SEF_URL_TEMPLATES_manual'] = array(
        'PARENT' => 'SEF_MODE',
        'NAME' => GetMessage('PARAMETER_SEF_URL_TEMPLATES_MANUAL'),
        "DEFAULT" => "",
        "VARIABLES" => array(),
    );

    это чтобы при сохранении компонента из публички не стерся твой параметр, GetMessage('PARAMETER_SEF_URL_TEMPLATES_MANUAL') - надо добавить в lang файл, здесь же папка /lang/ru/.parameters.php добавить
    $MESS['PARAMETER_SEF_URL_TEMPLATES_MANUAL'] = 'Мануал';
    Ответ написан
  • Как получить свойства заказа?

    @PetrPo
    \Bitrix\Main\Loader::includeModule('sale');
    
    $orderId = 10;
    $order = \Bitrix\Sale\Order::load($orderId);
    
    if(!empty($order)) {
    	$basket = $order->getBasket();
    
    	foreach($basket->getBasketItems() as $basketItem) {
    		$basketPropertyCollection = $basketItem->getPropertyCollection();
    		print_r($basketPropertyCollection->getPropertyValues());
    	}
    }
    Ответ написан
  • Как реализовать вывод товара "Сначала в ..."?

    @PetrPo
    В вызове компонента можно указать сортировку по складу
    "ELEMENT_SORT_FIELD" => "CATALOG_STORE_AMOUNT_<идентификатор_склада>",
    "ELEMENT_SORT_ORDER" => "desc",

    и указываешь вторую сортировку
    Ответ написан
    Комментировать
  • Как правильно масштабировать изображение при добавлении элемента инфоблока?

    @PetrPo
    В вопросе не уточняется, что речь о CSV импорте.
    Нужно поставить галку
    60a286a1158ba173845142.jpeg
    Ответ написан
    Комментировать
  • Как в модельное окно Битрикс добавить кнопку?

    @PetrPo
    Самый очевидный вариант
    click:  function() {
        $('#oneclick').modal('show')
    }
    Ответ написан
    Комментировать
  • Bitrix подмена статуса заказа при изменении заказа?

    @PetrPo
    $newStatusId = 'F';
    $order->setField('STATUS_ID', $newStatusId);
    $order->save();

    В доках пример есть Смена статуса
    Ответ написан
  • Почему в card catalog.item нельзя удалить блок с картинками что бы осталось работать добавление в корзину?

    @PetrPo
    Потому что в js написано
    init: function()
    {
    	// ................
    	if (!this.obPict)
    	{
    		this.errorCode = -2;
    	}
    	// ................
    	
    	if (!this.obPictSlider)
    	{
    		this.errorCode = -4;
    	}
    	// ................
    	
    	if (this.errorCode === 0)
    	{
    	// здесь все инициализируется, добавление в корзину в том числе
    Ответ написан
    Комментировать
  • Как узнать, что находится в полях $orderFields обработчика OnOrderSave?

    @PetrPo
    В своем обработчике
    \Bitrix\Main\Diag\Debug::writeToFile($arFields, 'fields', '/sale_log.txt');

    после вызова обработчика в корне появится файл
    Ответ написан
    Комментировать
  • Как в bitrix.sale.ajax прописать правило итоговой суммы?

    @PetrPo
    Ну там же есть функция editTotalBlock в ней все написано, смотри this.result.TOTAL
    Ответ написан
    Комментировать
  • Как в битрикс построить графики?

    @PetrPo
    библиотека есть в битриксе для графиков amcharts4, переключение естественно сам пишешь. С твоим скиллом - это неподъемная задача
    \Bitrix\Main\UI\Extension::load('amcharts4');
    Ответ написан
  • Не работает добавление в корзину битрикс?

    @PetrPo
    1. Первый вариант:
    - ставишь bitrix:catalog
    - файл sections.php в нем выводишь свой фильтр по разделам (раздел в фильтре должен быть ссылкой) и catalog.section, перед ним глобальный фильтр по твоему бренду (если не знаешь как, напиши, объясню), у catalog.section указываешь параметры
    'INCLUDE_SUBSECTIONS' => 'Y',
    'SHOW_ALL_WO_SECTION' => 'Y',
    'BY_LINK' => 'Y'

    - файл section.php - все тоже самое, только в catalog.section передаешь id раздела, он будет в $arResult['VARIABLES'], добавляешь параметр INCLUDE_SUBSECTIONS если нужен (2 других параметра не надо)
    - в вызове bitrix.catalog на index.php раздела ставишь параметры
    'AJAX_MODE' => 'Y',
    'AJAX_OPTION_STYLE' => 'Y',
    'AJAX_OPTION_HISTORY' => 'Y'

    Все остальное на себя возьмет битрикс, единственное все будет работать в режиме ajax, т.е. ссылки на деталку товаров тоже будут грузится ajax-ом, если надо чтобы только твой фильтр по разделам работал ajax-ом, тогда

    2. Второй вариант
    - примерно как у тебя сейчас, есть обработчик ajax в него передаешь url на текущую страницу и в data передаешь некоторый ключ, например
    //.......
    url: '<?=$APPLICATION->GetCurDir()?>'
    data: {SECTION_ID: idSection, BRAND_AJAX: 'Y'}
    //.......

    - подставляешь свой SECTION_ID в параметры catalog.section, если он есть в request
    - находишь часть контента которую ты хочешь получить обновленную
    <?
    $request = \Bitrix\Main\Application::getInstance()->getContext()->getRequest();
    $bBrandAjax = $request->isAjaxRequest() && isset($request['BRAND_AJAX']) && $request['BRAND_AJAX'] == 'Y';
    ?>
    <?// оборачиваешь в div для простоты вставки через js, можно поколдовать и сделать без этого контейнера, но тут уже сам))?>
    <div id="ajax_brand_container">
    <?
    if($bBrandAjax) {
        $APPLICATION->RestartBuffer();
    }
    
    // твой ajax-вый контент (вероятно только catalog.section)
    
    if($bBrandAjax) {
        die();
    }
    ?>
    </div>

    - В onsuccess ajax обработчика пишешь
    var ajaxContainer = document.querySelector('#ajax_brand_container');
    
    BX.ajax({
    	//........
    	onsuccess: async function(data) {
    		if(ajaxContainer) {
    			var obResult = BX.processHTML(data);
    			
    			await !(function() {
    				ajaxContainer.innerHTML = data;
    			})();
    			
    			BX.ajax.processScripts(obResult.SCRIPT);
    		}
    	}
    	//........


    P.S.
    Писал без тестирования, попробуй, если будут ошибки пиши...

    P.P.S.
    при втором варианте я бы посоветовал тоже использовать bitrix.catalog, но тут сам смотри
    Ответ написан
    Комментировать
  • Как вывести товары из разных инфоблоков?

    @PetrPo
    остаток - это свойство SVOB_OZHIDAEMYY_OSTATOK ? или все же остаток в торговом каталоге?

    Если в торговом каталоге
    \Bitrix\Main\Loader::includeModule('catalog');
    
    $iblockIds = [65, 66];
    $elements = \Bitrix\Catalog\ProductTable::getList([
    	'select' => ['ELEMENT_ID' => 'IBLOCK_ELEMENT.ID', 'ELEMENT_NAME' => 'IBLOCK_ELEMENT.NAME', 'QUANTITY'],
    	'filter' => ['IBLOCK_ELEMENT.IBLOCK_ID' => $iblockIds, '>QUANTITY' => 0]
    ])->fetchAll();
    
    print_r($elements);

    Если свойство
    $elements = [];
    $iblockIds = [65, 66];
    
    $iterator = \CIBlockElement::GetList(['ID' => 'ASC'], ['IBLOCK_ID' => $iblockIds, '>PROPERTY_SVOB_OZHIDAEMYY_OSTATOK' => 0], false, false, ['ID', 'NAME', 'PROPERTY_SVOB_OZHIDAEMYY_OSTATOK']);
    while($row = $iterator->Fetch()) {
    	$elements[] = $row;
    }
    
    print_r($elements);


    Весь код предыдущий закомментируй, он не нужен
    <?
    //...................
    // это не надо
    /*
    CModule::IncludeModule("iblock");
    CModule::IncludeModule("catalog");
    CModule::IncludeModule("sale");
    */
    
    \Bitrix\Main\Loader::includeModule('catalog');
    
    $iblockIds = [65, 66];
    $elements = \Bitrix\Catalog\ProductTable::getList([
      'select' => ['ELEMENT_ID' => 'IBLOCK_ELEMENT.ID', 'ELEMENT_NAME' => 'IBLOCK_ELEMENT.NAME', 'QUANTITY'],
      'filter' => ['IBLOCK_ELEMENT.IBLOCK_ID' => $iblockIds, '>QUANTITY' => 0]
    ])->fetchAll();
    
    // дальше все комментируешь до своей таблицы
    ?>
    
    <?if($elements):?>
    	<table border="1" cellpadding="1" cellspacing="1" style="width: 850px">
    	  <tbody>
    		<?foreach($elements as $element):?>
    			<tr>
    			  <td style="width: 100px;"><?=$element['ELEMENT_ID'];?></td>
    			  <td><?=$element['ELEMENT_NAME'];?></td>
    			  <td style="width: 80px;"><?=$element['QUANTITY'];?></td>
    			</tr>
    		<?endforeach;?>
    	  </tbody>
    	</table>
    <?endif;?>


    если надо в переменную записать таблицу, тогда надо буферизацию добавить
    <?ob_start();?>
        <?if($elements):?>
    .................................................
        <?endif;?>
    <?$MESSAGE = ob_get_clean();?>


    P.S.
    не надо uppercase в переменных использовать ($MESSAGE), всегда должен быть camelcase
    Ответ написан
    Комментировать
  • Как связать фильтр и таблицу в битрикс 24?

    @PetrPo
    доки
    Судя по докам, этот фильтр - это просто вспомогательный интерфейс и тебе надо после него еще самому составлять фильтр
    $filter = [];
    $lAdmin = new CAdminUiList('report_list', null);
    $lAdmin->AddFilter($ui_filter, $filter);

    И полученный $filter надо передавать в getlist
    Ответ написан
  • Почему умном фильтре не работают числовые свойства?

    @PetrPo
    В шаблоне фильтра в файле script.js есть функция JCSmartFilter.prototype.gatherInputsValues - в ней какой-то косяк, если отключишь объединение js в главном модуле, смогу точнее сказать в чем проблема. Для теста можешь заменить на дефолтную
    spoiler

    JCSmartFilter.prototype.gatherInputsValues = function (values, elements)
    {
    	if(elements)
    	{
    		for(var i = 0; i < elements.length; i++)
    		{
    			var el = elements[i];
    			if (el.disabled || !el.type)
    				continue;
    
    			switch(el.type.toLowerCase())
    			{
    				case 'text':
    				case 'textarea':
    				case 'password':
    				case 'hidden':
    				case 'number':
    				case 'phone':
    				case 'email':
    				case 'select-one':
    					if(el.value.length)
    						values[values.length] = {name : el.name, value : el.value};
    					break;
    				case 'radio':
    				case 'checkbox':
    					if(el.checked)
    						values[values.length] = {name : el.name, value : el.value};
    					break;
    				case 'select-multiple':
    					for (var j = 0; j < el.options.length; j++)
    					{
    						if (el.options[j].selected)
    							values[values.length] = {name : el.name, value : el.options[j].value};
    					}
    					break;
    				default:
    					break;
    			}
    		}
    	}
    };


    В этой функции должен быть case 'number': скорее всего или его не хватает или там какая-то кривая логика написана
    Ответ написан
  • Как поменять массово значение поля SUBSCRIBE?

    @PetrPo
    метод, внизу есть пример как раз с SUBSCRIBE (только это статический метод):
    D - по-умолчанию, из настроек модуля
    Y - да
    N - нет

    Я бы проставил всем по умолчанию и в настройках модуля "Торговый каталог" поставил Y, но тут сам смотри как тебе надо.

    UPD
    еще в исходниках написано что метод deprecated, использовать
    \Bitrix\Catalog\Model\Product::update($id, ['SUBSCRIBE' => 'Y']);

    UPDUPD
    здесь есть пример с CAN_BUY_ZERO, замени на SUBSCRIBE - на разок покатит
    Ответ написан
    Комментировать