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

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

00 голосов
5
Как реализовать копирование 1 элемента инфоблока по аналогии с функцией контекстного меню в инфоблоке "копировать".
Т.е. с таким порядком
1. жмем рядом с элементом ссылку "копировать"
2. создается копия элемента с программным изменением одного из свойств элемента.
3. по кнопке сохранить создаем новый элемент инфоблока.
спросил 02 Июль, 13 от Ymca (880 баллов)

5 Ответы

00 голосов
пока тока созрел следующий план реализации
1. получаем основные параметры элементы CIBlockElement::GetByID, CIBlockElement::GetList
2. получаем свойства элемента CIBlockElement::GetProperties
3. создаем новый элемент CIBlockElement::Add
4. дополняем свойства элемента CIBlockElement::SetPropertyValues
ответил 02 Июль, 13 от Ymca (880 баллов)
00 голосов
Код
<?
CModule::IncludeModule('iblock');

$resource = CIBlockElement::GetByID(ELEMENT_ID);
if ($ob = $resource->GetNextElement())
{
   $arFields = $ob->GetFields();
   $arFields['PROPERTIES'] = $ob->GetProperties();
   
   $arFieldsCopy = $arFields;
   $arFieldsCopy['PROPERTY_VALUES'] = array();
   
   foreach ($arFields['PROPERTIES'] as $property)
   {
      $arFieldsCopy['PROPERTY_VALUES'][$property['CODE']] = $property['VALUE'];
   }
   
   $el = new CIBlockElement();
   $NEW_ID = $el->Add($arFieldsCopy);
   
   echo 'Элемент скопирован. ID нового элемента: '.$NEW_ID;
}
?>
ответил 08 Авг, 13 от Ellindor (140 баллов)
00 голосов
возникает ошибка

Код
MSSQL Query Error:

INSERT INTO b_iblock_element(ID, TIMESTAMP_X, MODIFIED_BY, DATE_CREATE, CREATED_BY, IBLOCK_ID, IBLOCK_SECTION_ID, ACTIVE, ACTIVE_FROM, ACTIVE_TO, SORT, NAME, PREVIEW_PICTURE, PREVIEW_TEXT, PREVIEW_TEXT_TYPE, DETAIL_PICTURE, DETAIL_TEXT, DETAIL_TEXT_TYPE, SEARCHABLE_CONTENT, WF_STATUS_ID, WF_PARENT_ELEMENT_ID, WF_NEW, WF_LOCKED_BY, WF_DATE_LOCK, WF_COMMENTS, IN_SECTIONS, XML_ID, CODE, TAGS, TMP_ID, WF_LAST_HISTORY_ID, SHOW_COUNTER, SHOW_COUNTER_START) VALUES(51696, convert (datetime, '2011-06-16 12:07:59', 120), '1', convert (datetime, '2011-06-16 12:07:59', 120), '1', '38', '2167', 'Y', convert (datetime, '2011-06-16 00:00:00', 120), convert (datetime, '2011-06-24 00:00:00', 120), '500', 'проверка копирования', , '', 'text', , '', 'text', 'ПРОВЕРКА КОПИРОВАНИЯ', '1', , ' ', , , , 'Y', '51696', , '', , , , )

#37000 [Microsoft][SQL Native Client][SQL Server]Incorrect syntax near ','.


видимо за счет пустых полей, например TMP_ID, WF_LAST_HISTORY_ID, SHOW_COUNTER, SHOW_COUNTER_START
как поправить ?
ответил 08 Ноя, 13 от Ymca (880 баллов)
00 голосов
Ниже $arFieldsCopy = $arFields; добавьте
unset($arFieldsCopy['ID'], $arFieldsCopy['TMP_ID'], $arFieldsCopy['WF_LAST_HISTORY_ID'], $arFieldsCopy['SHOW_COUNTER'], $arFieldsCopy['SHOW_COUNTER_START']);
ответил 15 Фев, 14 от Ellindor (140 баллов)
00 голосов
1. не скопировалось поле типа "список" - в скопированном элементе поле пустое
для устранения потребовалось
Код
if ($property['PROPERTY_TYPE']=='L')
    $arFieldsCopy['PROPERTY_VALUES'][$property['CODE']]['VALUE_ENUM_ID'] = $property['VALUE_ENUM_ID'];

2. не скопировался элемент с заполненным полем типа "файл" - новый элемент не создан
для устранения потребовалось
Код
if ($property['PROPERTY_TYPE']=='F')
{
   if ($property['MULTIPLE']=='Y') {
     if (is_array($property['VALUE']))
     {
        foreach ($property['VALUE'] as $key => $arElEnum) 
         $arFieldsCopy['PROPERTY_VALUES'][$property['CODE']][$key]=CFile::CopyFile($arElEnum);                             
     }                 
   }else $arFieldsCopy['PROPERTY_VALUES'][$property['CODE']] = CFile::CopyFile($property['VALUE']);
}


PS замечено, что штатная функция копирования элемента инфоблока в админ-й части пропускает при копировании файлы (оставляя поля пустыми)
ответил 06 Июнь, 14 от Ymca (880 баллов)

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

0 голосов
1 ответ
0 голосов
2 ответов
0 голосов
2 ответов
спросил 24 Апр, 14 от Dayredo (180 баллов)
0 голосов
3 ответов
спросил 04 Март, 14 от 666KREVED (760 баллов)
0 голосов
3 ответов