2013-05-01 5 views
0

Я столкнулся с ситуацией здесь.Сопоставление существующего изображения с новыми типами контента

У меня есть тип контента 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() в этом случае не выполняется. Поэтому я не могу его сохранить.

Существуют ли какие-либо функции, которые будут отображать существующие изображения в другую таблицу?

ответ

2

ВАШЕ РЕШЕНИЕ !! $ url = "URL ВАШИХ ФАЙЛОВ";

// $ node = new StdClass();

или

// $ = узел node_load ("ВАШ ID УЗЕЛ");

$file_data = file_get_contents($url); 
if ($file_data) { 
    $directory = file_default_scheme() . '://public'; 
    $path = file_stream_wrapper_uri_normalize($directory . 'GIVE YOUR FILE NAME'); 
    $file = file_save_data($file_data, $path, FILE_EXISTS_REPLACE); 
    if ($file->fid > 0) { 
    // REPLACE WITH YOUR FIELD NAME 
     $node->field_XXXX = array(
      'und' => array(
      0 => array(
       'fid' => $file->fid, 
       'uri' => $file, 
       'display' => '1', 
      ), 
     ), 
     ); 
    } 
    node_save($node); 
} 
+0

file_save_data сохранит тот же файл еще раз с другим именем. У меня уже есть оригинальный файл, поэтому мне не нужно создавать реплику того же файла с другим именем. Я хочу использовать свойства существующего сохраненного файла для загрузки нового узла. Надеюсь, я объясню свое объяснение. – user1843970

0

API-интерфейс File_load решил мою проблему получения размеров существующего файла и сохранения в другом типе контента.