• Bitrix ORM: как получить поле связанной таблицы (fetchObject())?

    ragnar_ok
    @ragnar_ok Автор вопроса
    Магические методы работают только для описанных в сущности полей. Нужно использовать

    $tel = $entityObj->get('FIELD_ENUM').

    Ответили на вопрос:
    @gasparonik
    @protopgamer
    Ответ написан
    Комментировать
  • Умный фильтр: как установить значение по умолчанию для input'а?

    ragnar_ok
    @ragnar_ok Автор вопроса
    Нужно кастомизировать компонент.

    catalog.smart.filter/component.php:416
    if (empty($_CHECK)) {
      $arResult["ITEMS"][$PID]["VALUES"][array_key_first($arResult["ITEMS"][$PID]["VALUES"])]["CHECKED"] = true;
      $arResult["ITEMS"][$PID]["DISPLAY_EXPANDED"] = "Y";
    }
    Ответ написан
    Комментировать
  • Как формируется INPUT в Битрикс?

    ragnar_ok
    @ragnar_ok
    Не "недра ядра", конечно, но если вы хотите использовать $arItem["INPUT"], то компонент кастомизировать придется. Input'ы формируются в component.php:
    bitrix:catalog.filter: /bitrix/components/bitrix/catalog.filter/component.php:411
    (Привет, MVC!).

    Вы можете обойтись без кастомизации компонента. Для этого просто изучите $arResult компонента. Там вы найдете все, что нужно для формирования input'a (например, массив LIST для атрибута value). Избавьтесь от $arItem["INPUT"] в своем шаблоне и сформируйте свой input. В Вашем случае это будет выглядеть примерно так:
    <?foreach ($arItem["LIST"] as $key => $value):?>
        <div class="sp_div_block_1">
            <label class="section_position__form_sp__label"><?= $arItem["NAME"] ?></label>
            <input type="radio" name="<?=$arItem["INPUT_NAME"]?>" value="<?=htmlspecialcharsBx($key)?>"/>
        </div>
    <?endforeach;?>
    Ответ написан
    Комментировать
  • Bitrix\Highloadblock\HighloadBlockTable как получить ID блока по названию?

    ragnar_ok
    @ragnar_ok
    Для решения задачи не нужно знать ID highloadblock'a и использовать дополнительную функцию-обертку (GetEntityDataClass($HL_BLOCK_ID)); в Вашем примере).

    Вы можете получить то, что Вам нужно одной строкой:

    Highloadblock\HighloadBlockTable::compileEntity('НАЗВАНИЕ')->getDataClass(); // указываете сразу название вместо ID


    Возможно стоит написать функцию-обертку для того, чтобы ловить исключения, которые пробрасывает метод compileEntity:

    function compileEntity($entity): ?Base
        {
            try {
                return Highloadblock\HighloadBlockTable::compileEntity($entity);
            } catch (SystemException $systemException) {
                // что-нибудь
                return null;
            }
        }
    Ответ написан
    4 комментария
  • Как заставить bitrix:news.list работать с bitrix:catalog.filter при том, что bitrix:catalog.filter расположен ниже bitrix:news.list?

    ragnar_ok
    @ragnar_ok Автор вопроса
    Похоже на то, что без двойного вызова одного и того же компонента задача не решаема.
    Проблему решил используя jsAjaxUtil:
    jsAjaxUtil.InsertFormDataToNode(this, 'comp_' + window.bxajaxid, false);
    Ответ написан
    Комментировать
  • Как использовать CAjax::GetForm()?

    ragnar_ok
    @ragnar_ok Автор вопроса
    Предлагаю порядок действий:
    1. указать параметр AJAX_MODE для bitrix:news.list
    2. кастомизировать bitrix:news.list и заставить его возвращать $arParams['AJAX_ID'], который он сгенерировал из-за 'AJAX_MODE' => 'Y'
    3. передать AJAX_ID для bitrix:news.list в параметрах catalog.filter
    4. рендерим форму в шаблоне фильтра:
      CAjax::GetForm('name="ajaxform" action="formtest.php" method="POST"', 'comp_'.$arParams['AJAX_ID'], $arParams['AJAX_ID'])

    5. ???
    6. PROFIT!
    Ответ написан
    Комментировать
  • Bitrix D7 ORM: как организвать отношение многие-ко-многим (ManyToMany/N:M)?

    ragnar_ok
    @ragnar_ok Автор вопроса
    Нужно в ручную запрашивать линкующую таблицу. Средствами фреймворка на сегодня это не предусмотрено.
    CREATE TABLE `developer_region` (
      `developer_id` int(11) NOT NULL,
      `region_id` int(11) NOT NULL,
      PRIMARY KEY (`developer_id`,`region_id`),
      CONSTRAINT `FK_developer` FOREIGN KEY (`region_id`) REFERENCES `region` (`id`),
      CONSTRAINT `FK_region` FOREIGN KEY (`developer_id`) REFERENCES `developer` (`id`)
    );

    Либо описывать сущность линкующей таблицы и использовать createDbTable()
    Ответ написан
    Комментировать
  • Как выполнить редирект на страницу 500.php?

    ragnar_ok
    @ragnar_ok Автор вопроса
    С товарищем обнаружили, что в Bitrix\Main\Diag\ExceptionHandler вызывается set_exception_handler(function () {}).

    Отталкиваясь от ExceptionHandler в init.php указал следующее:
    if (!Bitrix\Main\Config\Configuration::getValue('exception_handling')['debug']) { // если 'exception_handling' => ['value' => ['debug' => false]]
        set_exception_handler(function ($exception) {
            (new Bitrix\Main\Diag\ExceptionHandler())->writeToLog($exception, Bitrix\Main\Diag\ExceptionHandlerLog::UNCAUGHT_EXCEPTION); // логируем
            LocalRedirect('/500.php');
            exit;
        });
    }

    Таким образом, при возникновении внутренней ошибки PHP в случае, если debug отключен, то происходит редирект на страницу /500.php. И не пришлось расширять класс.
    Ответ написан
    Комментировать
  • Как вывести не авторизованному пользователю форум с доступом "Нет доступа"?

    ragnar_ok
    @ragnar_ok Автор вопроса
    /bitrix/components/bitrix/forum.index/component.php:139
    Нужно изменить логику работы фильтра:
    if (!CForumUser::IsAdmin()):
    		$arFilter["PERMS"] = $USER->GetGroups() === "2" ? [] : array($USER->GetGroups(), 'A');
    		$arFilter["ACTIVE"] = "Y";
    	endif;
    Ответ написан
    Комментировать
  • Почему не выводится header и footer (bitrix:news + AJAX)?

    ragnar_ok
    @ragnar_ok Автор вопроса
    Я добавил атрибут onclick="void(0)" к ссылке на страницу авторизации, которой присваивался BX.ajax.insertToNode.
    Таким образом, я избавился от метода, а, значит, и от ИД сессии в параметрах. Теперь хидер и футер подключаются.
    Ответ написан
    1 комментарий
  • Как правильно вывести значение свойства по умолчанию?

    ragnar_ok
    @ragnar_ok Автор вопроса
    Позаимствовал в контроллере компонента такой подход. В случае, если свойство DEFAULT_VALUE заполнено, то также вносит в DISPLAY_PROPERTIES.
    foreach($arResult["ITEMS"] as &$arItem)
    {
        foreach($arParams["PROPERTY_CODE"] as &$pid)
        {
            $prop = $arItem["PROPERTIES"][$pid];
            if(
                (is_array($prop["DEFAULT_VALUE"]) && count($prop["DEFAULT_VALUE"])>0)
                || (!is_array($prop["DEFAULT_VALUE"]) && strlen($prop["DEFAULT_VALUE"])>0)
            )
            {
                $arItem["DISPLAY_PROPERTIES"][$pid] = CIBlockFormatProperties::GetDisplayValue($arItem, $prop, "news_out");
            }
        }
    }
    unset($arItem, $pid);
    Ответ написан
    Комментировать
  • Битрикс: CSaleBasket::Update - почему модифицируется количество, а цена нет?

    ragnar_ok
    @ragnar_ok Автор вопроса
    Вот и ответ:
    $arFields = array(
                "CALLBACK_FUNC" => "",
                "PRODUCT_PROVIDER_CLASS" => "",
                "CUSTOM_PRICE"      => "Y",
                "IGNORE_CALLBACK_FUNC"  => "Y"
            );

    Существует два параметра: "CUSTOM_PRICE", "IGNORE_CALLBACK_FUNC". Они позволяют отключать GetOptimalPrice и использовать кастомную цену.
    Ответ написан
    Комментировать