使用drupal的action,需要启用触发器模块,这个模块核心已经自带了但是没有启用。截图我就不发了,pro drupal的第2版有。
前段时间,根据需要,决定使用action来实现自动创建一个论坛话题的功能,实现商品与论坛的完整整合。决定使用action来实现,其实也可以使用nodeapi的,但是自从读了action介绍的方式以后,决定采用action来实现。分享一下代码:
/**
* @file create_topic.module
*
* 讓用戶可以對圖書發表評論,發表的書評將會成為論壇中的帖子
*/
/**
* Implementation of hook_action_info().
*/
function create_topic_action_info(){
$info['create_topic_auto_create_forum_action'] = array(
'type' => 'system',
'description' => t('Auto creat one forum topic'),
'configurable' => TRUE,
'hooks' => array(
'nodeapi' => array('insert','update','delete'),
),
);
return $info;
}
function create_topic_auto_create_forum_action($object, $context){
if($context['node']->type =='product' && $context['op'] == 'insert'){
$node = $context['node'];
$forum_node = new StdClass();
foreach ($node as $key => $value) {
$forum_node->$key = $value;
}
$forum_node->nid ='';
$forum_node->vid ='';
$forum_node->type = 'forum';
$forum_node->comment = 2;
$forum_node->body = $node->teaser;
$forum_node->tid = $context['forum_id'];
$forum_node->taxonomy = array(
'2' =>$context['forum_id'],
);
$forum_node->field_book_review = array(
0 => array(
'_error_element' => 'field_book_review[0][nid][nid]',
'nid' => $node->nid,
),
);
node_save($forum_node);
}
if($context['node']->type =='product' && $context['op'] == 'update'){
$sql = "SELECT nid FROM {content_type_forum} WHERE field_book_review_nid = %d ORDER BY nid DESC";
$result = db_query_range($sql,$nid,0,1);
//include_once(drupal_get_path('module', 'comment') . '/comment.module');
if($data = db_fetch_object($result)){
}else{
$node = $context['node'];
$forum_node = new StdClass();
foreach ($node as $key => $value) {
$forum_node->$key = $value;
}
$forum_node->nid ='';
$forum_node->vid ='';
$forum_node->type = 'forum';
$forum_node->comment = 2;
$forum_node->body = $node->teaser;
$forum_node->tid = $context['forum_id'];
$forum_node->taxonomy = array(
'2' =>$context['forum_id'],
);
$forum_node->field_book_review = array(
0 => array(
'_error_element' => 'field_book_review[0][nid][nid]',
'nid' => $node->nid,
),
);
node_save($forum_node);
}
}
if($context['node']->type =='product' && $context['op'] == 'delete'){
}
}
function create_topic_auto_create_forum_action_form($context){
$form['forum_id']=array(
'#type' => 'textfield',
'#title' => t('論壇版面ID'),
'#description' => t('請輸入論壇版面的id,也就是forum/fid路徑中的fid'),
'#default_value' => isset($context['forum_id'])?$context['forum_id']:'36',
'#required' => TRUE,
);
return $form;
}
function create_topic_auto_create_forum_action_validate($form, $form_state){
$forum_id = $form_state['values']['forum_id'];
if(!is_numeric($forum_id)){
form_set_error('forum_id', t('請輸入一個大於0的整數'));
}
}
function create_topic_auto_create_forum_action_submit($form, $form_state){
return array(
'forum_id' => (int) $form_state['values']['forum_id'],
);
}
这些代码都是我从网上,书上抄来的,没有自己写的,拼在了一块,实现了自己的功能。注意这里的函数名字topic_auto_create_forum_action_form,create_topic_auto_create_forum_action_validate,后者开始时我写成了create_topic_auto_create_forum_action_for_validate.另外就是info中字段的含义。还有就是$object, $context里面装的东西。我使用Zendstudio debug了一下,放了一个断点。看看里面装的什么,有时候你会用到的。关于action的框架的东西其实就这些,其它都是后台的配置了,和其它的模块没有太大区别的。
开始觉得有点难,自己动手做的时候,发现很简单,建议先读读pro drupal1第2章,我读了两遍,按照里面说的做,很快就明白了。难点就是模块里面的业务逻辑,我google了好大一会,才找到了那段代码,自己改八改吧就用上了。
相关链接: http://zhupou.cn