drupal: แก้และแปลงโมดูล

บันทึกแก้และแปลงโมดูล

Topic: 

drupal: บันทึกแก้โมดูล switch theme

เพิ่งสังเกตุว่าโมดูล Switch Theme เขาไม่ยอมเปลี่ยนธีมสำหรับผู้ใช้ทั่วไป (anonymous users)

ลองค้นดู bug ของ switchtheme พบ patch แก้ปัญหาไว้แล้ว แต่ยังไม่มีสำหรับ Drupal-6
เลยทดลองแก้ไขดู ได้ความแพตช์ดังนี้ครับ

$ patch -u -p switchtheme.module

--- switchtheme.module  2007-08-31 21:56:14.000000000 +0700
+++ switchtheme.module  2007-12-09 19:46:14.000000000 +0700
@@ -148,11 +148,17 @@ function switchtheme_switch_form_submit(
   // save the setting in the db for logged in users
   // save the setting in the session for all others
   if ($user->uid > 0) {
-    variable_set('theme_default', $form_values['custom_theme']);
+    // FIX DEFAULT THEME CHANGED
+    //variable_set('theme_default', $form_values['custom_theme']);
     if (user_save($user, array('theme' => $form_state['values']['custom_theme']))) {
       $user->theme = $form_state['values']['custom_theme'];
     }
   }
+  // FIX ANONYMOUS SWITCH THEME
+  elseif (user_access('switch theme')) {
+    // save the setting in the variable for all others
+    $_SESSION['custom_theme'] = $form_state['values']['custom_theme'];
+  }
 }


@@ -184,4 +190,4 @@ function switchtheme_select() {
   }
   asort($select);
   return $select;
-}
\ No newline at end of file
+}
Topic: 

drupal: แปลงโมดูล On This Date เป็น Recent 3 Days

ทดลองแปลงโมดูล On This Date ของ Drupal-5 Modules Tutorial

โมดูลในรุ่น 5 ควรเขียนในไดเรกทอรี่ ./sites/all/modules/
ดังนั้นต้องสร้างไดเรกทอรี่ให้โมดูลเราก่อน โดยใช้ชื่อ onthisdate เหมือนเดิม
$ cd /var/www/drupal
$ mkdir -p sites/all/modules/onthisdate
$ cd sites/all/modules/onthisdate

สำหรับรุ่น 5 ต้องมีไฟล์ info
$ vi onthisdate.info

; $Id$
name = On this date
description = "A block module that lists links to content such as blog entries or forum discussions that were created one week ago. (wd's: Modify to recent 3 days post)"

คราวนี้ก็สร้างไฟล์โมดูลจริง ๆ ได้แล้ว
$ vi onthisdate.module

<?php
/**
 * @file: onthisdate.module.5.txt Drupal tutorial on how to write modules
 * @author: Kitt Hodsden (http://kitt.hodsden.org/)
 * @license: GPL:v2, CC:by-nc-sa, contact for commercial uses
 */

/**
 * Display help and module information
 * @param section which section of the site we're displaying help 
 * @return help text for section
 */
function onthisdate_help($section='') {

  $output = '';

  switch ($section) {
    case "admin/help#onthisdate":
      $output = '<p>'.  t("Displays links to nodes created on this date"). '</p>';
      break;
  }

  return $output;
} // function onthisdate_help

/**
 * menu hook
 * @return array of menu items
 */
function onthisdate_menu() {
  
  $items = array();
  
  //this was created earlier in tutorial 7.
  $items[] = array(
    'path' => 'admin/settings/onthisdate',
    'title' => t('On this date module settings'),
    'callback' => 'drupal_get_form',
    'callback arguments' => 'onthisdate_admin',
    'access' => user_access('access administration pages'),
    'type' => MENU_NORMAL_ITEM,
   );

  //this is added for this current tutorial.
  $items[] = array(
    'path' => 'onthisdate',
    'title' => t('on this date'),
    'callback' => 'onthisdate_all',
    'access' => user_access('access content'),
    'type' => MENU_CALLBACK
  );

  return $items;
}

function onthisdate_admin() {

  $form['onthisdate_maxdisp'] = array(
    '#type' => 'textfield',
    '#title' => t('Maximum number of links'),
    '#default_value' => variable_get('onthisdate_maxdisp', 3),
    '#size' => 2,
    '#maxlength' => 2,
    '#description' => t("The maximum number of links to display in the block.")
  );

  return system_settings_form($form);
}


/**
 * Valid permissions for this module
 * @return An array of valid permissions for the onthisdate module
 */
function onthisdate_perm() {
  
  return array('access onthisdate', 'administer onthisdate');
  
} // function onthisdate_perm()

