Все сервисы Хабра

Сообщество IT-специалистов

Ответы на любые вопросы об IT

Профессиональное развитие в IT

Удаленная работа для IT-специалистов

Изобретаем колесо для качественно новой архитектуры
Войти на сайт
  • Все вопросы
  • Все теги
  • Пользователи

Хабр Q&A — вопросы и ответы для IT-специалистов

Получайте ответы на вопросы по любой теме из области IT от специалистов в этой теме.

Узнать больше
другие проекты хабра
  • Хабр
  • Карьера
  • Фриланс
Задать вопрос
winer

Роман Грицук

занимаюсь разработкой сайтов на 1c-bitrix
  • 139
    вклад
  • 5
    вопросов
  • 224
    ответа
  • 43%
    решений
Ответы
  • Информация
  • Ответы
  • Вопросы
  • Комментарии
  • Подписки
  • Нравится
  • Достижения
  • В чем отличия catalog.item и catalog.element и для чего надо их использовать?

    winer
    Роман Грицук @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    catalog.element - это компонент который предназначен для вывода детальной информации о товаре. Внутри него идёт запросы к БД, и формируется массив arResult с описанием товара.

    catalog.item - это компонент который, обычно, используется для вывода информации о товаре внутри списка товаров. Он отличается от catalog.element тем, что сам не получает ни какой информации о товаре. По сути это обертка, в параметры которой передается УЖЕ СФОРМИРОВАННЫЙ набор данных. Его удобно использовать в разных списочных компонентах, например в catalog.section.
    Ответ написан 20 янв.
    Комментировать
    Нравится Комментировать
  • Как поставить галочку для свойства товара "Показывать на странице списка элементов"?

    winer
    Роман Грицук @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    ORM таблица \Bitrix\Iblock\PropertyFeatureTable
    в БД это b_iblock_property_feature

    Смотрите что сохраняется в БД, а дальше через PropertyFeatureTable::add или PropertyFeatureTable::update делаете то что Вам надо.
    Ответ написан 24 дек. 2020
    Комментировать
    Нравится Комментировать
  • Как вывести видео в новости?

    winer
    Роман Грицук @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Если новость - это элемент инфоблока и видео надо выводить всегда в одном и том же месте шаблона, тогда можно сделать так:
    - Создать свойство ИБ типа видео.
    - Включить вывод этого свойства в настройках компонента. Скорее всего это будет комплексный компонент bitrix:news, в шаблоне которого подключен bitrix:news.detail.
    - в шаблоне соответствующего компонента вывести видео либо с помощью строки сформированной в $arResult["DISPLAY_PROPERTIES"], либо с помощью вставки пути к файлу с видео в html тег video

    p.s. В комментариях к вопросу вы показали, то куда добавляете PHP код. Так вот, его нельзя добавлять в описание элемента ИБ. Он там не будет выполнятся. Там допустим только html.
    Ответ написан 23 дек. 2020
    Комментировать
    Нравится 1 Комментировать
  • Как убрать свойства из умного фильтра?

    winer
    Роман Грицук @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    На странице бренда фильтрацию по бренду надо задавать через параметр умного фильтра PREFILTER_NAME.
    Этот параметр работает схожим образом с FILTER_NAME.

    глобальный массив PREFILTER_NAME нужно определить до catalog.smart.filter и передать в него фильтр по бренду. С ним умный фильтр сначала выполнит предварительную фильтрацию, которая не будет отображаться в шаблоне. Другие бренды пропадут.
    Ответ написан 11 дек. 2020
    Комментировать
    Нравится 1 Комментировать
  • Как в Битриксе получить дерево разделов каталога в виде вложенного массива?

    winer
    Роман Грицук @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Стандартного метода в API битрикс, который бы вернул дерево разделов от указанного элемента - НЕТ.

    Но можно воспользоваться CIBlockSection::GetNavChain, который возвращает путь по дереву от корня до раздела SECTION_ID в виде массива.

    Если Вам принципиально видеть выходной набор данный в виде дерева, напишите функцию обёртку над CIBlockSection::GetNavChain, которая переделает битриксовый массив в нужный вам формат
    Ответ написан 03 дек. 2020
    Комментировать
    Нравится Комментировать
  • Как сделать валидацию телефона при оформлении заказа в битриксе?

    winer
    Роман Грицук @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Если маску делали с помощью InputMask, то на фронте можно добавить валидацию поля ПЕРЕД сохранение заказа

    if ($(selector).inputmask("isComplete")){
        //do something
    }


    Можно к этой валидации добавить серверную валидацию поля на событии модуля sale OnSaleOrderBeforeSaved
    Приблизительно так может выглядеть обработчик:
    <?
    function OnSaleOrderBeforeSaved(\Bitrix\Main\Event $event)
    {
        /** @var \Bitrix\Sale\Order $order */
        $order = $event->getParameter("ENTITY");
    
        if ($order->isNew() ) {//Если проверка требуется только для нового заказа, а не при его редактировании
            $propertyCollection = $order->getPropertyCollection();
            $phoneProperty = $propertyCollection->getPhone();
            $isPhoneValid = validatePhone($phoneProperty);
    
            if (!$isPhoneValid) {
                $event->addResult(new \Bitrix\Main\EventResult(
                    \Bitrix\Main\EventResult::ERROR,
                    new \Bitrix\Sale\ResultError('Текст ошибки', 'PHONE_PROPERTY_INVALID')
                ));
            }
    
        }
    }


    надо только реализовать метод/функцию validatePhone, которая валидирует телефон так как Вам надо
    Ответ написан 27 нояб. 2020
    2 комментария
    Нравится 2 комментария
  • Существует ли событие добавления нового подписчика в компоненте bitrix:sender.subscribe?

    winer
    Роман Грицук @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Компонент bitrix:sender.subscribe добавляет подписку на рассылку с помощью метода \Bitrix\Sender\Subscription::add.
    Внутри метода сначала выполняется проверка наличие переданного email в базе контактов, и если EMAIL там отсутствует, то выполняется его добавление. А после добавления подписка на указанные рассылки.

    Добавление контакта происходит в ORM таблицу Bitrix\Sender\ContactTable
    Подписка на рассылку Bitrix\Sender\MailingTable

    Подписаться на событие можно так:
    $eventManager = Main\EventManager::getInstance();
    $eventManager->addEventHandler(
        "sender",
        "\Bitrix\Sender\ContactTable::onAfterAdd",
        ['myEvents','onBeforeAddHandler']
    );


    Подписавшись на событие добавления в ContactTable, вы сможете обработать варианты добавления НОВЫХ контактов. Но если старый пользователь воспользуется подпиской, обработчик не сработает.

    При подписке на добавление MailingTable, вы отловите ВСЕ подписки.
    Ответ написан 12 нояб. 2020
    1 комментарий
    Нравится 1 1 комментарий
  • Как указать агента для модуля?

    winer
    Роман Грицук @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Агент можно добавить с помощью метода CAgent::AddAgent

    Вызов этого метода можно разместить в install/index.php модуля.

    И где расположить сам код агента в структуре модуля

    Например в папке lib внутри модуля в одном из классов. А вообще там где Вам удобно
    Ответ написан 04 нояб. 2020
    Комментировать
    Нравится Комментировать
  • Как выбрать по 1 записи с определенным фильтром при помощи ORM Bitrix?

    winer
    Роман Грицук @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Можно сделать getList с группировкой по CLIENT_ID. а в runtime добавить поле max(ID)

    BirthdayEventsTable::getList(array(
        'select' => array('CLIENT_ID', 'MAX_ID'),
        'group' => array('CLIENT_ID'),
        'runtime' => array(
            new Entity\ExpressionField('MAX_ID', 'max(ID)')
        )
    ));
    Ответ написан 01 нояб. 2020
    2 комментария
    Нравится 2 комментария
  • Как добавить новое свойство элемента инфоблока через скрипт, так чтобы оно было доступно только для определенного раздела?

    winer
    Роман Грицук @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Насколько помню, есть такой класс CIBlockSectionPropertyLink. У него вот такие методы
    CIBlockSectionPropertyLink::Add($SECTION_ID, $PROPERTY_ID, $arLink = array())
    CIBlockSectionPropertyLink::Delete($SECTION_ID, $PROPERTY_ID)
    CIBlockSectionPropertyLink::DeleteByIBlock($IBLOCK_ID)
    CIBlockSectionPropertyLink::DeleteByProperty($PROPERTY_ID)
    CIBlockSectionPropertyLink::DeleteBySection($SECTION_ID)
    CIBlockSectionPropertyLink::GetArray($IBLOCK_ID, $SECTION_ID = 0, $bNewSection = false)


    https://dev.1c-bitrix.ru/community/webdev/user/898...

    Не помню насколько точна эта статья. Если что примеры данных можно смотреть в стандартной таблице b_iblock_section_property
    Ответ написан 27 окт. 2020
    Комментировать
    Нравится Комментировать
  • Как отключить отправку почтовых уведомлений при регистрации только для определенной группы пользователей?

    winer
    Роман Грицук @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Посмотрите в сторону обработчика события OnBeforeEventAdd.
    Ответ написан 03 сент. 2020
    2 комментария
    Нравится 2 комментария
  • Как обновить название торговыx предложений через $el->Update?

    winer
    Роман Грицук @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    торговое предложение (ТП) - это такой же элемент инфоблока, как и родительский товар.
    ТП будет находится в отдельном инфоблоке и иметь свой ID.
    Поэтому для обновления полей ТП надо в метод CIBlockElement::Update передавать именно ID ТП, а не товара.
    $el = new CIBlockElement;
    $fields = Array(
         "NAME"   => "1.3.1 Однопутная железная дорога"
    );
    $skuId = 8140;//ID торгового предложения
    $res = $el->Update($skuId, $fields );
    Ответ написан 29 июн. 2020
    Комментировать
    Нравится Комментировать
  • Почему не работает Sypex Geo?

    winer
    Роман Грицук @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Метод \Bitrix\Main\Service\GeoIp\Manager::getDataResult является оберткой над обработчиками геолокации, которые расположены тут Настройки > Настройки продукта >Геолокация

    На этой странице можно увидеть список обработчиков. Выше указанный метод выбирает обработчик в соответствии с сортировкой и пытается сделать запрос через его API. Если был получен результат, то возвращает его в виде объекта \Bitrix\Main\Service\GeoIp\Result, иначе идет запрос через следующий обработчик.

    Для Sypex Geo обработчиком является класс \Bitrix\Main\Service\GeoIp\SypexGeo, который расположен тут /bitrix/modules/main/lib/service/geoip/sypexgeo.php

    Попробовал напрямую сделать запрос через обработчик Sypex Geo, использовав IP из вашего примера:
    $ob = new \Bitrix\Main\Service\GeoIp\SypexGeo();
    $res = $ob->getDataResult("62.33.36.6");
    print_r($res);

    В ответ получил корректный набор данных
    Bitrix\Main\Service\GeoIp\Result Object
    (
        [geoData:protected] => Bitrix\Main\Service\GeoIp\Data Object
            (
                [ip] => 62.33.36.6
                [lang] => en
                [countryName] => Russia
                [regionName] => Tambovskaya Oblast'
                [subRegionName] => 
                [cityName] => Michurinsk
                [countryCode] => RU
                [regionCode] => RU-TAM
                [zipCode] => 
                [latitude] => 52.8978
                [longitude] => 40.4907
                [timezone] => Europe/Moscow
                [asn] => 
                [ispName] => 
                [organizationName] => 
                [handlerClass] => 
            )
    
        [isSuccess:protected] => 1
        [errors:protected] => Bitrix\Main\ErrorCollection Object
            (
                [values:protected] => Array
                    (
                    )
    
            )
    
        [data:protected] => Array
            (
            )
    
    )


    Возможно у вас достигнут лимит по запросам.
    Ответ написан 29 июн. 2020
    6 комментариев
    Нравится 6 комментариев
  • Можно ли положить в корзину товары в разных валютах?

    winer
    Роман Грицук @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Стандартный функционал такого не умеет. Битрикс может отобразить цену в разных валютах. Но оплата и покупка всегда происходит только в той валюте, которая указана в модуле интернет магазин.
    Ответ написан 08 мая 2020
    Комментировать
    Нравится Комментировать
  • Как генерируемый файл pdf записать в свойство инфоблока?

    winer
    Роман Грицук @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    $mpdf = new \Mpdf\Mpdf();
    $mpdf->WriteHTML($html2);
    $mpdf->Output($pdfPath . $fileName, \Mpdf\Output\Destination::FILE);
    
    $fileArray = \CFile::MakeFileArray($pdfPath . $fileName);


    А потом полученный массив используйте в CIBlockElement::SetPropertyValuesEx
    Ответ написан 22 мар. 2020
    4 комментария
    Нравится 1 4 комментария
  • Не отображаются свойства товара(материал и размер оба свойства типа Enum) в заказах административной панели Bitirx. Как сделать чтобы отобразились?

    winer
    Роман Грицук @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Для того чтобы там отображались эти свойства, нужно их(свойства) добавлять в корзину. Галочка "Значение добавляется в корзину" влияет только при использовании стандартного шаблона ( или шаблона на его основе).

    Вы же для добавления товара в корзину используете устаревшую функцию Add2BasketByProductID
    /**
     * @deprecated deprecated since catalog 17.5.9
     * @see \Bitrix\Catalog\Product\Basket::add
    */


    Посмотрите в коде стандартного компонента catalog.section или catalog.element, то как реализовано добавление товара в корзину. (Метод \Bitrix\Iblock\Component\Base::addProductToBasket)

    Либо же почитайте API https://mrcappuccino.ru/blog/post/work-with-basket...
    Ответ написан более года назад
    2 комментария
    Нравится 2 комментария
  • Передать значение SKU Bitrix?

    winer
    Роман Грицук @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    В стандартном шаблоне комплексного компонента каталога, такой URL Не поддерживается, но можно сделать через get параметр.
    В настройках ИБ торговых предложений можно прописать так:
    URL страницы детального просмотра: #PRODUCT_URL#?oid=#ELEMENT_ID#, а в шаблоне компонента catalog.element добавить обработку
    $oid = intval($_REQUEST["oid"]);
    if ($oid > 0) {
        foreach ($arResult['JS_OFFERS'] as $key => $jsOffer) {
            if ($jsOffer["ID"] == $oid) {
                $arResult['OFFERS_SELECTED'] = $key;
                break;
            }
        }
    }


    Если шаблон стандартный или сделан на его основе, то должно помочь.
    Ответ написан более года назад
    11 комментариев
    Нравится 1 11 комментариев
  • Как добавить свойство, при оформлении заказа в ИМ 1С-Битрикс?

    winer
    Роман Грицук @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Используйте свойства корзины:
    https://mrcappuccino.ru/blog/post/work-with-basket...
    https://dev.1c-bitrix.ru/api_d7/bitrix/sale/techni...
    Ответ написан более года назад
    2 комментария
    Нравится 2 комментария
  • CIBlockSection::Add в цикле?

    winer
    Роман Грицук @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Ваш код написан так, чтобы было выполнено добавление первого элемента, а все последующие выполняют обновление. Так происходит из за условия if( $ID > 0 ).

    $ID = $bs->Add($arFields);//добавляете элемент и записываете его ID в переменную
    $res = ( $ID > 0 );

    А на следующем шаге, не выполнив обнуления переменной ID, происходит обновление предыдущей записи.
    Ответ написан более года назад
    1 комментарий
    Нравится 1 1 комментарий
  • Как вывести элементы инфоблока с определенным значением свойства?

    winer
    Роман Грицук @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Параметр FIILTER_NAME https://dev.1c-bitrix.ru/user_help/components/cont...

    Перед подключением компонента нужно объявить глобальную переменную. В ней задать массив с фильтром в формате используемом в CIblockElement::GetList https://dev.1c-bitrix.ru/api_help/iblock/classes/c...

    После этого имя этой переменной нужно передать в параметры компонента
    Ответ написан более года назад
    9 комментариев
    Нравится 1 9 комментариев
Оценили как «Нравится»
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • Следующие →
Самые активные сегодня
  • SoreMix
    SoreMix
    • 12 ответов
    • 0 вопросов
  • sergiks
    Сергей Соколов
    • 7 ответов
    • 0 вопросов
  • firedragon
    Владимир Коротенко
    • 7 ответов
    • 0 вопросов
  • DevMan
    DevMan
    • 6 ответов
    • 0 вопросов
  • delphinpro
    Сергей delphinpro
    • 5 ответов
    • 0 вопросов
  • Drno
    • 5 ответов
    • 0 вопросов
  • © Habr
  • О сервисе
  • Обратная связь
  • Блог

Войдите на сайт

Чтобы задать вопрос и получить на него квалифицированный ответ.
Войти через центр авторизации