• Как на битрикс, теме Аспро убрать кнопку "заказать звонок"?

    AlexeyGfi
    @AlexeyGfi
    YouTube >>> Битриксоид из Колхоза
    Аспро держит "веб-формы" в инфоблоках.
    Подключает их через /ajax/form.php

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

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

    Прям сразу комментировать не советую, поскольку девять к одному, что при обновлении ваши изменения перетрутся. Тогда стоит кастомизировать шаблон и уже там работать с кодом.
    Ответ написан
    Комментировать
  • Как быть с хвостами флексбоксов?

    AlexeyGfi
    @AlexeyGfi Автор вопроса
    YouTube >>> Битриксоид из Колхоза
    Придумалось необычное решение. Нужно добить хвост элементами-пустышками.

    jsfiddle

    В количестве
    L — 2
    где L — количество элементов в списке
    «минус два», потому что когда в хвосте один элемент, он корректно прижимается к левому краю, а вот когда их в хвосте уже два, тогда возникает смещение.

    Можно скриптом после загрузки страницы, можно при создании страницы на бекэнде (всё-равно програмно генерятся элементы на странице, длина списка известна).
    Ответ написан
  • Стили компонента после основных возможно?

    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;
    	}
    }

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

    AlexeyGfi
    @AlexeyGfi Автор вопроса
    YouTube >>> Битриксоид из Колхоза
    Удалось расковырять самому.
    https://regex101.com/r/suCdNB/4/

    Основываясь на условных подмасках:
    php.net/manual/ru/regexp.reference.conditional.php
    а именно:
    (?(condition)yes-pattern)
    (?(condition)yes-pattern|no-pattern)


    Наш анализ сводится к такому: «Если выполняется условие "не содержится match", мы применяем шаблон [^>] (который соответствует телу тега <a=тело=>), иначе (если match присутствует), применяем пустой шаблон (то есть пытаемся найти пустой тег <a>)».

    Пустые теги <a> теоретически возможны (хоть и с точки зрения внедрения ссылки в текст безопасны), а значит наша регулярка не даёт железно 100%-результат. Потому в качестве no-pattern-а можно дать любую невалидную абракадабру (просто, чтобы её не было найдено).

    <(a)(?(?!match)[^>]|false)+>[^<]*</\1>
    Ответ написан
    Комментировать
  • Как поставить несколько Captcha на одной странице?

    AlexeyGfi
    @AlexeyGfi
    YouTube >>> Битриксоид из Колхоза
    Я знаю, что есть reCaptcha от гугл с отложеным рендером и возможностью рендерить несколько каптч на одну страницу, однако 2 и более сильно тормозят загрузку страницы.

    Пинайте их тогда, когда возникла в этом необходимость.
    У меня на лендинге 7 каптч, все они скрыты в разворачивающихся формах и не инициализируются, пока форма не будет раскрыта (или вообще не инициализируются, если дело до них не дошло).
    Ответ написан
  • Как отфильтровать каталог по значению поля типа 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, если компонент на новом ядре.
    Ответ написан
    Комментировать