• Как добавить заголовки свойств в карточке товара?

    winer
    @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    способов уйма:
    - в параметрах компонента указать какое свойство к какой группе относится. (это не стандартный функционал). Просто в массив параметров передайте свой массив, описывающий группировку.

    - создать ИБ и в нём сделать структуру, где разделы это группы свойств, а элементы это сами свойства. И на основе данных из ИБ группировать свойства там где Вам надо.

    - на ORM таблицах сделать тоже самое: одна таблица хранит группы, а вторая привязки свойств к этим группам. Только больше мороки будет с формами редактирования все этой информации.

    - купить готовое решение https://marketplace.1c-bitrix.ru/solutions/yenisit... или https://marketplace.1c-bitrix.ru/solutions/primepi...
    Ответ написан
  • Как на битриксе скрыть подразделы дальше 3 вложенности?

    winer
    @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Насколько я понимаю у Вас компонент bitrix:menu.sections формирует пункты для меню сайта в одном из файлов .<название_типа_меню>.menu_ext.php.

    У этого компонента есть параметр DEPTH_LEVEL. Используйте его.
    Ответ написан
    Комментировать
  • Как сделать выборку по ID елементов в вызове компонента?

    winer
    @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    "FILTER_NAME" - это имя глобальной переменной с фильтром, а не сам фильтр.

    global $arrFilter;
    $arrFilter = Array("IBLOCK_ID" => 121, "ID" => $_GET["elementsArray"], "CREATED_BY" => $userID);

    "FILTER_NAME" => "arrFilter"
    Ответ написан
    1 комментарий
  • Где в Bitrix Малый бизнес настройки eshop.banner?

    winer
    @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Баннеры отсутствуют в редакции "малый бизнес". Посмотреть разницу в редакциях можно тут

    Но eshop.banner - это компонент который работает не на основе модуля баннеров. Скопируйте шаблон компонента в свой шаблон сайта, и отредактируйте так как вам надо. Весь контент этого баннера в его шаблоне.
    Ответ написан
  • Как создать поле в категории каталога, которое будет хранить количество активных элементов?

    winer
    @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Создайте пользовательское поле типа Число (можно сделать прям из админки на в кладке раздела Доп. поля).

    Дальше это поле надо как то заполнять. Можно сделать с помощью обработчиков событий:
    OnAfterIBlockElementAdd
    OnAfterIBlockElementDelete
    OnAfterIBlockElementUpdate
    На них считайте количество элементов в разделе и записывайте это значение в пользовательское поле
    Ответ написан
    Комментировать
  • Почему возникает ошибка при заполнеии мвойст заказа при создании заказа через Bitrix\Sale\Order?

    winer
    @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Какое то из свойств дублируется. Скорее всего email.
    Попробуйте сначала получить из $propertyCollection эти свойства, а если их нет, то уже создавать.
    Пример для email
    if ($emailProp = $collection->getUserEmail()) {
    	$emailProp->setValue($email);
    } else {
    	$emailProp = $collection->createItem([
    		'ID' => 3,
    		'NAME' => 'NAME',
    		'TYPE' => 'STRING',
    		'CODE' => 'PROP_Email',
    	]);
    	$emailProp->setField('VALUE', $email);
    }


    Данный код будет работать если в настройках свойства email стоит галочка "Значение свойства будет использовано как E-Mail при регистрации нового пользователя". Если она не стоит, то нужно будет в цикле обойти propertyCollection
    Ответ написан
  • Bitrix как запустить экспорт каталога через событие?

    winer
    @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Откройте файл /bitrix/php_interface/include/catalog_export/cron_frame.php в нем же есть всё что нужно для запуска экспорта. Скопируйте то что нужно в метод/функцию и запускайте по событию. Если каталог большой, то лучше на событии OnSuccessCatalogImport1C создавайте агента, который уже будет выполнять экспорт (агенты в таком случае лучше перенести на cron).

    $profile_id = 7;
    
    $ar_profile = CCatalogExport::GetByID($profile_id);
    if (!$ar_profile)
    	die('No profile');
    
    $strFile = CATALOG_PATH2EXPORTS.$ar_profile["FILE_NAME"]."_run.php";
    if (!file_exists($_SERVER["DOCUMENT_ROOT"].$strFile))
    {
    	$strFile = CATALOG_PATH2EXPORTS_DEF.$ar_profile["FILE_NAME"]."_run.php";
    	if (!file_exists($_SERVER["DOCUMENT_ROOT"].$strFile))
    		die('No export script');
    }
    
    $arSetupVars = array();
    $intSetupVarsCount = 0;
    if ($ar_profile["DEFAULT_PROFILE"] != 'Y')
    {
    	parse_str($ar_profile["SETUP_VARS"], $arSetupVars);
    	if (!empty($arSetupVars) && is_array($arSetupVars))
    		$intSetupVarsCount = extract($arSetupVars, EXTR_SKIP);
    }
    
    $firstStep = true;
    
    global $arCatalogAvailProdFields;
    $arCatalogAvailProdFields = CCatalogCSVSettings::getSettingsFields(CCatalogCSVSettings::FIELDS_ELEMENT);
    global $arCatalogAvailPriceFields;
    $arCatalogAvailPriceFields = CCatalogCSVSettings::getSettingsFields(CCatalogCSVSettings::FIELDS_CATALOG);
    global $arCatalogAvailValueFields;
    $arCatalogAvailValueFields = CCatalogCSVSettings::getSettingsFields(CCatalogCSVSettings::FIELDS_PRICE);
    global $arCatalogAvailQuantityFields;
    $arCatalogAvailQuantityFields = CCatalogCSVSettings::getSettingsFields(CCatalogCSVSettings::FIELDS_PRICE_EXT);
    global $arCatalogAvailGroupFields;
    $arCatalogAvailGroupFields = CCatalogCSVSettings::getSettingsFields(CCatalogCSVSettings::FIELDS_SECTION);
    
    global $defCatalogAvailProdFields;
    $defCatalogAvailProdFields = CCatalogCSVSettings::getDefaultSettings(CCatalogCSVSettings::FIELDS_ELEMENT);
    global $defCatalogAvailPriceFields;
    $defCatalogAvailPriceFields = CCatalogCSVSettings::getDefaultSettings(CCatalogCSVSettings::FIELDS_CATALOG);
    global $defCatalogAvailValueFields;
    $defCatalogAvailValueFields = CCatalogCSVSettings::getDefaultSettings(CCatalogCSVSettings::FIELDS_PRICE);
    global $defCatalogAvailQuantityFields;
    $defCatalogAvailQuantityFields = CCatalogCSVSettings::getDefaultSettings(CCatalogCSVSettings::FIELDS_PRICE_EXT);
    global $defCatalogAvailGroupFields;
    $defCatalogAvailGroupFields = CCatalogCSVSettings::getDefaultSettings(CCatalogCSVSettings::FIELDS_SECTION);
    global $defCatalogAvailCurrencies;
    $defCatalogAvailCurrencies = CCatalogCSVSettings::getDefaultSettings(CCatalogCSVSettings::FIELDS_CURRENCY);
    
    CCatalogDiscountSave::Disable();
    include($_SERVER["DOCUMENT_ROOT"].$strFile);
    CCatalogDiscountSave::Enable();
    Ответ написан
  • Как сделать фид для динамических страниц битрикс?

    winer
    @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    1) Взять готовое решение на маркетплейсе. Не знаю какой там формат xml должен быть, но если как в Google Merchant то можно что то из этого .
    2) В csv можно часть данных выгрузить стандартными средствами в разделе Магазин -> Экспорт /bitrix/admin/cat_export_setup.php?lang=ru
    3) Взять API и написать скрипт, который сформирует в нужном Вам формате фид. Товары это элементы инфоблока. CIblockElement::GetList - с его помощью можно получить большую часть данных. Если есть желание то экспорт можно встроить в стандартный интерфейс битрикса
    Ответ написан
  • Как если торговое предложение не имеет цену брать её из карточки товара?

    winer
    @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    1) Сделать кастомное добавление в корзину, в котором вы будите получать цену на товар с помощью API, а потом добавлять его в корзину с флагом CUSTOM_PRICE и нужной Вам ценой
    2) Реализовать свой \Bitrix\Catalog\Product\CatalogProvider. В этом варианте можно оставить добавление в корзину стандартным, а в обработчике OnSaleBasketItemBeforeSaved подставлять в поле PRODUCT_PROVIDER_CLASS ВашCatalogProvider.

    3) Можно всё таки заполнять цены во всех ТП и ни чего не надо будет выдумывать.
    Ответ написан
    Комментировать
  • Как вывести раздел инфоблока в компоненте new.list?

    winer
    @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Там надо выбрать тип информационного блока. У вас на скриншоте это - Русская версия. Как только вы его выберите, произойдёт подгрузка вариантов значения для следующего select
    Ответ написан
  • Кто знает как в VMBitrix направить все поддомены в одну директорию?

    winer
    @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    В конфигах nginx и httpd для сайта, прописать поддомены
    httpd - /etc/httpd/bx/conf
    nginx - /etc/nginx/bx/site_avaliable

    для httpd это будет ServerAlias *.domain.com
    для nginx это будет server_name domain.com *.domain.com;
    Ответ написан
    Комментировать
  • Как при создании заказа через Bitrix\Sale\Order заполнить личные данные покупателя?

    winer
    @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Личные данные покупателя в Вашем случае - это свойства заказа.
    Вот тут можно почитать о том как работать с ними
    Ответ написан
    Комментировать
  • В чем отличия catalog.item и catalog.element и для чего надо их использовать?

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

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

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

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

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

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

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

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

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

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

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

    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, которая валидирует телефон так как Вам надо
    Ответ написан
  • Существует ли событие добавления нового подписчика в компоненте 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, вы отловите ВСЕ подписки.
    Ответ написан
    1 комментарий
  • Как указать агента для модуля?

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

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

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

    Например в папке lib внутри модуля в одном из классов. А вообще там где Вам удобно
    Ответ написан
    Комментировать