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

    если посмотреть код, то видно, что при wakeUp не выполняется никаких обращений к БД.
    Метод в файле bitrix/modules/main/lib/orm/objectify/entityobject.php
    смотрите разницу:
    fill*() - подгружает значение из БД
    set*() - задаёт значение свойства, но при несовпадении со старым значением переводит объект в состояние State::CHANGED
    wakeUp() -создаёт объект с указанными значениями свойств, не переводя объект в изменённое состояние, но только при условии, что в аргументе есть первичный ключ.
    Ответ написан
    Комментировать
  • Как настроить ошибку 404 не выводится ошибка в headers?

    Нет, достаточно допилить шаблон компонента каталога. Сейчас, полагаю, на неправильный URL открывается корень каталога? Если так, то достаточно в странице sections.php добавить свой код
    Ответ написан
  • Почему нет свойства в $arResult?

    потому что в аргументах CIBlockElement::GetList() надо указывать не 'PROPERTY_JOB_TITLE_VALUE' , а 'PROPERTY_JOB_TITLE'. А вот в результате будет 'PROPERTY_JOB_TITLE_VALUE' и ещё пачка мусора
    Ответ написан
  • Как получить название пользовательского поля Битрикс по его коду?

    Если есть id поля, то всё легко:
    <?php
    use Bitrix\Main\UserFieldTable;
    
    $id = 1;
    $res = UserFieldTable::getFieldData($id);
    print_r($res);

    Если только символьный код, то чуть сложнее:
    <?php
    use Bitrix\Main\UserFieldTable;
    $fieldName = 'UF_CRM_1728545307';
    $res = UserFieldTable::getList([
        'select' => array_merge(['*'], UserFieldTable::getLabelsSelect()),
        'filter' => [
            '=FIELD_NAME' => $fieldName,
        ],
        'limit' => 1,
        'runtime' => [
            UserFieldTable::getLabelsReference(null, 'ru'),
        ]
    ])->fetchRow();
    print_r($res);
    Ответ написан
    Комментировать
  • Как вывести баннер товара в шапку сайта?

    Судя по $arResult, показанный код где-то в template.php шаблона компонента для вывода баннера. Не надо так.
    вместо этого в шаблоне компонента делаете так:
    <?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
    $this->SetViewTarget("banner-head");
    if (!empty($arResult['PICTURE'])){
        echo CFile::GetPath($arResult['PICTURE']);
    }

    (это весь код шаблона)
    а в header.php сайта пишете:
    <?$APPLICATION->IncludeComponent(/* вызов компонента для баннера */);?>
    <?php
    $picture = trim($APPLICATION->GetViewContent('banner-head'));
    if (!empty($picture)): 
    // и дальше как было
    <?php

    Должно получиться.

    Пихать $APPLICATION->ShowTitle() внутрь шаблона компонента вообще дурная идея. С хлебными крошками, вероятно, то же самое, потому что это особенный компонент, и шаблон у него особенный.
    Ответ написан
  • Как передать значение из компонента в result_modifier шаблона, где компонент вызывается?

    не очень подробно описано, поэтому остаётся гадать. Я предполагаю 2 варианта:
    1) попроще: где-то вызов компонента С1, в шаблоне которого упомянутый result_modifier.php . Затем, ниже первого вызова, идёт вызов компонента С2, от которого нужны данные.
    Тогда просто перенесите вызов компонента С2 выше вызова С1 и оберните:
    <?php
    ob_start();
    $APPLICATION->IncludeComponent( "C2" ...);
    $APPLICATION->AddViewContent("view2",  ob_get_clean() );
    // там, где компонент был раньше, ставите:
    $APPLICATION->ShowViewContent("view2");

    Соответственно, в component_epilog.php компонента С2 засовываете нужные значения в $APPLICATION->SetPageProperty() или просто в $GLOBALS

    2) Посложнее: компонент С2 вызывается в template.php того же шаблона, которому принадлежит result_modifier.php. Тогда в result_modifier.php будет:
    <?php
    $arResult['PROPERTIES']['TABS'][] = array(
        'CODE' => 'FAQ',
        'TITLE' => 'Вопросы о товаре #COUNT#', // Отображаем количество вопросов
        'VALUE' => 'FAQ_FORM' // Временное значение
    );
    , а в template.php выше вывода вкладок:
    <?php
    $this->SetViewTarget("view2");
    $APPLICATION->IncludeComponent( "C2" ...);
    $this->EndViewTarget();
    // передача значения - аналогично первому варианту. Допустим, через $GLOBALS
    // где-то ниже при выводе заголовка таба
    $tab['TITLE'] = str_replace('#COUNT#', $GLOBALS['count'], $tab['TITLE']);
    // и ещё ниже, где был компонент:
    ?>
    <?$APPLICATION->ShowViewContent("view2")?>
    Ответ написан
    Комментировать
  • Как вытащить данные из формы в дополнительных настройках пользовательского поля?

    Дисклаймер: давно копался в этом ужасе, могу ошибаться.

    есть 2 ситуации:
    1) Вы только добавляете новое поле Вашего типа к какому-то объекту (допустим, USER). Вот когда Вы на форме добавления выбираете "Тип данных ..." и страница обновляется, только тогда срабатывает метод GetSettingsHTML()
    2) Вы уже сохранили поле, оно получило ID. Тогда то, что было задано в дополнительных настройках, будет в массиве по ключу SETTINGS поля. Пример кода:
    <?php
    $arUserField = CUserTypeEntity::GetByID(316); // 316 - это ID поля в моём случае, его тип - "связь с HL блоком"
    var_export($arUserField);
    Ответ написан
  • Как в битрикс в поиске добавить Найдено совпадений?

    Только делать свой компонент, плюс расширять класс CSearchTitle , посмотрите на метод
    Ответ написан
    Комментировать
  • Как решить проблему с дублированием при ajax?

    а Вы не пробовали убрать этот инлайновый скрипт в script.js шаблона? Я считаю, что у Вас в data прилетает этот javascript, исполняется, и становится 2 обработчика $(document).on('click', '.load_more',..) , на следующей подгрузке три и так далее. Это можно увидеть в DevTools - посмотрев, сколько ajax запросов порождает нажатие кнопки
    Ответ написан
    Комментировать
  • Как вставить переменную из js в template.php и обновить страницу?

    Вам надо добавить селекту имя и как-то сабмитить форму с селектом (на выбор есть GET и POST). Соответственно, в скрипте значение выбранного города будет в одном из значений в массиве $_GET или в массиве $_POST .

    P.S. Правильно пишется "city". Учите английский, в будущем пригодится.
    Ответ написан
    Комментировать
  • Как подключить reCAPTCHA v3 к форме 1С Битрикс?

    CEvent::Send() только ставит сообщение в очередь ( читай "пишет в таблицу в БД"). А отправлено оно будет только на следующем хите, если повезёт.
    Для немедленной отправки используйте CEvent::SendImmediate()
    Ответ написан
  • Как защититься от создания пустых заказов ботами?

    повесьте обработчик на событие onOrderAdd и записывайте в какой-то лог всё, что нужно: $_SERVER['REQUEST_METHOD'], $_SERVER['REQUEST_URI'], что-нибудь ещё
    Ответ написан
    Комментировать
  • Как передать данные от компонента к компоненту при композитном сайте на Битрикс?

    Через параметры этого другого компонента. Если компоненты разделены, через $GLOBALS или их аналог $APPLICATION->SetPageProperty() , $APPLICATION->GetPageProperty()
    Ответ написан
    Комментировать
  • Вывести описание раздела каталога Bitrix над его элементами?

    bitrix:catalog - это комплексный компонент. На странице element.php шаблона он подключает обычный компонент bitrix:catalog.element .
    Скорее всего, вам нужно посмотреть $arResult в шаблоне компонента bitrix:catalog.element -если там нет нужных данных, то догрузить их обращением к API в result_modifier.php .
    Ответ написан
    Комментировать
  • Как в Битрикс синхронизировать товары между основным сайтом и сайтом для разработки?

    Добавьте ещё b_file - там картинки.

    Если Вы хотите ограничиться только этими таблицами, то не так страшен чёрт, как его малюют. Я бы действовал так:
    1) через Adminer выгрузил структуру нужных таблиц на боевом и на тесте.
    2) сравнил эти структуры каким-нибудь инструментом ( например, Meld). В хорошем случае разница будет только в чём-то незначительном, типа автоинкремента.
    3) если всё хорошо, перелил таблицы.
    4) переиндексировал поиск, если это нужно.
    Возможно, диапазон таблиц стоит расширить до b_iblock_* , b_catalog_*
    Ответ написан
    Комментировать
  • Как изменить шаблон у внутренних страниц?

    Делайте так же, что Вас останавливает? Если не хотите плодить строчки, то я вижу 2 пути:
    1) использовать в "Тип условия" значение "Выражение PHP", а в "Условие" регулярное выражение. Вот пример от коробочного правила:
    preg_match("#^/video/([\.\-0-9a-zA-Z]+)(/?)([^/]*)#", $GLOBALS['APPLICATION']->GetCurPage(0))

    2) сделать комплексный компонент, регулярку задать в нём, поместить его, например, в /test/index.php . Или аналогично сделать через роутинг. Тогда в настройках сайта будет достаточно одной строчки с типом "Для папки или файла" .
    Ответ написан
    Комментировать
  • Как в Битриксе отключить товарное предложение?

    к ответу tgarl добавлю только, что если делать обработчик для onBefore события, то в нём не надо самому делать апдейт в базе, а надо делать
    $arFields['ACTIVE'] = 'N';
    Именно для этого $arFields и принимают по ссылке. И надо не забывать, что на том же событии могут быть другие обработчики, со своими изменениями
    Ответ написан
    Комментировать
  • Как настроить nginx + php fpm для 1c bitrix?

    попробуйте вот это:
    try_files $uri $uri/ /bitrix/urlrewrite.php$is_args$args;

    заменить на:
    try_files $uri $uri/ @bitrix;
    И добавить именованный location по образцу PHP-шного:
    location @bitrix {
      include fastcgi_params;
      fastcgi_intercept_errors on;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME $document_root/bitrix/urlrewrite.php;
      try_files $uri =404;
      fastcgi_read_timeout 3600;
      fastcgi_send_timeout 3600;
      fastcgi_param HTTPS "on";
      fastcgi_param SERVER_PORT 443;
      fastcgi_pass 127.0.0.1:{{php_fpm_port}};
      fastcgi_param PHP_VALUE "{{php_settings}}";
    }

    ( я это не проверял)
    Ответ написан
  • Почему иногда не срабатывает событие?

    Вы неправильно используете аргументы в CCrmCompany::getList(), из-за этого получаете вообще все компании и вынуждены их перебирать. Плюс, для событий "OnBefore....Add" ключ ID не может существовать - ведь такие события происходят до создания новой записи ( в смысле элемента, раздела, компании ).

    Должно быть что-то такое ( префиксный фильтр в arFilter должен работать, но я не проверял ):
    function OnBeforeCrmCompanyAddHandler(&$arFields)
    {
        $res = CCrmCompany::getList(['ID' => 'ASC'], ['=TITLE' => $arFields["TITLE"]], ['ID'], 1);
        if ($res->Fetch()) {
            $arFields["RESULT_MESSAGE"] = "Данная компания уже существует!";
            return false;
        }
        return true;
    }

    Список префиксов можно посмотреть в файле bitrix/modules/main/classes/general/sqlwhere.php , в свойстве $operations
    Ответ написан
    Комментировать
  • Как настроить чпу для компонента news для подразделов?

    моя гипотеза
    по скриншотам понять трудно, но попробуйте в параметрах компонента в поле "страница раздела" убрать начальный слеш; должно быть "#SECTION_CODE_PATH#/"
    Ответ написан
    Комментировать