Сопоставление существующего изображения с новыми типами контента

Я столкнулся с ситуацией здесь.

У меня есть тип контента A с полем изображения (field_upload_snaps). Существует еще один тип контента B, который также содержит поле изображения (field_valid_snaps).

Теперь пользователь будет загружать фотографии из типа контента A. Таким образом, если пользователь загрузит 3 изображения через A, тогда 3 FID и соответствующие им URI будут созданы в таблице file_managed в Drupal 7.

Теперь у меня есть требование, когда я должен программно вставить 2 изображения из 3, используя код Drupal. Теперь нет необходимости создавать новую копию изображения в общедоступном URI, поскольку изображения уже существуют через A.

Я пробовал два подхода: -

1) Я создал новый узел типа B. Я попытался получить URI файла, размер файла, имя файла и все соответствующие параметры из существующего файла 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);

Но это дает мне ошибку, что «Невозможно вставить повторяющееся значение в 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() в этом случае не выполняется. Так что я не могу сохранить его.

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


person simple user    schedule 01.05.2013    source источник


Ответы (2)


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

//$node = новый StdClass();

or

//$node = node_load("ИДЕНТИФИКАТОР ВАШЕГО УЗЛА");

$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);
}
person Shah Amit    schedule 01.05.2013
comment
file_save_data сохранит тот же файл еще раз с другим именем. У меня уже хранится исходный файл, поэтому мне не нужно создавать копию того же файла с другим именем. Я хочу использовать свойства существующего сохраненного файла для загрузки нового узла. Я надеюсь, что я ясно с моим объяснением. - person simple user; 02.05.2013

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

person simple user    schedule 04.05.2013