пятница, 1 марта 2013 г.

Битрикс - получение пользовательских свойств заказа.

Сегодня расскажу как просто и быстро получить свойства заказа пользователя.

Это часто необходимо для реализации личного кабинета в интернет магазинах, например, отобразить адрес доставки или тип платильщика.

Представим что мы создали в свойствах товара несколько полей: адрес, телефон, индекс и тд....
А в личном кабинете нам все это необходимо показать.
















Делается это очень просто:

<?
// Воспользуемся классом CSaleOrderPropsValue.
        $res = CSaleOrderPropsValue::GetList(
            $arOrder = array(), // Индекс сортировки.
            $arFilter = array("ORDER_ID" => $order_info['ORDER']['ID'], "CODE" => "address"), // Фильтр

            $arGroupBy = false, // Групировка
            $arNavStartParams = false, // Навигация
            $arSelectFields = array() // Необходимые поля.
            );

        $arVals = $res->Fetch();
        echo "<pre>".print_r($arVals , true)."</pre>";
?>

В примере выше вы покажем свойство "адрес" заказа с определенным ID.

Если в массив  $arFilter ничего не передавать - покажутся все свойства для всех заказов.
Так же не забывайте, если ожидаете получить несколько свойств, заключите         $arVals = array(); в цикл.

while ( $arVals[] = $res->Fetch() )




 

пятница, 18 января 2013 г.

Добавление элемента со множественным свойством типа Файл.

Заметил что в API-документации битрикса не хватает одной маленькой, но иногда очень нужной мелочи.
При создании елмента, через API, не увидел примера добавления пользовательского, множественного свойства типа "Файл".

Как оказалось все до банального просто и не интеренсо, но на всякий случай опишу, может кому то пригодится.

Что бы добавить пользовательское свйоство типа файл, необходмо сначала обработать этот файл методом  CFile::MakeFileArray.

$file_arr = CFile::MakeFileArray( #Полный путь к файлу #);

Если у нес несколько файлов и поле множественное то это надо заключить в цикл

 
foreach( $file_arr as $file){
     $more_src[] = CFile::MakeFileArray( $file );
 }

где:
$file_arr - Массив с путями картинок.

После присвоим полученый массив в массив пользовательских свойств.

$PROP[3] = $more_src;

где:
ключ 3 - ID Пользовательского свойства, ID можно заменить символьным кодом.

Следущим шагом будет заполнение массива с остальными полями:
$arLoadProductArray = Array(
        "MODIFIED_BY"    => $USER->GetID(), // элемент изменен текущим пользователем
        "IBLOCK_SECTION_ID" =>"",        
        "IBLOCK_ID"      => #IBLOCK_ID#,
        "PROPERTY_VALUES" =>  $PROP,
 );

Описание этих полей можете найти в документации 1С-Битрикс.

Все остальное останется неизменным

CModule::IncludeModule("iblock");
$el = new CIBlockElement;
$PRODUCT_ID = $el->Add($arLoadProductArray)

После  выполнения кода должны получить примерно следующее:
1c-Битрикс - заполнения пользовательского множественого свойства типа Файл.


Надеюсь эта статья кому то поможет, и я потратил время не зря.


среда, 3 октября 2012 г.

1С-Битрикс - фильтрация по дате (Пользовательское поле).

Недавно пришлось сделать небольшой виджет, вида "Праздник дня".  который вправом блоке сайта выводил бы сегоднешний праздник.
Для этог опришлось создать пользовательское поле типа "Дата/Время" с сивольным кодом "CELEBRATE_DATE" в котором я указываю дату праздника и по этому полю получать информацию в виджет.

Вся соль в том, что в документации по фильтрам написана следующая конструкция
$arFilter = array(
    "PROPERTY_CODE" => "VALUE",
);
Эта запись подходит для полей типа строка, число, но не для даты.
Битрикс не конвертирует сам дату в необходимый формат.
В базе данных дата хранится в следующем формате "d-m-YYYY H:i:s" , и нам необходимо любым способом привести ее к этому формату.

У битрикса есть методы по приведению даты к нужному формату, например,
$DB->CharToDateFunction(date("d.m.2010 00:00:00") );

Но мне этот метод не подошел и я воспользовался встроенной функцией в PHP
date("2010-m-d 00:00:00")

Теперь можно приступить к созданию фильтра для компонента
$arFilter = array(
    "PROPERTY_CELEBRATE_DATE" => date("2010-m-d 00:00:00"),
    "SECTION_CODE" => "celebration-of-the-day",
    "IBLOCK_ID" => "7"
);
С остальными полями фильтра проблем возникнуть недолжно.
Все, наш фильтр готов к использованию.

Так же кроме точного совпадения мы можем задавать условия:

После текущей даты
arFilter = array(
     ">PROPERTY_CELEBRATE_DATE" => date("YYYY-m-d 00:00:00")
);
До текущей даты
$arFilter = array(
     "<PROPERTY_CELEBRATE_DATE" => date("YYYY-m-d 00:00:00")
);
Все даты кроме этой
$arFilter = array(
     "!PROPERTY_CELEBRATE_DATE" => date("YYYY-m-d 00:00:00")
);