Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Как обновить описание для файлов, которые лежат в свойствах инфоблоков?

00 голосов
7
Здравствуйте, люди!

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

Почитал документацию и изменил размеры картинок которые хранятся в свойствах ( сделал это в функции BXIBlockAfterSave).

НО осталась проблема - размеры выводимых уменьшились, но функция CFile::Show2Images выводит картинки в рамках, которые соответсвуют размерам картинки, до их уменьшения.

Вот как я менял размеры:
Код
$img_path1 = $_SERVER['DOCUMENT_ROOT'].CFile::GetPath($img1['VALUE']);
$img_path2 = $_SERVER['DOCUMENT_ROOT'].CFile::GetPath($img2['VALUE']);
imageResizeCrop($img_path1, $img_path1, 800, 600, 50);
imageResizeCrop($img_path2, $img_path2, 150, 100, 50, true);


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

Может кто-то сталкивался с подобной проблемой и готов помочь?
спросил 03 Май, 13 от Angeal (180 баллов)

7 Ответы

00 голосов
Я может что-то не понял, но зачем было менять код функции CFile::Show2Images.

Данная функция возвращает HTML для показа изображения при клике на которое в отдельном popup-окне отображается другое изображение.

я в шаблоне инфоблока Вы должны были ее вызвать приблизительно так:
Код
    echo CFile::Show2Images(
         $_SERVER['DOCUMENT_ROOT'].CFile::GetPath($img1['VALUE']),
         $_SERVER['DOCUMENT_ROOT'].CFile::GetPath($img2['VALUE']), 
         150, 
         100, 
         "hspace='0' vspace='0' border='0' title='".$arElement["NAME"]."'",
         "Click Me",
    );
ответил 03 Май, 13 от spamer (500 баллов)
00 голосов
Я не менял код этой функции!

Цитата
Почитал документацию и изменил размеры картинок которые хранятся в свойствах ( сделал это в функции BXIBlockAfterSave).

Документация: вот тут в самом низу. Я просто изменил размеры картинок, которые хранятся в свойстве инфоблока, уже после того как сохранил их туда.

А затем в функцию Show2Images передал ID этих картинок!

Попробую объяснить на пальцах:
Я щелкаю на маленькое изображение, открывается новое окошко, но его размеры не соответствуют реальным размерам большой картинки! Размеры окошка с большой картинкой соответствуют размерам большой картинки ДО ее уменьшения.

Вот такая проблема!
ответил 04 Май, 13 от Angeal (180 баллов)
00 голосов
Код
$new_preview = CFile::MakeFileArray($fileTo);
            
            $el = new CIBlockElement;
            $res = $el->Update($ID, array("PREVIEW_PICTURE" => $new_preview), false);
            if (!$res)
                return ошибку;

$fileTo - путь к файлу;
$ID - идентификатор элемента, которому принадлежит ваш файл;
PREVIEW_PICTURE - имя свойства, которое обновляем;
$new_preview - массив, описывающий файл.
Документация.
ответил 06 Июль, 13 от wanaj (140 баллов)
00 голосов
Прошу прощения, написал не под той учеткой.
Немного погорячился я с советом, ибо для обновления пользовательских свойств, надо передавать массив всех свойств...

Соответственно, надо смотреть на CIBlockElement::SetPropertyValueCode.
Кстати в документации рассмотрен интересующий вас пример.
ответил 09 Окт, 13 от Almarea (3,760 баллов)
00 голосов
Функция CIBlockElement::SetPropertyValueCode не помогла, она у меня почему то, вместо того чтобы обновить описание к картинке, создает в массиве еще одну, копию первой (пользовательское свойство сделано в виде массива картинок)

Тем не менее, думаю что мы пошли в неправильном направлении!

Используя phpMyAdmin и документацию по битриксу выяснил! что информация о размере картиники по вертикали и по горизонтали хранится в таблице b_file, а когда я изменяю размеры вручную, информация в ней не обновляется, поэтому размеры открывающихся окон неправильные!

Начал искать функцию которая по известному ID обновляет описание файла в этой таблице и не нашел ее! (искал в классе CFile)

Неужели мне придется через класс CDatabase обращаться к базе данных чтобы вручную проапдейтить нужные поля??
ответил 09 Янв, 14 от Angeal (180 баллов)
00 голосов
Нет, путем мы пошли правильным, т.к. пример, описанный выше, работает для стандартных полей (PREVIEW_PICTURE, DETAIL_PICTURE). А не работает в этом, потому что у вас поле множественное, тут вот надо подумать как это дело изменить.

Действительно описание добавляется, а не обновляется, но добавляется обновленное описание, это уже хорошо. Ситуация странноватая, ждем совета других форумчан.
ответил 27 Апр, 14 от Almarea (3,760 баллов)
00 голосов
В качестве ключа массива для значения файла надо использовать ID зачения свойства (PROPERTY_VALUE_ID). Тогда будет не дублирование, а замещение.
Код
//FILES - код множественного свойства
//$PROPERTY_VALUE_ID из CIBlockElement::GetProperty($IBLOCK_ID, $ELEMENT_ID,array("PROPERTY_TYPE"=>"F"));
CIBlockElement::SetPropertyValues($ELEMENT_ID, $IBLOCK_ID, array(
  //перечисляем файлы
  $PROPERTY_VALUE_ID => array(
    "VALUE" => array(
       "old_file" => $VALUE
    ),
    "DESCRIPTION" => "Новое описание",
  ),
), "FILES"
);
ответил 23 Авг, 14 от Miso (740 баллов)

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

0 голосов
0 ответов
0 голосов
5 ответов
0 голосов
1 ответ
спросил 10 Май, 14 от Feluna (120 баллов)
0 голосов
5 ответов