2013-05-01 50 views
0

我在这里面临一种情况。使用新内容类型映射现有图像

我有一个内容类型A,其中包含一个图像字段(field_upload_snaps)。还有另一种内容类型B,其中还包含图像字段(field_valid_snaps)。

现在用户将从A内容类型上传图片。因此,如果用户通过A上传3张图片,则3个FID及其相应的URI将在Drupal 7的file_managed表格中创建。

现在我有一个要求,我必须使用Drupal代码以编程方式插入2个图像。现在有没有必要产生任何新的图像拷贝公共URI作为图像通过A.存在

我尝试两种方法: -

1)我创建我试图B型的新节点从现有的fid中获取文件的URI,文件大小,文件模式和所有相关参数,并使用它与节点相关联。

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中插入重复值”。它会给出,因为这样的值已经存在于通过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 2013-05-01 20:21:55

0

File_load API解决了我获取现有文件的维度并保存在另一个内容类型中的问题。