【问题标题】:Mapping existing Image with new content types将现有图像映射到新的内容类型
【发布时间】:2013-04-25 03:33:55
【问题描述】:

我在这里遇到了一个情况。

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

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

现在我有一个要求,我必须使用 Drupal 代码以编程方式插入 3 个图像中的 2 个。现在不需要在公共 URI 中生成任何新的图像副本,因为图像已经通过 A 存在。

我尝试了两种方法:-

1) 我创建了一个新的 B 类节点。我尝试从现有的 fid 中获取文件 URI、文件大小、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() 之后的行在这种情况下不会执行。所以我无法保存它。

是否有任何功能可以将现有图像映射到另一个表中?

【问题讨论】:

    标签: drupal drupal-7 drupal-nodes drupal-files


    【解决方案1】:

    您的解决方案!! $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);
    }
    

    【讨论】:

    • file_save_data 将以不同的名称再次保存同一个文件。我已经将原始文件保存在那里,所以我不需要创建具有不同名称的相同文件的副本。我想使用现有保存文件的属性来加载新节点。我希望我的解释清楚。
    【解决方案2】:

    File_load API 解决了我获取现有文件的尺寸并保存为另一种内容类型的问题。

    【讨论】:

      猜你喜欢
      • 2020-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-21
      • 2017-07-04
      • 2023-03-05
      相关资源
      最近更新 更多