<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2chinesetwfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://my.netscape.com/rdf/simple/0.9/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">

 <channel>
  <title>eddie@Home</title>
  <link>http://blog.eddie.com.tw</link>
  <description />
 </channel>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/eddiekao" type="application/rss+xml" /><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Feddiekao" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Feddiekao" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/eddiekao" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Feddiekao" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Feddiekao" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Feddiekao" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2Feddiekao" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
   <title>2009 PTT Flash 版聚</title>
   <description>&lt;p&gt;今年八月底聚集了一些對Flash有熱好的朋友們，讓大家互相認識一下平常在版上互動的人長什麼樣子，也順便透過幾個專題演講來分享一下心得&lt;/p&gt;&lt;p&gt;連結在此：&lt;a href="http://www.eddie.com.tw/FlashLabs/PTT-Flash.htm" target="_blank" title="PTT Flash Workshop list"&gt;http://www.eddie.com.tw/FlashLabs/PTT-Flash.htm&lt;/a&gt;&lt;/p&gt;&lt;p&gt;這應該算是PTT Flash版第二度的板聚(上一次是在2008年的八月，已經相隔一年了)&lt;/p&gt;&lt;p&gt;Flash在台灣一直比較少見有專門大型的研討會，比較大型的大多是伴隨產品上市的發表會一起辦&lt;/p&gt;&lt;p&gt;雖然我們這個不是官方舉辦或贊助的活動，但我還是很羨幕能有像&lt;a href="http://max.adobe.com/" target="_blank" title="Adobe MAX"&gt;Adobe MAX&lt;/a&gt;或是&lt;a href="http://www.flashonthebeach.com/" target="_blank" title="Flash on the Beach"&gt;Flash on the Beach&lt;/a&gt;那樣大型的研討會&lt;/p&gt;&lt;p&gt;希望有一天能在台灣也能看到純粹技術發表的研討會 :)&lt;/p&gt;&lt;p&gt;至於我們這個PTT Flash Workshop，我想希望可以把這樣的聚會變成固定舉辦的活動，也許可以辦在寒、暑假&lt;/p&gt;&lt;p&gt;然後再來去借個比較大一點的場地來辦party好了 :) &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/eddiekao/~4/-aGEG_8k2H0" height="1" width="1"/&gt;</description>
   <link>http://feedproxy.google.com/~r/eddiekao/~3/-aGEG_8k2H0/2009-ptt-flash-workshop</link>
      <pubDate>Tue, 27 Oct 2009 07:11:12 +0800</pubDate>   
  <feedburner:origLink>http://blog.eddie.com.tw/2009/10/27/2009-ptt-flash-workshop</feedburner:origLink></item>
    <item>
   <title>戰利品</title>
   <description>&lt;p&gt;&lt;img src="http://blog.eddie.com.tw/gallery/1/uk_flag.png" border="0" alt="UK Flag" title="UK Flag" hspace="3" vspace="3" align="left" /&gt;難得給自已排了一段時間出去玩，這趟去英國溜躂，音樂劇Les Miserables是心靈上最值回票價的體驗，當然物質上的一些戰利品也是不可少的啊(其實根本就是去買玩具的吧)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff6600"&gt;1. 電話亭存錢筒：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;是鐵製的，拿在手上挺有份量(存錢這是一定要的啊)&lt;/p&gt;&lt;p&gt;&lt;img src="http://blog.eddie.com.tw/gallery/1/DSC01414.jpg" border="0" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff6600"&gt;2. 小羊鑰匙圈&lt;/span&gt; &lt;/p&gt;&lt;p&gt;這個是在湖區買的小羊鑰匙圈，造型真是超可愛&lt;/p&gt;&lt;p&gt;&lt;img src="http://blog.eddie.com.tw/gallery/1/DSC01420.jpg" border="0" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff6600"&gt;3. 懷舊寶箱&lt;/span&gt;&lt;/p&gt;&lt;p&gt;這是在二手店看到的小寶箱，不知道為什麼我看了就覺得很愛&lt;/p&gt;&lt;p&gt;&lt;img src="http://blog.eddie.com.tw/gallery/1/DSC01409.jpg" border="0" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff6600"&gt;4. 超難拼圖&lt;/span&gt;&lt;/p&gt;&lt;p&gt;號稱世上最難的拼圖，雖然只有529片，但拼起來像是4,000片?!&lt;/p&gt;&lt;p&gt;&lt;img src="http://blog.eddie.com.tw/gallery/1/DSC01413.jpg" border="0" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff6600"&gt;5. Doctor Who模型&lt;/span&gt;&lt;/p&gt;&lt;p&gt;大概二、三十公分高，人物部份要自已著色，Tardis在啟動的時候會發出跟影集一樣的聲音。&lt;br /&gt;&lt;img src="http://blog.eddie.com.tw/gallery/1/DSC01410.jpg" border="0" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff6600"&gt;6. Daleks&lt;/span&gt;&lt;/p&gt;&lt;p&gt;有看Doctor Who的人一定知道這像垃圾筒的機器人是誰啊.... &lt;/p&gt;&lt;p&gt;&lt;img src="http://blog.eddie.com.tw/gallery/1/DSC01416.jpg" border="0" /&gt; &lt;/p&gt;&lt;p&gt;而且壓它還有音效的咧，真讚&lt;/p&gt;&lt;p&gt;&lt;object type="application/x-shockwave-flash" width="450" height="350" data="http://www.youtube.com/v/o4S83qiwyFA" id="ltVideoYouTube"&gt;&lt;param name="movie" value="http://www.youtube.com/v/o4S83qiwyFA" /&gt;&lt;param name="wmode" value="transparent" /&gt;&lt;param name="allowScriptAcess" value="sameDomain" /&gt;&lt;param name="quality" value="best" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;param name="FlashVars" value="playerMode=embedded" /&gt;&lt;/object&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff6600"&gt;7. 其它&lt;/span&gt;&lt;/p&gt;&lt;p&gt;每個景點專屬的名信片當然也是不可少的(本來要寄的，但最後都捨不得只寄了一張最不喜歡的出去了..) &lt;/p&gt;&lt;p&gt;另外還有個搖控的小直昇機(給我爸玩的)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;結論：&lt;/p&gt;&lt;p&gt;要努力工作，趕快把錢賺回來了....!!!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/eddiekao/~4/6RFe_rCct5o" height="1" width="1"/&gt;</description>
   <link>http://feedproxy.google.com/~r/eddiekao/~3/6RFe_rCct5o/booty-from-uk</link>
      <pubDate>Thu, 04 Jun 2009 00:07:02 +0800</pubDate>   
  <feedburner:origLink>http://blog.eddie.com.tw/2009/06/04/booty-from-uk</feedburner:origLink></item>
    <item>
   <title>上台講話</title>
   <description>&lt;p&gt;&lt;img src="http://blog.eddie.com.tw/gallery/1/previews/ActionscriptIcon_400.png" border="0" alt="ActionScript 3.0" title="ActionScript 3.0" hspace="5" vspace="5" align="right" /&gt;Oops! 發現最後一篇blog竟然已經是去年的事了!! 是時間過太快還是我太懶了?&lt;br /&gt;&lt;br /&gt;最近因為幾個案子在趕著要上線，不久前的&lt;a href="http://osdc.tw/" target="_blank" title="OSDC.TW"&gt;OSDC.tw&lt;/a&gt;沒辦法全程參加，只好挑自已喜歡的Session參加(&lt;a href="http://blog.ericsk.org/" target="_blank" title="Ericsk"&gt;ericsk&lt;/a&gt;的&lt;a href="http://code.google.com/p/google-app-engine-oil/" target="_blank" title="GAEO"&gt;GAEO&lt;/a&gt;比我想像中的還好用)&lt;br /&gt;&lt;br /&gt;以前某個我不喜歡的老闆曾跟我說過，做presentation就像表演一樣&lt;br /&gt;&lt;br /&gt;近來我自告奮勇的找了一些對flash有興趣的朋友們每週來聚會，每次約2小時，我教大家怎麼來學 &lt;a href="http://en.wikipedia.org/wiki/ActionScript" target="_blank" title="ActionScript"&gt;ActionScript3.0&lt;/a&gt;。沒另外收費(只需各自分擔場地費，我還太嫩，還不到那種敢收學費的等級)&lt;br /&gt;&lt;br /&gt;常聽到「這個東西我懂，我只是不會講而已」，但我一直相信，真的懂的人一定是講得出來的；不會講不代表真的不會，只是還沒能完全透徹，某個環節沒學好，講不出來&lt;br /&gt;&lt;br /&gt;在台上講話實在是件不容易的事，一來得先克服緊張感，二來得讓自已的腦袋保持清醒。&lt;br /&gt;&lt;br /&gt;當然我也沒這麼佛心，開這樣的課當然是有目的：&lt;br /&gt;1. 透過在台上講課，讓自已對AS3更熟悉&lt;br /&gt;2. 訓練自已講話的技巧，練習怎麼掌握台下的反應(可能講太快或一下子講太難)&lt;br /&gt;3. 透過每週準備課程，讓自已不會跟AS3離太遠&lt;br /&gt;&lt;br /&gt;越是複雜的技術，要做這種大眾化的教學困難度也越高，像是知名的flash totur &lt;a href="http://theflashblog.com/" target="_blank" title="Lee Brimelow"&gt;Lee Brimelow&lt;/a&gt; 用影音的方式來教學，清楚又易懂&lt;br /&gt;&lt;br /&gt;最近在路邊牆上貼的一段話：「有困難是能力不夠，有麻煩是方法不對」看來，這條路還相當漫長&amp;nbsp; :)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/eddiekao/~4/_yPD5nceS-g" height="1" width="1"/&gt;</description>
   <link>http://feedproxy.google.com/~r/eddiekao/~3/_yPD5nceS-g/speak-on-the-stage</link>
      <pubDate>Wed, 06 May 2009 17:00:42 +0800</pubDate>   
  <feedburner:origLink>http://blog.eddie.com.tw/2009/05/06/speak-on-the-stage</feedburner:origLink></item>
    <item>
   <title>Doctrine, the PHP ORM Framework</title>
   <description>&lt;p&gt;&lt;img src="http://blog.eddie.com.tw/gallery/1/doctrine-logo.png" border="0" /&gt; &lt;/p&gt;&lt;p&gt;&lt;a href="http://www.doctrine-project.org/" target="_blank" title="PHP Doctrine"&gt;Doctrine&lt;/a&gt;是一個在PHP上的資料庫ORM(Object Relational Mapper)，最近手邊的幾個小案子透過Doctrine來實作。ORM的確是讓開發者少寫不少的SQL查詢，但相對的效能一定是比簡單的SQL要來得差，我想魚跟熊掌要兼得並不容易，便利跟效能之間總有個天平讓開發者來自已調整，所以ORM好不好用就見人見志囉。 &lt;/p&gt;&lt;p&gt;&lt;span style="font-size: medium"&gt;一、前置作業：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;1. 系統需求&lt;br /&gt;依官網上面提到的，Doctrine需要PHP 5.2.3以上的版本，除此之外就不用再另外安裝其它的套件或函式庫即可運作，不過如果要使用PDO(&lt;a href="http://tw2.php.net/manual/en/intro.pdo.php" target="_blank" title="PDO(PHP Data Object)"&gt;PHP Data Object&lt;/a&gt;)的話，則可能會需要另外安裝PDO驅動程式。&lt;/p&gt;&lt;p&gt;2. 檢查PDO驅動程式&lt;br /&gt;如果你要用PDO的話，想要知道你的主機上是不是有安裝你所需要的PDO驅動程式，只要一行簡單的PHP程式放到主機上執行：&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: #808080"&gt;&amp;lt;?php phpinfo(); ?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;p&gt;如果你有看到一段PDO的資訊，那差不多應該就是有安裝了，再確認一下是不是有你要的版本，以及是否啟用即可。&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: medium"&gt;二、取得原始檔&lt;/span&gt;&lt;/p&gt;&lt;p&gt;有幾種取得Doctrine的方法：&lt;/p&gt;&lt;p&gt;* SVN(Subversion)&lt;br /&gt;* Pear&lt;br /&gt;* Zip-package&lt;/p&gt;&lt;p&gt;如果你熟悉SVN的操作的話，這應該是最簡單使用的了。如果你只是想試玩一下Doctrine的功能的話，你可以下載官網上打包好的&lt;a href="http://www.doctrine-project.org/download/1_0_5/sandbox/1/format/tgz" target="_blank" title="Sanbox"&gt;Sandbox套件&lt;/a&gt;來玩。我個人比較喜歡官方打包好的壓縮檔 :) &lt;/p&gt;&lt;p&gt;什麼是Sandbox套件?&lt;br /&gt;Doctrine網站的&lt;a href="http://www.doctrine-project.org/download" target="_blank" title="Doctrine Download"&gt;下載區&lt;/a&gt;有貼心的打包了免設定的方便套件，直接下載、解壓縮後，就可以拿來試玩了。這裡面包括了一些範例schema檔案以及可以匯入的資料檔，讓你可以很快的就可以開始體驗Doctrine的優點。&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: medium"&gt;三、開始第一個專案&lt;/span&gt;&lt;br /&gt;在Doctrine裡，Doctrine_Record是最基本的元件。資料庫裡的每個資料表都會有一個對應的Doctrine_Record類別。這個類別是以&lt;a href="http://en.wikipedia.org/wiki/Active_record_pattern" target="_blank" title="Active Record Pattern"&gt;Active Record&lt;/a&gt;這個設計模式實作的，所以在其它語言像是在ROR(Ruby on Rails)上才看得到方便功能，在Doctrine裡也可以使用到了，即使是複雜的資料庫操作，透過這個類別也可以簡單的完成。&lt;br /&gt;&lt;br /&gt;在使用Doctrine_Record來建立資料表時，如果沒有特別指定Primary Key的話，Doctrine會自動幫你加一個叫做&amp;quot;id&amp;quot;的主索引欄位(自動編號)。接下來你需要做的事情，就是建立一個繼承自 Doctrine_Record類別的子類別，然後透過setTableDefinition()以及hasColumn()就可以來建立你的資料表。&lt;br /&gt;&lt;br /&gt;為了單純一些，我們這裡只先用一個表格做範例(多個表格之間的關聯性操作，例如一對一、一對多、多對多等關係，再另外開幾篇再寫)。假設我們現在要建立一個叫做&amp;quot;member&amp;quot;的會員資料表，這個資料表裡會有id、username、password以及建立日期這幾個欄位，我們可以這樣做：&lt;br /&gt;&lt;br /&gt;檔案：models/Member.php&lt;/p&gt;&lt;blockquote&gt;&amp;nbsp;&lt;span style="color: #999999"&gt;&amp;lt;?php&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class Member extends Doctrine_Record&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public function setTableDefinition()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 預設將會使用跟&amp;quot;user&amp;quot;做為資料表的名稱(同名)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 並且會自動加一個欄位id的主索引鍵 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;hasColumn(&amp;#39;username&amp;#39;, &amp;#39;string&amp;#39;, 30);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;hasColumn(&amp;#39;password&amp;#39;, &amp;#39;string&amp;#39;, 30);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public function setUp()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;actAs(&amp;#39;Timestampable&amp;#39;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;除了手工打造模型類別外，你也可以使用YAML格式的檔案來建立資料表的schema檔案，底下這個範例的設定跟上面這個類別是一樣的意思，而且也可以透過Doctrine的一些指令來互相轉換。&lt;br /&gt;&lt;br /&gt;檔案：schemas/schema.yml&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: #808080"&gt;Member:&lt;br /&gt;&amp;nbsp; columns:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; username: string(30)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; password: string(30)&lt;br /&gt;&amp;nbsp; actAs: [Timestampable]&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;p&gt;這裡要注意的是，YAML的縮排是有意義的，所以要特別注意縮排的層級。你可以用一行簡單的語法就可以把YAMLY檔案(.yml)轉換成模型類別(.php)：&lt;/p&gt;&lt;p&gt;檔案：createMode.php&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: #808080"&gt;&amp;nbsp;&amp;lt;?php&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; require_once &amp;#39;config/doctrine_config.php&amp;#39;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Doctrine::&lt;strong&gt;generateModelsFromYaml&lt;/strong&gt;(&amp;#39;schemas/schema.yml&amp;#39;, &amp;#39;models&amp;#39;); &lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;執行之後看一下models資料夾以models裡有一個自動產生的generated資料夾(如下圖)，你會看到有一個&amp;quot;Member.php&amp;quot;以及&amp;quot;BaseMember.php&amp;quot;。其中，&amp;quot;Member.php&amp;quot;是可以讓你自己定義一些功能用的，而&amp;quot;BaseMember.php&amp;quot;裡的內容則是依據YAML的內容幫你寫好的。(要特別注意BaseMember類別會在每次執行轉換的時候重新產生一次，而Member類別只會產生一次)。&lt;br /&gt;&lt;br /&gt;&lt;img src="http://blog.eddie.com.tw/gallery/1/doctrine-5.png" border="0" /&gt;&lt;/p&gt;&lt;p&gt;我們現在有一個透過YAML建立的Doctrine_Record類別，接下來就可以把它匯入資料庫來建立資料表了。&lt;br /&gt;&lt;br /&gt;檔案：modelToDatabase.php&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: #808080"&gt;&amp;nbsp;&amp;lt;?php&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; require_once &amp;#39;config/doctrine_config.php&amp;#39;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 建立資料表&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Doctrine::&lt;strong&gt;createTablesFromArray&lt;/strong&gt;(array(&amp;#39;Member&amp;#39;));&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;p&gt;這樣就搞定了!看一下資料表的樣子：&lt;/p&gt;&lt;p&gt;&lt;img src="http://blog.eddie.com.tw/gallery/1/doctrine-1.png" border="0" /&gt; &lt;/p&gt;&lt;p&gt;如前面說的，它會自動加上&amp;quot;id&amp;quot;這個欄位，而&amp;quot;Timestampable&amp;quot;則會自動幫忙加上&amp;quot;created_at&amp;quot;及&amp;quot;updated_at&amp;quot;這兩個欄位。&lt;/p&gt;&lt;p&gt;現在我們有一個資料表以及一個對應的模型類別可以讓我們來練習資料的基本操作了(新增、修改、刪除及查詢)。 &lt;/p&gt;&lt;p&gt;&lt;strong&gt;新增：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;檔案：testInsert.php &lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: #808080"&gt;&amp;lt;?php&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; require_once &amp;#39;config/doctrine_config.php&amp;#39;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $myTable = new Member;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $myTable-&amp;gt;username = &amp;#39;eddie&amp;#39;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $myTable-&amp;gt;password = &amp;#39;mypassword&amp;#39;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $myTable-&amp;gt;save();&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;資料表欄位的指定，除了上面這種物件式的存取方式外，也可以使用陣列的方式：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: #808080"&gt;&amp;nbsp; $myTable = new Member;&lt;br /&gt;&amp;nbsp; $myTable[&amp;#39;username&amp;#39;] = &amp;#39;eddie&amp;#39;;&lt;br /&gt;&amp;nbsp; $myTable[&amp;#39;password&amp;#39;] = &amp;#39;mypassword&amp;#39;;&lt;br /&gt;&amp;nbsp; $myTable-&amp;gt;&lt;strong&gt;save&lt;/strong&gt;(); &lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;不用寫什麼insert...into，只要一個save()就完成了! 回頭看一下資料表就會發現，有一些神奇的事情它幫忙做了。上面這段程式碼執行後，member資料表會長得像這樣： &lt;/p&gt;&lt;p&gt;&lt;img src="http://blog.eddie.com.tw/gallery/1/doctrine-2.png" border="0" /&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;修改： &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;假設剛剛寫入的那筆資料的id編號是1號，更新方法是先找到它，然後一樣用save()來更如下：&lt;/p&gt;&lt;p&gt;檔案：testUpdate.php &lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: #808080"&gt;&amp;lt;?php&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; require_once &amp;#39;config/doctrine_config.php&amp;#39;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $myTable = new Member;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $record = $myTable-&amp;gt;getTable()-&amp;gt;find(1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $record-&amp;gt;password = &amp;#39;mynewpassword&amp;#39;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $record-&amp;gt;save();&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;結果如下：&lt;/p&gt;&lt;p&gt;&lt;img src="http://blog.eddie.com.tw/gallery/1/doctrine-3.png" border="0" /&gt;&lt;/p&gt;&lt;p&gt;你會發現，password欄位變成&amp;quot;mynewpassword&amp;quot;之外，它的更新時間(updated_at)也跟著更新了。 &lt;/p&gt;&lt;p&gt;&lt;strong&gt;刪除：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;跟更新差不多，也是先找到那筆資料後，再給它一個delete()：&lt;/p&gt;&lt;p&gt;檔案：testDelete.php &lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: #808080"&gt;&amp;lt;?php&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; require_once &amp;#39;config/doctrine_config.php&amp;#39;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $myTable = new Member;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $myTable-&amp;gt;getTable()-&amp;gt;find(1)-&amp;gt;&lt;strong&gt;delete&lt;/strong&gt;();&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;查詢：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;假設我要找出id編號是1號的資料，可以這樣做： &lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: #999999"&gt;&amp;lt;?php&lt;br /&gt;&amp;nbsp; $myTable = new Member;&lt;br /&gt;&amp;nbsp; $result =$myTable-&amp;gt;getTable()-&amp;gt;find(1);&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;除了透過find方法外，Doctrine還有它自已一套叫做DQL的語法，使用方法大致如下： &lt;/p&gt;&lt;p&gt;檔案：testDQL.php &lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: #808080"&gt;&amp;lt;?php&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; require_once &amp;#39;config/doctrine_config.php&amp;#39;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $myTable = new Member;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $record = $myTable-&amp;gt;getTable()-&amp;gt;find(1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $record-&amp;gt;password = &amp;#39;mynewpassword&amp;#39;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $record-&amp;gt;save();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $result = Doctrine_Query::CREATE()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;gt;select(&amp;#39;*&amp;#39;)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;gt;from(&amp;#39;Member&amp;#39;)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;gt;where(&amp;#39;id = ?&amp;#39;, 1)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;gt;fetchArray();&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print_r($result);&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;印出來的結果如下：&lt;/p&gt;&lt;p&gt;&lt;img src="http://blog.eddie.com.tw/gallery/1/doctrine-4.png" border="0" /&gt; &lt;/p&gt;&lt;p&gt;上面的DQL相當於底下的SQL：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: #808080"&gt;select * from member where id = 1;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;其實DQL的細節也可以另外來寫一篇 :) &lt;/p&gt;&lt;p&gt;&lt;span style="font-size: medium"&gt;結語：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;老實說，如果只是簡單的查詢，Doctrine寫起來不見得比原本的SQL快，而且效能又比較差一些，但如果是比較複雜的查詢，透過Doctrine包裝好的一些方法，可以不用去想那些單引號、雙引號的問題外，也可以安全的避開可能的危機(例如SQL Injection) ，就如同最前面說的，便利跟效能，我會比較偏向便利的這一方。 &lt;/p&gt;&lt;p&gt;更多的細節，可參考&lt;a href="http://www.doctrine-project.org/documentation" target="_blank" title="PHP Doctrine Manual"&gt;Doctrine官網手冊&lt;/a&gt;，寫得滿詳細的。&lt;/p&gt;&lt;p&gt;上面的程式碼我也有打包了一份供大家參考囉 :) &lt;/p&gt;&lt;p&gt;&lt;a href="http://blog.eddie.com.tw/gallery/1/doctrine-lession1.rar" target="_blank" title="Source Code"&gt;檔案下載&lt;/a&gt; &lt;/p&gt;&lt;p&gt;使用前請先看一下config/doctrine_config.php裡面的資料庫相關設定。&lt;/p&gt;&lt;p&gt;相關連結：&lt;/p&gt;&lt;p&gt;．&lt;a href="http://www.doctrine-project.org/" target="_blank" title="Doctrine"&gt;Doctrine官方網站&lt;/a&gt; &lt;br /&gt;．&lt;a href="http://groups.google.com/group/doctrine-user" target="_blank" title="Doctrine User Group"&gt;Doctrine User Group&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/eddiekao/~4/RaYiEnjbHR4" height="1" width="1"/&gt;</description>
   <link>http://feedproxy.google.com/~r/eddiekao/~3/RaYiEnjbHR4/doctrine-the-php-orm-framework</link>
      <pubDate>Tue, 23 Dec 2008 11:00:49 +0800</pubDate>   
  <feedburner:origLink>http://blog.eddie.com.tw/2008/12/23/doctrine-the-php-orm-framework</feedburner:origLink></item>
    <item>
   <title>AMFPHP-搭起Flash與PHP的美麗橋樑</title>
   <description>&lt;p&gt;&lt;a id="res_34" href="http://blog.eddie.com.tw/gallery/1/amfphp_logo.gif"&gt;&lt;/a&gt;&lt;img src="http://blog.eddie.com.tw/gallery/1/previews/amfphp_logo.gif" border="0" alt="AMFPHP Logo" title="AMFPHP Logo" hspace="3" vspace="3" width="120" height="27" align="left" /&gt;Flash在跟Server在交換資料，比較常見的是一般的文字訊息或是XML，我自己在趕時間的時候，會偷懶的隨便echo一個字出來知會flash說server程式已經做完了或是程式執行之後的結果，不趕時間且資料量較多的時候，則會乖乖的用XML。不過，最近開始我比較常用的是AMF跟&lt;a href="http://www.json.org/" target="_blank" title="JSON"&gt;JSON&lt;/a&gt;這兩個方法，其實都還滿方便的，各有其優缺點。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;AMF(Action Message Format)，由&lt;a href="http://www.adobe.com/" target="_blank" title="Adobe Inc"&gt;Adobe&lt;/a&gt;公司推出的規格，主要是用來給flash以RPC的方式來交換資料用的，在flash player 6的版本就已經開始支援(AMF0)，直到flash player 9才又推出新規格(AMF3)。其它細節可參考：&lt;a href="http://en.wikipedia.org/wiki/Action_Message_Format"&gt;http://en.wikipedia.org/wiki/Action_Message_Format&lt;/a&gt;&lt;/p&gt;&lt;p&gt;接下來就來個簡單的實作吧 :)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. 下載AMF gateway&lt;br /&gt;&lt;/strong&gt;找個自己順手的語言吧&lt;/p&gt;&lt;p&gt;AMFPHP：這是PHP的&lt;br /&gt;&lt;a href="http://www.amfphp.org/" target="_blank" title="AMFPHP"&gt;http://www.amfphp.org/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;PyAMF：這是Python的(還不熟，努力學習中)&lt;br /&gt;&lt;a href="http://pyamf.org/" target="_blank" title="PyAMF"&gt;http://pyamf.org/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;AMF.NET：這是.NET的&lt;br /&gt;&lt;a href="http://amfnet.openmymind.net/" target="_blank" title="AMF for .Net"&gt;http://amfnet.openmymind.net/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;光看名字大概就能猜到它的後端是用什麼做的&lt;br /&gt;其它還有for Java或其它的，有興趣的可以繼續google翻翻看&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. 安裝AMF gateway(以AMFPHP為例)&lt;/strong&gt;&lt;br /&gt;安裝方法很容易的，只要把下載下來的壓縮檔解開，放在Web server底下一個自己找得到的路徑就行了&lt;/p&gt;&lt;p&gt;我是放在 &lt;u&gt;http://127.0.0.1/test/amfphp/&lt;/u&gt; 底下&lt;/p&gt;&lt;p&gt;AMFPHP有提供一個很棒的Service Browser：&lt;br /&gt;&lt;u&gt;http://127.0.0.1/test/amfphp/browser&lt;/u&gt;&lt;br /&gt;這是個用Flex做的介面，可以清楚列出目前在AMF gateway上的服務&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. 在AMF gateway上新增一個服務&lt;/strong&gt;&lt;br /&gt;我做了一個簡單的php類別檔，存檔為callme.php，並放在AMF gateway的services資料夾裡面(文末有原始檔連結)。php不像java或as一樣硬性規定類別名稱一定要跟檔名一樣...至少php5還沒有，但建立這習慣也不錯。&lt;/p&gt;&lt;p&gt;&amp;lt;?php&lt;br /&gt;class callme&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; function callmeplease($text)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return $text;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;上面，我做了一個&lt;u&gt;callme&lt;/u&gt;的類別，然後裡面放了一個&lt;u&gt;callmeplease&lt;/u&gt;的方法，這個方法會接收一個參數，執行完成之後，會把傳入的參數return回來&lt;br /&gt;這裡只是簡單直接return而已，更複雜的資料庫存取程式也可以寫在這裡....&lt;/p&gt;&lt;p&gt;接下來看一下Service Browser，會發現寫寫的那個新的服務在的左手邊的列表裡&lt;br /&gt;&lt;img src="http://blog.eddie.com.tw/gallery/1/amfphp.gif" border="0" alt="AMFPHP Browser" width="546" height="276" /&gt;&lt;br /&gt;在右邊的Text輸入文字，按一下右邊的「Call」，應該就可以直接看到結果。(中文支持問題請見文末補充)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4. 新增一個Fla(這裡以AS3.0為例)&lt;/strong&gt;&lt;br /&gt;import flash.net.*;&lt;/p&gt;&lt;p&gt;// 新增一個NetConnection物件&lt;br /&gt;var test:NetConnection = new NetConnection();&lt;/p&gt;&lt;p&gt;// 連上AMF gateway&lt;br /&gt;// 這裡每家AMF gateway的實作方法應該都有差別，細節請記得看該實作說明&lt;br /&gt;test.connect(&amp;#39;http://127.0.0.1/test/amfphp/gateway.php&amp;#39;);&lt;/p&gt;&lt;p&gt;// 準備一個Responder物件來接收事件，用法及參數請參考F1說明&lt;br /&gt;var returnResult:Responder = new Responder(ok, ng);&lt;/p&gt;&lt;p&gt;function ok(res:Object):void {&lt;br /&gt;&amp;nbsp; trace(res);&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;function ng(res:Object):void {&lt;br /&gt;&amp;nbsp; trace(res);&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;//以上，我做了ok跟ng兩個簡單小function，分別是trace出它們接收到的物件&lt;/p&gt;&lt;p&gt;test.call(&amp;#39;callme.callmeplease&amp;#39;, returnResult, &amp;#39;hi, flash&amp;#39;);&lt;br /&gt;// 這裡是最重要的動作，就是直接用call這個方法&lt;br /&gt;// &amp;quot;呼叫&amp;quot;在gateway上面的callme這個服務裡的callmeplease這個方法&lt;br /&gt;// 第二個參數是接收反應的responder，第三個參數是給callmeplease的參數&lt;/p&gt;&lt;p&gt;以上，callme.callmeplease會把&amp;quot;hi, flash&amp;quot;傳給AMF gateway，然後gateway回傳&amp;quot;hi, flash&amp;quot;回來給flash。順利的話，Ctrl + Enter執行，就會在output視窗看到輸出的東西了。&lt;/p&gt;&lt;p&gt;就這樣，你的Flash已經可以跟各家有支援AMF的gateway&amp;quot;對談&amp;quot;了&lt;/p&gt;&lt;p&gt;上面提到的原始檔在這裡可以拿得到(其實沒幾行字，就一個php跟fla)&lt;br /&gt;&lt;a href="http://code.eddie.com.tw/downloads/flash/AMF.rar" target="_blank" title="Source Code"&gt;http://code.eddie.com.tw/downloads/flash/AMF.rar&lt;/a&gt;&lt;/p&gt;&lt;p&gt;還是看不懂嗎? 沒關係，這裡有個很棒的影音教學，看完跟著作一遍就知道大概是怎麼運作的了&lt;br /&gt;&lt;a href="http://www.gotoandlearn.com/player.php?id=78" target="_blank" title="GotoAndLearn"&gt;http://www.gotoandlearn.com/player.php?id=78&lt;/a&gt;&lt;/p&gt;&lt;p&gt;希望對大家有幫助 :)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;補充1：&lt;/strong&gt;&lt;br /&gt;AMF不久之後已經可以在&lt;a href="http://framework.zend.com/" target="_blank" title="Zend Framework"&gt;Zend Framework&lt;/a&gt;裡找到native module了，ZF真的是包山包海了 :)((而且ZF-AMF就是由AMFPHP裡的主導人&lt;a href="http://wadearnold.com/blog/" target="_blank" title="Wade Arnold"&gt;Wade Arnold&lt;/a&gt;來親自操刀)。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;補充2：&lt;/strong&gt;&lt;br /&gt;AMFPHP預設的編碼是不支援中文的(會出現亂碼)，不過只要修改一下gateway的程式碼即可。&lt;/p&gt;&lt;p&gt;使用文字編輯器，開啟AMFPHP資料夾的gateway.php，應該可以找到一段跟字碼有關的：&lt;br /&gt;$gateway-&amp;gt;setCharsetHandler(&amp;quot;utf8_decode&amp;quot;, &amp;quot;ISO-8859-1&amp;quot;, &amp;quot;ISO-8859-1&amp;quot;);&lt;/p&gt;&lt;p&gt;把它修改成：&lt;br /&gt;$gateway-&amp;gt;setCharsetHandler(&amp;quot;utf8_decode&amp;quot;, &amp;quot;UTF-8&amp;quot;, &amp;quot;UTF-8&amp;quot;);&lt;/p&gt;&lt;p&gt;或是如果你的PHP模組裡有iconv的話也可以這樣改：&lt;br /&gt;$gateway-&amp;gt;setCharsetHandler(&amp;quot;iconv&amp;quot;,&amp;quot;UTF-8&amp;quot;,&amp;quot;UTF-8&amp;quot;);&lt;/p&gt;&lt;p&gt;記得，不要改flash裡的useCodePage =&amp;nbsp;true，雖然可能也ok，但這是走回頭路....能使用Unicode就盡量使用它吧 :)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/eddiekao/~4/Iefadl8stOY" height="1" width="1"/&gt;</description>
   <link>http://feedproxy.google.com/~r/eddiekao/~3/Iefadl8stOY/amfphp-tutorial</link>
      <pubDate>Sun, 12 Oct 2008 08:35:32 +0800</pubDate>   
  <feedburner:origLink>http://blog.eddie.com.tw/2008/10/12/amfphp-tutorial</feedburner:origLink></item>
    <item>
   <title>dojo toolkit入門(一)</title>
   <description>&lt;p&gt;&lt;img src="http://blog.eddie.com.tw/gallery/1/dojo_logo.jpg" border="0" alt="Dojo" title="Dojo" hspace="3" vspace="3" width="102" height="74" align="left" /&gt;雖然我個人還是比較喜歡&lt;a href="http://jquery.com/" target="_blank" title="jQuery"&gt;jQuery&lt;/a&gt;的簡潔方便，而且一些常用的function也都jQuery化了，不過畢竟&lt;a href="http://dojotoolkit.org/" target="_blank" title="Dojo Toolkit"&gt;Dojo&lt;/a&gt;從&lt;a href="http://framework.zend.com" target="_blank" title="Zend Framework"&gt;Zend Framework&lt;/a&gt; 1.6版後就被officially的收進去了，為了ZF寫起來的完整性，還是花點時間來研究一下。&lt;/p&gt;&lt;p&gt;廢話不多說，先來試玩一下!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;hr /&gt;步驟一：下載它&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;到&lt;a href="http://dojotoolkit.org/" target="_blank" title="Dojo Toolkit"&gt;dojo toolkit&lt;/a&gt;的網站即可下載(不過其實也可以不用下載...請見步驟二) &lt;p&gt;&lt;strong&gt;&lt;hr /&gt;步驟二：安裝它&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;基本上，下載壓縮檔回來後，解壓縮後放在你的網頁的目錄(放哪裡都可，只要你能找得到就好)&lt;br /&gt;假設我放在js/dojo底下，接下來只要一行： &lt;p&gt;&lt;span style="font-size: x-small; font-family: arial,helvetica,sans-serif"&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&lt;span style="color: #008080"&gt;js/dojo/dojo/dojo.js&lt;/span&gt;&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;這樣就算完成安裝了..&lt;/p&gt;&lt;p&gt;除了這種方式外，也有不用下載整包回來的方法，就是使用別人家(CDN or Google)準備好的服務：&lt;br /&gt;1. &lt;strong&gt;AOL的CDN(Content Delivery Network)：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: x-small; font-family: arial,helvetica,sans-serif"&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&lt;span style="color: #008080"&gt;http://o.aolcdn.com/dojo/1.1.1/dojo/dojo.xd.js&lt;/span&gt;&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;2. &lt;strong&gt;Google Ajax Libraries API：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: x-small; font-family: arial,helvetica,sans-serif"&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&lt;span style="color: #008080"&gt;http://ajax.googleapis.com/ajax/libs/dojo/1.1.1/dojo/dojo.xd.js&lt;/span&gt;&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;註：Google上還有host別的Ajax library(如jQuery、MooTools..等)，詳情請洽&lt;a href="http://code.google.com/apis/ajaxlibs" target="_blank" title="Google Ajax Libraries API"&gt;Google Ajax Libraries API&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;使用線上版跟本機版各有優缺點，線上版的好處就是省頻寬，畢竟dojo整包檔案解開壓縮也不小，有十幾MB，若能使用像Google這種又快又穩定的主機頻寬來host，多少也是可以省一些的；當然缺點就是畢竟是別人家免費提供的服務，萬一有什麼&amp;quot;萬一&amp;quot;的話，可能會導致全站的功能都出問題。而本機版的優缺點就剛好跟線上版的相反(個人比較偏好本機版安裝法)。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;hr /&gt;步驟三：使用它&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;在步驟二的地方，當你指定&amp;lt;script&amp;gt;的src的時候，其實就已經使用了... &lt;p&gt;先來試一下DOM selector跟onLoad事件：&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: x-small; font-family: arial,helvetica,sans-serif"&gt;&lt;span style="color: #808080"&gt;&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=utf-8&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Dojo Test&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&lt;span style="color: #008080"&gt;http://o.aolcdn.com/dojo/1.1.1/dojo/dojo.xd.js&lt;/span&gt;&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;span style="color: #008080"&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; dojo.addOnLoad(function(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dojo.byId(&amp;quot;test1&amp;quot;).innerHTML = &amp;quot;Hello, Dojo&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dojo.connect(dojo.byId(&amp;quot;btn1&amp;quot;), &amp;quot;onclick&amp;quot;, function(evt){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert(&amp;quot;Hello again, Dojo!&amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; })&lt;br /&gt;&amp;nbsp;});&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;div id=&amp;quot;test1&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;clickme!&amp;quot; id=&amp;quot;btn1&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://labs.eddie.com.tw/dojo/hello.htm" target="_blank" title="dojo online demo"&gt;線上測試&lt;/a&gt;&lt;img src="http://blog.eddie.com.tw/js/tinymce/plugins/emotions/images/smiley-cool.gif" border="0" alt="Cool" title="Cool" width="18" height="18" /&gt;&lt;/p&gt;&lt;p&gt;簡單的說明上面用到的幾個功能：&lt;/p&gt;&lt;p&gt;1. dojo.addOnLoad&lt;br /&gt;就是在頁面讀取完成之後會做的事，有點像一般的onLoad功能，不過順序在它之後。&lt;/p&gt;&lt;p&gt;2. dojo.byId(&amp;quot;test1&amp;quot;)&lt;br /&gt;這將會回傳在頁面裡面叫id叫做&amp;quot;test1&amp;quot;的元素(在上面這裡是一個div)，功能有點像原來的document.getElementById()。再透過設定這個回傳回來的物件的innerHTML的值，就可以直接讓這個Div區塊裡面的值有變化。&lt;/p&gt;&lt;p&gt;3. dojo.connect()&lt;br /&gt;這個比較有趣，這個function可以傳入四個參數&lt;br /&gt;第一個是參數是物件&lt;br /&gt;第二個參數是事件(字串)&lt;br /&gt;第三個參數也是物件(可省略)&lt;br /&gt;第四個參數是要綁的事件(字串)，可以另外在別的地方定義好function再掛上來，也可以像上例一樣直接給它一個anonymous function&lt;br /&gt;簡單的說，dojo.connect()可以翻譯成「把某個事件(或function)，綁到某個物件的某個事件(或function)上」，直接來看上面的例子：&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: x-small; color: #008080; font-family: arial,helvetica,sans-serif"&gt;dojo.connect(dojo.byId(&amp;quot;btn1&amp;quot;), &amp;quot;onclick&amp;quot;, function(evt){&lt;br /&gt;&amp;nbsp; alert(&amp;quot;Hello again, Dojo!&amp;quot;);&lt;br /&gt;})&lt;/span&gt;&lt;/p&gt;&lt;p&gt;以上例來翻譯成白話文就是說&lt;br /&gt;「我把一個anonymous function，綁到id為btn1的那個按鈕的onclick事件上」，所以，當觸發這個按鈕的onclick事件(也就是點擊它)，就會跟著觸動這個function，丟出&amp;quot;Hello again, Dojo!&amp;quot;的字樣出來。&lt;/p&gt;&lt;p&gt;這部份的細節可再參考Dojo的線上手冊&lt;/p&gt;&lt;p&gt;目前國內用dojo的人看起似乎並不多，日前去書局弄了一本&lt;a href="http://tlsj.tenlong.com.tw/WebModule/BookSearch/bookSearchViewAction.do?isbn=0596516487&amp;amp;sid=45369" target="_blank" title="Dojo, the Definitive Guide"&gt;Dojo-The Definitive Guide&lt;/a&gt;，仍在研究中，看來這個Dojo能做的事情還挺多，有心得再來繼續貼。&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/eddiekao/~4/kNTWQ1SZ3Ho" height="1" width="1"/&gt;</description>
   <link>http://feedproxy.google.com/~r/eddiekao/~3/kNTWQ1SZ3Ho/dojo-toolkit-tutorial-part-1</link>
      <pubDate>Tue, 16 Sep 2008 01:25:50 +0800</pubDate>   
  <feedburner:origLink>http://blog.eddie.com.tw/2008/09/16/dojo-toolkit-tutorial-part-1</feedburner:origLink></item>
    <item>
   <title>Omit the PHP closing tag "?&amp;gt;"</title>
   <description>&lt;p&gt;自從開始改用ZF後，開始慢慢的調整自己的code style，過程也許會痛苦，但相信結果應該會是甜美的。在ZF的&lt;a href="http://framework.zend.com/manual/en/coding-standard.php-file-formatting.html" target="_blank" title="Zend Framework Coding Standard"&gt;Coding Standard&lt;/a&gt;裡有一段是這麼寫的：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;For files that contain only PHP code, the closing tag (&amp;quot;?&amp;gt;&amp;quot;) is never permitted. It is not required by PHP, and omitting it prevents the accidental injection of trailing whitespace into the response. &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;看不太懂哪來的injection，後來再翻了一下&lt;a href="http://www.php.net/manual/en/language.basic-syntax.instruction-separation.php" target="_blank" title="PHP"&gt;PHP的官方資料&lt;/a&gt;才發現也有提到這段：&lt;/p&gt;&lt;p&gt;&lt;a href="http://tw.php.net/ini.core"&gt;&lt;/a&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The closing tag of a PHP block at the end of a file is &lt;strong&gt;optional&lt;/strong&gt;, and in some cases omitting it is helpful when using &lt;strong&gt;include()&lt;/strong&gt; or &lt;strong&gt;require()&lt;/strong&gt;, so unwanted whitespace will not occur at the end of files, and you will still be able to add headers to the response later. It is also handy if you use output buffering, and would not like to see added unwanted whitespace at the end of the parts generated by the included files.&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;後來自己動手做了一下實驗：&lt;/p&gt;&lt;p&gt;檔名：inc.php&lt;br /&gt;&lt;span style="color: #800000"&gt;&amp;lt;?php&lt;br /&gt;&amp;nbsp; // do something&lt;br /&gt;?&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;檔名：test.php&lt;br /&gt;&lt;span style="color: #800000"&gt;&amp;lt;?php&lt;br /&gt;&amp;nbsp; require_once(&amp;#39;inc.php&amp;#39;);&lt;br /&gt;&amp;nbsp; session_start();&lt;br /&gt;?&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;執行test.php，看起來是沒什麼大問題；不過如果在inc.php的&amp;quot;?&amp;gt;&amp;quot;後面再按幾下enter，多加幾行空白行，test.php就會丟出警告訊息&amp;quot;Cannot send session cookie - headers already sent by...&amp;quot;，如果把inc.php的&amp;quot;?&amp;gt;&amp;quot;拿掉就ok了。&lt;/p&gt;&lt;p&gt;原來，在&amp;quot;?&amp;gt;&amp;quot;之後多按的幾個enter(newline)也會被當成資料丟給瀏覽器，所以如果include了這樣的檔案進來，會讓header()或session_start()之類的指令丟出&amp;quot;headers already sent by...&amp;quot;的警告訊息，而如果省去結尾的&amp;quot;?&amp;gt;&amp;quot;則可以避免這個問題。&lt;/p&gt;&lt;p&gt;果然魔鬼都是還是躲在細節裡，&lt;a href="http://www.php.net/manual/en/" target="_blank" title="PHP Manual"&gt;PHP的手冊&lt;/a&gt;還是要多看啊! &lt;img src="http://blog.eddie.com.tw/js/tinymce/plugins/emotions/images/smiley-cool.gif" border="0" alt="Cool" title="Cool" width="18" height="18" /&gt;&lt;/p&gt;&lt;p&gt;順帶一提，ZF有&lt;a href="http://framework.zend.com/docs/overview" target="_blank" title="Zend Framework Online Document"&gt;PDF版的離線手冊&lt;/a&gt;了，一千多頁，雖然不見得有比線上方便，但沒網路的時候倒還不錯用(我是把它放到PDA裡，上廁所可以看)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/eddiekao/~4/XVl663NWZl0" height="1" width="1"/&gt;</description>
   <link>http://feedproxy.google.com/~r/eddiekao/~3/XVl663NWZl0/omit-the-php-closing-tag</link>
      <pubDate>Wed, 10 Sep 2008 15:29:21 +0800</pubDate>   
  <feedburner:origLink>http://blog.eddie.com.tw/2008/09/10/omit-the-php-closing-tag</feedburner:origLink></item>
    <item>
   <title>Zend Framework之Zend_Tool</title>
   <description>&lt;p&gt;&lt;img src="http://blog.eddie.com.tw/gallery/1/zf_logo.gif" border="0" alt="Zend Framework Logo" title="Zend Framework Logo" hspace="3" vspace="3" width="66" height="53" align="left" /&gt;看到&lt;a href="http://www.djangoproject.com/" target="_blank" title="django"&gt;django&lt;/a&gt;、&lt;a href="http://www.rubyonrails.org/" target="_blank" title="ruby on rails"&gt;rails&lt;/a&gt;之類的framework都有可以快速的產生scaffold的工具，甚至連同樣都是php framework的&lt;a href="http://cakephp.org/" target="_blank" title="CakePHP"&gt;cakephp&lt;/a&gt;也有...還好我之前都是在Zend Studio裡直接new一個Zend Framework Project，它也會自動產生基本的架構出來。隨著Zend Framework 1.6版的上市，它也提供了類似的方便工具(不過從目錄名字看起來還是在實驗階段而已..)&lt;/p&gt;&lt;p&gt;我的作業環境是WinXP，如果要在別的系統可參考最底下的參考資料，有提到怎麼修改路徑。&lt;/p&gt;&lt;p&gt;簡單的使用方法如下：&lt;br /&gt;&lt;strong&gt;Step 1. &lt;/strong&gt;&lt;br /&gt;到&lt;a href="http://framework.zend.com/" target="_blank" title="Zend Framework"&gt;ZF官網&lt;/a&gt;下載Zend Framework 1.6，解壓縮之後裡面有個laboratory資料夾，裡面有個ZendL，把它放到你的include_path底下。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Step 2. &lt;/strong&gt;&lt;br /&gt;在laboratory/Zend_Tool/bin裡有個zf.bat跟zf.php，改一下zf.bat裡的php.exe的路徑(如果放在跟php.exe同目錄就不用改了)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Step 3. &lt;/strong&gt;&lt;br /&gt;以上設定完成之後，到cmd模式下，輸入&amp;quot;&lt;strong&gt;zf show version&lt;/strong&gt;&amp;quot;，應該會出現「Zend Framework Version: 1.6.0」字樣&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Step 4. &lt;/strong&gt;&lt;br /&gt;隨便找一個資料夾來試試，輸入&amp;quot;&lt;strong&gt;zf create project&lt;/strong&gt;&amp;quot;，等一會，它就會幫你把資料夾跟檔案產生好了(如下圖)&lt;br /&gt;&lt;img src="http://blog.eddie.com.tw/gallery/1/zf_scaffold.gif" border="0" width="165" height="233" /&gt;&lt;/p&gt;&lt;p&gt;完成! 這樣就完成了基本的ZF MVC的骨架出來了，也做了簡單的bootstrap跟幾個預設的controller跟view。不過我發現這個Zend_Tool會把ZF的library整個也複製一份到library底下，雖然是方便發布，不過我個人是習慣不把它放在web資料夾下.. &lt;/p&gt;&lt;p&gt;結論：不管是Zend Studio或是Zend_Tool都可以快速的產生架構出來，我還是習慣用自己的架構...&lt;img src="http://blog.eddie.com.tw/js/tinymce/plugins/emotions/images/smiley-cool.gif" border="0" alt="Cool" title="Cool" width="18" height="18" /&gt;&lt;/p&gt;&lt;p&gt;參考資料：&lt;a href="http://devzone.zend.com/article/3811-Using-Zend_Tool-to-start-up-your-ZF-Project" target="_blank" title="Zend Developer Zone"&gt;Zend&amp;nbsp;Developer Zone&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/eddiekao/~4/hOvnVi6yDw8" height="1" width="1"/&gt;</description>
   <link>http://feedproxy.google.com/~r/eddiekao/~3/hOvnVi6yDw8/zend-tool</link>
      <pubDate>Sat, 06 Sep 2008 14:21:27 +0800</pubDate>   
  <feedburner:origLink>http://blog.eddie.com.tw/2008/09/06/zend-tool</feedburner:origLink></item>
    <item>
   <title>Zend Framework 1.6 Release</title>
   <description>&lt;p&gt;&lt;img src="http://blog.eddie.com.tw/gallery/1/zf_logo.gif" border="0" alt="Zend Framework Logo" title="Zend Framework Logo" hspace="3" vspace="3" width="66" height="53" align="left" /&gt;之前用了一陣子的RC版，今天終於正式&lt;a href="http://framework.zend.com/download/current/" target="_blank" title="Zend Framework 1.6"&gt;Release&lt;/a&gt;了，這個1.6版的ZF比1.5版多了不少有趣的東西啊(不過選在跟新聞炒很大的&lt;a href="http://www.google.com/chrome" target="_blank" title="Google Chrome"&gt;google chrome&lt;/a&gt;同一天出來，鋒頭多少被蓋去了一點點)&lt;/p&gt;&lt;p&gt;‧Dojo Integration&lt;br /&gt;‧SOAP&lt;br /&gt;‧Preview of Tooling Project in Laboratory (see /laboratory folder)&lt;br /&gt;‧Unit Testing Harness for Controllers&lt;br /&gt;‧Lucene 2.3 Index File Format Support&lt;br /&gt;‧Zend_Session save handler for Database Tables&lt;br /&gt;‧Paginator Component&lt;br /&gt;‧Text/Figlet Support&lt;br /&gt;‧ReCaptcha Service&lt;br /&gt;‧Captcha Form Element&lt;br /&gt;‧Zend_Config_Xml Attribute Support &lt;br /&gt;‧Zend_File_Transfer Component&lt;br /&gt;‧File Upload Form Element&lt;br /&gt;‧Zend_Wildfire Component with FireBug Log Writer&lt;br /&gt;‧Media View Helpers (Flash, Quicktime, Object, and Page)&lt;br /&gt;‧Support in Zend_Translate for INI File Format&lt;/p&gt;&lt;p&gt;對我工作上比較大的影響是跟Dojo的整合(我還是比較喜歡jQuery)，這裡&lt;a href="http://andigutmans.blogspot.com/2008/09/zend-framework-16-featuring-dojo-soap.html"&gt;有篇文章&lt;/a&gt;有寫到1.6版新增的一些功能介紹&lt;/p&gt;&lt;p&gt;另外，分頁、表單認證碼及檔案上傳功能....這些在做網站時常用的功能，之前都是自己拼裝出來用的，結果在1.6也都加進來了&lt;img src="http://blog.eddie.com.tw/js/tinymce/plugins/emotions/images/smiley-cool.gif" border="0" alt="Cool" title="Cool" width="18" height="18" /&gt;。我試著直接把1.5版昇級為1.6版，目前手邊的案子看起來都還滿正常的。&lt;/p&gt;&lt;p&gt;下載連結：&lt;a href="http://framework.zend.com/download/current/" target="_blank" title="Zend Framework"&gt;http://framework.zend.com/download/current/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/eddiekao/~4/MvEju_Xy12U" height="1" width="1"/&gt;</description>
   <link>http://feedproxy.google.com/~r/eddiekao/~3/MvEju_Xy12U/zend-framework-1.6-release</link>
      <pubDate>Wed, 03 Sep 2008 09:47:24 +0800</pubDate>   
  <feedburner:origLink>http://blog.eddie.com.tw/2008/09/03/zend-framework-1.6-release</feedburner:origLink></item>
    <item>
   <title>IE6之Select的Z-Index設定</title>
   <description>&lt;p&gt;&lt;img src="http://blog.eddie.com.tw/gallery/1/jquery.jpg" border="0" alt="jQuery logo" title="jQuery logo" width="110" height="78" align="left" /&gt;在IE6的環境下，如果網頁上有div區塊和下拉選單重疊在一起的時候，即使再怎麼調整下拉選單的z-index，下拉選單還是會把div區塊蓋住(在Firefox是正常的)，google了一下網路上的資料，大多是用iframe來解這個問題，但弄iframe寫起來也是花時間而且不順手。有善心人士把這段程式碼寫成&lt;a href="http://jquery.com/" target="_blank" title="jQuery"&gt;jQuery&lt;/a&gt;的plugin：&lt;a href="http://plugins.jquery.com/project/bgiframe" target="_blank" title="jQuery plugin - bgiframe"&gt;bgiframe&lt;/a&gt;，只要簡單的呼叫plugin，就可以在div底下插入一段可以把下拉選單遮住的iframe，div區塊就可以正常顯示了。&lt;/p&gt;&lt;p&gt;程式碼很簡單，直接看線上demo就知道了；有需要的也可以整包下載回去&lt;img src="http://blog.eddie.com.tw/js/tinymce/plugins/emotions/images/smiley-cool.gif" border="0" alt="Cool" title="Cool" width="18" height="18" /&gt;&lt;/p&gt;&lt;p&gt;線上demo：&lt;a href="http://labs.eddie.com.tw/javascript/div.htm" target="_blank"&gt;http://labs.eddie.com.tw/javascript/div.htm&lt;/a&gt;&lt;br /&gt;整包下載：&lt;a href="http://labs.eddie.com.tw/javascript/div.rar" target="_blank"&gt;http://labs.eddie.com.tw/javascript/div.rar&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/eddiekao/~4/5-sQRBrC9jQ" height="1" width="1"/&gt;</description>
   <link>http://feedproxy.google.com/~r/eddiekao/~3/5-sQRBrC9jQ/select-z-index-in-ie6</link>
      <pubDate>Fri, 08 Aug 2008 18:13:03 +0800</pubDate>   
  <feedburner:origLink>http://blog.eddie.com.tw/2008/08/08/select-z-index-in-ie6</feedburner:origLink></item>
  </rdf:RDF>
