Drupal 7 开发内部培训资料, 分头诗人

Drupal 7 通过编程方式创建节点(node)、留言(comment)、分类/标签(taxonomy)

猪跑啦独家原创专稿,欢迎您转载本文,转载请注明来源。

很多时候,我们要批量添加一些数据到节点(node)、留言(comment)、分类/标签(taxonomy),而drupal 的后台UI默认是只能一个一个的手动添加。

批量方式,我们可以通过编程方式实现。

那么,有什么好的方法能快速方便做到批量添加呢?这里猪跑啦将会讲解如何实现批量添加,包括:

1,编程方式添加节点(node):

  • 初始化一个node object
  • 添加body 字段内容
  • 添加自定义字段内容
  • 添加file / image字段内容
  • 添加taxonomy term 字段内容
  • 保存节点(node)

 

2,编程方式添加留言(comment)

 

3,编程方式添加分类/标签(taxonomy)

 

 

1,如何编程方式添加节点(node)

1.1,初始化一个node object

1
2
3
4
5
6
7
$node = new stdClass(); // 创建一个 node object
$node->type = "page"; // 内容类型选择page,或者其他你想指定的
$node->title = "节点的标题";
$node->language = LANGUAGE_NONE; // 节点的语言类型,LANGUAGE_NONE 表示und,不分语言,如果你系统安装了Locale模块,有多语言,你也可以指定是什么语言
$node->uid = 1; // 添加人的id,1表示drupal的第一个用户,是超级管理员,如果你要指定一个其他已有的角色,可以设置那个角色的id。
$node->path = array('alias' => '文章的别名'); // 要来设置一个节点文章的别名
node_object_prepare($node); // 设置一些默认值。

我们设置$node->language值为LANGUAGE_NONE,如果你没有开启locale 模块,节点会分配一个特定的语言,因为locale模块不是每个人都安装的,这就是我们为什么设置值为LANGUAGE_NONE。在Drupal里面,node 跟 field 都是可以有超过一种语言的,所以如果你的网站是多语言的,你可以指定一个语言代码给这个字段,你可以通过在设置语言的页面看到语言代码,路径是:Configuration -> Regional and language -> Languages 【admin/config/regional/language

 

1.2,添加body字段内容

 

1
2
3
4
// 添加body内容
$node->body[$node->language][]['value'] = '这里填写body的内容';
$node->body[$node->language][]['summary'] = '这里是body的简介,简介是在列别页(Teaser)显示';
$node->body[$node->language][]['format'] = 'filtered_html'; // 格式化内容,如果你想格式化为其他格式,可以在Administration » Configuration » Content authoring设置(admin/config/content/formats),这里我用filtered_html

 

1.3,添加自定义字段内容

 

1
2
3
4
5
// 这里是添加通过CCK/Field API生成的字段. 
$node->field_custom_name[$node->language][]['value'] = '这里是自定义字段的值';
// 如果你的字段是有格式的,别忘记定义
$node->field_custom_name[$node->language][]['format'] = '这里是字段的格式';
// 你可以通过这个方式添加其他的自定义字段

 

1.4,添加file / image字段内容

 

1
2
3
4
5
6
7
8
9
10
// 一些系统中的文件
$file_path = drupal_realpath('somefile.png'); // 创建一个文件 object
$file = (object) array(
          'uid' => 1,
          'uri' => $file_path,
          'filemime' => file_get_mimetype($file_path),
          'status' => 1,
);
$file = file_copy($file, 'public://'); // 保存文件的位置,public://默认表示在sites/default/file下方,你可以定义一些二级文件夹,如 'public://images'
$node->field_image[LANGUAGE_NONE][] = (array)$file; //把这个文件object关联到相对应的文件字段

 

1.5,添加taxonomy term 字段内容

 

1
$node->field_tags[$node->language][]['tid'] = 1;

'field_tags'是term reference字段的名称,'1'是你想增加到节点的term id,是不是很简单?

 

1.6,保存节点(node

 

1
2
$node = node_submit($node); // 准备提交
node_save($node); // 保存到节点,当做完这个操作后,系统会生成一个nid

 

2,编程方式添加留言(comment)

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 创建一个comment
$comment = new stdClass(); // 创建一个comment object
$comment->nid = $node->nid; // comment是附带在一个节点(node)上的,所以要填写这个comment所属于的节点的nid
$comment->cid = ; // comment 的自身id
$comment->pid = ; // comment 是可以多级回复的,所以comment有可能是属于某个comment,是父子关系,0表示没有上级comment
$comment->uid = 1; // 用户的id,意思是谁添加这个comment的
$comment->mail = 'drupalla@drupalla.com'; // 用户的email
$comment->name = '分头诗人'; // 如果是认证用户,这里会自动完成,如果是未登录的浏览者,这里需要自行填写。
$comment->thread = '01/'; // 非必要的,如果你需要线程控制,就添加这个,否则就将此行删除就可以
$comment->hostname = '127.0.01' // 非必要的. 你可以通过这样记录发布者的ip。
$comment->created = time(); // 非必要的. 你可以设置comment的发布时间。
$comment->is_anonymous = ; // 是否匿名用户
$comment->homepage = ''; // 添加首页
$comment->status = COMMENT_PUBLISHED; // 默认设置comment 自动发布。
$comment->language = LANGUAGE_NONE; // 跟node 类似,是语言控制
$comment->subject = 'Comment 标题';
$comment->comment_body[$comment->language][]['value'] = 'Comment body 内容'; // 这里类似node 节点
$comment->comment_body[$comment->language][]['format'] = 'filtered_html';
$comment->field_custom_field_name[LANGUAGE_NONE][]['value'] = ‘你设置的值’; // 非必要的,如果你的comment 增加了一些自定义字段,可以通过这个方式添加,类似节点(node)
comment_submit($comment); // 准备保存
comment_save($comment);

 

3,编程方式添加分类/标签(taxonomy)

 

这个章节非常简单,只需要下面几行代码:

1
2
3
4
5
$term = new stdClass();
$term->name = 'Term Name';
$term->vid = 1; // ‘1’是 词汇表id(vocabulary id)
$term->field_custom_field_name[LANGUAGE_NONE][]['value'] = '你设置的值'; // 非必要的,如果你的comment 增加了一些自定义字段,可以通过这个方式添加,类似节点(node)
taxonomy_term_save($term); // 最后,保存

好了,基本介绍完了如何通过编程方式添加node,comment,taxonomy term,你可以通过这个方式实现很多你想做的,诸如采集系统,通过某些方式批量获得某个站点的资料,然后通过 node_save 自动批量的添加到drupal里面,大家有看过本人做的图标酷网站吗?没看过?赶紧去看看效果吧,里面的数据就是通过采集数据并且通过node_save, comment_save, taxonomy_term_save这个方式批量添加数据的,数据量有40G。希望本文对你有帮助。

 

评论

布兰卡的头像

很详细,看来诗人很用心的在经营网站.

 

看来上面的代码,彻彻底底明白了D7的所谓的entity概念包括了node,comments,taxonomy等等.

跟d6下面差别还是挺大的.

分头诗人的头像

是的,D7 差别跟D6还是有不少的

lauralee的头像

我按照上面的代码 进行node_save
 其他字段都没问题 
但是图片字段 没有存储成功并报错

The specified file could not be copied, because no file by that name exists. Please check that you supplied the correct filename.

诗人有什么解决办法吗 我传过去的图片是 input file上传的文件路径