Ответы пользователя по тегу 1С-Битрикс
  • Как используя \Bitrix\Catalog\ProductTable::getList получить список товаров по определённому инфоблоку?

    nikolaevevge
    @nikolaevevge Автор вопроса
    <?php
    require $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php';
    
    $result = \Bitrix\Catalog\ProductTable::getList(array(
        'filter' => array("=IBLOCK_ELEMENT.IBLOCK_ID"=>46),
    ));
    
    if($product=$result->fetch()) {
      var_dump($product);
    }
    Ответ написан
    Комментировать
  • В корзине bitrix использую самописный ajax api на CSaleBasket::Update через который не всегда обновляется колличество товаров. Кеш?

    nikolaevevge
    @nikolaevevge Автор вопроса
    Заменил код функции следующим:
    function productUpdateInBasket($prodId=0,$QUANTITY=0) {
        if ($prodId == 0) {return false;}
          $basket = \Bitrix\Sale\Basket::loadItemsForFUser(\Bitrix\Sale\Fuser::getId(CSaleBasket::GetBasketUserID()), \Bitrix\Main\Context::getCurrent()->getSite());
          $basket->refresh();
    
          $dbRes = \Bitrix\Sale\Basket::getList(array(
            "select"=>["PRODUCT_ID","NAME","QUANTITY","ID"],
            "filter"=>array(
            "=FUSER_ID"=>\Bitrix\Sale\Fuser::getId(),
            "=ORDER_ID" => null,
            "=LID"=>\Bitrix\Main\Context::getCurrent()->getSite(),
            "=CAN_BUY"=>"Y",
            "=PRODUCT_ID"=>$prodId
          )
        ));
    
        $itemId = false;
    
        while ($item = $dbRes->fetch()) {
          if (isset($item["ID"]) and $item["ID"] and isset($item["PRODUCT_ID"]) and ($item["PRODUCT_ID"] == $prodId)) {
            $itemId = $item["ID"];
          }
        }
    
        if ($itemId) {
          $itemProd = $basket->getItemById($itemId);
          if ($QUANTITY==0) {
            $itemProd->delete();
          } else {
            $itemProd->setField("QUANTITY",$QUANTITY);
          }
          $basket->save();
          $basket->refresh();
          return true;
       }
      return false;
    }

    Так ещё инфа с примерами кода по ситуации тут blog.ivru.net/?id=51
    Ответ написан
    Комментировать
  • Bitrix при использовании включаемой области (IncludeComponent("bitrix:main.include") параметры по умолчанию) сервер выдаёт ошиюбку 500. Почему?

    nikolaevevge
    @nikolaevevge Автор вопроса
    В настоящий момент вопрос решен, только как именно я не совсем понял.

    Сделал следующее. Удалил старый файл(index_inc.php) который содержал информацию из встраиваемой области(хотя в нем был в общем то обычный html), далее создал из "Изменить страницу" в нужном месте включаемую область. Через админку Bitrix записал в файл HTML с предыдущего сервера, захожу по URL - работает. Затем ещё вынес область в подключаемый файл области в отдельный файл через $APPLICATION->IncludeFile где она ранее и подключалась. Теперь работает. Вроде как по коду всё то же самое и осталось.

    Странная ситуация. Когда удалял старый файл встраиваемой области не обратил внимания какие у него были права, может в этом было дело.
    Ответ написан
    Комментировать
  • Как в bitrix установить свойство типа список(enum) у инфоблока методами api?

    nikolaevevge
    @nikolaevevge Автор вопроса
    В результате написал функцию которая принимает 3 параметра: 1) значение которое должно быть у списочного свойства, 2) Ид инфоблока, 3) код свойства - функция возвращает Ид существующего свойства, а если не найдёт - создает запись в свойстве и возвращает её Ид. При ошибке возвращается false

    Код функции и примеры использования тут blog.ivru.net/?id=175

    Непосредственно по заданному вопросу, создание товаров или торговых предложений с привязкой свойства типа список(enum) осуществляется следующим образом:

    $el = new CIBlockElement;
    
    $arLoadProductArray = array(
      "IBLOCK_ID"=>2, // IBLOCK торговых предложений
      "NAME"=>"Имя торгового предложения",
      "ACTIVE"=>"Y",
      "PROPERTY_VALUES"=>array(
        "CML2_LINK"=>$PRODUCT_ID, // Свойство типа "Привязка к товарам (SKU)", связываем торг. предложение с товаром
        "CML2_ARTICLE"=>"Артикул торгового предложения",
        "SIZE"=>$sizePropId,
        "CLOTH"=>$clothPropId
      )
    );
    
    $product_offer_id = $el->Add($arLoadProductArray);


    В коде выше у меня свойства SIZE и CLOTH типа список(enum) в переменных $sizePropId и $clothPropId передаются идентификаторы необходимых значений свойств.

    Для получения идентификатора по значению, я привёл ссылку на соответствующую функцию.
    Ответ написан
    Комментировать
  • Не отображаются свойства товара(материал и размер оба свойства типа Enum) в заказах административной панели Bitirx. Как сделать чтобы отобразились?

    nikolaevevge
    @nikolaevevge Автор вопроса
    Оказалось следующее:

    У меня в файле который принимал по ajax id товара и количество для добавления в корзину была самописная функция:

    function productAddToBasket($PRODUCT_ID=0,$QUANTITY=0) {
      return Add2BasketByProductID($PRODUCT_ID,$QUANTITY,array());
    }


    В случаи если не используется стандартный компонент для добавления в корзину галочка "Значение добавляется в корзину" бесполезна, то есть если Вы пишите свой вариант добавления в корзину на API то добавление свойств необходимо производить самостоятельно, и возможно это сделать и в функции Add2BasketByProductID(не смотря на то что она устаревшая), для этого передавать свойства требуется в третьем параметре.

    Моя ошибка была в том, что я не помещал свойства в ещё один массив, то есть 3-ий параметр должен выглядеть так: array(array("NAME"=>"Имя свойства","CODE"=>"test_code","VALUE"=>"Значение")) ну или несколько вложенных массивов внутри внешнего через запятую.

    То есть в моём случаи я поправил строчку:

    return Add2BasketByProductID($PRODUCT_ID,$QUANTITY,array());

    на строчку:

    return Add2BasketByProductID($PRODUCT_ID,$QUANTITY,array(array("NAME"=>"Имя свойства","CODE"=>"test_code","VALUE"=>"Значение")));

    То есть исправление потребовалось только в файле добавляющем товары в корзину. Файл же который из корзины формирует заказ я не трогал. В результате замены вышеуказанной строчки в админке получил следующее:

    5e21a7d7c8b43501761093.jpeg

    Методом о которым пишет Роман Грицук тоже возможно, например следующим кодом:

    $fields = array("PRODUCT_ID"=>$PRODUCT_ID,"QUANTITY"=>2,"PROPS"=>
       array(array("NAME"=>"Имя свойства","CODE"=>"test_code","VALUE"=>"Значение"))
    );
    $r = \Bitrix\Catalog\Product\Basket::addProduct($fields);


    Зачем в массиве свойств передаётся CODE не совсем понятно, при этом экспериментальным путём установлено что этот код не обязан совпадать с кодом указанным в свойствах инфоблока.

    Возможно кому то потребуется метод для получения свойств инфоблока у которых отмечена галочка "Значение добавляется в корзину"(информацию по этому поводу нашёл тут https://dev.1c-bitrix.ru/support/forum/forum48/top... )

    $IBlockId = 2;//В данном случаи передаю Id инфоблока торговых предложений
    $ee = \Bitrix\Catalog\Product\PropertyCatalogFeature::getBasketPropertyCodes($IBlockId);
    var_dump($ee);//возвращает:array(2) { [0]=> string(2) "11" [1]=> string(2) "42" } 11 и 42 это Id свойств торговых предложений отмеченных галочкой "Значение добавляется в корзину"


    Итого я переписал исходную функцию следующим образом(только учитывайте что у меня в ней перебираются только свойства типа список(ENUM), поскольку мне другие были не нужны):

    function productAddToBasket($PRODUCT_ID=0,$QUANTITY=0) {
        $TPIBlockId = 2;//Инфоблок торговых предложений(в данной задаче требуется только он, возможно в другой потребуется выбирать свойства из обоих инфоблоков)
        $propIds = \Bitrix\Catalog\Product\PropertyCatalogFeature::getBasketPropertyCodes($TPIBlockId);//Получаем Id свойств отмеченные галочкой "Значение добавляется в корзину"
    
        $dbProps = CIBlockElement::GetProperty($TPIBlockId,$PRODUCT_ID,array(),Array("ID"=>$propIds));
        $propsForBasketAr = array();
        while($oneProp = $dbProps->Fetch()) {
    //В следующей строчке условие которое выбирает значения только для ENUM свойств, если есть другие требуется дописать
          if (isset($oneProp["VALUE_ENUM"]) and $oneProp["VALUE_ENUM"] and isset($oneProp["NAME"]) and $oneProp["NAME"] and isset($oneProp["CODE"]) and $oneProp["CODE"]) {
            $propsForBasketAr[] = array("NAME"=>$oneProp["NAME"],"CODE"=>$oneProp["CODE"],"VALUE"=>$oneProp["VALUE_ENUM"]);
          }
        }
        return Add2BasketByProductID($PRODUCT_ID,$QUANTITY,$propsForBasketAr);
    }


    Есть ещё одно решение, которое предложил PetrPo. Подробности находятся в комментариях под его ответом. Если сделать как он написал результат будет таким:

    5e21b0c570092546639769.jpeg
    Ответ написан
    Комментировать
  • Отправка почты в bitrix. Где искать этот файл?

    Бывает ищу в поиске "Отправка почты bitrix" и попадаю на эту страницу. Для тех кому нужно не для интернет-магазина, а просто настроить отправку через APi, создать почтовый шаблон и событие, вот информация: blog.ivru.net/admin/edit.php?id=69
    Ответ написан
    Комментировать
  • Перестала работать авторизация через соц.сети на 1C-Bitrix. Что делать?

    Я писал свой скрипт авторизации через ВКонтакте, Одноклассники, FaceBook если кому нужен: - доступен по ссылке: blog.ivru.net/?id=58
    Ответ написан
  • Почему не срабатывает geoip?

    Вот простая библиотека для реализации GeoIp в битрикс, без лимитов и простой настройкой blog.ivru.net/?id=82
    Ответ написан
    Комментировать
  • Как реализовать определение городов пользователя?

    Всего 3 строчки кода:
    <?php
    require $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php';// подключаем пролог Bitrix
    require_once($_SERVER["DOCUMENT_ROOT"] . "/ADRES_DO_CLASSA_OTNOSITELNO_KORNYA_SAITA/nikolaevevgeIpGeo.php");// подключаем класс библиотеки
    var_dump(nikolaevevgeIpGeo::getInfoByIp($_SERVER["REMOTE_ADDR"]));// получаем var_dump массива в результате работы библиотеки по определению географии клиента по IP-адресу

    Сам класс библиотеки доступен по ссылке blog.ivru.net/?id=82

    Установка библиотеки:

    - в первом листинге(по указанной выше ссылке) информация как осуществляется получение данных от удалённого сервера о географии IP адресов;
    - второй листинг - SQL код для создания таблицы в базе данных битрикс, куда будет сохраняться кеш для IP адресов по которым осуществлялся запрос к удалённому серверу, чтобы не выполнять повторных удалённых соединений, а так же для снижения времени определения;
    - третий листинг - это сам класс библиотеки, его код нужно сохранить например в файл nikolaevevgeIpGeo.php и подключить в первой строке кода который я привёл в своём ответе.

    Описание работы класса библиотеки:

    Библиотека достаточно простая. Содержит методы для преобразования IP адресов в целое число без точек и наоборот, а так же методы поиска по кешу в локальной базе данных, сохранению новых данных кеш, и метод для запроса информации с сервера где хранится база данных по адресам.

    Информация о географии определённая по одному IP адресу в рамках единой PHP-сессии, не создаёт повторных обращений к кешу базы данных и удалённому серверу, за счёт сохранения информации о IP-адресе в статической переменной класса библиотеки, то есть если информация о IP есть в указанном массиве запросы к удалённому серверу или базе данных выполняться не будут. Такой подход работает даже если Вы будите использовать определение из разных модулей Bitrix.

    Настройки библиотеки(не обязательно):

    В классе библиотеки есть такие строчки:
    // [НАЧАЛО] !! Настройки !!
    static public $timeToUpdate = 1728000;// Время в секундах через которое записи о IP-адресах в базе данных считаются устаревшими(1728000 = 20 дней).
    static public $tableName = "useripdata";// Имя таблицы в базе данных
    // [КОНЕЦ] !! Настройки !!
    В первой переменной Вы можете задать время хранения кеша с информацией о IP адресе, по умолчанию 20 дней.
    В второй переменной задаётся имя таблицы в базе данных которое Вы хотите использовать для хранения кеша с гео-информацией о IP-адресе(а если точнее о стеке IP-адресов), если Вы будите использовать отличное от useripdata, то не забудте поменять название таблицы при создании в базе данных а именно в строчке CREATE TABLE IF NOT EXISTS `useripdata` (

    Скрины с примерами кода и демонстрацией результата:

    5d8b6d09186ea243230798.jpeg
    5d8b6d113549f347192529.jpeg
    Ответ написан
    Комментировать
  • На комплексном компоненте news(Новости)при детальном просмотре отображается элемент не найден(элементы инфоблока находятся в множественных секциях)?

    nikolaevevge
    @nikolaevevge Автор вопроса
    Не понял что именно я сделал но сейчас работает. В настройках ничего не менял.
    Есть лишь предположение, что хотя бы 1 раз нужно вызвать элемент из корня инфоблока, а уже затем присваивать ему разделы.
    То есть присвоил элементу родителя. зашёл на детальную отображается. Присвоил назад категории - обновил кеш - работает.
    Может не из за этого.
    Вопрос закрыт.
    Ответ написан
    Комментировать
  • Как в шаблоне news list получить массив секций(разделов) к которым относится инфоблок(элемент инфоблока принадлежит к нескольким секциям/разделам)?

    nikolaevevge
    @nikolaevevge Автор вопроса
    Только что нашёл вот такую штуку CIBlockElement::GetElementGroups, но пока не разобрался работает или нет.

    Вопрос по поводу настройки компонента news list всё ещё актуален. То есть можно ли передать параметры компоненту так, чтобы без дополнительных запросов в result_modifier.php обойтись.
    Ответ написан
    Комментировать
  • Как вывести ["DETAIL_PICTURE"]["SRC"] в bitrix:news?

    Если news list
    1) при вызове компонента указать
    array(
    "FIELD_CODE" => array(
    0 => "DETAIL_PICTURE",
    1 => "",
    ),
    )

    2) в шаблоне
    foreach ($arResult["ITEMS"] as $arItem) {
    // SRC детальной картинки находится в $arItem["FIELDS"]["DETAIL_PICTURE"]["SRC"];
    Ответ написан
    6 комментариев
  • Вывод данных пользователя в форму заказа битрикс: управление сайтом, как это сделать?

    Я в result_modifier.php получаю, вот код:

    global $USER;

    $arResult["MY_USER_PROPS"] = array();

    $arResult["MY_USER_PROPS"]["FIRST_NAME"] = "";
    $arResult["MY_USER_PROPS"]["MIDDLE_NAME"] = "";
    $arResult["MY_USER_PROPS"]["LAST_NAME"] = "";
    $arResult["MY_USER_PROPS"]["EMAIL"] = "";
    $arResult["MY_USER_PROPS"]["PHONE"] = "";
    $arResult["MY_USER_PROPS"]["ADDRESS"] = "";
    $arResult["MY_USER_PROPS"]["COMPANY_NAME"] = "";
    $arResult["MY_USER_PROPS"]["UR_ADDRESS"] = "";
    $arResult["MY_USER_PROPS"]["INN"] = "";
    $arResult["MY_USER_PROPS"]["KPP"] = "";

    $userId = CUser::GetID();
    if ($userId > 0) {
    $filter = array("ID"=>$userId);
    $rsUsers = CUser::GetList(($by = ""), ($order = "desc"), $filter,array("SELECT"=>array("UF_*")));
    $arUser = $rsUsers->fetch();
    foreach ($arUser as $key => $val) {
    $arResult["MY_USER_PROPS"][$key] = $val;
    }
    }

    $userId = CUser::GetID();

    if ($userId > 0) {
    $filter = array("ID"=>$userId);
    $rsUsers = CUser::GetList(($by = ""), ($order = "desc"), $filter,array("SELECT"=>array("UF_*")));
    $arUser = $rsUsers->fetch();

    if (isset($arUser["NAME"])) {
    $arResult["MY_USER_PROPS"]["FIRST_NAME"] = $arUser["NAME"];
    }
    if (isset($arUser["SECOND_NAME"])) {
    $arResult["MY_USER_PROPS"]["MIDDLE_NAME"] = $arUser["SECOND_NAME"];
    }
    if (isset($arUser["LAST_NAME"])) {
    $arResult["MY_USER_PROPS"]["LAST_NAME"] = $arUser["LAST_NAME"];
    }
    if (isset($arUser["EMAIL"])) {
    $arResult["MY_USER_PROPS"]["EMAIL"] = $arUser["EMAIL"];
    }
    if (isset($arUser["PERSONAL_PHONE"])) {
    $arResult["MY_USER_PROPS"]["PHONE"] = $arUser["PERSONAL_PHONE"];
    }
    if (isset($arUser["PERSONAL_STREET"])) {
    $arResult["MY_USER_PROPS"]["ADDRESS"] = $arUser["PERSONAL_STREET"];
    }
    if (isset($arUser["WORK_COMPANY"])) {
    $arResult["MY_USER_PROPS"]["COMPANY_NAME"] = $arUser["WORK_COMPANY"];
    }
    if (isset($arUser["WORK_STREET"])) {
    $arResult["MY_USER_PROPS"]["UR_ADDRESS"] = $arUser["WORK_STREET"];
    }
    if (isset($arUser["UF_INN"])) {
    $arResult["MY_USER_PROPS"]["INN"] = $arUser["UF_INN"];
    }
    if (isset($arUser["UF_KPP"])) {
    $arResult["MY_USER_PROPS"]["KPP"] = $arUser["UF_KPP"];
    }
    }
    // Конец получения информации о пользователе
    Ответ написан
    Комментировать
  • Bitrix. Как на D7 установить статус заказу(в момент формирования заказа)?

    nikolaevevge
    @nikolaevevge Автор вопроса
    Роман Грицук ответил на вопрос, только я не верные статусы стандартные написал.
    Случайно посчитал что DN это статус заказа. А оказалось это статус доставки.
    Таким образом, я в статусах создал новый статус заказа - "ожидает обработки менеджером", поскольку нужного статуса заказа по-умолчанию не было.
    На скрине ниже статусы которые были по-умолчанию и новый статус который я создал (Статус A):
    5d1df8ab2fdd0474505168.jpeg

    Таким образом в конечном счёте строчка кода выглядит так:
    $order->setField("STATUS_ID", "A");

    Изначально я создал заказ с статусом DN - это привело к тому что не получается даже под админом зайти в заказ. Стал разбираться и выяснилось что DN это не статус заказа.
    Ответ написан
  • Class 'Bitrix\Sale\Basket' not found (если подключать плолог, а если подключать header.php работает).Как подключить?

    nikolaevevge
    @nikolaevevge Автор вопроса
    Разобрался!

    После use забыл написать:

    Bitrix\Main\Loader::includeModule("sale");
    Bitrix\Main\Loader::includeModule("catalog");
    Ответ написан
    Комментировать
  • Почему bitrix:catalog.smart.filter игнорирует настройки фильтра?

    Согласно информации на форуме Битрикс скоро жить станет чуть проще.

    5d16014ac6505562479042.jpeg

    По поводу применения к задаче PREFILTER_NAME не понял. Если я комплексному каталогу в arrFilter передаю Id товаров, как мне их же отдать в start.filter, чтобы данные для фильтра строились только по Id указанных товаров?
    Ответ написан
  • Распродажа повторяет комплексный компонент catalog bitrix. Как настроить массив в FILTER_NAME чтобы на распродаже выводлись только товары с скидкой?

    nikolaevevge
    @nikolaevevge Автор вопроса
    Сейчас решил следующим образом, при этом если у Вас есть иное решение - пожалуйста, предлагайте!

    require($_SERVER['DOCUMENT_ROOT'].'/local/templates/main/phpscripts/myGetBasketData.php');// класс нужен для получения Id товаров с скидкой
    $myGetBasketData = new myGetBasketData;

    global $arrFilter;
    $arrFilter = array();
    $arrFilter["=ID"] = $myGetBasketData->getProductIdDiscontAr();

    далее $arrFilter передаём комплексному компоненту bitrix catalog через FILTER_NAME а именно
    $APPLICATION->IncludeComponent(
    "bitrix:catalog",
    "new_catalog",
    array(
    "FILTER_NAME" => "arrFilter",
    ...

    Метод getProductIdDiscontAr класса myGetBasketData доступен в листинге файла класса myGetBasketData.php по ссылке blog.ivru.net/?id=96

    Важно! Метод возвращает массив товаров с скидкой, только тогда, когда скидка создана непосредственно на товар, то есть так как показано на скринсшоте.
    5d15f4350ea9c968017210.jpeg

    Алгоритм работы метода определения Id товаров с скидкой метода getProductIdDiscontAr() примерно следующий

    1) получается список скидок через CSaleDiscount::GetList
    2) далее в foreach Id скидок передаются в CSaleDiscount::GetByID
    3) у возвращённых данных проверяется наличие и не пустота ключа массива ["CONDITIONS"]
    4) если строка есть и не пустая парсятся данные от Equal";s:5:"value";a: до }
    5) если такие данные найдены то они множественно парсятся от i: до ;
    6) каждое второе значение это и есть Id товара на который действует скидка(эти Id собираются в массив $prodIdAr и возвращаются методом getProductIdDiscontAr)

    Таким образом если у Вас скидки указаны не явно на товар а например по свойства, то метод нужно дописывать под такие скидки.
    Ответ написан
    Комментировать
  • Как в bitrix catalog.section выполнить фильтрацию по свойствам торговых предложений?

    nikolaevevge
    @nikolaevevge Автор вопроса
    Ответ дали на форуме битрикс в этой ветке - https://dev.1c-bitrix.ru/support/forum/forum6/topi...

    Ответ такой:

    foreach ($_GET as $key => $get) :
    if (is_array($get)) {
    foreach ($get as $value) {
    $arrFilter['OFFERS']['PROPERTY_'.$key.'_VALUE'][] = $value;
    }
    }
    endforeach;
    Ответ написан
    Комментировать
  • Битрикс - Как при регистрации выбирать группу пользователей?

    Если Вас методы API интересуют, вот здесь есть несколько примеров кода blog.ivru.net/?id=29 регистрации по API с одновременным присвоением нужной группе. Там же найдёте как эти группы методами API получить. Остаётся в форму подгрузить и добавить нужное на скрипт авторизации.
    Ответ написан
    Комментировать
  • Как вывести торговые предложения в карточке товара?

    Вот этот код посмотрите - blog.ivru.net/?id=52 ? То что Вам нужно или нет?
    Тут такой момент, в этом коде свойства торгового предложения подгружаются через result_modifier.php на текущий момент я не нашёл стандартного решения как это делать из коробки, если знаете расскажите.

    Ну и соответственно в шаблоне обращаетесь через $arResult["OFFERS"]
    Ответ написан
    Комментировать