С помощью какого метода можно получить свойство элемента

  Свойства элементов

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

Общий подход при работе со свойствами

С помощью какого метода можно получить свойство элемента

Примечание: свойства создаются для каждого инфоблока отдельно.

  Как создать свойство?

  1. Откройте форму настроек информационного блока (Контент > Инфоблоки > Типы инфоблоков > название_типа > название_инфоблока).
  2. Перейдите на закладку

    Свойства

    С помощью какого метода можно получить свойство элемента

    .

  3. В свободной строчке:
    • введите название свойства (название будет показываться на сайте);
    • выберите тип хранимых в свойстве данных;
    • отметьте флаг Множ., если значений у свойства может быть несколько;
    • отметьте флаг Обяз., если указание значений данного свойства – это обязательная процедура;
    • заглавными латинскими буквами укажите

      код свойства

      С помощью какого метода можно получить свойство элемента

      ;

    • нажмите кнопку […] для детального редактирования настроек свойства.
  4. Во всплывающем окне проверьте уже сделанные вами настройки и выполните оставшиеся.

    Примечание: перечень полей зависит от выбранного типа свойства. Описание каждого поля приведено в

    документации по продукту.

    Форма позволяет выполнить детальную настройку свойств инфоблока. Поля некоторых форм могут

    отличаться для разных свойств. Для открытия формы нужно:

    1. Перейдите на страницу

      Контент > Информ. блоки > Типы информ. блоков > Название типа инфоблоков.
    2. В колонке команд выбрать команду Свойства для нужного инфоблока.

      Откроется страница списка свойств для элементов инфоблока.
    3. На контекстной панели нажмите кнопку Добавить свойство или

      в меню действий конкретного свойства выберите команду Изменить.

    либо:

    1. Перейдите на страницу

      Контент > Информ. блоки > Типы информ. блоков > Название типа инфоблоков > Название инфоблока.
    2. В колонке команд выбрать команду Изменить.
    3. Перейдите на закладку Свойства.
    4. В строке с нужным свойством элемента нажмите на кнопку [].

      Откроется форма настройки свойств информационного блока.

    Подробнее…

  5. Сохраните настройки.

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

создании/редактировании

Следуйте инструкциям на схеме и расширяйте контент вашего сайта: публикуйте статьи, добавляйте товары и новости.

Подробнее…

элементов:

С помощью какого метода можно получить свойство элемента

Важно! Если свойство не появилось в форме создания/редактирования элемента, то

перенастройте внешний вид

При работе с товарами, материалами статей, каталогами справочников вы зачастую обращаете внимание на следующий момент: в форме присутствуют поля, которые не используются на сайте. Лишние поля увеличивают размеры формы редактирования и затрудняют внесение данных.

Облегчите свой труд, используйте инструмент настройки форм инфоблоков. Инструмент учитывает индивидуальные потребности, позволяет настроить формы редактирования разделов и элементов инфоблока под себя:

  • удаляйте лишние поля или целые вкладки;
  • перемещайте поля между вкладками;
  • создавайте свои вкладки.

Подробнее…

формы.

  Как вывести информацию из свойства?

Когда свойство

уже создано

С помощью какого метода можно получить свойство элемента

и в элементах инфоблока проставлены его

значения

С помощью какого метода можно получить свойство элемента

, можно приступать к выводу этих значений на сайт:

  1. Откройте на сайте страницу, где демонстрируется посетителям информация из вашего инфоблока.
  2. Включите

    режим правки

    Режим Правка – специальный режим работы “1С-Битрикс: Управление сайтом”, в котором происходит изменение информации на сайте.
    С помощью какого метода можно получить свойство элемента
    Подробнее…

    .

  3. Откройте форму с

    настройками компонента.

    В режиме правки наведите мышь на область компонента, появится панель настроек. Выберите пункт Редактировать параметры компонента. Откроется форма настройки.

    Подробнее…

  4. Перейдите к настройкам списка и/или детального просмотра и отметьте

    ваше свойство

    С помощью какого метода можно получить свойство элемента

    .

  5. Сохраните настройки.

Теперь значения из свойства показываются на сайте:

С помощью какого метода можно получить свойство элемента

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

  Как вывести подсказки в фильтре?

