You are here

Drupal的action

g089h515r806 的头像
Submitted by g089h515r806 on 星期日, 2008-11-30 14:18

使用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

            触发器动作和hook

论坛: