Ответы пользователя по тегу 1С-Битрикс
  • Стили компонента после основных возможно?

    AlexeyGfi
    @AlexeyGfi
    YouTube >>> Битриксоид из Колхоза
    Пересилить стили можно не только !important, но и указанием более расширенного правила с использованием любого родителя.

    То есть, если имеем:
    <div class= 'parent'>
    	<div class= 'child'>
    		Текст
    	</div>
    </div>


    И стили:

    .child { color: red; }
    .parent .child { color: blue; }


    То цвет текста внутри .child будет синим, а не красным.
    Ответ написан
    Комментировать
  • Как построить многоуровневое меню из одного файла?

    AlexeyGfi
    @AlexeyGfi
    YouTube >>> Битриксоид из Колхоза
    https://dev.1c-bitrix.ru/learning/course/?COURSE_I...
    Система Bitrix Framework позволяет также создавать меню динамического типа. Т.е. массив данных таких меню генерируется автоматически на основании некоторых данных, получаемых с помощью программного кода. Данный код должен храниться в папке соответствующего раздела сайта в файле с именем .<тип меню>.menu_ext.php.


    Кладёте в *.menu_ext.php что угодно — хоть компонент с выборкой подразделов... Суть в том, что на вход пришёл $aMenuLinks, должен $aMenuLinks и уйти. То есть в этом файле дополняете массив новыми пунктами/подпунктами и пропускаете дальше.
    Ответ написан
  • Как правильно работать с кешем в Битрикс?

    AlexeyGfi
    @AlexeyGfi
    YouTube >>> Битриксоид из Колхоза
    При формировании ключа кеша используется arParams.

    Вот цитата кода
    файл /bitrix/modules/main/classes/general/component.php:
    public function getCacheID($additionalCacheID = false)
    {
    	(...)
    
    	$cacheID = $SITE_ID."|".$LANGUAGE_ID.($SITE_TEMPLATE_ID != "" ? "|".$SITE_TEMPLATE_ID:"")."|".$this->__name."|".$this->getTemplateName()."|";
    
    	foreach($this->arParams as $k=>$v)
    		if(strncmp("~", $k, 1))
    			$cacheID .= ",".$k."=".serialize($v);
    
    	(...)
    
    	if ($additionalCacheID !== false)
    		$cacheID .= "|".serialize($additionalCacheID);
    
    	return $cacheID;
    }


    Как одно из предположений: у вас arParams разный для разных пользователей.
    Попробуйте организовать вывод массива во время формирования ключа кеша (а лучше настройте xdebug и наступит вам счастье =)
    Ответ написан
    Комментировать
  • Как настроить урл при поиске в битрикс?

    AlexeyGfi
    @AlexeyGfi
    YouTube >>> Битриксоид из Колхоза
    Шаблоны ссылок в настройках инфоблока.
    Ответ написан
    3 комментария
  • Как организовать многоуровневые комментарии с постраничной навигацией?

    AlexeyGfi
    @AlexeyGfi
    YouTube >>> Битриксоид из Колхоза
    www.realcommenter.com

    Специально запустил тестовый поддомен, где регулярно генерится в автомате новая порция комментариев.
    Там уже 1 800 000 комментариев
    test.realcommenter.com
    Ответ написан
    Комментировать
  • Как программно уменьшить количество товара в корзине?

    AlexeyGfi
    @AlexeyGfi
    YouTube >>> Битриксоид из Колхоза
    Алексей Емельянов:
    Скорее всего нужно сначала удалить документ отгрузки.

    При обновлении через админку, документы не помеха (остаются проведёнными, появляется уточнение о том, сколько отгружено и сколько нужно до-отгрузить).

    Также нужно быть осторожным, поскольку «спрыгивают» применённые при создании подарки. Скидки не проверял.

    Используйте D7.

    Работающий код
    (внутри — PHPDocs, без которых IDE не может сориентироваться в подсказках):
    // Читаем заказ, читаем корзину
    $order= \Bitrix\Sale\Order::load( 6924 );
    $basket= $order->getBasket();
    $basket_items= $basket->getBasketItems();
    
    /**
     * @var $bi \Bitrix\Sale\BasketItem
     */
    foreach ( $basket_items as $bi ) {
    	$quantity_current= $bi->getField( 'QUANTITY' );
    	
    	//Приходит в формате "3.000"
    	$quantity_current++;
    	$quantity_current= $bi->setField( 'QUANTITY', $quantity_current );
    	
    	$save_result= $bi->save();
    	if ( !$save_result->isSuccess() ) {
    		ShowError( $save_result->getErrorMessages() );
    		exit;
    	}
    }

    (!) При изменении таким способом, накапливается и история изменений в сопроводительной информации к заказу.
    В частности: изменение количества заказа, стоимости заказа, изменений в подарках.
    Также в отгрузках корректно срабатывает счётчик требуемой до-отгрузки.
    Ответ написан
    Комментировать
  • Как отфильтровать каталог по значению поля типа highload?

    AlexeyGfi
    @AlexeyGfi
    YouTube >>> Битриксоид из Колхоза
    Выбирать нужно по XML_ID.
    Заглянем внутрь.

    База данных:
    79c8f320d8624c4c85f6b2a4fb177fea.png

    HL-блок. Я хз, почему оно названо одинаково (два поля ID). Его можно переименовать, но так делает система и нам сейчас важна стандартная комплектация):
    0b144c46bbb44baabfe89b2b88003335.png

    Ну и наш запрос:
    \Bitrix\Main\Loader::includeModule( 'highloadblock' );
    \Bitrix\Main\Loader::includeModule( 'iblock' );
    
    $el_Filter= [
            'IBLOCK_ID' => 5,
            'INCLUDE_SUBSECTIONS' => 'Y', 
            'PROPERTY_BRAND' => 46361
    ];
    
    $el_Nav= [ 'nTopCount' => 10 ];
    
    $el_Select= [ 'IBLOCK_ID', 'ID', 'NAME', 'PROPERTY_BRAND' ];
    
    $el_res= CIBlockElement::GetList( false, $el_Filter, false, $el_Nav, $el_Select );
    while ( $el_arr= $el_res->Fetch() ) {
    	...
    }
    Ответ написан
    Комментировать
  • Почему очищается массив $_POST?

    AlexeyGfi
    @AlexeyGfi
    YouTube >>> Битриксоид из Колхоза
    Если вы обновите страницу, она не попросит вас подтвердить отправку формы (как обычно бывает при отправке POST-запроса).
    Это значит, что страница прошла через LocalRedirect( ... );

    Первое, что я бы сделал — прошёлся по лабиринту за ниточку xdebug-а.

    Возможно в _after подключении срабатывает условие переадресации, а перехватить _POST нужно до его подключения и самому сделать редирект.

    UPD: вот ещё, может поможет:
    https://dev.1c-bitrix.ru/api_help/main/general/pag...
    Ответ написан
    4 комментария
  • Что за ошибка bitrix?

    AlexeyGfi
    @AlexeyGfi
    YouTube >>> Битриксоид из Колхоза
    while($ar_result = $db_list->GetNextElement()) {
    	$ar_el= $ar_result->GetFields();
    	$ar_el[ 'PROPERTIES' ]= $ar_result->GetProperties();
    	
    	$arResult[]= $ar_el;
    }
    Ответ написан
    Комментировать
  • Как сделать навигацию в bitrix news detail с сортировкой по дате активности?

    AlexeyGfi
    @AlexeyGfi
    YouTube >>> Битриксоид из Колхоза
    $res = CIBlockElement::GetList(
    	Array(
    	    'DATE_ACTIVE_FROM' => 'ASC'
    	),
    	Array("IBLOCK_CODE"=>"news", "ACTIVE"=>"Y"),
    	false,
    	false,
    	[   указывайте, какие поля читать.
    		Не тяните целую колбасу, когда вам нужно всего пару полей
    	]
    );


    И ещё.
    Здесь есть такое:
    arNavStartParams
    "nElementID" - ID элемента который будет выбран вместе со своими соседями...
    Ответ написан
    Комментировать
  • Почему не перезаписываются стили?

    AlexeyGfi
    @AlexeyGfi
    YouTube >>> Битриксоид из Колхоза
    Как я понимаю, тот, что в папке с компонентами, должен перезаписывать стили того, что выше него (подключаться позже)

    Если ShowHead в header-е идёт раньше подключения /css/style.css, будет наоборот.

    Порядок подключенных css- и js-файлов можно увидеть при просмотре исходного кода страницы.

    Примеры подключения, чтобы css ушёл в общий набор:
    js:
    $doc_root= \Bitrix\Main\Application::getDocumentRoot();
    $js= '/images/file_upload_agent.js';
    \Bitrix\Main\Page\Asset::getInstance()->addJs( $js . '?x=' . md5( filemtime( $doc_root . $js ) ), true );


    css (есть функция ->addCss, но она по факту не рабочая — не допилили они её видимо):
    $doc_root= \Bitrix\Main\Application::getDocumentRoot();
    		$css= '/css/style.css';
    		\Bitrix\Main\Page\Asset::getInstance()
    			->addString( '<link rel="stylesheet" type="text/css" href="'.$css.'?x='.md5( filemtime( $doc_root . $css ) ).'" />', true );
    Ответ написан
    Комментировать
  • Как подставить класс в поле конструктора api:main.feedback?

    AlexeyGfi
    @AlexeyGfi
    YouTube >>> Битриксоид из Колхоза
    Почему не обратитесь к разработчикам?
    https://tuning-soft.ru/shop/api.feedback/ — они ведь?

    773582e2665c4c2a835b3dce4ac413fe.jpg
    Ответ написан
  • Где настроить права доступа чтоб была возможность использования привязки к разделам?

    AlexeyGfi
    @AlexeyGfi
    YouTube >>> Битриксоид из Колхоза
    Мультипривязка к разделам работает по-умолчанию:
    935e529543c94cb5a8fe5f11432e7cf6.jpg

    По сути вопроса:
    Такое (у меня) случалось тогда, когда привязка шла к другому инфоблоку и уже к тому инфоблоку у менеджера не было доступа.

    В вашей ситуации инфоблок тот же, значит возникает вопрос — указан ли он явно в настройках свойства «Привязка к разделам» в настройке инфоблока?
    b0de203296c54cc18ad78c075d3abf6a.jpg

    Если не указан явно, строится список ко всем инфоблокам и если в этот список попадает недоступный инфоблок...

    UPD:
    Увидел ваш комментарий случайно. Нажимайте "Комментировать", чтобы уведомления рассылались авторам ответов.

    Но я не могу выбрать тот же ИБ в свойстве
    ===
    Да, действительно. В списке его нет.
    Хотя в привязке элементов он же присутствует.

    Тогда либо использовать стандартную мультипривязку, либо своё пользовательское свойство организовать, либо обычное текстовое поле, с мультизначениями (но тогда менеджер не будет иметь возможность выбирать).

    Лучше всего своё пользовательское свойство.
    Тема с наскока мутноватая, но если разобраться, за ней реальная мощь.
    И реализуется сравнительно быстро. Вам по-минимуму нужно создать свой тип свойства, в нём строить список разделов инфоблока с возможностью мультивыбора (это если не заморачиваться с кнопкой «...» и интерфесом выбора раздела из таблицы).

    По теме:
    https://dev.1c-bitrix.ru/community/webdev/user/285...
    https://dev.1c-bitrix.ru/community/webdev/user/107...
    https://blog.sibirix.ru/2012/05/12/user-type-descr...
    https://dev.1c-bitrix.ru/api_help/iblock/classes/u...
    Ответ написан
    Комментировать
  • Как добавить номер страницы в мета-тег страницы пагинации?

    AlexeyGfi
    @AlexeyGfi
    YouTube >>> Битриксоид из Колхоза
    Как делал бы я:

    1. Завёл бы в админке, в настройках модулей, в управлении структуры в секции «типы свойств» новое свойство:
    pagination_suffix

    2. В шаблоне компонента инициализировал бы это свойство:
    $APPLICATION->SetPageProperty( 'pagination_suffix', ' Страница zZz' );

    Текст « Страница » по-правильному вынести в /lang/ файлы и тогда вызов предыдущей строки будет таким:
    $APPLICATION->SetPageProperty( 
    		'pagination_suffix', 
    		\Bitrix\Main\Localization\Loc::getMessage( 'PAGE_IN_BROWSER_TITLE' ) . 'zZz' 
    	);

    Шаблон:
    — знает, какой номер страницы;
    — избавляет нас от геморроя с отслеживанием PAGEN_1, PAGEN_2, PAGEN_3, ...

    Номер страницы берём из
    $arResult[ 'NAV_RESULT' ]->NavNum;

    3. Вывод заголовка дополнил бы так:
    <title><?$APPLICATION->ShowTitle()?><?$APPLICATION->ShowProperty( 'pagination_suffix' )?></title>


    (!) Есть риск, что это шаблон компонента кешируется и потому первый вызов даст нам нумерацию страниц, а потом перестанет срабатывать SetPageProperty. Я выношу код из template.php в component_epilog.php (почти всегда уже так делаю) и так все вызовы не кешируются.

    Чтобы пробросить arResult в component_epilog.php, нужно в result_modifier.php прописать:
    $this->__component->SetResultCacheKeys( arrary_keys( $arResult ) );


    То есть у нас в папке с шаблоном компонента:
    • result_modifier.php (создаём если его нет) с пробросом переменных;
    • template.php, в котором остаётся только голосование за композит $this->setFrameMode(true);
    • component_epilog.php, где собственно вывод на экран и выполнение прописывания заголовков.
    Ответ написан
    Комментировать
  • Где в Битриксе лежат формы?

    AlexeyGfi
    @AlexeyGfi
    YouTube >>> Битриксоид из Колхоза
    С формами (если имеются в виду веб-формы) возможна путаница, так как может подключаться не шаблон компонента, а шаблон веб-формы, переопределённый в её настройках.

    Я бы не влазил туда, а сначала просто попробовал навесить клик на кнопку.
    Например, форма у нас имеет name="SIMPLE_FORM_3"
    То есть <form ... name= "SIMPLE_FORM_3" ... >

    Пишем функцию и вызываем её при загрузке страницы:
    function form_mark() {
    	//Получаем кнопку в форме
    	let form_submit= document.querySelector( 'form[name="SIMPLE_FORM_3"] input[type="submit"]' );
    	if ( !form_submit ) {
    		return;
    	}
    	
    	//Вешаем дополнительное событие на кнопку на клик
    	form.submit.addEventListener( 'click', function() { ... } );
    }
    
    //Вешаем дополнительное событие на windows на загрузку
    window.addEventListener( 'load', form_mark );
    Ответ написан
    Комментировать
  • Не могу понять какой шаблон отвечает за вывод списка товаров в 1С Битрикс?

    AlexeyGfi
    @AlexeyGfi
    YouTube >>> Битриксоид из Колхоза
    Похожая путаница например с веб-формами, когда используется шаблон из настроек, а не тот, что указан в параметрах компонента.
    Раскопайте component.php и посмотрите, какой шаблон вызывается.
    Или class.php, если компонент на новом ядре.
    Ответ написан
    Комментировать
  • Как получить значение переменной из одного класса в другой?

    AlexeyGfi
    @AlexeyGfi
    YouTube >>> Битриксоид из Колхоза
    Во-первых, у вас путаница в коде
    38663631d8e1456a9544977bd362537e.jpg
    .

    Во-вторых (по сути вопроса), исходя из очерёдности наступления событий:
    — сначала вызовется
    CEvent::Send( 'THANKS', $arrSite, $arSend );
    — потом наступит событие
    OnBeforeEventAdd
    — которое вызовет функцию
    OnBeforeEventAddHandler ( &$event, &$lid, &$arFields )

    При чём в этой ветке вызовов:
    &$event УЖЕ равно'THANKS' и значит его не нужно переопределять (а даже можно добавить проверку, чтобы не резались все почтовые события поголовно);
    &$arFields будет содержать ссылку на массив $arSend, в который вы и можете поместить нужную переменную. Использовать как вам нужно и почистить (или не чистить — поля, которых нет в почтовом шаблоне просто проигнорируются).

    В-третьих: что-то мне не нравится такая логика (либо не очевидно то, что вы пытаетесь сделать). Если $WORKEREMAIL задумано как одно из полей в письме, его нужно просто учесть в почтовом шаблоне и передать сразу в
    CEvent::Send( 'THANKS', $arrSite, $arSend ); без последующего перехвата.

    Сюда же: $arSend составлен неправильно. Тут должен быть массив ключ–значение.
    Ответ написан
  • Есть ли возможность вывода товаров с торговыми предложениями?

    AlexeyGfi
    @AlexeyGfi
    YouTube >>> Битриксоид из Колхоза
    Два экземпляра одного и того же компонента, но с разными шаблонами.
    В первом выводится список без товарных предложений и предоставляется выбор.
    Второй по фильтру отбирает конкретный товар с товарными предложениями, но в шаблоне отображаете только список предложений.
    Ответ написан
    Комментировать
  • Правильная настройка ЧПУ Битрикс?

    AlexeyGfi
    @AlexeyGfi
    YouTube >>> Битриксоид из Колхоза
    Через обработку адресов + настройку шаблонов ссылок непосредственно в инфоблоке.

    Обработка адресов:
    /bitrix/admin/urlrewrite_list.php
    + курс

    Шаблоны ссылок в инфоблоке:
    первый скриншот
    Ответ написан
  • Не выводится ни один компонент IncludeComponent в Битриксе: как починить?

    AlexeyGfi
    @AlexeyGfi
    YouTube >>> Битриксоид из Колхоза
    В каких файлах задается работа IncludeComponent?

    /bitrix/modules/main/*
    Конкретно —
    /bitrix/modules/main/classes/general/main.php

    лицензия истекла

    Желательно иметь точную сборку согласно версии, некоторые фичи могут быть несовместимы с ядром.

    Я написал бы в техподдержку.
    Ответ написан
    Комментировать