2007 Drupal Summer Course @ Taiwan

 

0. 說明

0.0 本文件的對象?

=> 滿足以上條件的使用者,將可以輕鬆閱讀本文件

0.1 如何使用本文件?

Drupal Summer Course包含三個部份的內容,第一部份為cck和views的設定,第二部份為theme開發的小技巧,第三部份為module開發技巧,內容大部分為大綱式,可能有許多圖片缺乏文字說明,或許多條列式的綱要缺乏文字。在瀏覽本文件的過程中,可以隨時點右上角的「2007 drupal summer course」圖樣,便可看到下拉式目錄。

在整個資料夾中,除了此文件所用到的檔案之外,在example資料夾中另有課程中使用到的範例(cck, views, theme, module),cck和views的範例需要透過該模組的import,將文字檔的內容貼入。theme和module的範例,則按照drupal安裝新theme和module方式安裝即可啟用。

0.2 授權條款

本文件以創用CC-姓名標示-非商業性-相同方式分享方式授權,也表示歡迎大家共筆修改此份文件,有任何筆記能夠填入回應,將會對所有本文件的使用者都能受益。

所有本文見中原始碼,附加檔案的範例原始碼,皆以GNU GPL Version 2方式授權。

1. Drupal無限可能的原因:CCK + Views

1.1 CCK設定詳解

1.1.1 content types設定(詳看範例 examples/cck_examples/test_type.txt )

1.1.2 建立、設定群組 (add group)

1.1.3 建立、設定欄位: (add field)

 

1.1.4 排列、管理欄位:(manage fields)

title、body、taxonomy是定義死的,其他可以隨著group的定義隨意更動

1.1.5 顯示設定:(display fields)

p.s. 文章發表後的設定,非欄位呈現設定

 

1.2 Views設定詳解

1.2.1 基礎設定,新增一個view

page基本設定流程(增加一個頁面)

block基本設定流程(增加一個區塊)

1.2.2 基礎應用(範例 examples/views_examples/views_ex_simple1-4.txt )

1.2.3 進階應用(範例 examples/views_examples/views_ex_adv1-4.txt )

1.3 瞭解content type、nodes、views、和taxonomy的定位

p.s. 在drupal裡頭,分類、content type的field、和content type常常會有重疊使用、混用的情形,如文件的年度可能當成分類或是一個文章類型的欄位皆可以,釐清每個的用途不同來設計架構因此很重要。

1.4 Case study:建立報名表單

  1. 呈現的樣稿(多篇文章樣稿 ex 摘要列表,單篇文章樣稿 ex. 搭配縮圖)
  2. 欄位的細部規劃(email、姓名、年齡、類型、縣市、blog url、內容文)
  3. 模組的選擇(email、url、captcha、image field、image cache)
  4. content type 和 taxonomy 區分與先期規劃(類型用cck的field,縣市用taxonomy)
  5. 著手建立欄位 => admin/content/types/add
  6. 設定views(摘要呈現列表搭配縮圖1、單篇文章搭配縮圖2)

 

p.s. 事前確切的規劃,事後省力

1.5 以CCK + Views出發,有各種網站的解決方案

彈性的目的,就是為了讓你展現創意!

 

2. 超彈性版型~調整drupal版型一點也不難

2.1 PHPTemplate架構及概念介紹

2.1.1 theme engin、theme與loading流程

 

2.1.2 由page.tpl.php開始出發的結構

 

2.1.3 框架(html tag - div)、內容(變數)、樣式(style)分離的template

 

2.2 PHPTemplate的版型開發小技巧

詳細請安裝範例版型 examples/theme_examples

tips1: 子版型

新增 yourtheme/subtheme_name/style.css

tips2: 不同content type的版型node-type.tpl.php

新增 yourtheme/node-typename.tpl.php

如bluemarine/node-story.tpl.php

tips3: 首頁版型page-front.tpl.php

新增 yourtheme/page-front.tpl.php

tips4: 自定義regions

在yourtheme/template.php 檔案中增加yourtheme_regions()函數

tips5: 自定義版型變數

在yourtheme/template.php 檔案中增加_phptemplate_variables()函數

