<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xml:base="http://www.joetsuihk.com" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
 <title>PHP</title>
 <link>http://www.joetsuihk.com/free_tags/php</link>
 <description>The taxonomy view with a depth of 0.</description>
 <language>en</language>
<item>
 <title>專業級編程人員和普通編程員的分別</title>
 <link>http://www.joetsuihk.com/professional_php_web_developer</link>
 <description>&lt;p&gt;今天路過一個網站&lt;br /&gt;
&lt;a href=&quot;http://www.litfuel.net/plush/?postid=166&quot;&gt;What separates a professional PHP web developer from a scripter?&lt;/a&gt;&lt;br /&gt;
覺得不錯, 你可能不會完全同意他們說法,&lt;br /&gt;
但逐一看看相關的資料都會學到不少東西&lt;/p&gt;
&lt;p&gt;翻譯:&lt;br /&gt;
我(原作者)三年來已經見過差不多第二百個php/web 應徵者了. 我得出一些作為一個高級(senior) 開發者所需的條件, 要求.&lt;br /&gt;
但發現98%的應徵者不能達到一半的要求, 你具備多少個?&lt;/p&gt;
&lt;p&gt;PHP5 vs PHP4&lt;br /&gt;
你必需知道最少它們之間三個主要的功能差異&lt;/p&gt;
&lt;p&gt;Networks(網路)&lt;br /&gt;
你必需懂得基本的接口(socket) 編程, 或最少, 如何連接到其他電腦&lt;/p&gt;
&lt;p&gt;OOP&lt;br /&gt;
你必需對面向對象編程(object-oriented programming) 有深的認識, 知道簡單的問題, 如私有(private) 和內部(protected) 方法的分別.&lt;br /&gt;
並知道:(你可沒有用過, 但至少知道為何需要它們)&lt;br /&gt;
* 接口 interfaces&lt;br /&gt;
* 构造函數 constructors&lt;br /&gt;
* 私有, 內部, 公共 private, public, protected&lt;br /&gt;
* 繼承 inheritance&lt;br /&gt;
* 多態性 polymorphism&lt;br /&gt;
* static methods&lt;/p&gt;
&lt;p&gt;Database(資料庫)&lt;br /&gt;
什麼是normalized database, 知道 primary 和 foreign keys,&lt;/p&gt;
&lt;p&gt;Design Patterns(設計結構)&lt;br /&gt;
你不必覺得奇怪. 同樣的, 你不需使用很多, 但必需知道最少幾種結構&lt;/p&gt;
&lt;p&gt;Source Control(源碼控制)&lt;br /&gt;
明瞭其中一種以上的版本控制系統. 知道cvs 的致命弱點可加分&lt;/p&gt;
&lt;p&gt;Unit Testing(個體測試)&lt;br /&gt;
什麼是個體測試(unit test), 為什麼重要(test driven design, javascript 測試, 使用selenium 可加分)&lt;/p&gt;
&lt;p&gt;Part of the Community(社區的一份子)&lt;br /&gt;
從google 上可以找到你的php, web 技術, 工作. 如果google 上找不到你, 基本上是一個警告(red flag)&lt;br /&gt;
(如果有一個企劃或你參與的都可以加分)&lt;/p&gt;
&lt;p&gt;Javascript Skills&lt;br /&gt;
使用DOM(document object model)(appendChild, removeChild, nextSibling...),&lt;br /&gt;
在javascript 內建立類, 懂得建立私有變數可加分&lt;/p&gt;
&lt;p&gt;CSS Skills&lt;br /&gt;
知道box model(padding, margin, border的分別, 關係, 內外), css 選擇器, 繼承&lt;/p&gt;
&lt;p&gt;Passion for Improvement(進步的熱情)&lt;br /&gt;
愛你所做的, 不要只做到最低要求. 持續建立技術, 變得更有價值&lt;br /&gt;
四時五十九分check-in, 五時走人留下未build 的源碼等都是欠缺熱情的表現&lt;/p&gt;
&lt;p&gt;譯者註:&lt;br /&gt;
從留言看, 有不少人覺得這幾個條件不錯,&lt;br /&gt;
但也有人覺得js, css 的要求相對不重要&lt;br /&gt;
socket 的使用次數六年都未有一次&lt;br /&gt;
好的開發者也未必有時間活躍於社區&lt;br /&gt;
五時離開只是時間管理好等等&lt;/p&gt;
&lt;p&gt;我個人覺得, 這些都是概念上的東西&lt;br /&gt;
是編程第一課的東西&lt;br /&gt;
但反正大家都會忘記了&lt;br /&gt;
到了某一天, 你覺得php 應用起來得心應手&lt;br /&gt;
就應該回到概念, 你就會更上一層樓&lt;br /&gt;
進步的是mind-set, design-pattern, 更加可擴充&lt;br /&gt;
此乃&quot;內功&quot;之重要性&lt;br /&gt;
特別是非計算機科學出身的開發者更為顯著&lt;br /&gt;
內功心法就會隨著時間增長了&lt;/p&gt;
</description>
 <comments>http://www.joetsuihk.com/professional_php_web_developer#comments</comments>
 <category domain="http://www.joetsuihk.com/free_tags/php">PHP</category>
 <pubDate>Fri, 08 Jun 2007 09:06:17 -0700</pubDate>
 <dc:creator>JOE</dc:creator>
 <guid isPermaLink="false">68 at http://www.joetsuihk.com</guid>