Бывают ситуации, когда в фильтре каталога товаров требуется прояснить фильтруемые параметры. Поскольку параметры фильтра – это свойства инфоблока, то используйте механизм подсказок. Добавить подсказку очень просто:

  1. Откройте форму редактирования вашего каталога с товарами (Контент > Инфоблоки > Типы инфоблоков > название_типа > название_инфоблока).
  2. Перейдите на закладку Свойства.
  3. В строке с требуемым свойством нажмите кнопку […].
  4. Введите текст подсказки в поле

    Подсказка в умном фильтре для посетителей

    С помощью какого метода можно получить свойство элемента

    .

  5. Сохраните настройки.

Теперь в фильтре рядом с параметром отображается подсказка:

С помощью какого метода можно получить свойство элемента

  Заключение

Свойства создаются отдельно для каждого инфоблока. Значения свойства задаются в элементах инфоблока. Показ значений свойства на сайте определяется настройками компонента.

Источник

 

Заглянувший

Сообщений: 8
Авторитет:

0
Рейтинг пользователя:

0
Регистрация: 27.12.2004

Подскажите, пожалуйста, каким образом я могу получить свойства элемента, которые сам создал. К примеру я выбираю все элементы из информационного блока, которые подходят по имени, а затем мне необходимо уже из этих элементов выбрать окончательные. Я предварительно создал в иблоке свойство, как к нему можно получить доступ?

$firstitems  = GetIBlockElementListEx(“routers”, Array(), Array(), Array(“name”=>”asc”), false, Array(“NAME”=>$_POST[“firstpoint”]), Array(), false);
$seconditems = GetIBlockElementListEx(“routers”, Array(), Array(), Array(“name”=>”asc”), false, Array(“NAME”=>$_POST[“secondpoint”]), Array(), false);

while ($arItem = $firstitems->GetNext())
{
while ($SecarItem = $seconditems->GetNext())
{
// Что здесь необходимо вызвать, что бы получить доступ?
}
}

 

С помощью какого метода можно получить свойство элемента

Администратор

Сообщений: 1045
Баллов: 108
Авторитет:

5
Рейтинг пользователя:

6
Регистрация: 24.03.2004

$SecarItem[“PROPERTIES”][“<имя свойства>”][“VALUE”]

Это применимо к свойствам типа строка, число. Вывод множественных свойств, свойств типа список и файл осуществляется по-другому. Если вам это требуется, то я предоставлю вам пример.

 

Заглянувший

Сообщений: 8
Авторитет:

0
Рейтинг пользователя:

0
Регистрация: 27.12.2004

Сделал как вы подсказали – но ничего не выводит. Просмотрел массив print_r($SecarItem) на существование [PROPERTIES] – такового не оказалось. Свойство строка и немножественное. В чем может быть трабл?

 

Заглянувший

Сообщений: 8
Авторитет:

0
Рейтинг пользователя:

0
Регистрация: 27.12.2004

Пофиксил этот трабл только таким способом – вызвал свойства только для конкретного элемента…

$first = GetIBlockElement($FirarItem[“ID”]);
$first[“PROPERTIES”][“<имя_свойства>”][“VALUE”];

 

Миша Аксенчик

Заглянувший

Сообщений: 8
Авторитет:

0
Рейтинг пользователя:

0
Регистрация: 27.12.2004

#5

10.01.2005 20:50:59

Цитата
SecarItem[“PROPERTIES”][“<имя свойства>”][“VALUE”]

Это применимо к свойствам типа строка, число. Вывод множественных свойств, свойств типа список и файл осуществляется по-другому. Если вам это требуется, то я предоставлю вам пример.

Вывод свойст типа список можно увидеть?

 

Anton Ezhkov

С помощью какого метода можно получить свойство элемента

Администратор

Сообщений: 1045
Баллов: 108
Авторитет:

5
Рейтинг пользователя:

6
Регистрация: 24.03.2004

#6

11.01.2005 15:47:26

Цитата
Вывод свойст типа список можно увидеть?

Вывод значения свойства типа список осуществляется точно также, только если он не множественный.
Element[“PROPERTIES”][“<имя свойства>”][“VALUE”]

 

Миша Аксенчик

Заглянувший

Сообщений: 8
Авторитет:

0
Рейтинг пользователя:

0
Регистрация: 27.12.2004

#7

12.01.2005 00:48:49

Цитата
Вывод значения свойства типа список осуществляется точно также, только если он не множественный.
Element[“PROPERTIES”][“<имя свойства>”][“VALUE”]

Цитата
$SecarItem[“PROPERTIES”][“<имя свойства>”][“VALUE”]

Это применимо к свойствам типа строка, число. Вывод множественных свойств, свойств типа список и файл осуществляется по-другому. Если вам это требуется, то я предоставлю вам пример

Может стоит быть хоть немного более внимательными с ответами…      

 

