2013-05-01 2 views
0

여기 상황이 있습니다.새로운 콘텐츠 형식으로 기존 이미지 매핑

이미지 필드 (field_upload_snaps)가있는 콘텐츠 유형 A가 있습니다. 이미지 필드 (field_valid_snaps)도 포함하는 다른 콘텐츠 유형 B가 있습니다.

이제 사용자는 A 콘텐츠 유형에서 사진을 업로드합니다. 따라서 사용자가 A를 통해 3 개 사진을 업로드 한 다음 3 개의 FID와 해당 URI가 Drupal 7의 file_managed 테이블에 생성되는 경우

Drupal 코드를 사용하여 프로그래밍 방식으로 2 개의 이미지를 삽입해야하는 요구 사항이 있습니다. 나는에 시도 유형 B의 새로운 노드를 생성 한

1) - : 지금은 두 가지 방법을 시도

이미지가 이미 A. 통해 존재하는 공공 URI에 새로운 이미지 복사본을 생성 할 필요가 없다 파일 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); 

하지만 "can not는 중복 된 값을 file_managed에 삽입합니다."라는 오류 메시지가 나타납니다. A를 통해 file_managed에 이러한 값이 이미 존재하므로 값을 저장할 수 없습니다.

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

File_load API는 기존 파일의 크기를 가져 와서 다른 콘텐츠 형식으로 저장하는 내 문제를 해결했습니다.