如何以编程方式将图像添加到drupal节点?

时间:2009-08-14 14:42:43

标签: php drupal rss

我正在使用Drupal 6.x而且我正在编写一个php类,它将获取RSS提要并将其作为节点插入。

我遇到的问题是RSS源附带图像,我无法弄清楚如何正确插入它们。

This page有一些信息,但不起作用。

我创建并将图像保存到服务器,然后将其添加到节点对象,但是当节点对象被保存时,它没有图像对象。

这会创建图像对象:

$image = array();
if($first['image'] != '' || $first['image'] != null){
    $imgName = urlencode('a' . crypt($first['image'])) . ".jpg";
    $fullName = dirname(__FILE__) . '/../../sites/default/files/rssImg/a' . $imgName;
    $uri = 'sites/default/files/rssImg/' . $imgName;

    save_image($first['image'], $fullName);

    $imageNode = array(
        "fid" => 'upload',
        "uid" => 1,
        "filename" => $imgName,
        "filepath" => $uri,
        "filemime" => "image/jpeg",
        "status" => 1,
        'filesize' => filesize($fullName),
        'timestamp' => time(),
        'view' => '<img class="imagefield imagefield-field_images" alt="' . $first['title'] . '" src="/' . $uri . '" /> ',
    );
    $image = $imageNode;
}

并将图像添加到节点:

$node->field_images[] = $image;

我使用

保存节点
module_load_include('inc', 'node', 'node.pages');

// Finally, save the node
node_save(&$node);

但是当我转储节点对象时,它不再是图像。我检查了数据库,图像确实显示在表中,但它没有fid。我怎么能这样做?

5 个答案:

答案 0 :(得分:2)

为什么不将Feedapi与feedapi映射器一起使用,并将RSS字段中的图像映射到您为任何类型的节点创建的图像CCK字段?

这很简单,您甚至可以通过用户界面来完成。

只需启用feedapi,feedapi节点(不确定该模块的确切名称),feedapi映射器,并创建一个Feed。

创建Feed后,转到Feed节点上的地图(您也可以对Feed内容类型执行此操作),并选择哪些Feed项将转到哪些节点字段。

如果您的Feed项已经创建,则此时您将要删除它们,然后刷新Feed。这应该就是你需要做的。

您是否需要创建一个单独的模块,或者现有模块是否适合您?

当$ op ='prepare'时,您是否使用hook_nodeapi将图像对象添加到节点对象?

答案 1 :(得分:0)

如果你阅读了你发布的网站上的评论,你会发现:

  

在“文件”字段中附加文件   (即由。提供的字段类型)   FileField模块)你必须添加一个   “description”项到字段数组,   像这样:

$node->field_file = array(
    array(
    'fid' => 'upload',
    'title' => basename($file_temp),
    'filename' => basename($file_temp),
    'filepath' => $file_temp,
    'filesize' => filesize($file_temp),
    'list' => 1, // always list
    'filemime' => mimedetect_mime($file_temp),
    'description' =>  basename($file_temp),// <-- add this
    ), ); 

也许这样有效。您也可以尝试以这种方式开始分配:

$node->field_file = array(0 => array(...

答案 2 :(得分:0)

如果您只是抓取有图像的内容,为什么不在您的节点主体中将图像的路径更改为绝对路径而不是本地路径,那么您根本不必担心CCK。

答案 3 :(得分:0)

您可能需要做的其他两件事

  1. “fid”=&gt; '上传',保存时将其更改为文件的fid。如果它不在文件表中,那么您需要修复它。我想你需要feild_file_save_file()

    2.您的imageNode数组下可能需要一个数组“data”,其中“title”,“description”和“alt”为字段。

答案 4 :(得分:0)

要构建文件信息,如果您有文件字段模块,还可以使用field_file_load()field_file_save_file()。有关详细信息,请参阅文件 filefield / field_file.inc

示例:

$node->field_name[] = field_file_load('sites/default/files/filename.gif');