/**
* Generate HTML for the onthisdate block
* @param op the operation from the URL
* @param delta offset
* @returns block HTML
*/
function onthisdate_block($op='list', $delta=0) {
  // listing of blocks, such as on the admin/block page
  if ($op == "list") {
    $block[0]["info"] = t("On This Date");
    return $block;
  } else if ($op == 'view') {
  // our block content
    // content variable that will be returned for display
    $block_content = '';

    // Get today's date
    $today = getdate();

    // calculate midnight one week ago
    //$start_time = mktime(0, 0, 0,$today['mon'],
    //                           ($today['mday'] - 7), $today['year']);
    //wd's: MODIFY TO LAST 3 DAYS 
    $start_time = mktime(0, 0, 0,$today['mon'],
                               ($today['mday'] - 3) , $today['year']);

    // we want items that occur only on the day in question, so
    //calculate 1 day
    //$end_time = $start_time + 86400;
    // 60 * 60 * 24 = 86400 seconds in a day
    //wd's EXPAND TO 3 DAYS
    $end_time = $start_time + 259200;

    $limitnum = variable_get("onthisdate_maxdisp", 3);

    $query = "SELECT nid, title, created FROM " .
           "{node} WHERE created >= %d " .
           "AND created <= %d ORDER BY created DESC";

    // get the links
    $queryResult = db_query_range($query, $start_time, $end_time, 0, $limitnum);

    while ($links = db_fetch_object($queryResult)) {
      //wd's: MODIFY TO LIST
      //$block_content .= l($links->title, 'node/'.$links->nid) . '<br />';
      $block_content .= '<li>'.l($links->title, 'node/'.$links->nid) . '</li>';
    }
    // check to see if there was any content before setting up the block
    if ($block_content == '') {
      // no content from a week ago, return nothing.
      return;
    } else {
      //wd's: ADD <ul>
      $block_content = '<ul>'.$block_content.'</ul>'; 
    }
    // add a more link to our page that displays all the links
    $block_content .=
      "<div class=\"more-link\">".
      l( t("more"), "onthisdate", array( "title" => t("More events on this day.")))."</div>";
    // set up the block
    //$block['subject'] = 'On This Date';
    //wd's EXPAND TO 3 DAYS
    $block['subject'] = 'These 3 Days';
    $block['content'] = $block_content;
    return $block;
  }
} // end onthisdate_block

/**
 * Settings for the onthisdate module
 * @return form contents for this module
 */
function onthisdate_settings() {

  // only administrators can access this function
  if (!user_access('access administration pages')) {
    return message_access();
  }
  
  // 4.7 forms API
  $form['onthisdate_maxdisp'] = array('#type' => 'textfield',
                    '#title' => t('Maximum number of links'),
                    '#default_value' => variable_get('onthisdate_maxdisp', 3),
                    '#description' => t("The maximum number  of links to display in the block."),           
                    '#maxlength' => '2', '#size' => '2');
  return $form;

}

/**
 * Render a page listing links to all the content from a week ago
 */
function onthisdate_all() {
  
  // content variable that will be returned for display
  $page_content = '';

  // Get today's date
  $today = getdate();

  // calculate midnight one week ago
  //$start_time = mktime(0, 0, 0, $today['mon'], ($today['mday'] - 7), $today['year']);
  //wd's: CHANGE TO LAST 3 DAYS
  $start_time = mktime(0, 0, 0, $today['mon'], ($today['mday'] - 3), $today['year']);
  
  // we want items that occur only on the day in question,
  // so calculate 1 day
  //$end_time = $start_time + 86400;
  // 60 * 60 * 24 = 86400 seconds in a day
  //wd's EXPAND TO 3 DAYS
  $end_time = $start_time + 259200;
  
  $query = "SELECT nid, title, created FROM " .
           "{node} WHERE created >= '" . $start_time .
           "' AND created <= '". $end_time . " ORDER BY created DESC'";

  // get the links (no range limit here)
  $queryResult = db_query($query);
  while ($links = db_fetch_object($queryResult)) {
    //$page_content .= l($links->title, 'node/'.$links->nid).'<br />';
    //wd's: ADD LIST
    $page_content .= '<li>'.l($links->title, 'node/'.$links->nid).'</li>';
  }

  // check to see if there was any content before
  // setting up the block
  if ($page_content == '') {
    // no content from a week ago, let the user know
    $page_content = "No events occurred on this site on this date in history.";
  } else {
    //wd's: ADD <ul>
    $page_content = '<ul>'.$page_content.'</ul>';
  }
  print theme("page", $page_content);
}

?>

เสร็จแล้ว
ต่อไปก็ทำตามขั้นตอนคือ

  • ให้โมดูลทำงาน
    admin/build/module -> enable onthisdate
  • ให้ผู้ใช้สามารถใช้งานโมดูลได้
    admin/user/access -> เปิดให้ทำงานตาม roles
  • เปิดให้ใช้งานบล๊อก
    admin/build/block -> enable onthisdate
Topic: