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

    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
    Ответ написан
    Комментировать
  • Как обновить название торговы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 );
    Ответ написан
    Комментировать
  • Почему не работает 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
            (
            )
    
    )


    Возможно у вас достигнут лимит по запросам.
    Ответ написан
    6 комментариев