Anton Ezhkov

С помощью какого метода можно получить свойство элемента

Администратор

Сообщений: 1045
Баллов: 108
Авторитет:

5
Рейтинг пользователя:

6
Регистрация: 24.03.2004

#8

12.01.2005 11:12:04

Все зависит от того, что вы хотите вывести.

Если вы хотите вывести текущее значение не множественного свойства типа список, то используйте

Код
$Element[“PROPERTIES”][“<имя свойства>”][“VALUE”]

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

Код
$enum_props = CIBlockPropertyEnum::GetList(Array(“NAME”=>”ASC”), Array(“CODE”=>”<имя свойства>”));
while($arEnumProps = $enum_props->GetNext())
{
?>
<option value=”<? echo $arEnumProps[“ID”]?>”><?echo $arEnumProps[“VALUE”]?></option>
<?
}

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

Код
$enum_props = CIBlockPropertyEnum::GetList(Array(“NAME”=>”ASC”), Array(“CODE”=>”<имя свойства>”));
while($arEnumProps = $enum_props->GetNext())
{
if (in_array($arEnumProps[“ID”], $Element[“PROPERTIES”][“<имя свойства>”][“VALUE”])) echo $arEnumProps[“VALUE”];
}
 

Заглянувший

Сообщений: 8
Авторитет:

0
Рейтинг пользователя:

0
Регистрация: 27.12.2004

Подскажите, пожалуйста, как вывести все значения множественного свойства типа строка.

 

С помощью какого метода можно получить свойство элемента

Администратор

Сообщений: 1045
Баллов: 108
Авторитет:

5
Рейтинг пользователя:

6
Регистрация: 24.03.2004

$Element[“PROPERTIES”][“<имя свойства>”][“VALUE”]
$Element – будет массивом, каждый элемент которого будет соответствовать значению свойства.
$Element = Array(“<1-е значение свойства>”, “<2-е значение свойства>”, “<3-е значение свойства>”, “<4-е значение свойства>”…)

 

Александр Лякин

Заглянувший

Сообщений: 2
Авторитет:

0
Рейтинг пользователя:

0
Регистрация: 02.08.2006

#11

21.09.2006 09:32:57

Цитата
Anton Ezhkov пишет:
$Element[“PROPERTIES”][“<имя свойства>”][“VALUE”]
$Element – будет массивом, каждый элемент которого будет соответствовать значению свойства.
$Element = Array(“<1-е значение свойства>”, “<2-е значение свойства>”, “<3-е значение свойства>”, “<4-е значение свойства>”…)

То есть получается что в любом случае для получения множественных параметров нужно вызывать для каждой записи дополнительную функцию?

Как это отразится если у меня 25000 записей надо их все вывести? А у каждой записи есть множественное поле в котором иногда бывает аж по 200 элементов??

Предположим на сайт заходит 30-50 тыс. человек в день…. для ускорения задачи будем выводить по 20 наименований на страницу… (хотя я не уверен что эти сильно спасет)… мне кажется что это не позволит обрабатывать клиентов быстро!….

Как можно решить эту проблему?? можете ли вы доработать функцию CIBlockElement::GetList по уму, чтоб если она наталкивается на множественное значение, чтоб она формировала массив…? Это очень критично при больших нагрузках! Я более чем уверен, что это можно сделать средствами PHP без пополнительных запросов к БД.

 

Постоянный посетитель

Сообщений: 13
Баллов: 21
Авторитет:

1
Рейтинг пользователя:

0
Регистрация: 11.09.2006

так используйте кэширование в таком случае, вы ведь не изменяете свойства записей каждые 5 минут

 

Анна Кузьмина

Постоянный посетитель

Сообщений: 140
Баллов: 21
Авторитет:

0
Рейтинг пользователя:

0
Регистрация: 01.06.2006

#13

23.09.2006 19:27:57

Цитата
Александр Лякин пишет:
Как это отразится если у меня 25000 записей надо их все вывести? А у каждой записи есть множественное поле в котором иногда бывает аж по 200 элементов??

Вот так вот пальцем ткнули в самое больное место БУС. Дергание функций вида GetList в цикле приводит к _тааааакому_ перелопачиванию данных и _тааааким_ хитростным запросам, что ужос. А если еще по этим записям сортировать, вообще вешалка. Можно, плюнув на API, тащить прямо из базы нужное, ускорение работы в разы, но это некрасиво, зачем тогда покупатель за API-то платил. Кэширование сглаживает остроту проблему, но по сути тоже костыль.

