@nautilus644

Кастомные свойства (текст + файл)?

Всем привет!

Не смог найти подходящее решение в сети. Есть только вариант, когда все поля свойства типа Строка.

<?AddEventHandler("iblock","OnIBlockPropertyBuildList",array("Property_Service_List_Class","GetUserTypeDescription"));

class Property_Service_List_Class
{
   function GetUserTypeDescription()
   {
       return array(
           "PROPERTY_TYPE"   => "S",
           "USER_TYPE"    => "EServiceList",
           "DESCRIPTION"   => "Услуги",
           "GetPropertyFieldHtml" => array("Property_Service_List_Class","GetPropertyFieldHtml"),
           "GetPublicEditHTML"  => array("Property_Service_List_Class","GetPropertyFieldHtml"),
           "ConvertToDB"   => array("Property_Service_List_Class","ConvertToDB"),
           "ConvertFromDB"   => array("Property_Service_List_Class","ConvertFromDB"),
           "GetAdminListViewHTML" => array("Property_Service_List_Class","GetAdminListViewHTML"),
       );
   }
   function GetPropertyFieldHtml($arProperty, $value, $strHTMLControlName)
   {

       $html = '';
       $html = "<table>";
       $html .= "<tr><th>Наименование</th><th>Цена</th><th>Время</th></tr>";
       $html .= "<tr>";
       $html .= '<td><input type="text" size="20" placeholder="Наименование" name="'.$strHTMLControlName['VALUE'].'[]" value="'.$value['VALUE'][0].'" /></td>';
       $html .= '<td><input type="text" size="20" placeholder="Цена" name="'.$strHTMLControlName['VALUE'].'[]" value="'.$value['VALUE'][1].'" /></td>';
       $html .= '<td><input type="file" size="20" placeholder="Время" name="'.$strHTMLControlName['VALUE'].'[]" value="'.$value['VALUE'][2].'" /></td>';
       $html .= '</tr>';
       $html .= "</table>";

       return  $html;

   }
   function ConvertToDB($arProperty, $value)
   {
       if($value['VALUE'][0]!='') {
           $value['VALUE'] = serialize($value['VALUE']);
       } else {
           $value['VALUE'] = null;
       }
       return $value;
   }
   function ConvertFromDB($arProperty, $value){
       if(strlen($value["VALUE"])>0) {
           $tmpArr = unserialize($value["VALUE"]);
           if(is_array($tmpArr) && count($tmpArr))
               $value["VALUE"] = $tmpArr;
       } else {
           $value["VALUE"] = null;
       }
       return $value;
   }
   function GetAdminListViewHTML($arProperty, $value, $strHTMLControlName) {
       if(is_array($value["VALUE"]) && count($value["VALUE"])) {
           $tmpArr = array();
           $tmpArr[] = "[".$value['VALUE'][0]."] - ".$value['VALUE'][1]." - ".$value['VALUE'][2]." - ".$value['VALUE'][3];

           return implode(" /\n",$tmpArr);
       }
       else
       {
           return htmlspecialcharsex($value["VALUE"]);
       }
   }

}


А как добавить возможность загрузки файла с сохранением его в карточки элемента?
Не работает - файл выбирается, но не сохраняется.
Возможно ли вообще такое реализовать или же тип свойства для всех полей должен быть один и тот же?
  • Вопрос задан
  • 464 просмотра
Пригласить эксперта
Ответы на вопрос 3
Tomio
@Tomio
backend developer (python, php)
Так в битриксе же есть уже готовое свойство типа "Файл".

5e31372f39336472030900.png

Или вы хотите понять принцип работы кастомных свойств?
Ответ написан
Комментировать
@nautilus644 Автор вопроса
Я знаю что есть.
Мне нужно что бы в одной строке - при редактировании элемента - была возможность заполнить два текстовых поля + выбрать файл. Все это сохранить. Свойство должно быть множественным, т.е. пользователь должен иметь возможность добавить много строк в каждой из которых будет 2 текстовых поля + файл. И все это сохранялось бы в карточке элемента.
Ответ написан
AlexanderTsymbal
@AlexanderTsymbal
tsymbal.su
Реализовать такое, конечно можно. Но придётся очень сильно внедриться в ядро. Думаю, игра не стОит свеч.
Лучше сделайте отдельный инфоблок для этого множественного свойства с множеством разных полей и при создании элемента в родительском инфоблоке создавайте "дочерние" элементы в этом отдельном инфоблоке, с привязкой к родительскому элементу.
Такое решение предлагают сами разработчики битрикс. Ведь их интернет-магазин построен по принципу "Товар -> Товарные предложения". Первый инфоблок - родительский, второй - дочерний. У каждого товара может быть огромное количество товарных предложений с нужными параметрами.
Да, это дополнительные запросы к БД, снижение скорости.
Если всё правильно сделать, то в связке с кешированием будет всё хорошо и быстро работать.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы