我在这里面临一种情况。
我有一个内容类型A,其中包含一个图像字段(field_upload_snaps)。还有另一种内容类型B,它还包含一个图像字段(field_valid_snaps)。
现在,用户将从A内容类型上传照片。因此,如果用户通过A上传3个图片,那么3个FID将在Drupal 7中的file_managed表中创建相应的URI。
现在我有一个要求,我必须使用Drupal代码以编程方式从3个中插入2个图像。现在不需要在公共URI中生成任何新的图像副本,因为图像已经存在于A。
我尝试了两种方法: -
1)我创建了一个类型B的新节点。我尝试从现有的fid中获取文件URI,filesize,filemime和所有相关参数,并使用此节点与节点关联。
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()之后的行不会执行。所以我无法保存它。
是否有可用的功能将现有图像映射到另一个表格?
答案 0 :(得分:2)
你的解决方案!! $ url =“您的文件网址”;
// $ node = new StdClass();
或
// $ node = 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);
}
答案 1 :(得分:0)
File_load API解决了获取现有文件的尺寸并保存为其他内容类型的问题。