我尝试使用直接MySQL插入查询将图像从自定义CMS导入Drupal到Drupal数据库。图像被复制到drupal站点内的路径:
sites/default/files/images/import
节点显示在列表中,但直接链接(someurl / node / 1234)导致404错误。它们都是media_image类型,并且分配了有效的uid。我还对files
和content_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:"";}';
注意:上面的查询是生成的查询。
答案 0 :(得分:2)
如果你得到的是404,那是因为内部node_load()
function的返回是NULL / FALSE。
如果您单步执行该功能,您将看到从INNER JOIN
表到node
表格node_revisions
...如果{中没有匹配的记录{1}}表,就Drupal而言,没有节点。
要修复错误,您只需填充node_revisions
表及其所需的列 - 最值得注意的是node_revisions
和nid
(即版本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提供的所有功能,你可能会重新发明轮子。