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

Картинки элементов инфоблока

00 голосов
4
Есть такая задача. нужно всем элементам инфоблока задать программно детальную картинку и превью-картинку. Все картинки залиты на сервер следующим образом ... ./230/artikul.jpgгде артикул - это соответственно свойство артикул для каждого элемента, то же и с детальными изображениями. Элементов очень много, пдскажите пожалуйста, как лучше подойти к решению этой проблемы!
спросил 26 Дек, 13 от TRIADA (100 баллов)

4 Ответы

00 голосов
$query = "SEL ECT id, IBLOCK_ID, PREVIEW_PICTURE 
FR OM  `b_iblock_element` 
WHERE IBLOCK_ID =  '4'
AND PREVIEW_PICTURE IS NULL 
LIMIT 0 , 500 ";
 $sql = mysql_query($query);
 while ($velo= mysql_fetch_array($sql))
     {  


$el = new CIBlockElement;

$db_props = CIBlockElement::GetProperty('4', $velo['id'], "sort", "asc", Array("CODE"=>"artikul"));
 

if($ar_props = $db_props->Fetch())
$img = $ar_props["VALUE"];
$image='images/velo/700/'.$img.'.jpg';
$arLoadProductArray = Array(
  "ACTIVE"         => "Y",            // активен
  "DETAIL_PICTURE" => CFile::MakeFileArray($image)
  );

$PRODUCT_ID = $velo['id'];  // изменяем элемент с кодом (ID) 2
$res = $el->Update($PRODUCT_ID, $arLoadProductArray);

}


что здесь не так? smile:(
ответил 19 Март, 14 от TRIADA (100 баллов)
00 голосов
  1. Следует использовать API Битрикса, никаких прямых запросов.
  2. CFile::MakeFileArray() принимает абсолютный путь.

Ваш код примет примерно такой вид:
Код
   if (CModule::IncludeModule("iblock")) {
      $arFilter  = Array(
         "IBLOCK_ID" => "4",
         "PREVIEW_PICTURE" => false, // PREVIEW_PICTURE не задан
      );
      $arSelect = Array("IBLOCK_ID", "ID", "PREVIEW_PICTURE", "PROPERTY_artikul"); // и свойство "artikul" сразу
      $arNavStartParams = Array(
         "nPageSize" => 500,
         "iNumPage" => 1, // первые 500
      );
      $dbE = CIBlockElement::GetList(Array("ID" => "ASC"), $arFilter, false, $arNavStartParams, $arSelect);
      while ($arElement = $dbE->Fetch()) {
         $el = new CIBlockElement;
         
         $img = $arElement["PROPERTY_ARTIKUL_VALUE"];
         $image = '/images/velo/700/' . $img . '.jpg'; 
         $arLoadProductArray = Array(
            "ACTIVE"         => "Y",            // активен
            "DETAIL_PICTURE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"] . $image)
         ); 
         $PRODUCT_ID = $arElement["ID"];
         //ваш udpate
         $res = $el->Update($PRODUCT_ID, $arLoadProductArray);
      }
   }
ответил 11 Июль, 14 от Fenozipam (420 баллов)
00 голосов
Напрямую с базой быстрее, просто с синтаксисом была невнимательна)
Вот так в результате реализовала



<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetTitle("import");
CModule::IncludeModule("iblock");

$query = "SEL ECT id, IBLOCK_ID, PREVIEW_PICTURE FR OM  `b_iblock_element` WHERE IBLOCK_ID =  '4' AND PREVIEW_PICTURE IS NULL LIMIT 0 , 100 ";
 $sql = mysql_query($query);
 while ($velo= mysql_fetch_array($sql))
     {  


$el = new CIBlockElement;

$db_props = CIBlockElement::GetProperty('4', $velo['id'], "sort", "asc", Array("CODE"=>"artikul"));
 

if($ar_props = $db_props->Fetch())
$img = $ar_props["VALUE"];
$image='http://demo.smithbikes.ru/images/velo/230/'.$img.'.jpg';
echo $image.'<br>';
$arLoadProductArray = Array(
  "ACTIVE"         => "Y",            // активен
  "PREVIEW_PICTURE" => CFile::MakeFileArray($image)
  );

$PRODUCT_ID = $velo['id'];  
$res = $el->Update($PRODUCT_ID, $arLoadProductArray);

}
?>
ответил 11 Ноя, 14 от TRIADA (100 баллов)
00 голосов
Коллеги, вы зачем такой огород городите?
Если у вас картинки уже залиты, зачем их еще раз, уже программно заливать в каталог?
Ну используйте просто в шаблоне вывод нужных картинок, которые берутся по имени(=артикулу товара) картинки из известного места(нужный каталог с картинками)?
Сделайте в result_modifier.php их сжатие до нужного размера - все останется в кеше в нужном размере после первого обращения. Потребуется другой размер - допишите код и в кеш попадет в другом размере.
Зачем именно в превью и детейл свойства пихать то, что уже есть на сервере-то?

Тем более прямое обращение к базе - отвыкайте в Битриксе от использования прямых запросов. Их использовать только в том случае, если не хватает возможности стандартного API.
ответил 08 Март, 15 от Cyber (540 баллов)

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

0 голосов
1 ответ
0 голосов
6 ответов
спросил 13 Окт, 13 от zapekana (180 баллов)
0 голосов
0 ответов
спросил 09 Окт, 13 от TeneFox (140 баллов)
0 голосов
4 ответов