posts - 431,  comments - 344,  trackbacks - 0
Creating a Node Module

1Creating the .info File

Let’s also create the joke.info file and add it to the joke folder.

; $Id$

name = Joke

description = Provides a joke node type with a punchline.

version = "$Name$"

2Creating the .install File

<?php

function joke_install() {

       switch ($GLOBALS['db_type']) {

              case 'mysql':

              case 'mysqli':

                     db_query("CREATE TABLE {joke} (

                            nid int unsigned NOT NULL default '0',

                            vid int unsigned NOT NULL default '0',

                            punchline text NOT NULL,

                            PRIMARY KEY (nid,vid),

                            UNIQUE KEY vid (vid),

                            KEY nid (nid)

                     ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

                     break;

              case 'pgsql':

                     db_query("CREATE TABLE {joke} (

                            nid int unsigned NOT NULL default '0',

                            vid int unsigned NOT NULL default '0',

                            punchline text NOT NULL,

                            PRIMARY KEY (nid,vid),

                            UNIQUE KEY vid (vid),

                            KEY nid (nid)

                     )");

              break;

       }

}

function joke_uninstall() {

       db_query('DROP TABLE {joke}');

}

3Creating the .module File

<?php

function joke_perm() {

       return array('create joke', 'edit joke', 'delete joke');

}

/**

* @file

* Provides a "joke" node type.

*/

/**

* Implementation of hook_node_info().

*/

function joke_node_info() {

       // We return an array since a module can define multiple node types.

       // We're only defining one node type, type 'joke'.

       return array(

              'joke' => array(

                     'name' => t('Joke'), // Required.

                     'module' => 'joke', // Required.

                     'description' => t('Tell us your favorite joke!'), // Required.

                     'has_title' => TRUE,

                     'title_label' => t('Title'),

                     'has_body' => TRUE,

                     'body_label' => t('Joke'),

                     'min_word_count' => 2,

                     'locked' => TRUE

              )

       );

}

function joke_menu($may_cache) {

       $items = array();

       if ($may_cache) {

              $items[] = array(

                     'path' => 'node/add/joke',

                     'title' => t('Joke'),

                     'access' => user_access('create joke'),

              );

       }

       return $items;

}

function joke_access($op, $node) {

       global $user;

       if ($op == 'create') {

              return (user_access('create joke'));

       }

       if ($op == 'update') {

              return (user_access('edit joke') && ($user->uid == $node->uid));

       }

       if ($op == 'delete') {

              return (user_access('delete joke') && ($user->uid == $node->uid));

       }

}

function joke_form($node) {

       // Get metadata for this node type

       // (we use it for labeling title and body fields).

       // We defined this in joke_node_info().

       $type = node_get_types('type', $node);

       $form['title'] = array(

              '#type' => 'textfield',

              '#title' => check_plain($type->title_label),

              '#required' => TRUE,

              '#default_value' => $node->title,

              '#weight' => -5

       );

       $form['body_filter']['body'] = array(

              '#type' => 'textarea',

              '#title' => check_plain($type->body_label),

              '#default_value' => $node->body,

              '#rows' => 7,

              '#required' => TRUE

       );

       $form['body_filter']['filter'] = filter_form($node->format);

       $form['punchline'] = array(

              '#type' => 'textfield',

              '#title' => t('Punchline'),

              '#required' => TRUE,

              '#default_value' => $node->punchline,

              '#weight' => 5

       );

       return $form;

}

function joke_validate($node) {

       //Enforce a minimum word length of 3.

       if (isset($node->punchline) && str_word_count($node->punchline) <= 3) {

              $type = node_get_types('type', $node);

              form_set_error('punchline', t('The punchline of your @type is too short. You need at least three words.', array('@type'=> $type->name)));

       }

}

function joke_insert($node) {

       db_query("INSERT INTO {joke} (nid, vid, punchline) VALUES (%d, %d, '%s')",

       $node->nid, $node->vid, $node->punchline);

}

function joke_update($node) {

       if ($node->revision) {

              joke_insert($node);

       } else {

              db_query("UPDATE {joke} SET punchline = '%s' WHERE vid = %d", $node->punchline, $node->vid);

       }

}

/**

* Implementation of hook_delete().

*/

function joke_delete(&$node) {

       // Delete the related information we were saving for this node.

       db_query('DELETE FROM {joke} WHERE nid = %d', $node->nid);

}

/**

* Implementation of hook_load().

*/

function joke_load($node) {

       drupal_add_js('misc/collapse.js');

       return db_fetch_object(db_query('SELECT punchline FROM {joke} WHERE vid = %d', $node->vid));

}

function joke_view($node, $teaser = FALSE, $page = FALSE) {

       if (!$teaser) {

              // Use Drupal's default node view.

              $node = node_prepare($node, $teaser);

              $node->guffaw = str_repeat(t('Ha!'), mt_rand(0, 10));

              // Now add the punchline.

              /**

              $node->content['punchline'] = array(

                     '#value' => theme('joke_punchline', $node),

                     '#weight' => 2

              );

              */

       }

       if ($teaser) {

              // Use Drupal's default node view.

              $node = node_prepare($node, $teaser);

       }

       return $node;

}

function theme_joke_punchline($node) {

       $output = '<div class="joke-punchline">'.check_plain($node->punchline). '</div><br />';

       $output .= '<div class="joke-guffaw">'.check_plain($node->guffaw). '</div>';

       return $output;

}

posted on 2007-12-04 09:28 周锐 阅读(271) 评论(0)  编辑  收藏 所属分类: PHP

只有注册用户登录后才能发表评论。


网站导航: