【问题标题】:Drupal: Programmatically saving imagefield imagesDrupal:以编程方式保存图像场图像
【发布时间】:2010-06-04 09:20:54
【问题描述】:

我正在尝试编写一个将一些数据保存到节点的同步函数,它工作正常,直到我尝试保存与节点关联的缩略图。

我已成功下载文件并将其放入我的 sites/default/files 文件夹,但告诉 Drupal“将此文件放入 CCK 图像字段”的最佳方式是什么?

编辑 澄清一点..我分别同步缩略图(因为一个图像可以被多个节点使用)...我希望初始缩略图同步将文件保存在正确的文件夹中(不是临时文件夹),然后指向imagefield 到这个文件...这就是 field_file_save_file() 让我烦恼的地方,它保存一个新文件而不是仅仅创建一个指针.. 有什么建议吗?

【问题讨论】:

    标签: php image drupal cck sync


    【解决方案1】:

    您可以使用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】:

      这段代码可以做到:

      $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);
      

      【讨论】:

      • 酷!我有类似的布局,但没有 node_submit().. 有什么区别?
      • node_submit 创建预告片,如果未设置则添加用户并设置节点的创建日期和更新日期。
      • 哦!我不知道那个汤姆。感谢您的提示!
      • 工作需要魅力。我只是为验证器和 FILE_EXISTS_REPLACE 传递了空的承诺(null)——你的例子是这个任务的一个很好的模式。我肯定会再次引用它;)
      【解决方案3】:

      我想我自己解决了这个问题。我分别在 field_file_save_file() 我的缩略图,然后在同步节点时 field_file_load() 它们。

      似乎工作正常。 :)

      【讨论】:

        【解决方案4】:

        您需要在数据库中四处寻找。 不幸的是,您的数据库可以根据字段的使用以多种方式布局。所以解释有点难。如果 CCK 认为有必要,CCK 将在表中移动、重命名并(去)规范化数据库。数据可能在任何地方 :) 并且取决于它现在所在的位置,解决这个问题变得更容易或更难。

        假设,您的节点类型是 foo,缩略图字段是 bar。您可以在表 content_foo 中有一个列 bar,但也可以有一个表 content_field_bar

        在该表中,图像字段存储 file 表的外键。您要么需要在文件表中查找条目(如果存在),要么输入新记录。这并不容易。然后在 content_foo 表、列栏或 content_field_bar 中添加该文件条目的键。

        但是,在开始之前:这真的不值得痛苦:只需删除节点并将内容复制粘贴到新节点中即可。

        【讨论】:

        • 不!不要在数据库中四处寻找!
        • 当然。但是,如果您的数据库已损坏,则需要在其中四处寻找以再次修复它。 Aces 数据库似乎坏了。
        • 非常糟糕的建议......永远不要直接接触数据库。
        • 为什么这么糟糕?如果您的数据库损坏,您将需要深入了解数据库。时期。但顺便说一句:为什么直接接触数据库会不好?
        • 因为当你建议人们在数据库中四处寻找时,他们更有可能最终得到一个需要更多探索的损坏的数据库。然后你也释放了他们的扑克之河。我们会把它们送到你家,问他们为什么被戳。
        猜你喜欢
        • 1970-01-01
        • 2012-01-04
        • 2010-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多