Я столкнулся с ситуацией здесь.Сопоставление существующего изображения с новыми типами контента
У меня есть тип контента A с полем изображения (field_upload_snaps). Существует еще один тип контента B, который также содержит поле изображения (field_valid_snaps).
Теперь пользователь загрузит фотографии из типа контента. Поэтому, если пользователь загрузит 3 фотографии через A, то 3 FID и соответствующие им URI будут созданы в таблице file_managed в Drupal 7.
Теперь у меня есть требование, когда мне необходимо вставить 2 изображения из 3 программно с помощью кода Drupal. Теперь нет необходимости генерировать любую новую копию изображения в общественном URI, как уже существуют изображения с помощью А.
Я попробовал два подхода: -
1) Я создал новый узел типа B. Я пытался fetch file URI, filesize, filemime и все соответствующие параметры из существующего fid и ассоциировать с узлом, используя это.
global $user;
$node = new stdClass();
$node->type = "user_slideshow_snaps";
$node->language = LANGUAGE_NONE;
node_object_prepare($node);
$node->uid = $user->uid;
$file = (object) array(
'uid' => $user->uid,
'uri' => 'public://1.jpeg" ,
'filemime' => 'image/jpeg',
'status' => 1,
);
$node->field_upload_snaps['und'][] = (array)$file;
$node = node_submit($node); // Prepare node for a submit
node_save($node);
Но это дает мне сообщение об ошибке «Cant insert duplicate value in file_managed». Это даст, потому что такое значение уже существует в file_managed через A. Поэтому я не могу сохранить ценность.
2) Сначала я сохранил узел, а затем вручную вставляю в поле изображения, как это.
global $user;
$node = new stdClass();
$node->type = "user_slideshow_snaps";
$node->language = LANGUAGE_NONE;
node_object_prepare($node);
$node->uid = $user->uid;
$node = node_submit($node); // Prepare node for a submit
node_save($node);
db_insert('field_data_field_valid_snaps')
->fields(array(
'entity_type' => 'node',
'bundle' => 'user_actualD_snaps',
'deleted'=> 0,
'entity_id'=>$node->nid,
'delta'=>0,
'field_valid_snaps_fid'=>517,
'field_valid_snaps_alt'=>'',
'field_valid_snaps_title'=>'',
'field_valid_snaps_width'=>200,
'field_valid_snaps_height'=>300,
))
->execute();
Но строка после node_save() в этом случае не выполняется. Поэтому я не могу его сохранить.
Существуют ли какие-либо функции, которые будут отображать существующие изображения в другую таблицу?
file_save_data сохранит тот же файл еще раз с другим именем. У меня уже есть оригинальный файл, поэтому мне не нужно создавать реплику того же файла с другим именем. Я хочу использовать свойства существующего сохраненного файла для загрузки нового узла. Надеюсь, я объясню свое объяснение. – user1843970