Задать вопрос
@avshivtseva

Как создать кастомный тип свойства инфоблока?

Как создать кастомный тип свойства инфоблока, состоящий из трех полей с типами строка, файл, HTML/текст.

Пока получилось сделать вот это
AddEventHandler("iblock", "OnIBlockPropertyBuildList", array("CIBlockPropertyCustom", "GetUserTypeDescription"));

class CIBlockPropertyCustom
{
    public function GetUserTypeDescription()
    {
        return array(
            "PROPERTY_TYPE"        => "S", // тип свойства — строка
            "USER_TYPE"            => "SERVICE",
            "DESCRIPTION"          => "Услуга",
            "GetPropertyFieldHtml" => array("CIBlockPropertyCustom", "GetPropertyFieldHtml"),
        );
    }

    // вывод поля свойства на странице редактирования
    public function GetPropertyFieldHtml($arProperty, $value, $strHTMLControlName)
    {
        return '<input type="text" name="'.$strHTMLControlName["VALUE"].'" value="'.$value['VALUE'].'">
        <input type="file" name="'.$strHTMLControlName["VALUE"].'" value="'.$value['VALUE'].'">
        <textarea name="'.$strHTMLControlName["VALUE"].'" id="" cols="30" rows="10" value="'.$value['VALUE'].'"></textarea>


        ';
    }

    //сохраняем в базу
   function ConvertToDB($arProperty, $value){
       return $value;
   }
   //читаем из базы
   function ConvertFromDB($arProperty, $value){
       return $value;
   }
}


Но сохраняется только одно значение для всех полей
  • Вопрос задан
  • 2188 просмотров
Подписаться 2 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
@iitovka
1) т.к. у вас несколько полей, то они не могут иметь одинаковый name. надо каждому задать

name="'.$strHTMLControlName["VALUE"].'[1]"
name="'.$strHTMLControlName["VALUE"].'[2]"
name="'.$strHTMLControlName["VALUE"].'[3]"

2) Базовый тип вашего свойства - строка. поэтому сохранение значения в базу происходит просто как строка. файл никуда из формы не сохраняется и никак не обрабатывается.
Сохранение в базу вы должны написать сами вот тут
function ConvertToDB($arProperty, $value){
return $value;
}

например, из поля $value['VALUE'][2] - у вас будет картинка. ее сначала надо будет сохранить, можно средствами же битрикса, чтобы файл был записан в таблицу b_file, и у вас только id файла осталась, и уже это id записывать в значение кастомного свойства.

С полями типа файл кастомные свойства не делала, но вот пример сохранения строка+селект с множественным выбором+строка

function ConvertToDB($arProperty, $value) {
if(!$value['VALUE'][1]) return false;
$value['VALUE'][2]= implode('+', $value['VALUE'][2]);
$value['VALUE']= implode('||', $value['VALUE']);
return $value;
}

т.е. тут еще проверяю, если первый input не заполнен, то свойство не сохраняется.
само значение в итоге записано из массивов в строки. можно также сделать сериализацию.

а в ConvertFromDB - все обратно разбирать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы