手动Drupal节点插入

时间:2012-02-08 16:05:26

标签: php mysql drupal drupal-6

我尝试使用直接MySQL插入查询将图像从自定义CMS导入Drupal到Drupal数据库。图像被复制到drupal站点内的路径:

sites/default/files/images/import

节点显示在列表中,但直接链接(someurl / node / 1234)导致404错误。它们都是media_image类型,并且分配了有效的uid。我还对filescontent_type_media_image

进行了关联插入

是否需要内部Drupal进程来完成此导入?如果没有重写为适当的Drupal导入模块,它是否可能呢?

示例节点插入:

INSERT INTO node SET
    type='media_image',
    language='en',
title='apicture.jpg',
uid='4',
status=1,
created=1328644135,
changed=1328644135;

// grab nid as last mysql_insert()
INSERT INTO files SET
uid = 4,
filename = 'apicture.jpg',
filepath = 'sites/default/files/images/import',
filemime = 'image/jpeg',
filesize = 40069,
status = 1,
timestamp = 1328644136;

INSERT INTO content_type_media_image SET
vid = 683,
nid = 683,
field_image_fid = 539,
field_image_list = 1,
field_image_data = 'a:3:{s:11:"description";s:0:"";s:3:"alt";s:0:"";s:5:"title";s:0:"";}';

注意:上面的查询是生成的查询。

2 个答案:

答案 0 :(得分:2)

如果你得到的是404,那是因为内部node_load() function的返回是NULL / FALSE。

如果您单步执行该功能,您将看到从INNER JOIN表到node表格node_revisions ...如果{中没有匹配的记录{1}}表,就Drupal而言,没有节点。

要修复错误,您只需填充node_revisions表及其所需的列 - 最值得注意的是node_revisionsnid(即版本ID)和标题与身体。您可能还想在vid列中设置正文文本的文本格式(它与format表中的键相关)。

顺便说一句,此版本ID也应该添加到filter_formats表本身,因为这是node所做的。我认为获得下一个可用ID最安全的方法是:

INNER JOIN

如果您没有针对任何内容类型启用修订,则SELECT MAX(vid) + 1 FROM node 可能始终与vid相同。

答案 1 :(得分:1)

我认为直接进行SQL插入是非常麻烦的。 Drupal提出了许多导入内容的解决方案,我最喜欢的是Feeds:http://drupal.org/project/feeds。它可以自动化所有内容,几乎可以接受任何输入格式,并提供非常灵活的映射机制。

使用直接数据库方式意味着你绕过了Drupal提供的所有功能,你可能会重新发明轮子。