tips6: 複寫預設theme

  1. 拷貝module既有的function theme_foobar() 至 template.php
  2. 改名為 phptemplate_foobar(),並調整裡頭原始程式
  3. 完成!之後系統便會直接呼叫phptemplate_foobar,而不會經過function theme_foobar

 

2.3 Case Study:以Region實現Drupal超彈性版型

2.3.1 為何使用regions?

2.3.2 如何實現?

這個範例很遜嗎?看看進階苦勞網首頁的region規劃

2.4 如何使用Drupal與美工合作實戰分享

2.4.1 你跟什麼樣的伙伴合作?

  1. 很純的美工
    以美工軟體提供三面基本版型美工稿(首頁、摘要文章列、內頁+回應串) +
    psd檔完整的page切好圖用透明圖層(icon、logo、背景分層),並能給定css的色碼 +
  2. 網頁美工設計者
    除了第一種人的能力之外
    能過將三面的美工稿,轉換成html頁面 +++
    能夠做出像open web design好的html + css layout,結構化網頁的元素 ++++
  3. 有美工設計能力的程式設計師
    能夠做出wordpress的版型 http://themes.wordpress.net/ ++++
    能夠做出css zen garden的版型 +++++
    drupal的版型就是小case,theme就可以交給對方

2.4.2 與伙伴的分工與溝通

3. 超快速開發,開發drupal模組實戰指引

3.1 Drupal模組開發前:hook,form API,database API原理簡介

3.1.1 Database API

reference: http://api.drupal.org/api/5/group/database

3.1.2 FROM API

reference: http://api.drupal.org/api/5/file/developer/topics/forms_api.html
http://api.drupal.org/api/5/file/developer/topics/forms_api_reference.html

3.1.3 hook system

3.2 一個最簡單的模組範例

詳細請安裝範例模組 examples/module_examples

/* */ //====================================================================== ; module_name.info: test.info name = test description = Just a test module package = testing package version = VERSION

/* */ //====================================================================== // module name: test // $maycache是看看是否要從database裡頭傳回該user的menu cache // 通常與使用者id變換無關的menu皆可以視情況cache起來,增加menu loading的效能 function test_menu($maycache){ $items = array(); if($maycache){ $items[] = array( 'path' => 'simple_test', 'title' => t('Test page'), 'callback' => 'test_page', // just naming yourself 'callback arguments' => array('123','abc'), 'access' => user_access('access content'), 'type' => MENU_CALLBACK ); } else{ // !$maycache

} return $items; }

function test_page($arg1, $arg2){ $output = 'test'.$arg1.$arg2; return $output; // test123abc //print $output; }

3.3 快速開發的撇步

3.4 進階模組範例(+ form)

function test_menu($maycache){ $items = array(); if($maycache){ $items[] = array( 'path' => 'simple_test', 'title' => t('Test page'), 'callback' => 'test_page', // just naming yourself 'callback arguments' => array('123','abc'), 'access' => user_access('access content'), 'type' => MENU_CALLBACK ); $items[] = array( 'path' => 'simple_test2', 'title' => t('Test page2'), 'callback' => 'test_page2', // just naming yourself 'access' => user_access('access content'), 'type' => MENU_CALLBACK ); } else{ // !$maycache

} return $items; } function test_page2(){ // edit this form global $user; $edit['form_name'] = $user->created; $output = drupal_get_form('test_form', $edit); return $output; }

function test_form($edit, $title = NULL) { $form = array(); $form['new_name'] = array( '#type' => 'fieldset', '#title' => t('field set title'), '#collapsible' => TRUE, '#collapsed' => FALSE, ); $form['new_name']['form_name'] = array( '#type' => 'textfield', '#title' => t('text form title'), '#default_value' => $edit['form_name'], '#description' => t('text form test sample'), ); $form['submit'] = array('#type' => 'submit', '#value' => t('Save')); return $form; }

function test_form_validate($form_id, $form_values) { if (!is_numeric($form_values['form_name'])) { form_set_error('', t('You must fill a digits number from 0 to 9')); } }

function test_form_submit($form_id, $form_values) { global $user; db_query("UPDATE {users} SET created = %d WHERE uid = %d", $form_values['form_name'], $user->uid); drupal_set_message(t('Your form has been saved.')); }

3.5 debug指引

3.6 還有什麼不知道?