代码之家  ›  专栏  ›  技术社区  ›  Ace

Drupal:以编程方式保存ImageField图像

  •  1
  • Ace  · 技术社区  · 16 年前

    我正在尝试编写一个同步函数,它可以将一些数据保存到节点,这很好,直到我尝试保存与该节点关联的缩略图图像。

    我已经设法下载了这个文件并把它放在我的sites/default/file s文件夹中,但是告诉Drupal“把这个文件放在那个cck imagefield”的最好方法是什么?

    编辑 澄清一下……我单独同步缩略图(因为一个图像可以被多个节点使用)。我希望初始缩略图同步将文件保存在正确的文件夹中(不是临时文件夹),并将ImageField指向此文件…这就是让我对字段_file_save_file()感到恼火的地方,它保存了一个新文件,而不是只做一个指针。 有什么建议吗?

    4 回复  |  直到 16 年前
        1
  •  5
  •   Rimian    16 年前

    你可以使用 field_file_save_file(); 将文件从临时目录移动到指定目录,并创建要保存为cck字段的对象。

    见: http://api.lullabot.com/field_file_save_file

    然后可以使用返回值保存字段,如下所示:

    $node->field_image[0] = field_file_save_file($my_file_path, array(), $my_destination);

    您可能需要运行一些测试。因此,您需要将目标目录丢弃,然后重新执行。

        2
  •  5
  •   Tom    16 年前

    此代码将执行以下操作:

    $imagefile = '/temp/somefile.jpg';
    // Load up the CCK field  
    $field = content_fields('field_image', 'mycontenttype');
    // Load up the appropriate validators
    $validators = array_merge(filefield_widget_upload_validators($field), imagefield_widget_upload_validators($field));
    // Where do we store the files?
    $files_path = filefield_widget_file_path($field);
    // Create the file object, replace existing file with new file as source and dest are the same
    $file = field_file_save_file($imagefile, $validators, $files_path, FILE_EXISTS_REPLACE);
    
    
    $node = node_load($mynode);
    $node->field_image[] = $file;
    $node = node_submit($node);
    node_save($node);
    
        3
  •  1
  •   Ace    16 年前

    我想这是我自己解决的。同步节点时,我分别对缩略图进行field_file_save_file(),然后对它们进行field_file_load()。

    似乎工作正常。:)

        4
  •  -4
  •   berkes    16 年前

    您将需要在数据库中进行浏览。 不幸的是,根据字段的使用,数据库可以以多种方式进行布局。所以解释起来有点困难。如果CCK认为有必要,它将围绕表移动、重命名内容和(取消)使数据库正常化。这些数据可能存在于任何地方:)而且根据它现在所处的位置,解决这个问题变得越来越容易或困难。

    例如,您的节点类型是 缩略图字段是 酒吧 . 你可以有一个专栏 酒吧 在桌子上 特伦特福奥 ,但是你也可以有一张桌子 内容栏

    在该表中,ImageField存储 文件 表。您要么需要在文件表中找到条目(如果存在),要么输入新记录。这不容易。然后在内容foo表、列栏或内容字段栏中添加该文件项的键。

    但是,在开始之前:它确实不值得这样做:只需删除节点并复制粘贴到新节点中的内容。

    推荐文章