Битрикс замена путей файлов на постоянные

При импорте, а также просто загрузке файлов битрикс создает каждый раз новый путь до файла.
Выглядит он примерно так: /upload/iblock/0a1/image.png . Я же заменю на /upload/files/1234/image.png где 1234 id элемента.
Я пройдусь по всем файлам и перемещю их в постоянные папки, удалив старые, чтобы не занимали места. Далее подробно в комментах.


if(!CModule::IncludeModule(
 "iblock"
)) return;

// инфоблоки где будем менять свойства
$IBLOCKS = ['2'];

array_map('change_link', $IBLOCKS);
ignore_user_abort(1);

/**
 * замена ссылок файлов на постоянные
 * @param  [type] $IBLOCK_ID [description]
 * @return [type]            [description]
 */
function change_link($IBLOCK_ID){

  /**
   * [$arFilter description]
   * @var array
   */
  $arFilter = array(
      "IBLOCK_ID" => $IBLOCK_ID,
  );

  /**
   * получим все элементы инофблока
   * @var [type]
   */
  $rsItems = CIBlockElement::GetList(Array("SORT" => "ASC"), $arFilter, false, false, Array());

  /**
   * [$res description]
   * @var [type]
   */
  while ($res = $rsItems->getNextElement()) {
  	# code...
    /**
     * все поля элемента
     * @var [type]
     */
  	$arFields = $res->GetFields();

      /**
       * свойство с файлом, ссылку которого будем менять. Множественное значение
       * @var [type]
       */
  	 $db_props = CIBlockElement::GetProperty($IBLOCK_ID, $arFields['ID'], "sort", "asc", array("CODE" => "FILES"));

  	 while($ar_props = $db_props->Fetch()){
          

         $file_id = $ar_props['VALUE'];
    		 $rsFile = CFile::GetByID($file_id);
    		 $arFile = $rsFile->Fetch();
    		 $file_path = CFile::GetPath($file_id);

         // замена урла на постоянный
         if (!empty($arFile) || !empty($file_path)) {
              $el_dir = $_SERVER["DOCUMENT_ROOT"]."/upload/files/{$arFields['ID']}/";
              if (!is_dir($el_dir)) {
                  mkdir($el_dir, 0700);
              }
            rename("{$_SERVER["DOCUMENT_ROOT"]}$file_path", "$el_dir{$arFile['ORIGINAL_NAME']}");
            // удаляем сам файл
            CFile::Delete($ar_props['VALUE']);
            // удаляем ссылки на файл с БД из таблицы b_iblock_element_property . Значения свойств элемента инфоблока храняться как раз там 
            CIBlockElement::SetPropertyValues(
                $arFields['ID'],
                $IBLOCK_ID,
                array(
                    $ar_props['PROPERTY_VALUE_ID'] => array(
                        "VALUE" => array("del" => "Y")
                    )
                ),
                'FILES'
            );
         }
      }


  }
}

Чтобы ссылки на файлы удалялись нормально, в dbconn.php надо закомментить файловый кеш


//define("CACHED_b_file", 3600);	

Leave a comment

Your email address will not be published.


*