2Даниил Хорошоко — свойства не изменяем, но почти та же проблема, только вид сбоку, проявляется при сортировке…

 

Постоянный посетитель

Сообщений: 13
Баллов: 21
Авторитет:

1
Рейтинг пользователя:

0
Регистрация: 11.09.2006

ну можно кэшировать и данные с разными типами сортировок и т.д. задавать cache_id в зависимости от параметров (вывода, сортировки, пальзователя) просто..

 

Постоянный посетитель

Сообщений: 140
Баллов: 21
Авторитет:

0
Рейтинг пользователя:

0
Регистрация: 01.06.2006

Костыли получаются красивые, развесистые… Это все же не решение, да и спасает лишь на сайтах с небольшой интерактивностью страниц. Разница в сравнении с реализацией моей задачи на “чистых” запросах к MySQL и на API БУС достигала 800% (не в пользу API). Это уже где-то за пределами добра и зла

 

Заглянувший

Сообщений: 38
Баллов: 1
Авторитет:

1
Рейтинг пользователя:

0
Регистрация: 13.12.2005

2Анна Кузьмина
Анна, а по какой причине Вы выбрали именно этот продукт, если не секрет конечно?  

 

Постоянный посетитель

Сообщений: 140
Баллов: 21
Авторитет:

0
Рейтинг пользователя:

0
Регистрация: 01.06.2006

Остальное — еще хуже

В действительности, БУС — хорошая штука. Многие фичи (те же свойства, ведь фактически, речь идет о конструировании прикладных типов данных; вот бы добавили еще свойство “таблица”, было бы совсем красиво) в других, известных мне системах (не сказать, чтобы совсем много, но почти все основные бесплатные и ряд коммерческих) или сделаны через грязный хак или отсутствуют и приходится самостоятельно плодить такие костыли и ваять кастомные модули (читай — дописывать функционал, который в общем-то должен быть в базе).

В общем, если рассматривать совокупность потребительских свойств БУС все же превосходит соперников. На мой, еще раз замечу, вкус. Реализация многих вещей безусловно несовершенна, но на то есть форум, где можно и нужно пинать разработчиков

 

Начинающий интегратор

Гость

У меня вопросик один: немного ламерский и относится больше к пхп, чем к БУС:
а как собсно вывести все элементы полученного массива?

 

S Lee

Гуру

Сообщений: 2529
Баллов: 447
Авторитет:

1
Рейтинг пользователя:

38
Регистрация: 29.11.2005

#19

14.08.2007 13:12:56

Цитата
Начинающий интегратор пишет:
а как собсно вывести все элементы полученного массива?

Не понятно, что конкретно Вам нужно, может быть это:

https://php.ru/manual/function.print-r.html
https://php.ru/manual/control-structures.foreach.html

 

Да извините уж за тупой вопрос, просто я давно ничего не кодил и всё перезабыл, мне нужно было вот что:

for($i=0;$i<count($array);$i++)
echo $array[$i];

Вот, даже такие банальности оказывается можно позабыть…

 

Denis Sharomov

Администратор

Сообщений: 2072
Баллов: 289
Авторитет:

0
Рейтинг пользователя:

18
Регистрация: 28.03.2006

#21

14.08.2007 14:06:18

Лучше так:

Код
foreach ($array as $a) echo $a;
 

S Lee

Гуру

Сообщений: 2529
Баллов: 447
Авторитет:

1
Рейтинг пользователя:

38
Регистрация: 29.11.2005

#22

14.08.2007 14:11:39

Цитата
Гость пишет:
for($i=0;$i<count($array);$i++)
echo $array[$i];

А… ну тогда уже лучше так, т.к. ключ массива не всегда может быть целым числом или начинаться с “0”:

Код
foreach($array as $key=>$value)
{
  echo $key.” = “.$value.”<br />”;
}

а если Вам просто нужно посмотреть, что в массиве:

Код
echo “<pre>”;
print_r($array);
echo “</pre>”;
 

Постоянный посетитель

Сообщений: 81
Баллов: 14
Авторитет:

1
Рейтинг пользователя:

1
Регистрация: 08.08.2007

Спасибо всем большое
Кстати говоря, по неизвестной причине, когда я обучался кодингу совсем с циелами Foreach не сталкивался, поэтому до сих пор часто, если есть возможность юзаю For

 

Salik

С помощью какого метода можно получить свойство элемента

Заглянувший

Сообщений: 20
Баллов: 1
Авторитет:

0
Рейтинг пользователя:

0
Регистрация: 04.06.2007

#24

31.10.2007 14:35:24