</item>
<item>
 <title>2007-05-12 jquery 在Drupal 的使用(二) -jquery recursive</title>
 <link>http://www.joetsuihk.com/2007_05_09_jquery_in_drupal_2_jquery_recursive</link>
 <description>&lt;p&gt;續jquery&lt;/p&gt;
&lt;p&gt;先說明一下callback&lt;br /&gt;
用fadeIn() 說明一下&lt;br /&gt;
&lt;code /&gt;&lt;br /&gt;
fadeIn(speed, callback)&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
fadeIn() 有兩個參數&lt;br /&gt;
第一個speed&lt;br /&gt;
用作指定淡入的速度, 可以為字符串&quot;slow&quot; &quot;normal&quot; &quot;fast&quot;&lt;br /&gt;
也可以為數字, 指定毫秒(千分一秒)&lt;/p&gt;
&lt;p&gt;第二個callback&lt;br /&gt;
參數可以是一個函數名, 也可以定義一個新函數(inline 的方式)&lt;br /&gt;
而這個函數會在fadeIn() 完成,&lt;br /&gt;
也即是效果完結的時候被呼叫.&lt;br /&gt;
例如&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;$(&amp;quot;#joe&amp;quot;).fadeIn( &amp;quot;normal&amp;quot; , &amp;quot;joe_example&amp;quot; )&lt;br /&gt;&lt;br /&gt;function joe_example(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert( &amp;quot;Element with id &amp;quot; + $(this).attr(&amp;quot;id&amp;quot;) + &amp;quot; fade in finished.&amp;quot; );&lt;br /&gt;}&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
這樣fadeIn 元成的時候便會呼叫 joe_example()&lt;br /&gt;
函數內可以用 $(this) 來指定&quot;自己&quot;&lt;br /&gt;
來獲得這個元素的相關資料&lt;br /&gt;
如果配合next(), sibling(), parent() 也可以得到附近的元素&lt;br /&gt;
再作其他處理&lt;/p&gt;
&lt;p&gt;至於inline的方式, 語法為:&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;$(&amp;quot;#joe&amp;quot;).fadeIn( &amp;quot;normal&amp;quot; , function(){&lt;br /&gt;&amp;nbsp; $(this).next().fadeIn();&lt;br /&gt;});&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
例子中, id 是joe 的元素先淡入&lt;br /&gt;
淡入完成之後,&lt;br /&gt;
joe 元素的下一個元素淡入&lt;br /&gt;
完成一次兩個為一組的連還淡入效果&lt;br /&gt;
注意, 這個例子只會淡入joe 元素和joe 元素的下一個元素&lt;br /&gt;
共兩個元素&lt;br /&gt;
並不會連鎖的淡入第三個元素&lt;/p&gt;
&lt;p&gt;如果要發生無限的連鎖,&lt;br /&gt;
像這站的menu 的效果&lt;br /&gt;
便要使用遍歷(recursive) 結構了&lt;br /&gt;
首先介紹一下遍歷結構,&lt;br /&gt;
簡單的遍歷一般是指一個函數會自己呼叫自己&lt;br /&gt;
一直到符合某一個條件才停下&lt;br /&gt;
所以一個完整的遍歷結構一定有兩個條件&lt;br /&gt;
一個是呼叫自己的呼叫&lt;br /&gt;
另一個是一個停止呼叫的條件&lt;br /&gt;
用一個簡單的例子說明&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;function recursive(count){&lt;br /&gt;&amp;nbsp; //完結條件&lt;br /&gt;&amp;nbsp; if ( count&amp;gt;5 ){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; alert( count++ );&lt;br /&gt;&amp;nbsp; //呼叫自己&lt;br /&gt;&amp;nbsp; recursive( count );&lt;br /&gt;}&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
上面展示了一個遍歷函數&lt;br /&gt;
但這個函數不會開始, 直到代碼第一次呼叫 recursive(0)&lt;br /&gt;
一但被第一次呼叫(initialize)&lt;br /&gt;
便不會停, 直到count&amp;gt;5&lt;/p&gt;
&lt;p&gt;同樣的原理可以放到menu 的連鎖反應之中&lt;br /&gt;
javascript 的代碼都分為兩個部份&lt;br /&gt;
一個遍歷的函數,&lt;br /&gt;
一次呼叫(initialize)&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;//initialize&lt;br /&gt;$(document).ready(function(){&lt;br /&gt;&amp;nbsp; $(&amp;quot;ul.primary-links&amp;quot;).children().eq(0).fadeIn(&amp;quot;slow&amp;quot;,function(){nextFadeIn(this)});&lt;br /&gt;});&lt;br /&gt;//遍歷函數&lt;br /&gt;function nextFadeIn(obj){&lt;br /&gt;&amp;nbsp; $(obj).next().fadeIn(&amp;quot;slow&amp;quot;,function(){nextFadeIn(this)});&lt;br /&gt;}&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;下一次介紹drupal 加入javascript 的方法和總結一下jquery 的用法, 思考方向等&lt;/p&gt;
</description>
 <comments>http://www.joetsuihk.com/2007_05_09_jquery_in_drupal_2_jquery_recursive#comments</comments>
 <category domain="http://www.joetsuihk.com/free_tags/development">Development</category>
 <category domain="http://www.joetsuihk.com/free_tags/drupal">Drupal</category>
 <category domain="http://www.joetsuihk.com/free_tags/php">PHP</category>
 <pubDate>Sat, 12 May 2007 01:02:00 -0700</pubDate>
 <dc:creator>JOE</dc:creator>
 <guid isPermaLink="false">53 at http://www.joetsuihk.com</guid>
</item>
<item>
 <title>2007-04-26 Tutorial on Drupal form API, Drupal 表單使用教學</title>
 <link>http://www.joetsuihk.com/2007_04_26_tutorial_on_drupal_form_api</link>
 <description>&lt;p&gt;原本打算先寫一個cck 的教學&lt;br /&gt;
但因為工作上的需要, 急需對Drupal form API 有深一點的認知&lt;br /&gt;
所以就埋頭苦幹, 翻讀又翻讀Drupal 主站的手冊&lt;br /&gt;
定要打好form 處理的根基&lt;/p&gt;
&lt;p&gt;本文既翻譯官方手冊關於form API的一些部分&lt;br /&gt;
再加上自己的一點研發而成&lt;/p&gt;
&lt;p&gt;表單乃任何應用系統的中心&lt;br /&gt;
令使用者和系統之間的交流具體化&lt;br /&gt;
確實請求, 遞交的介面, 公用接口等&lt;br /&gt;
如果沒有表單, 用戶只可被動的接受系統的一切&lt;br /&gt;
用戶的要求並不能傳到系統中,&lt;br /&gt;
像啞巴, 不能表達自己的訴求&lt;br /&gt;
用了表單, 用戶可以在系統允許的情況之下要求&lt;br /&gt;
如排序, 提交等等&lt;br /&gt;
所以一個小型的模組很可能已經需要使用表單,&lt;br /&gt;
作了解用戶的設定, 請求之用&lt;br /&gt;
可惜, Drupal 的 form API 使用概念上和html form 有頗大差異&lt;br /&gt;
但的確簡化了傳統上 顯示, 處理, 儲存 三個部分的處理&lt;/p&gt;
&lt;p&gt;用form API 生成表單, 大概有三個地方可放代碼&lt;br /&gt;
*.module 文件, template 文件, block boxes.(hook_form_alter() 只用作修改, 而非建設表單)&lt;/p&gt;
&lt;p&gt;*.module 文件中放代碼這方法為主流, 也正統, 又萬能&lt;br /&gt;
官網的教學全都集中在這個地方.&lt;br /&gt;
主要目的多是開發一個新的模組, 要設定模組的各參數而使用表格&lt;br /&gt;
學習上, 因為有很多現成模組的例子, 算是簡單&lt;br /&gt;
生成方法要從hook_menu 說起&lt;br /&gt;
user.module 為例:&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;&amp;lt;?php&lt;br /&gt;$items&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;[] = array(&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;path&#039; &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;=&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;user&#039;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;,&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;title&#039; &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;=&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;User account&#039;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;),&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;callback&#039; &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;=&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;drupal_get_form&#039;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;,&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;callback arguments&#039; &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;=&amp;gt; array(&lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;user_login&#039;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;),&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;access&#039; &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;=&amp;gt; !&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$user&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;uid&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;,&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;type&#039; &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;=&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;MENU_CALLBACK&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
設定:&lt;br /&gt;
路徑(path)                             /%DRUPAL%/user&lt;br /&gt;
頁面標題(title)                        t(&#039;User account&#039;) (t()為可以翻譯)&lt;br /&gt;
存取時轉到函數(callback)           drupal_get_form()&lt;br /&gt;
函數參數(callback arguments)    array(&#039;user_login&#039;)&lt;br /&gt;
權限(access)                          !$user-&amp;gt;uid (指已經登入者)&lt;/p&gt;
&lt;p&gt;實際上呼叫函數drupal_get_form(&#039;user_login&#039;)&lt;br /&gt;
drupal_get_form(&#039;user_login&#039;) 呼叫 user_login(),&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;&amp;lt;?php&lt;br /&gt;user_login&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(){&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;略&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;...&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;name&#039;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;] = array(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;#type&#039; &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;=&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;textfield&#039;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;#title&#039; &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;=&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;Username&#039;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;#size&#039; &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;=&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;60&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;#maxlength&#039; &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;=&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;USERNAME_MAX_LENGTH&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;#required&#039; &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;=&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;TRUE&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;#attributes&#039; &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;=&amp;gt; array(&lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;tabindex&#039; &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;=&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;1&#039;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;),&lt;br /&gt;&amp;nbsp; );&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;略&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;...&lt;br /&gt;&amp;nbsp; return &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
例子中定義了一個textfield (#type)&lt;br /&gt;
field 的題目(類似說明)為t(&#039;Username&#039;) (t()為可以翻譯)&lt;br /&gt;
等等, 詳細參數表請參考API &lt;a href=&quot;http://api.drupal.org/api/5/file/developer/topics/forms_api_reference.html&quot; title=&quot;http://api.drupal.org/api/5/file/developer/topics/forms_api_reference.html&quot;&gt;http://api.drupal.org/api/5/file/developer/topics/forms_api_reference.ht...&lt;/a&gt;&lt;br /&gt;
user_login() 最後返回變數$form, 給drupal_get_form()&lt;br /&gt;
表單顯示輸出部份到此完成&lt;br /&gt;
只要設定好 user_login, hook_menu,&lt;br /&gt;
其餘的部分(action, method, form_id, form tags)由Drupal 負責&lt;/p&gt;
&lt;p&gt;接著是確認表單有效的步驟: ( 按了submit, button type 後 )&lt;br /&gt;
續用user_login 為例,&lt;br /&gt;
定義一個函數: 函數名_validate()&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;&amp;lt;?php&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;function &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;user_login_validate&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form_id&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form_values&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;) {&lt;br /&gt;&amp;nbsp; if (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form_values&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;name&#039;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;]) {&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;//略&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
$form_id 為 函數名&lt;br /&gt;
$form_values 為array, 像一般的$_POST 般使用&lt;br /&gt;
_validate() 認證錯誤的話, 使用form_set_error(&#039;login&#039; , $message);&lt;br /&gt;
Drupal 自動跳回表單&lt;br /&gt;
否則不用返回, Drupal 跳到儲存函數&lt;/p&gt;
&lt;p&gt;儲存函數: 函數名_submit&lt;br /&gt;
(按下type 為 submit 的元素後)&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;&amp;lt;?php&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;function &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;user_login_submit&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form_id&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form_values&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;) {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;/**&lt;br /&gt;*&amp;nbsp; 數據庫處理等等&lt;br /&gt;*/&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$message &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;submit complete&#039;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;&amp;nbsp; return &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&quot;/user&quot;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$user&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;uid&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
$form_id 為 函數名&lt;br /&gt;
$form_values 為array, 像一般的$_POST 般使用&lt;br /&gt;
返回值為路徑, Drupal 會跳到該路徑&lt;br /&gt;
並顯示$message&lt;/p&gt;
&lt;p&gt;到此, 基本, 主要, 一般使用form API 的方法完成&lt;/p&gt;
&lt;p&gt;Template 文件上使用form API 實際上違反了MVC 的概念&lt;br /&gt;
但卻能快速的實現表單, 添加和修改頁面隨意&lt;br /&gt;
如 &quot;加一個表單到關於我們, 填電話吧&quot; 之類的請求&lt;br /&gt;
用一個模組加上hook_form_alter, hook_node_api 會令模組管理混亂&lt;br /&gt;
系統效能下降的問題&lt;br /&gt;
而更麻煩的是開發時間長&lt;br /&gt;
使用template 能減輕一定程度的工作量,&lt;br /&gt;
特別當改動少, 但又不得不改代碼, CSS 不能代勞時.&lt;/p&gt;
&lt;p&gt;使用概念跟使用druapl_get_form() 大致相約&lt;br /&gt;
template 中一樣要定義三個函數, 如&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;&amp;lt;?php&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;function &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;user_login2&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(){&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;[]=array(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ..........................&lt;br /&gt;&amp;nbsp; );&lt;br /&gt;&amp;nbsp; return &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;}&lt;br /&gt;&lt;br /&gt;function &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;user_login2_submit&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form_id&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form_values&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;){&lt;br /&gt;&amp;nbsp; .............&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;user_login2_validate&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form_id&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form_values&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;){&lt;br /&gt;&amp;nbsp; .............&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;print_r &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;drupal_get_form&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;user_login2&#039;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;));&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;最後用一句 print_r 就可以了,&lt;br /&gt;
Drupal 會顯示表單.&lt;br /&gt;
也使用 user_login2_validate() 確認&lt;br /&gt;
user_login2_submit() 提交&lt;/p&gt;
&lt;p&gt;但留意, 切忌過份使用, 否則只會做成維護的困難&lt;br /&gt;
又,&lt;br /&gt;
如果只改動現有模組, 可先作處理, 再呼叫原模組:&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;&amp;lt;?php&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;function &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;user_login2&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(){&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;[] = &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;user_login&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;();&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;[] = array(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ....&lt;br /&gt;&amp;nbsp; );&lt;br /&gt;}&lt;br /&gt;function &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;user_login2_submit&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form_id&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form_values&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;){&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;//more operation here&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;user_login&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form_id&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form_values&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;至於block boxes,&lt;br /&gt;
block 可以自己定制, 可以使用php code內建到block&lt;br /&gt;
在site build-&amp;gt;block 內有add block 選項&lt;br /&gt;
code 的使用和template 使用form API 的方法一樣&lt;br /&gt;
不再重覆, 主要使用print_r(drupal_get_form())&lt;br /&gt;
但值得一提的是block 的擺放位置, 如加上panels&lt;br /&gt;
幾乎可以放到任何位置, block 又可以設定何時顯示, 何時隐藏&lt;br /&gt;
又開發快速&lt;br /&gt;
唯一缺點, 如果php 代碼有錯, 將會做成修改不能的錯誤&lt;br /&gt;
要手動到資料庫修改, 故只適用於對php 非常熟悉的人使用&lt;/p&gt;
&lt;p&gt;Originally want to write a tutorial about cck first.&lt;br /&gt;
However, because of my job, there is an emergency that i need to have a deeper knowledge about Drupal&#039;s form API.&lt;br /&gt;
So here comes hours ad hours study, rushing through drupal&#039;s handbook,&lt;br /&gt;
build up so solid base about form.&lt;/p&gt;
&lt;p&gt;form system is a concrete base of any application.&lt;br /&gt;
it makes the communication between user and  system become practical, applicatable,&lt;br /&gt;
include confirm requests, submit interface, public sockets etc etc.&lt;br /&gt;
if there is no forms at all, users can only accept the information from server passively.&lt;br /&gt;
user&#039;s request cannot be sent to server,&lt;br /&gt;
like mute, who cannot present themselves.&lt;br /&gt;
under forms, users can submit request upon their needs,&lt;br /&gt;
for example sorting or submit etc etc.&lt;br /&gt;
as a result, there may be already a need for forms even inside a small module.&lt;br /&gt;
but unluckily, the concept between Drupal&#039;s form API and HTML form is very different,&lt;br /&gt;
in terms of three core part of form: presentation, process, save.&lt;/p&gt;
&lt;p&gt;To use from API to generate forms, there are three places that your code may place&lt;br /&gt;
*.module file, templates, boxes block. ( hook_form_alter() can only edit a form, but not create one )&lt;/p&gt;
&lt;p&gt;form API inside *.module is the most popular method, Drupal style, and also powerful.&lt;br /&gt;
the tutorial inside drupal.org is mainly focus in this scoop.&lt;br /&gt;
This method is mainly used to configure the parameters of the module, during development a new module.&lt;br /&gt;
This method ie relatively easy to learn as there is many existing modules that you can refer to.&lt;br /&gt;
the start point is hook_menu():&lt;br /&gt;
use user.module as an example,&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;&amp;lt;?php&lt;br /&gt;$items&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;[] = array(&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;path&#039; &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;=&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;user&#039;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;,&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;title&#039; &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;=&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;User account&#039;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;),&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;callback&#039; &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;=&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;drupal_get_form&#039;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;,&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;callback arguments&#039; &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;=&amp;gt; array(&lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;user_login&#039;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;),&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;access&#039; &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;=&amp;gt; !&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$user&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;uid&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;,&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;type&#039; &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;=&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;MENU_CALLBACK&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
details:&lt;br /&gt;
path                       /%DRUPAL%/user&lt;br /&gt;
title                        t(&#039;User account&#039;)    (t()means translatable)&lt;br /&gt;
callback                   drupal_get_form()&lt;br /&gt;
callback arguments    array(&#039;user_login&#039;)&lt;br /&gt;
access                    !$user-&amp;gt;uid           (means logged-in user)&lt;/p&gt;
&lt;p&gt;in practical, this will have call a function drupal_get_form(&#039;user_login&#039;)&lt;br /&gt;
drupal_get_form calls user_login():&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;&amp;lt;?php&lt;br /&gt;user_login&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(){&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;//...some code before...&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;name&#039;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;] = array(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;#type&#039; &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;=&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;textfield&#039;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;#title&#039; &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;=&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;Username&#039;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;#size&#039; &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;=&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;60&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;#maxlength&#039; &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;=&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;USERNAME_MAX_LENGTH&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;#required&#039; &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;=&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;TRUE&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;#attributes&#039; &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;=&amp;gt; array(&lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;tabindex&#039; &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;=&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;1&#039;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;),&lt;br /&gt;&amp;nbsp; );&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;//...some more code...&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;return &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
In this example, it defines a textfield by #type,&lt;br /&gt;
the title of this field is Username (t()means translatable)&lt;br /&gt;
etc etc. and the parameters reference: &lt;a href=&quot;http://api.drupal.org/api/5/file/developer/topics/forms_api_reference.html&quot; title=&quot;http://api.drupal.org/api/5/file/developer/topics/forms_api_reference.html&quot;&gt;http://api.drupal.org/api/5/file/developer/topics/forms_api_reference.ht...&lt;/a&gt;&lt;br /&gt;
finally, user_login() return the $form variable, back to drupal_get_form()&lt;br /&gt;
the output part of form finished.&lt;br /&gt;
you only have to setup user_login, hook_menu, the elements inside the form,&lt;br /&gt;
the rest part( action, method, form_id, form tags ) will left to Drupal.&lt;/p&gt;
&lt;p&gt;next is the validation of form( by pressing any button, submit type ):&lt;br /&gt;
user_login() as example again,&lt;br /&gt;
define a new function inside *.module, named function _name_validate()&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;&amp;lt;?php&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;function &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;user_login_validate&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form_id&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form_values&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;) {&lt;br /&gt;&amp;nbsp; if (&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form_values&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;name&#039;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;]) {&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;// some code&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
$form_id is the name of the form function,&lt;br /&gt;
$form_values is an array, like normal $_POST,&lt;br /&gt;
if validation fails, you may use form_set_error(&#039;login&#039; , $message);&lt;br /&gt;
Drupal will jump back to the form&lt;br /&gt;
otherwise, drupal will jump to save process.&lt;/p&gt;
&lt;p&gt;save function: function_name_submit()&lt;br /&gt;
(when press element that is &#039;submit&#039; type)&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;&amp;lt;?php&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;function &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;user_login_submit&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form_id&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form_values&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;) {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #FF8000&quot;&gt;/**&lt;br /&gt;*&amp;nbsp; database process&lt;br /&gt;*/&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$message &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;submit complete&#039;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;&amp;nbsp; return &lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&quot;/user&quot;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$user&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;uid&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
$form_id is the name of the form function,&lt;br /&gt;
$form_values is an array, like normal $_POST,&lt;br /&gt;
return the path that will be redirected,&lt;br /&gt;
and display $message&lt;/p&gt;
&lt;p&gt;up to this point, the basic use of form API finish.&lt;/p&gt;
&lt;p&gt;The use of form API inside template file actually contradict the MVC concept,&lt;br /&gt;
but this method can build up form quickly, edit them quickly.&lt;br /&gt;
for example, a need of &quot;add a form to about us, user may enter their phone number&quot;&lt;br /&gt;
this kind of need is not worth to open a new module because of performance, long develop time&lt;br /&gt;
using template can reduce some workload,&lt;br /&gt;
especially when changes is small, but CSS cannot help.&lt;/p&gt;
&lt;p&gt;the basic concept is the same, also use drupal_get_form(),&lt;br /&gt;
define three function inside the template file:&lt;br /&gt;
&lt;div class=&quot;codeblock&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;&amp;lt;?php&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;function &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;user_login2&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(){&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;[]=array(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ..........................&lt;br /&gt;&amp;nbsp; );&lt;br /&gt;&amp;nbsp; return &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;}&lt;br /&gt;&lt;br /&gt;function &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;user_login2_submit&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form_id&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form_values&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;){&lt;br /&gt;&amp;nbsp; .............&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;user_login2_validate&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form_id&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;$form_values&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;){&lt;br /&gt;&amp;nbsp; .............&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;print_r &lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;drupal_get_form&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #DD0000&quot;&gt;&#039;user_login2&#039;&lt;/span&gt;&lt;span style=&quot;color: #007700&quot;&gt;));&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000BB&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;finally use print_r, drupal will display the form.&lt;br /&gt;
user_login2_validate to process validation the form&lt;br /&gt;
user_login2_submit to save to database,&lt;/p&gt;
&lt;p&gt;but keep in mind, do not use it frequently, which will increase the difficulties to maintain&lt;/p&gt;
&lt;p&gt;finally, about from API inside block boxes,&lt;br /&gt;
as blocks can embed php code inside,&lt;br /&gt;
form can also embedded inside blocks.&lt;br /&gt;
the use of code is just like the use inside template,&lt;br /&gt;
use print_r(drupal_get_form()) again,&lt;br /&gt;
define three function....&lt;br /&gt;
one more to note, in combination with panels modules,&lt;br /&gt;
blocks can be placed everywhere, in specific page, specific place,&lt;br /&gt;
with fast development&lt;br /&gt;
the only disadvantage is, if there is php code error inside block,&lt;br /&gt;
you may face down site, which can only be repair from database.&lt;br /&gt;
so it is only advice to advance php users&lt;/p&gt;
</description>
 <comments>http://www.joetsuihk.com/2007_04_26_tutorial_on_drupal_form_api#comments</comments>
 <category domain="http://www.joetsuihk.com/free_tags/development">Development</category>
 <category domain="http://www.joetsuihk.com/free_tags/drupal">Drupal</category>
 <category domain="http://www.joetsuihk.com/free_tags/php">PHP</category>
 <category domain="http://www.joetsuihk.com/free_tags/tabbed_block">Tabbed Block</category>
 <pubDate>Sun, 29 Apr 2007 00:35:54 -0700</pubDate>
 <dc:creator>JOE</dc:creator>
 <guid isPermaLink="false">43 at http://www.joetsuihk.com</guid>
</item>
<item>
 <title>2007-04-11 Add digg it to your wordpress</title>
 <link>http://www.joetsuihk.com/2007_04_11_add_digg_it_your_wordpress</link>
 <description>&lt;p&gt;&lt;b&gt;2007-04-21 修正:這站已經換成Drupal Based.&lt;/b&gt;&lt;br&gt;&lt;br&gt;現今首屈一指的用戶驅動的新聞網站中&lt;br&gt;digg.com 絕對為大龍頭&lt;br&gt;透過用戶的點?量為新聞評分&lt;br&gt;真正一人一票選新聞&lt;br&gt;&lt;br&gt;這個資訊爆炸的年代,&lt;br&gt;用一個資訊爆炸的方法&lt;br&gt;自動, 實時的排序出最熱的新聞&lt;br&gt;無人運作, 卻一日二十四小時不停更新&lt;br&gt;&lt;br&gt;所以介紹一個wordpress plugin: &lt;a title=&quot;Gregarious&quot; target=&quot;blank_&quot; href=&quot;http://wordpress.org/extend/plugins/gregarious/&quot;&gt;Gregarious&lt;/a&gt;&lt;br&gt;為你的wordpress 自動加上digg, tailrank 等大量用戶驅動網站的連結&lt;br&gt;方便訪客, 方便自己&lt;br&gt;&lt;br&gt;安裝:&lt;br&gt;將 gregarious folder 放到 wp-contentplugins 下&lt;br&gt;然後到wordpress plugin admin 啟用後&lt;br&gt;便可以到options 中找到 gregarious 的管理介面&lt;br&gt;一開始有數個選項&lt;br&gt;但其實只會用到post badge 和 share-this 兩個&lt;br&gt;post badge 就是那個顯示有多少個digg 的buttom&lt;br&gt;share-this 就是一個綜合的buttom,&lt;br&gt;令用戶可以一click 即可將你的網頁放到十多個網站的popup.&lt;br&gt;&lt;br&gt;tips:&lt;br&gt;post badge 的位置可以在post badge 的option 中config&lt;br&gt;diggWrap 就是digg buttom 的 class 了&lt;br&gt;而askt_form 就可以apply share-this 的CSS&lt;br&gt;&lt;br&gt;&lt;/p&gt;
</description>
 <comments>http://www.joetsuihk.com/2007_04_11_add_digg_it_your_wordpress#comments</comments>
 <category domain="http://www.joetsuihk.com/free_tags/php">PHP</category>
 <category domain="http://www.joetsuihk.com/free_tags/wordpress">wordpress</category>
 <pubDate>Wed, 11 Apr 2007 14:54:55 -0700</pubDate>
 <dc:creator>JOE</dc:creator>
 <guid isPermaLink="false">13 at http://www.joetsuihk.com</guid>
</item>
</channel>
</rss>
