Блог Николая Семенцова

Партнер компании 1с-битрикс

1C интеграция bitrix - реализация множественных свойств

Недавно решал такую проблему, необходимо было сделать выгрузку множественных свойств из 1С, но в ней такого функционала не реализовано. Для решения этой задачи я создал в  1С свойство типа строка,  например   цвет, записывал в эту строку в товаре  значения через разделитель запятая " синий , красный , желтый " (разделитель может быть любой, у меня их два) .

Далее я помести такой код в файл init.php

// реализуем возможность загрузки из 1С множественной строки   
AddEventHandler("iblock", "OnAfterIBlockElementAdd", "UpdatePluralToProp_1с");
AddEventHandler("iblock", "OnAfterIBlockElementUpdate", "UpdatePluralToProp_1с");
 
function UpdatePluralToProp_1с(&$arFields)
{           
    // соберем массив свойств элемента и сделаем обработку строки которая может быть множественной
    // переменная для разделителей    
    $spacer =  array(",", "\\");
    $properties = array();
    $db_props = CIBlockElement::GetProperty($arFields['IBLOCK_ID'], $arFields['ID'], array("sort" => "asc"), Array());
    while ($ob = $db_props->GetNext())
    {
        // получим свойство в котором обнаружили разделитель
 
        if($ob['CODE'] != 'CML2_ATTRIBUTES') {
            $properties[$ob['ID']][] = $ob;                     
        }
    }  
 
 
 
    foreach ($properties as $keyprops => $prop) {
 
         // удалим пустые значения
         foreach($prop as $key_v => $values) {
            if(empty($values['VALUE'])){
               unset($prop[$key_v]);     
            }
         }
 
         if ((!empty($prop)) && (count($prop) <= 2)) {
 
             foreach ($prop as $key_pro => $v) {
 
                 // пройдемся по массиву с разделителями
                 foreach($spacer as $spacer_value) {
 
 
                     if (strpos($v['VALUE'], $spacer_value) !== false) {
 
                          // разделим строку на массив
                          //$v['VALUE'] = str_replace(" ","",$v['VALUE']);
                          $v['VALUE'] = trim($v['VALUE']);
                          $PROPERTY_VALUE = array();
                          $arr_element_prop = array();
                          $arr_element_prop = explode($spacer_value, $v['VALUE']);
                          foreach($arr_element_prop as $key_elem => $element_prop) {
                                $element_prop = trim($element_prop);   
                                $PROPERTY_VALUE['n'.$key_elem] = array(
                                    'VALUE'=>$element_prop
                                );                                         
                          }
 
                          CIBlockElement::SetPropertyValuesEx($arFields['ID'], $arFields['IBLOCK_ID'], array($keyprops => $PROPERTY_VALUE));
 
                     }                   
 
                 }  
 
 
             }
         }
 
    }
 
 
  // printr($arFields);die;                 
 
}


Этот код был реализован для моих задач, но другим он тоже может быть полезен :)


Опубликовано: 24 января 2012




Помогла заметка? Жмите кнопки ниже


ВКонтакт Facebook Google Plus Одноклассники Twitter Livejournal Liveinternet Mail.Ru





comments powered by Disqus