Php Drupal:以编程方式保存imagefield图像

Php Drupal:以编程方式保存imagefield图像,php,image,drupal,cck,sync,Php,Image,Drupal,Cck,Sync,我正在尝试编写一个同步函数,将一些数据保存到节点,这很好,直到我尝试保存与节点关联的缩略图 我已经设法下载了这个文件并把它放在我的sites/default/files文件夹中,但是告诉Drupal“把这个文件放在那个CCK imagefield中”的最好方法是什么呢 编辑 澄清一下。。我分别同步缩略图(因为一个图像可以由多个节点使用)。。。我想初始缩略图同步保存在正确的文件夹中的文件(不是临时的),并只是指向这个文件的imagefield。。。这就是我对字段\文件\保存\文件()感到恼火的地方

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

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

编辑 澄清一下。。我分别同步缩略图(因为一个图像可以由多个节点使用)。。。我想初始缩略图同步保存在正确的文件夹中的文件(不是临时的),并只是指向这个文件的imagefield。。。这就是我对字段\文件\保存\文件()感到恼火的地方,它保存了一个新文件,而不仅仅是做一个指针。。
有什么建议吗?

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

比如说,您的节点类型是foo,缩略图字段是。您可以在表内容\u foo中有一个列,但也可以有一个表内容\u字段\u栏

在该表中,imagefield存储文件的外键。您需要在文件表中查找条目(如果存在),或者输入新记录。这并不容易。然后将该文件项的键添加到content\u foo表、列栏或content\u field\u栏中


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

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

比如说,您的节点类型是foo,缩略图字段是。您可以在表内容\u foo中有一个列,但也可以有一个表内容\u字段\u栏

在该表中,imagefield存储文件的外键。您需要在文件表中查找条目(如果存在),或者输入新记录。这并不容易。然后将该文件项的键添加到content\u foo表、列栏或content\u field\u栏中


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

您可以使用
field\u file\u save\u file()
将文件从临时目录移动到指定位置,并创建要另存为CCK字段的对象

见:

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


$node->field\u image[0]=field\u file\u save\u file($my\u file\u path,array(),$my\u destination);


您可能需要运行一些测试。因此,您需要丢弃目标目录,然后再次执行此操作。

您可以使用
field\u file\u save\u file()
将文件从临时目录移动到指定位置,并创建要另存为CCK字段的对象

见:

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


$node->field\u image[0]=field\u file\u save\u file($my\u file\u path,array(),$my\u destination);

您可能需要运行一些测试。因此,您需要丢弃目标目录,然后再次执行此操作。

此代码将完成此操作:

$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);
此代码将执行以下操作:

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

我想这是我自己解决的。我分别输入\文件\保存\文件(),然后在同步节点时输入\文件\加载()缩略图


似乎工作正常。:)

我想这是我自己解决的。我分别输入\文件\保存\文件(),然后在同步节点时输入\文件\加载()缩略图



似乎工作正常。:)

不!不要乱翻数据库!当然但是,如果您的数据库坏了,您将需要在其中插入一段时间来再次修复它。而且Aces数据库似乎坏了。非常糟糕的建议。。。永远不要直接接触数据库。为什么这么糟糕?如果数据库已损坏,则需要深入数据库。时期旁白:为什么直接接触数据库会不好呢?因为当你建议人们在数据库中四处翻找时,他们很可能最终会遇到一个需要更多翻找的坏数据库。然后你也向他们释放了扑克牌之河。我们会把他们送到你家去问他们为什么会被戳。不!不要乱翻数据库!当然但是,如果您的数据库坏了,您将需要在其中插入一段时间来再次修复它。而且Aces数据库似乎坏了。非常糟糕的建议。。。永远不要直接接触数据库。为什么这么糟糕?如果数据库已损坏,则需要深入数据库。时期旁白:为什么直接接触数据库会不好呢?因为当你建议人们在数据库中四处翻找时,他们很可能最终会遇到一个需要更多翻找的坏数据库。然后你也向他们释放了扑克牌之河。我们会把它们送到你家去问它们为什么会被戳。酷!我有类似的布局,但没有节点_submit()。。区别是什么?节点_submit创建摘要,如果未设置,则添加用户,并设置节点的创建日期和更新日期。噢!我不知道汤姆。谢谢你的提示!我想要个符咒。我刚刚为验证器和文件_EXISTS _REPLACE传递了空承诺(null)——您的示例是这个任务的一个很好的模式。我会参考