Thứ Hai, 15 tháng 7, 2013

Viết Module đầu tiên cho Drupal

Module cần có 2 file là :
- .info
- .module
Vậy đầu tiên , ta cần tạo file info . Tôi viết ứng dụng get file XML từ trang http://www.goodreads.com/review/list_rss/398385?shelf=history-of-philosophy . Và đưa về module trang web của mình :
đầu tiên tạo thư mục goodreads . Trong đó tạo 2 file goodreads.info và goodreads.module .
2 File có nội dung như sau :

File goodreads.info có nội dung như sau :
 
;$Id$
name = "Goodreads Bookshelf"
description = "Displays items from a Goodreads Bookshelf"
core = 6.x
php = 5.1
name và description chỉ đơn giản là mô tả môdule .

File con chính : goodreads.module có nội dung :

<?php
// $Id$
/**
 * @file
 * Module for fetching data from Goodreads.com.
 * This module provides block content retrieved from a
 * Goodreads.com bookshelf.
 * @see http://www.goodreads.com
 */
 /**
 * Implementation of hook_block()
 */
function goodreads_block($op='list' , $delta=0, $edit=array()) {
  switch ($op) {
    case 'list':
      $blocks[0]['info'] = t('Goodreads Bookshelf');
      return $blocks;
    case 'view':
      $url = 'http://www.goodreads.com/review/list_rss/'
            .'398385'
            .'?shelf='
            .'history-of-philosophy';
      $blocks['subject'] = t('On the Bookshelf');
      $blocks['content'] = _goodreads_fetch_bookshelf($url);
      return $blocks;
  }
}
/**
 * Retrieve information from the Goodreads bookshelp XML API.
 * 
 * This makes an HTTP connection to the given URL, and 
 * retrieves XML data, which it then attempts to format 
 * for display.
 *
 * @param $url
 * URL to the goodreads bookshelf.
 * @param $num_items
 * Number of items to include in results.
 * @return 
 * String containing the bookshelf.
 */
function _goodreads_fetch_bookshelf($url, $num_items=3) {
  $http_result = drupal_http_request($url);
    if ($http_result->code == 200) {
    $doc = simplexml_load_string($http_result->data);
    if ($doc === false) {
      $msg = "Error parsing bookshelf XML for %url: %msg.";
      $vars = array('%url'=>$url, '%msg'=>$e->getMessage());
      watchdog('goodreads', $msg, $vars, WATCHDOG_WARNING);
      return t("Getting the bookshelf resulted in an error.");
    }     
    return _goodreads_block_content($doc, $num_items);
    // Otherwise we don't have any data
  } 
  else {
    $msg = 'No content from %url.';
    $vars = array('%url' => $url);
    watchdog('goodreads', $msg, $vars, WATCHDOG_WARNING);
    return t("The bookshelf is not accessible.");
  }
}
/**
 * Generate the contents of a block from a SimpleXML object.
 * Given a SimpleXML object and the maximum number of 
 * entries to be displayed, generate some content.
 *
 * @param $doc
 * SimpleXML object containing Goodreads XML.
 * @param $num_items
 * Number of items to format for display.
 * @return
 * Formatted string. 
 */
function _goodreads_block_content($doc, $num_items=3) {   
  $items = $doc->channel->item;
  $count_items = count($items);
  $len = ($count_items < $num_items) ? $count_items : $num_items;   
  
  $template = '<div class="goodreads-item">'
            .'<img src="%s"/>
%s
by %s</div>';
  // Default image: 'no cover'
  $default_img = 'http://www.goodreads.com/images/nocover-60x80.jpg';
  $default_link = 'http://www.goodreads.com';   
  $out = '';  
  foreach ($items as $item) {  
      $author = check_plain($item->author_name);
    $title = strip_tags($item->title);
    $link = check_url(trim($item->link));
    $img = check_url(trim($item->book_image_url));     
    if (empty($author)) $author = '';
    if (empty($title)) $title = '';
    if (empty($link) !== 0) $link = $default_link;
    if (empty($img)) $img = $default_img;     
    $book_link = l($title, $link);
    $out .= sprintf($template, $img, $book_link, $author);
  }
  $out .= '
<div class="goodreads-more">'
         . l('Goodreads.com', 'http://www.goodreads.com')
         .'</div>';
  return $out;
}
 
Giải thích : 1 : Code trên không cần dấu tag đóng ?> vì khi có nó thì nếu kết quả trả về có khoản trắng sẽ không tốt cho website lắm . 2 : Ta cần chú ý biến $op . $op là biến quan trọng của drupal, nó có các tham số quan trọng là : + Configure . + List . + View ... Đầu tiên :

case 'list':
      $blocks[0]['info'] = t('Goodreads Bookshelf');
      return $blocks;
Nếu $op là list thì $blocks[0]['info'] có giá trị là "Goodreads Bookshelf" . Và giá trị này được dùng khi cài module . Sau đó :
case 'view':
      $url = 'http://www.goodreads.com/review/list_rss/'
            .'398385'
            .'?shelf='
            .'history-of-philosophy';
      $blocks['subject'] = t('On the Bookshelf');
      $blocks['content'] = _goodreads_fetch_bookshelf($url);
      return $blocks;
 
 
Nếu $op là view thì sẽ gọi $blocks['subject'] : là tựa đề module chính. $blocks['content'] : là nội dung hiện ra . Sau đó module sẽ gọi function _goodreads_fetch_bookshelf để xử lý . Hàm watchdog(): Hàm thường có dạng như sau : watchdog('goodreads', $msg, $vars, WATCHDOG_WARNING); - Tham số thứ 1 : là tên module . - Thứ 2 và 3 : chỉ đơn giản là truyền biến var vào trong biến $msg . - Tham số thứ 4 chỉ độ quan trọng :

WATCHDOG_EMERG: The system is now in an unusable state.
WATCHDOG_ALERT: Something must be done immediately.
WATCHDOG_CRITICAL: The application is in a critical state.
WATCHDOG_ERROR: An error occurred.
WATCHDOG_WARNING: Something unexpected (and negative) happened, but didn't cause any serious problems.
WATCHDOG_NOTICE: Something significant (but not bad) happened.
WATCHDOG_INFO: Information can be logged.
WATCHDOG_DEBUG: Debugging information can be logged.

Hook_Help trong module :

/**
 * Implementation of hook_help()
 */
function goodreads_help($path, $arg) {   
  if ($path == 'admin/help#goodreads' || $path == 'admin/help') {
    $txt = 'The Goodreads module uses the !goodreads_url XML '
      .'API to retrieve a list of books and display it as block '
      .'content.';
    $link = l('Goodreads.com', 'http://www.goodreads.com');
    $replace = array(
      '!goodreads_url' => $link
    );
    return '<p>'. t($txt, $replace) .'</p>';
  }
}
 
Chỉ đơn thuần là file help, hướng dẫn người dùng sử dụng module .

Không có nhận xét nào:

Đăng nhận xét

Học lập trình web căn bản với PHP

Bài 1: Các kiến thức căn bản Part 1:  https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-1-cac.html Part 2:  https://...