Цитата
Миша Аксенчик пишет:
Это применимо к свойствам типа строка, число. Вывод множественных свойств, свойств типа список и файл осуществляется по-другому. Если вам это требуется, то я предоставлю вам пример.

Подскажите с файлом.
Создаю инфоблок для загрузки файлов(прайсов) в формате xls.
Создал свойство инфоблока:
———————————————————-
ID Название Акт. Тип    Множ. Сорт. Код        Изм. Удал
———————————————————-
1  Файл     +    файл     –   100   typefiles
———————————————————-

Нужно: чтоб работвло

ИМЯ_ЭЛЕМЕНТА

Не могу изъять это свойство элемента.
Помогите плиз!!!

www.inzer.info

 

Александр Черкасов

Гуру

Сообщений: 2861
Баллов: 510
Авторитет:

1
Рейтинг пользователя:

55
Регистрация: 16.02.2006

#25

31.10.2007 15:32:57

Цитата
Salik пишет:
Нужно: чтоб работвло ИМЯ_ЭЛЕМЕНТА
Не могу изъять это свойство элемента.

Посмотрите в сторону функции CFile::GetPath

https://www.1c-bitrix.ru/help/source/main/help/ru/developer/reference/cfile/getpat­h.php.html

/истина где-то рядом….

Источник

Примеры решения задач, возникающих при работе с элементами, разделами и свойствами инфоблоков.

  • Получить значения всех свойств элемента, зная его ID
  • Получить свойства элементов, используя метод CIBlockElement::GetList
  • Добавить свойство типа TEXT/html для элемента
  • Заполнить множественное свойство типа Файл
  • Заполнить множественное свойство типа Список
  • Получить пользовательское свойство раздела
  • Пример создания своего типа данных для пользовательского свойства
  • Как удалить файл в свойстве элемента инфоблока
  • Задача 1:
    Получить значения всех свойств элемента, зная его ID.

    1 <? $db_props = CIBlockElement::GetProperty(IBLOCK_ID, ELEMENT_ID, “sort”, “asc”, array());
    2 $PROPS = array();
    3 while($ar_props = $db_props->GetNext())
    4 $PROPS[$ar_props[‘CODE’]] = $ar_props[‘VALUE’];?>

    Теперь символьный код свойства является ключом ассоциативного массива $PROPS, то есть, если вам нужно значение свойства с кодом price, то оно будет храниться в $PROPS[‘price’].

    Задача 2:
    Получить свойства элементов, используя метод CIBlockElement::GetList

    1 <? $arSelect = array(“ID”, “NAME”, “PROPERTY_prop_code_1”, “PROPERTY_prop_code_2”);
    2 $res = CIBlockElement::GetList(array(), array(), false, array(), $arSelect);?>

    Дальше использовать цикл и получить свойства с символьными кодами prop_code_1 и prop_code_2.

    Советы веб-разработчиков.

    Антон Долганин: Если для какого-либо изменения в БД предусмотрен специальный метод, следует использовать именно его, а не более общий метод изменения БД.

    Хороший пример: модуль интернет-магазина и работа с заказом. Можно изменить флаг оплаты заказа путем CSaleOrder::Update, а можно путем CSaleOrder::PayOrder. Так вот, следует применять именно PayOrder, потому что в нем произойдет вызов соответствующих обработчиков.

    Задача 3:

    Добавить свойство типа TEXT/html для элемента.

    Если свойство не множественное:

    01 <? $element = new CIBlockElement;
    02 $PROP = array();
    03 $PROP[‘символьный код свойства’][‘VALUE’][‘TYPE’] = ‘text’; // или html
    04 $PROP[‘символьный код свойства’][‘VALUE’][‘TEXT’] = ‘значение, которое нужно забить’;
    05 $arLoadArray = array(
    06 “IBLOCK_ID” => IBLOCK_ID,
    07 “PROPERTY_VALUES”=> $PROP,
    08 “NAME” => “Название элемента”
    09 );
    10 $element->Add($arLoadArray);?>

    Если свойство множественное:

    01 <? // В $ITEMS хранятся значения множественного свойства, которое нужно забить
    02 foreach($ITEMS as $item)
    03 {
    04 $VALUES[][‘VALUE’] = array(
    05 ‘TYPE’ => ‘text’, // или html
    06 ‘TEXT’ => $item,
    07 );
    08 }
    09 $element = new CIBlockElement;
    10 $PROPS = array();
    11 $PROPS[‘символьный код свойства’] = $VALUES;
    12 $arLoadArray = array(
    13 “IBLOCK_ID” => IBLOCK_ID,
    14 “PROPERTY_VALUES”=> $PROPS,
    15 “NAME” => “Название элемента”
    16 );
    17 $element->Add($arLoadArray);?>

    Задача 4:

    Заполнить множественное свойство типа Файл. Довольно часто при добавлении элемента в инфоблок может понадобиться привязать к нему несколько файлов. Для этого удобно создать у инфоблока множественное свойство типа Файл и хранить файлы в нём. Пример заполнения свойства:

    01 <?
    02 $arFiles = array();
    03 for($i = 1; $i CFile::MakeFileArray($_SERVER[“DOCUMENT_ROOT”].’/images/image_’.$i.’.jpg’), ‘DESCRIPTION’ => ”);
    08 }
    09 }
    10 ?>

    После этого массив $arFiles передается как значение свойства при добавлении элемента.

    Задача 5:

    Заполнить множественное свойство типа Список с отображением в виде флажков. В данном случае у каждого элемента списка значений есть свой ID. Посмотреть их можно, зайдя в детальное редактирование свойства. Заполняется свойство следующим образом:

    1 <?
    2 if($first_condition == true) $values[] = array(‘VALUE’ => 1);
    3 if($second_condition == true) $values[] = array(‘VALUE’ => 2);
    4 CIBlockElement::SetPropertyValuesEx($ELEMENT_ID, $IBLOCK_ID, array(‘property_code’ => $values));
    5 ?>

    В данном случае при выполнении первого и второго условий мы отмечаем флажками элементы списка с ID =1 и ID=2 соответственно. Заменить следует $ELEMENT_ID, $IBLOCK_ID и property_code на нужные значения.

    Задача 6:

    Получить пользовательское свойство раздела

    1 <? $section_props = CIBlockSection::GetList(array(), array(‘IBLOCK_ID’ => IBLOCK_ID, ‘ID’ => SECTION_ID),
    true, array(“UF_ADDITIONAL_PRICE”));
    2 $props_array = $section_props->GetNext(); ?>

    Теперь в $props_array[‘UF_ADDITIONAL_PRICE’] лежит значение свойства UF_ADDITIONAL_PRICE раздела инфоблока.

    Совет от веб-разработчиков.

    Алексей Коваленко: При работе с инфоблоками удобнее все коды свойств именовать заглавными буквами. В таком случае вы сможете избежать небольших несостыковок в своей работе.

    Например, значение свойства с кодом foto при работе с компонентами часто доступно через [PROPERTIES][foto][VALUE]?, а при использовании метода GetList вы можете получить PROPERTY_FOTO_VALUE.

    Пример создания своего типа данных для пользовательского свойства

    В качестве значения свойства попробуем завести картинку с превью. Это могут быть например фотографии гостиницы на туристическом сайте или что-то подобное. В варианте такого применения и рассмотрим решение задачи.

    Один из вариантов реализации: хранить изображения в отдельном инфоблоке и показывать как привязку к элементу. Пример кода:

    AddEventHandler(“iblock”, “OnIBlockPropertyBuildList”, array(“CIBlockPropertyPicture”, “GetUserTypeDescription”));
    AddEventHandler(“iblock”, “OnBeforeIBlockElementDelete”, array(“CIBlockPropertyPicture”, “OnBeforeIBlockElementDelete”));
    class CIBlockPropertyPicture
    {
    function GetUserTypeDescription()
    {
    return array(
    “PROPERTY_TYPE” =>”E”,
    “USER_TYPE” =>”Picture”,
    “DESCRIPTION” =>”Картинка”,
    “GetPropertyFieldHtml” =>array(“CIBlockPropertyPicture”, “GetPropertyFieldHtml”),
    “GetPublicViewHTML” =>array(“CIBlockPropertyPicture”, “GetPublicViewHTML”),
    “ConvertToDB” =>array(“CIBlockPropertyPicture”, “ConvertToDB”),

    //”GetPublicEditHTML” =>array(“CIBlockPropertyPicture”,”GetPublicEditHTML”),
    //”GetAdminListViewHTML” =>array(“CIBlockPropertyPicture”,”GetAdminListViewHTML”),
    //”CheckFields” =>array(“CIBlockPropertyPicture”,”CheckFields”),
    //”ConvertFromDB” =>array(“CIBlockPropertyPicture”,”ConvertFromDB”),
    //”GetLength” =>array(“CIBlockPropertyPicture”,”GetLength”),
    );
    }

    function GetPropertyFieldHtml($arProperty, $value, $strHTMLControlName)
    {
    $LINK_IBLOCK_ID = intval($arProperty[“LINK_IBLOCK_ID”]);
    if($LINK_IBLOCK_ID)
    {
    $ELEMENT_ID = intval($value[“VALUE”]);
    if($ELEMENT_ID)
    {
    $rsElement = CIBlockElement::GetList(array(), array(“IBLOCK_ID” => $arProperty[“LINK_IBLOCK_ID”],
    “ID” => $value[“VALUE”]), false, false, array(“ID”, “PREVIEW_PICTURE”, “DETAIL_PICTURE”));
    $arElement = $rsElement->Fetch();
    if(is_array($arElement))
    $file_id = $arElement[“DETAIL_PICTURE”];
    else
    $file_id = 0;
    }
    else
    {
    $file_id = 0;
    }

    if($file_id)
    {
    $db_img = CFile::GetByID($file_id);
    $db_img_arr = $db_img->Fetch();
    if($db_img_arr)
    {
    $strImageStorePath = COption::GetOptionString(“main”, “upload_dir”, “upload”);
    $sImagePath = “/”.$strImageStorePath.”/”.$db_img_arr[“SUBDIR”].”/”.$db_img_arr[“FILE_NAME”];
    return ‘<label><input name=”‘.$strHTMLControlName[“VALUE”].'[del]” value=”Y” type=”checkbox”>
    Удалить файл ‘.$sImagePath.'</label>’
    .'<input name=”‘.$strHTMLControlName[“VALUE”].'[old]” value=”‘.$ELEMENT_ID.'” type=”hidden”>’;
    }
    }
    return ‘<input type=”file” size=”‘.$arProperty[“COL_COUNT”].'” name=”‘.$strHTMLControlName[“VALUE”].'”/>’;
    }
    else
    {
    return “Ошибка настройки свойства. Укажите инфоблок в котором будут храниться картинки.”;
    }
    }

    function GetPublicViewHTML($arProperty, $value, $strHTMLControlName)
    {
    $LINK_IBLOCK_ID = intval($arProperty[“LINK_IBLOCK_ID”]);
    if($LINK_IBLOCK_ID)
    {
    $ELEMENT_ID = intval($value[“VALUE”]);
    if($ELEMENT_ID)
    {
    $rsElement = CIBlockElement::GetList(array(), array(“IBLOCK_ID” => $arProperty[“LINK_IBLOCK_ID”],
    “ID” => $value[“VALUE”]), false, false, array(“ID”, “PREVIEW_PICTURE”, “DETAIL_PICTURE”));
    $arElement = $rsElement->Fetch();
    if(is_array($arElement))
    return CFile::Show2Images($arElement[“PREVIEW_PICTURE”], $arElement[“DETAIL_PICTURE”]);
    }
    }
    return “”;
    }

    function ConvertToDB($arProperty, $value)
    {
    $arResult = array(“VALUE” => “”, “DESCRIPTION” => “”);
    $LINK_IBLOCK_ID = intval($arProperty[“LINK_IBLOCK_ID”]);
    if($LINK_IBLOCK_ID)
    {
    if(
    is_array($value[“VALUE”])
    && is_array($value[“VALUE”][“error”])
    && $value[“VALUE”][“error”][“VALUE”] == 0
    && $value[“VALUE”][“size”][“VALUE”] > 0
    )
    {
    $arDetailPicture = array(
    “name” => $value[“VALUE”][“name”][“VALUE”],
    “type” => $value[“VALUE”][“type”][“VALUE”],
    “tmp_name” => $value[“VALUE”][“tmp_name”][“VALUE”],
    “error” => $value[“VALUE”][“error”][“VALUE”],
    “size” => $value[“VALUE”][“size”][“VALUE”],
    );
    $obElement = new CIBlockElement;
    $arResult[“VALUE”] = $obElement->Add(array(
    “IBLOCK_ID” => $LINK_IBLOCK_ID,
    “NAME” => $arDetailPicture[“name”],
    “DETAIL_PICTURE” => $arDetailPicture,
    ), false, false, true);
    }
    elseif(
    is_array($value[“VALUE”])
    && isset($value[“VALUE”][“size”])
    && !is_array($value[“VALUE”][“size”])
    && $value[“VALUE”][“size”] > 0
    )
    {
    $arDetailPicture = array(
    “name” => $value[“VALUE”][“name”],
    “type” => $value[“VALUE”][“type”],
    “tmp_name” => $value[“VALUE”][“tmp_name”],
    “error” => intval($value[“VALUE”][“error”]),
    “size” => $value[“VALUE”][“size”],
    );
    $obElement = new CIBlockElement;
    $arResult[“VALUE”] = $obElement->Add(array(
    “IBLOCK_ID” => $LINK_IBLOCK_ID,
    “NAME” => $arDetailPicture[“name”],
    “DETAIL_PICTURE” => $arDetailPicture,
    ), false, false, true);
    }
    elseif($value[“VALUE”][“del”])
    {
    $obElement = new CIBlockElement;
    $obElement->Delete($value[“VALUE”][“old”]);
    }
    elseif($value[“VALUE”][“old”])
    {
    $arResult[“VALUE”] = $value[“VALUE”][“old”];
    }
    elseif(!is_array($value[“VALUE”]) && intval($value[“VALUE”]))
    {
    $arResult[“VALUE”] = $value[“VALUE”];
    }
    }
    return $arResult;
    }

    function OnBeforeIBlockElementDelete($ELEMENT_ID)
    {
    $arProperties = array();
    $rsElement = CIBlockElement::GetList(array(), array(“ID” => $ELEMENT_ID), false, false, array(“ID”, “IBLOCK_ID”));
    $arElement = $rsElement->Fetch();
    if($arElement)
    {
    $rsProperties = CIBlockProperty::GetList(array(), array(“IBLOCK_ID” => $arElement[“IBLOCK_ID”], “USER_TYPE” => “Picture”));
    while($arProperty = $rsProperties->Fetch())
    $arProperties[] = $arProperty;
    }

    $arElements = array();
    foreach($arProperties as $arProperty)
    {
    $rsPropValues = CIBlockElement::GetProperty($arElement[“IBLOCK_ID”], $arElement[“ID”], array(), array(
    “EMPTY” => “N”,
    “ID” => $arProperty[“ID”],
    ));
    while($arPropValue = $rsPropValues->Fetch())
    {
    $ID = intval($arPropValue[“VALUE”]);
    if($ID > 0)
    $arElements[$ID] = $ID;
    }
    }

    foreach($arElements as $to_delete)
    {
    CIBlockElement::Delete($to_delete);
    }
    }
    }

    Что мы в итоге имеем:

    • Интерфейс редактирования элемента с возможностью добавления и удаления изображений.
    • При удалении элемента связанная с ним информация удаляется.
    • Поддержка компонент публичной части.

    Инструкция по применению:

    • Этот код разместите в файле /bitrix/php_interface/init.php.
    • Создайте инфоблок для хранения изображений и в его настройках укажите параметры генерации картинки предварительного просмотра из детальной (на вкладке Поля).
    • В инфоблоке Гостиницы добавьте свойство типа Картинка и в дополнительных настройках этого свойства укажите созданный на первом шаге инфоблок. Не забудьте указать символьный код свойства.
    • Создайте элемент и “поиграйтесь” со значениями этого свойства.
    • В публичной части, например в компоненте news, в параметрах настройки списка элементов выбрать это свойство.

    Как удалить файл в свойстве элемента инфоблока

    Обновить любое свойство можно с помощью методов:

    • Update
    • SetPropertyValues
    • SetPropertyValuesEx

    При использовании любого метода на ключ массива обновления идет код свойства, а значение – новое значение. Для удаления файла нам надо передать вот такой простой массив:

    array(‘MY_FILE’ => array(‘XXX’ => array(‘del’ => ‘Y’)));

    Способ универсален и подходит что для инфоблоков, что для инфоблоков 2.0, что для документооборота. MY_FILE – это код вашего свойства типа Файл. А что такое ХХХ? В нём содержится ID значения_ свойства. То есть не ID свойства, а именно ID значения.

    CModule::IncludeModule(‘iblock’);
    $IB = 24;
    $ID = 220304;
    $CODE = ‘ONE_FL’;
    if ($arProp = CIBlockElement::GetProperty($IB, $ID, ‘ID’, ‘DESC’, array(‘CODE’ => $CODE))->fetch()) {
    $XXX = $arProp[‘PROPERTY_VALUE_ID’];
    CIBlockElement::SetPropertyValueCode($ID, $CODE, array($XXX => array(‘del’ => ‘Y’)));
    }

    Вот таким образом получается этот универсальный XXX, именно так его и надо передавать для каждого файла, который мы хотим удалить.

    Что делать в случае множественного файла? Как удалить конкретный файл в списке? Все просто – используем в примере выше не if, а while, ну и дополнительно фильтруем, какой файл надо удалить.

    Источник

    Читайте также:  Какое свойство угля нефти природного газа и торфа