<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>jQuery, Ajax, PHP, JSON, XML, Web Technologies &#187; jQuery</title>
	<atom:link href="http://blog.chonla.com/category/jquery/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.chonla.com</link>
	<description>คุยกันเรื่อง jQuery, Ajax, PHP, JSON, XML และ Web Technologies เป็นภาษาไทยกันดีกว่า</description>
	<lastBuildDate>Tue, 17 Jan 2012 18:27:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>enable() กับ disable() ที่ขาดหายไปใน jQuery</title>
		<link>http://blog.chonla.com/2010/12/enable-%e0%b8%81%e0%b8%b1%e0%b8%9a-disable-%e0%b8%97%e0%b8%b5%e0%b9%88%e0%b8%82%e0%b8%b2%e0%b8%94%e0%b8%ab%e0%b8%b2%e0%b8%a2%e0%b9%84%e0%b8%9b%e0%b9%83%e0%b8%99-jquery/</link>
		<comments>http://blog.chonla.com/2010/12/enable-%e0%b8%81%e0%b8%b1%e0%b8%9a-disable-%e0%b8%97%e0%b8%b5%e0%b9%88%e0%b8%82%e0%b8%b2%e0%b8%94%e0%b8%ab%e0%b8%b2%e0%b8%a2%e0%b9%84%e0%b8%9b%e0%b9%83%e0%b8%99-jquery/#comments</comments>
		<pubDate>Thu, 02 Dec 2010 17:57:26 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[disable]]></category>
		<category><![CDATA[enable]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=310</guid>
		<description><![CDATA[คนใช้ jQuery น่าจะเคยเจอปัญหาเดียวกันคือ อยากจะ disable หรือ enable ปุ่ม ด้วย jQuery แต่ติดตรงที่มันไม่มี function มาให้ ทำให้เราต้องเขียนใช้งานเองบ่อย ๆ ปกติแล้ว ถ้าใช้ไม่เยอะ ผมจะเขียนตรง ๆ ง่าย ๆ เอา โดยจะเขียนประมาณนี้ครับ $('#selector').attr('disabled','disabled'); // สำหรับ disable $('#selector').removeAttr('disabled'); // สำหรับ enable แต่ถ้าใช้บ่อย ๆ แล้ว จะให้มาเขียนแบบนี้อยู่ตลอด ก็คงจะไม่สะดวกนัก จะให้เขียนเป็น function มาครอบก็อาจจะดูไม่เก๋เท่ากับเขียนให้มันเป็น แบบ plugin ซะเลย (function($)  { $.fn.disable = function() {return this.attr('disabled', true).addClass('disabled');} $.fn.enable = function() {return this.removeClass('disabled').attr('disabled', [...]]]></description>
			<content:encoded><![CDATA[<p>คนใช้ jQuery น่าจะเคยเจอปัญหาเดียวกันคือ อยากจะ disable หรือ enable ปุ่ม ด้วย jQuery แต่ติดตรงที่มันไม่มี function มาให้ ทำให้เราต้องเขียนใช้งานเองบ่อย ๆ ปกติแล้ว ถ้าใช้ไม่เยอะ ผมจะเขียนตรง ๆ ง่าย ๆ เอา โดยจะเขียนประมาณนี้ครับ</p>
<pre class="js">$('#selector').attr('disabled','disabled'); // สำหรับ disable
$('#selector').removeAttr('disabled'); // สำหรับ enable
</pre>
<p><span id="more-310"></span>แต่ถ้าใช้บ่อย ๆ แล้ว จะให้มาเขียนแบบนี้อยู่ตลอด ก็คงจะไม่สะดวกนัก จะให้เขียนเป็น function มาครอบก็อาจจะดูไม่เก๋เท่ากับเขียนให้มันเป็น แบบ plugin ซะเลย</p>
<pre class="js">(function($)  {
$.fn.disable = function() {return this.attr('disabled', true).addClass('disabled');}
$.fn.enable = function() {return this.removeClass('disabled').attr('disabled', false);}
})(jQuery);
</pre>
<p>เท่านี้ก็เรียกใช้ .disable() กับ .enable() ได้ละ &#8230; เก๋ซะไม่มี 5555</p>
<p><a title="jQuery Plugin : Disable" href="http://sandbox.chonla.com/disable/jquery.disable.js" target="_blank">โหลด plugin ตัวนี้ที่นี่เลยครับ</a></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.chonla.com%2F2010%2F12%2Fenable-%25e0%25b8%2581%25e0%25b8%25b1%25e0%25b8%259a-disable-%25e0%25b8%2597%25e0%25b8%25b5%25e0%25b9%2588%25e0%25b8%2582%25e0%25b8%25b2%25e0%25b8%2594%25e0%25b8%25ab%25e0%25b8%25b2%25e0%25b8%25a2%25e0%25b9%2584%25e0%25b8%259b%25e0%25b9%2583%25e0%25b8%2599-jquery%2F&amp;title=enable%28%29%20%E0%B8%81%E0%B8%B1%E0%B8%9A%20disable%28%29%20%E0%B8%97%E0%B8%B5%E0%B9%88%E0%B8%82%E0%B8%B2%E0%B8%94%E0%B8%AB%E0%B8%B2%E0%B8%A2%E0%B9%84%E0%B8%9B%E0%B9%83%E0%B8%99%20jQuery" id="wpa2a_2"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2010/12/enable-%e0%b8%81%e0%b8%b1%e0%b8%9a-disable-%e0%b8%97%e0%b8%b5%e0%b9%88%e0%b8%82%e0%b8%b2%e0%b8%94%e0%b8%ab%e0%b8%b2%e0%b8%a2%e0%b9%84%e0%b8%9b%e0%b9%83%e0%b8%99-jquery/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>jQuery 1.4.4 Cheat Sheet</title>
		<link>http://blog.chonla.com/2010/11/jquery-1-4-4-cheat-sheet/</link>
		<comments>http://blog.chonla.com/2010/11/jquery-1-4-4-cheat-sheet/#comments</comments>
		<pubDate>Mon, 15 Nov 2010 05:07:33 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Cheat Sheet]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=307</guid>
		<description><![CDATA[Cheat Sheet ในที่นี้ อธิบายให้เห็นภาพชัด ๆ ก็คงหมายถึงโพยที่ใช้แอบเอาเข้าห้องสอบครับ (ใครเคยทำมั่ง สารภาพมาซะดี ๆ) หน้าตาโพยปกติแล้วก็จะเป็นกระดาษแผ่นนึง จดมันทุกอย่างที่ต้องใช้สอบลงไป ใช่ครับ jQuery Cheat Sheet ที่ผมกำลังจะพูดถึงก็เป็นแบบนั้น jQuery 1.4.4 Cheat Sheet ก็จะเป็นโพยที่รวมเอา function ทุุกอย่างของ jQuery 1.4.4 รวมถึงมี remark เล็ก ๆ ไว้ด้วยว่าอะไรเป็นอะไร ใช้ได้กับ jQuery เวอร์ชั่นไหน ข้อดีของ Cheat Sheet คือ มันรวมทุกอย่างไว้ในหน้าเดียว ไม่ต้องเสียเวลาไปหาจากตรงไหนอีก ถ้าหน้านี้ไม่มี ก็คือไม่มีแล้วครับ เรียกได้ว่า สะดวกสุด ๆ ไปเลย บนหน้าเว็บยังมีเวอร์ชั่น pdf และ png ให้โหลดเก็บไว้ได้อีกด้วย แต่เนื่องจากมันเป็น Cheat Sheet มันเลยไม่มีรายละเอียดของ function [...]]]></description>
			<content:encoded><![CDATA[<p>Cheat Sheet ในที่นี้ อธิบายให้เห็นภาพชัด ๆ ก็คงหมายถึงโพยที่ใช้แอบเอาเข้าห้องสอบครับ (ใครเคยทำมั่ง สารภาพมาซะดี ๆ) หน้าตาโพยปกติแล้วก็จะเป็นกระดาษแผ่นนึง จดมันทุกอย่างที่ต้องใช้สอบลงไป ใช่ครับ jQuery Cheat Sheet ที่ผมกำลังจะพูดถึงก็เป็นแบบนั้น</p>
<p><span id="more-307"></span>jQuery 1.4.4 Cheat Sheet ก็จะเป็นโพยที่รวมเอา function ทุุกอย่างของ jQuery 1.4.4 รวมถึงมี remark เล็ก ๆ ไว้ด้วยว่าอะไรเป็นอะไร ใช้ได้กับ jQuery เวอร์ชั่นไหน</p>
<p>ข้อดีของ Cheat Sheet คือ มันรวมทุกอย่างไว้ในหน้าเดียว ไม่ต้องเสียเวลาไปหาจากตรงไหนอีก ถ้าหน้านี้ไม่มี ก็คือไม่มีแล้วครับ เรียกได้ว่า สะดวกสุด ๆ ไปเลย บนหน้าเว็บยังมีเวอร์ชั่น pdf และ png ให้โหลดเก็บไว้ได้อีกด้วย แต่เนื่องจากมันเป็น Cheat Sheet มันเลยไม่มีรายละเอียดของ function นั้น ๆ ว่าเอาไว้ทำอะไร ตัวอย่างการใช้งาน ก็คือ เราจะใช้ เราต้องรู้อยู่แล้วว่ามันทำอะไรครับ</p>
<p>ใครสนใจไปชมไปโหลด เชิญได้เลยที่ <a title="jQuery Cheat Sheet" href="http://jqapi.ru/" target="_blank">http://jqapi.ru/</a></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.chonla.com%2F2010%2F11%2Fjquery-1-4-4-cheat-sheet%2F&amp;title=jQuery%201.4.4%20Cheat%20Sheet" id="wpa2a_4"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2010/11/jquery-1-4-4-cheat-sheet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery 1.4.4 มาแว้ววว</title>
		<link>http://blog.chonla.com/2010/11/jquery-1-4-4-%e0%b8%a1%e0%b8%b2%e0%b9%81%e0%b8%a7%e0%b9%89%e0%b8%a7%e0%b8%a7%e0%b8%a7/</link>
		<comments>http://blog.chonla.com/2010/11/jquery-1-4-4-%e0%b8%a1%e0%b8%b2%e0%b9%81%e0%b8%a7%e0%b9%89%e0%b8%a7%e0%b8%a7%e0%b8%a7/#comments</comments>
		<pubDate>Sat, 13 Nov 2010 18:29:23 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=304</guid>
		<description><![CDATA[จริง ๆ แล้วผมเองก็ไม่ได้โพสเกี่ยวกับความเคลื่อนไหวของ jQuery มานานแล้ว พอดีเพิ่งได้ไป follow @jquery ใน twitter เลย &#8220;เพิ่งเห็น&#8221; ว่า jQuery 1.4.4 ออกแล้ว หลัก ๆ แล้วก็ไม่ได้มีอะไรมากไปกว่าการแก้ไขบัก (ส่วนใหญ่) และการปรับปรุงสิ่งที่มีอยู่แล้วให้ดีขึ้นครับ สิ่งที่เปลี่ยนแปลงไปหลัก ๆ ที่ developer ทั้งหลายควรจะรู้มีแค่ 2 เรื่องครับ คือ function ใหม่ ที่ชื่อว่า fadeToggle อยู่ในหัวข้อของ animation ซึ่งจะทำหน้าที่ให้ fade in หรือ out จาก selector ที่กำหนด และวิธีการดูว่า element ที่เราต้องการมันซ่อนอยู่หรือเปล่า เดิมเช็คโดยการดู .width() และ .height() ว่าเป็น 0 หรือเปล่า ก็เปลี่ยนเป็นการใช้ .is(&#8216;:hidden&#8217;) [...]]]></description>
			<content:encoded><![CDATA[<p>จริง ๆ แล้วผมเองก็ไม่ได้โพสเกี่ยวกับความเคลื่อนไหวของ jQuery มานานแล้ว พอดีเพิ่งได้ไป follow <a href="http://twitter.com/#!/jquery" target="_blank">@jquery</a> ใน twitter เลย &#8220;เพิ่งเห็น&#8221; ว่า jQuery 1.4.4 ออกแล้ว</p>
<p><span id="more-304"></span>หลัก ๆ แล้วก็ไม่ได้มีอะไรมากไปกว่าการแก้ไขบัก (ส่วนใหญ่) และการปรับปรุงสิ่งที่มีอยู่แล้วให้ดีขึ้นครับ สิ่งที่เปลี่ยนแปลงไปหลัก ๆ ที่ developer ทั้งหลายควรจะรู้มีแค่ 2 เรื่องครับ คือ function ใหม่ ที่ชื่อว่า fadeToggle อยู่ในหัวข้อของ animation ซึ่งจะทำหน้าที่ให้ fade in หรือ out จาก selector ที่กำหนด และวิธีการดูว่า element ที่เราต้องการมันซ่อนอยู่หรือเปล่า เดิมเช็คโดยการดู .width() และ .height() ว่าเป็น 0 หรือเปล่า ก็เปลี่ยนเป็นการใช้ .is(&#8216;:hidden&#8217;) แทนครับ เรียกได้ว่าสะดวกมากขึ้นกันเลยทีเดียว ส่วน .withd() และ .height() ของ element ที่ซ่อนอยู่ตอนนี้ก็จะไม่เป็น 0 แล้วนะครับ แต่จะกลายเป็นความกว้างและความสูงของ element นั้น ๆ แทนแล้วครับ ใครใช้แบบเดิมอยู่ก็อย่าลืมแก้ไขนะเออ</p>
<p>ใครสนใจอ่านรายละเอียดของเวอร์ชั่นนี้เต็ม ๆ ก็ตามไปอ่านต่อกันได้ที่ <a href="http://blog.jquery.com/2010/11/11/jquery-1-4-4-release-notes/" target="_blank">http://blog.jquery.com/2010/11/11/jquery-1-4-4-release-notes/</a> (*เป็นภาษาอังกฤษนะจ๊ะ)</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.chonla.com%2F2010%2F11%2Fjquery-1-4-4-%25e0%25b8%25a1%25e0%25b8%25b2%25e0%25b9%2581%25e0%25b8%25a7%25e0%25b9%2589%25e0%25b8%25a7%25e0%25b8%25a7%25e0%25b8%25a7%2F&amp;title=jQuery%201.4.4%20%E0%B8%A1%E0%B8%B2%E0%B9%81%E0%B8%A7%E0%B9%89%E0%B8%A7%E0%B8%A7%E0%B8%A7" id="wpa2a_6"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2010/11/jquery-1-4-4-%e0%b8%a1%e0%b8%b2%e0%b9%81%e0%b8%a7%e0%b9%89%e0%b8%a7%e0%b8%a7%e0%b8%a7/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Chonla&#8217;s Instant ก็แค่อยากลอง Instant กับเค้าบ้างน่ะ</title>
		<link>http://blog.chonla.com/2010/09/chonlas-instant-%e0%b8%81%e0%b9%87%e0%b9%81%e0%b8%84%e0%b9%88%e0%b8%ad%e0%b8%a2%e0%b8%b2%e0%b8%81%e0%b8%a5%e0%b8%ad%e0%b8%87-instant-%e0%b8%81%e0%b8%b1%e0%b8%9a%e0%b9%80%e0%b8%84%e0%b9%89%e0%b8%b2/</link>
		<comments>http://blog.chonla.com/2010/09/chonlas-instant-%e0%b8%81%e0%b9%87%e0%b9%81%e0%b8%84%e0%b9%88%e0%b8%ad%e0%b8%a2%e0%b8%b2%e0%b8%81%e0%b8%a5%e0%b8%ad%e0%b8%87-instant-%e0%b8%81%e0%b8%b1%e0%b8%9a%e0%b9%80%e0%b8%84%e0%b9%89%e0%b8%b2/#comments</comments>
		<pubDate>Sun, 26 Sep 2010 19:31:14 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Technologies]]></category>
		<category><![CDATA[Chonla's Instant]]></category>
		<category><![CDATA[Google Instant]]></category>
		<category><![CDATA[Instant]]></category>
		<category><![CDATA[Youtube Instant]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=301</guid>
		<description><![CDATA[เมื่อ entry ที่แล้วเพิ่งเขียนถึง Google Instant Search ไป หลังจากนั้นไม่นาน ก็มี Youtube Instant ตามมา (http://ytinstant.com/) สร้างโดยนาย Feross Aboukhadijeh (อ่านว่าอะไรไม่รู้ เฟรอส อาบูคาดีเย่ มั๊ง) เลยนั่งนึก ๆ ดู อยากลองทำมั่งแฮะ ว่าแล้วช่วงที่ว่างก็ลองปั่นเว็บที่ทำงานแบบ Instant ออกมาเป็น Chonla&#8217;s InstantChonla&#8217;s Instant เป็นเว็บที่ทำงานเหมือน Google Instant Search คือ จะทำการค้นหาในขณะที่เรากำลังพิมพ์ไปด้วยพร้อม ๆ กัน ทำให้ประหยัดเวลาในการกด Enter หรือเอาเมาส์ไปคลิกปุ่มค้นหา จริง ๆ แล้ว Instant Search มันไม่ใช่เรื่องใหม่ ก่อนหน้านี้ Google ก็เคยทำอะไรที่ &#8220;คล้าย ๆ&#8221; กันออกมานี้แล้ว นั่นก็คือ Suggestion [...]]]></description>
			<content:encoded><![CDATA[<p>เมื่อ entry ที่แล้วเพิ่งเขียนถึง Google Instant Search ไป หลังจากนั้นไม่นาน ก็มี Youtube Instant ตามมา (<a title="Youtube Instant" href="http://ytinstant.com/" target="_blank">http://ytinstant.com/</a>) สร้างโดยนาย Feross Aboukhadijeh (อ่านว่าอะไรไม่รู้ เฟรอส อาบูคาดีเย่ มั๊ง) เลยนั่งนึก ๆ ดู อยากลองทำมั่งแฮะ ว่าแล้วช่วงที่ว่างก็ลองปั่นเว็บที่ทำงานแบบ Instant ออกมาเป็น Chonla&#8217;s Instant<span id="more-301"></span>Chonla&#8217;s Instant เป็นเว็บที่ทำงานเหมือน Google Instant Search คือ จะทำการค้นหาในขณะที่เรากำลังพิมพ์ไปด้วยพร้อม ๆ กัน ทำให้ประหยัดเวลาในการกด Enter หรือเอาเมาส์ไปคลิกปุ่มค้นหา จริง ๆ แล้ว Instant Search มันไม่ใช่เรื่องใหม่ ก่อนหน้านี้ Google ก็เคยทำอะไรที่ &#8220;คล้าย ๆ&#8221; กันออกมานี้แล้ว นั่นก็คือ Suggestion ที่สามารถบอกถึงคำค้นหาที่ใกล้เคียงกับที่เราค้นหาอยู่ พร้อมทั้งจำนวนของผลลัพธ์จากคำค้นหานั้นออกมา เพื่อให้เราเห็นและเลือกใช้ได้โดยง่าย ตัว Instant ก็ทำในทำนองคล้าย ๆ กัน เพียงแค่แทนที่จะแสดงคำค้นที่ใกล้เคียง แต่แสดงผลลัพธ์ของคำค้นที่เราพิมพ์อยู่แทน</p>
<p>Chonla&#8217;s Instant ใช้ jQuery เป็น engine หลักในการทำงานฝั่ง client และมี query interface เดียว ที่เป็น engine หลักทางฝั่ง server ที่เอาไว้สำหรับรับ keyword จาก client เพื่อไปค้นหาตาม resource ที่กำหนด วิธีนี้ ทำให้ code ที่รันทางฝั่ง client สั้นกระทัดรัด และโยนภาระที่เหลือไปทางฝั่ง server แทน</p>
<p>Service หลัก ๆ ที่ผมลองเอาไปใส่ใน Chonla&#8217;s Instant ตอนที่ทำครั้งแรก คือ Longdo Dictionary (<a title="Longdo Dictionary" href="http://dict.longdo.com/" target="_blank">http://dict.longdo.com/</a>) ซึ่งเป็น Online dictionary ที่ได้รับความนิยมในประเทศไทย ตามมาด้วย Youtube (<a title="Youtube" href="http://www.youtube.com/" target="_blank">http://www.youtube.com/</a>) โดยที่ Youtube ที่ผมใส่นั้น จะทำหน้าที่ search และเอาผลลัพธ์แค่ title, link และ thumbnail มาแสดงเท่านั้น ไม่มีส่วน clip player หลังจากที่ทดสอบและแก้ไขจนพอใจ ก็เอา Service ที่ 3 มาลง นั่นก็คือ พจนานุกรม ฉบับราชบัณฑิตยสถาน ปี พ.ศ. 2542 (<a title="พจนานุกรม ฉบับราชบัณฑิตยสถาน 2542" href="http://rirs3.royin.go.th/" target="_blank">http://rirs3.royin.go.th/</a>)</p>
<p>การทำงานฝั่ง Client หลัก ๆ ผมก็ใช้วิธี พิมพ์ปุ๊บ ก็เริ่มไปค้นหาด้วย Ajax และระหว่างที่ค้นหาอยู่ ก็ block ไม่ให้เกิดการค้นหาซ้อนจนกว่าจะค้นหาเสร็จ เมื่อค้นหาเสร็จแล้ว ถ้ามีการค้นหาซ้อนค้างอยู่ ให้ค้นต่อ แล้วเอาผลลัพธ์ที่ได้มาแสดง ส่วนทางฝั่ง Server ก็ใช้ php ไปดึงข้อมูลจาก Server ที่ให้บริการทั้ง 3 services มาเรียบเรียง แล้วส่งกลับไปให้ Ajax เพื่อแสดงผล</p>
<p>เขียนมาซะยาวเลย &#8230; ผมว่า ลองไปเล่นกันเลยดีกว่าครับ กับ <a title="Chonla's Instant" href="http://instant.chonla.com/" target="_blank">Chonla&#8217;s Instant</a> (<a title="Chonla's Instant" href="http://instant.chonla.com/" target="_blank">http://instant.chonla.com/</a>)</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.chonla.com%2F2010%2F09%2Fchonlas-instant-%25e0%25b8%2581%25e0%25b9%2587%25e0%25b9%2581%25e0%25b8%2584%25e0%25b9%2588%25e0%25b8%25ad%25e0%25b8%25a2%25e0%25b8%25b2%25e0%25b8%2581%25e0%25b8%25a5%25e0%25b8%25ad%25e0%25b8%2587-instant-%25e0%25b8%2581%25e0%25b8%25b1%25e0%25b8%259a%25e0%25b9%2580%25e0%25b8%2584%25e0%25b9%2589%25e0%25b8%25b2%2F&amp;title=Chonla%26%238217%3Bs%20Instant%20%E0%B8%81%E0%B9%87%E0%B9%81%E0%B8%84%E0%B9%88%E0%B8%AD%E0%B8%A2%E0%B8%B2%E0%B8%81%E0%B8%A5%E0%B8%AD%E0%B8%87%20Instant%20%E0%B8%81%E0%B8%B1%E0%B8%9A%E0%B9%80%E0%B8%84%E0%B9%89%E0%B8%B2%E0%B8%9A%E0%B9%89%E0%B8%B2%E0%B8%87%E0%B8%99%E0%B9%88%E0%B8%B0" id="wpa2a_8"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2010/09/chonlas-instant-%e0%b8%81%e0%b9%87%e0%b9%81%e0%b8%84%e0%b9%88%e0%b8%ad%e0%b8%a2%e0%b8%b2%e0%b8%81%e0%b8%a5%e0%b8%ad%e0%b8%87-instant-%e0%b8%81%e0%b8%b1%e0%b8%9a%e0%b9%80%e0%b8%84%e0%b9%89%e0%b8%b2/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>ปลั๊กอิน BBCode สำหรับ jQuery</title>
		<link>http://blog.chonla.com/2009/11/%e0%b8%9b%e0%b8%a5%e0%b8%b1%e0%b9%8a%e0%b8%81%e0%b8%ad%e0%b8%b4%e0%b8%99-bbcode-%e0%b8%aa%e0%b8%b3%e0%b8%ab%e0%b8%a3%e0%b8%b1%e0%b8%9a-jquery/</link>
		<comments>http://blog.chonla.com/2009/11/%e0%b8%9b%e0%b8%a5%e0%b8%b1%e0%b9%8a%e0%b8%81%e0%b8%ad%e0%b8%b4%e0%b8%99-bbcode-%e0%b8%aa%e0%b8%b3%e0%b8%ab%e0%b8%a3%e0%b8%b1%e0%b8%9a-jquery/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 10:33:23 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[Homemade Plugin]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Souce Code]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[BBCode]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Regular Expression]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=245</guid>
		<description><![CDATA[วันนี้ผมลองเขียน plugin แก้ขัดที่หายหน้าหายตาไปนานมาให้ลองกันครับ นั่นก็คือปลั๊กอินที่ใช้ render BBCode ครับ ใครที่เป็นนักโพสเว็บบอร์ดคงจะรู้จักกันดีว่า BBCode คืออะไร สำหรับใครที่ยังไม่รู้จักก็อ่านย่อหน้าถัดไปได้เลยครับ BBCode เราเรียกได้ว่าเป็น lightweighted markup language ใช้สำหรับจัดรูปแบบข้อความตามเว็บบอร์ดต่าง ๆ ครับ มีลักษณะของแท็กอยู่ในเครื่องหมายก้ามปู เช่น [b]ตัวหนา[/b] ครับ เจ้าตัว BBCode นี่เว็บบราวเซอร์มันไม่รู้จักครับ ต้องทำการแปลไปเป็น markup language ที่ใช้ทั่ว ๆ ไปก่อนครับ นั่นก็คือ HTML หรือ XHTML ครับ เช่น จาก [b]ตัวหนา[/b] จะถูกแปลงไปเป็น &#60;b&#62;ตัวหนา&#60;/b&#62; แล้วค่อยนำไปแสดงผลครับ จุดประสงค์หลัก ๆ ของ BBCode คือ เพื่อให้ผู้ใช้สามารถจัดรูปแบบข้อความได้ง่ายขึ้น รวมไปถึงเพื่อความปลอดภัยของการแสดงผลข้อความที่โพสโดยผู้ใช้ด้วยครับ เช่น การควบคุมการใช้งาน javascript การควบคุมให้ใช้ tag [...]]]></description>
			<content:encoded><![CDATA[<p>วันนี้ผมลองเขียน plugin แก้ขัดที่หายหน้าหายตาไปนานมาให้ลองกันครับ นั่นก็คือปลั๊กอินที่ใช้ render BBCode ครับ ใครที่เป็นนักโพสเว็บบอร์ดคงจะรู้จักกันดีว่า BBCode คืออะไร สำหรับใครที่ยังไม่รู้จักก็อ่านย่อหน้าถัดไปได้เลยครับ</p>
<p>BBCode เราเรียกได้ว่าเป็น lightweighted markup language ใช้สำหรับจัดรูปแบบข้อความตามเว็บบอร์ดต่าง ๆ ครับ มีลักษณะของแท็กอยู่ในเครื่องหมายก้ามปู เช่น [b]ตัวหนา[/b] ครับ เจ้าตัว BBCode นี่เว็บบราวเซอร์มันไม่รู้จักครับ ต้องทำการแปลไปเป็น markup language ที่ใช้ทั่ว ๆ ไปก่อนครับ นั่นก็คือ HTML หรือ XHTML ครับ เช่น จาก [b]ตัวหนา[/b] จะถูกแปลงไปเป็น &lt;b&gt;ตัวหนา&lt;/b&gt; แล้วค่อยนำไปแสดงผลครับ<br />
<span id="more-245"></span><br />
จุดประสงค์หลัก ๆ ของ BBCode คือ เพื่อให้ผู้ใช้สามารถจัดรูปแบบข้อความได้ง่ายขึ้น รวมไปถึงเพื่อความปลอดภัยของการแสดงผลข้อความที่โพสโดยผู้ใช้ด้วยครับ เช่น การควบคุมการใช้งาน javascript การควบคุมให้ใช้ tag ภายในข้อกำหนด เป็นต้น</p>
<p>เจ้าตัว BBCode เนี่ย มันไม่มีข้อกำหนดเป็นมาตรฐาน เพียงแค่มีการใช้งานโดยทั่วไปตามเว็บบอร์ดเวอร์ชั่นใหม่ ๆ ทั่วไปครับ รายละเอียดรูปแบบคำสั่ง สามารถตามไปดูในหัวข้ออ้างอิงท้ายบทความได้เลยครับ</p>
<p>ทีนี้มาดูกันว่าปลั๊กอินตัวนี้จะทำงานยังไงครับ</p>
<p>ง่าย ๆ ครับ แค่เรียก $(&lt;selector&gt;).bbcode(); เท่านั้นครับ เช่น</p>
<pre class="js">$("div").bbcode();</pre>
<p>ไอเดียของปลั๊กอินตัวนี้ผมได้มาจากตอนเขียนแก้บักการแสดงผล BBCode ให้เก็บเว็บไซต์หนึ่งครับ ปกติแล้วการ render จาก BBCode ไปเป็น HTML นั้น มักจะทำที่ Server และส่ง HTML ที่ได้มาให้บราวเซอร์แสดงผล แต่ผมต้องการที่จะลดโหลดฝั่ง Server ลง โดยจะย้ายการทำงานจากฝั่ง Server มาทำที่บราวเซอร์แทน</p>
<p>หลักการทำงานก็ไม่มีอะไรมากครับ ผมใช้วิธีการกำหนดค่า Pattern ในรูปแบบ Regular Expression และใช้ Regular Expression Engine ของ JavaScript ในการแสดงผลให้ถูกต้องเท่านั้นครับ</p>
<p>ลองไปดูที่ <a title="BBCode Plugin for jQuery" href="http://sandbox.chonla.com/bbcode/" target="_blank">LIVE DEMO</a> กันเลยครับ</p>
<p><span style="text-decoration: underline;">อ้างอิง</span></p>
<ul>
<li><span style="background-color: #ffffff;"><a title="BBCode" href="http://en.wikipedia.org/wiki/BBCode" target="_blank">http://en.wikipedia.org/wiki/BBCode</a></span></li>
</ul>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.chonla.com%2F2009%2F11%2F%25e0%25b8%259b%25e0%25b8%25a5%25e0%25b8%25b1%25e0%25b9%258a%25e0%25b8%2581%25e0%25b8%25ad%25e0%25b8%25b4%25e0%25b8%2599-bbcode-%25e0%25b8%25aa%25e0%25b8%25b3%25e0%25b8%25ab%25e0%25b8%25a3%25e0%25b8%25b1%25e0%25b8%259a-jquery%2F&amp;title=%E0%B8%9B%E0%B8%A5%E0%B8%B1%E0%B9%8A%E0%B8%81%E0%B8%AD%E0%B8%B4%E0%B8%99%20BBCode%20%E0%B8%AA%E0%B8%B3%E0%B8%AB%E0%B8%A3%E0%B8%B1%E0%B8%9A%20jQuery" id="wpa2a_10"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2009/11/%e0%b8%9b%e0%b8%a5%e0%b8%b1%e0%b9%8a%e0%b8%81%e0%b8%ad%e0%b8%b4%e0%b8%99-bbcode-%e0%b8%aa%e0%b8%b3%e0%b8%ab%e0%b8%a3%e0%b8%b1%e0%b8%9a-jquery/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Method Chaining ใน PHP ทำเองก็ได้ง่ายจัง</title>
		<link>http://blog.chonla.com/2009/09/method-chaining-%e0%b9%83%e0%b8%99-php-%e0%b8%97%e0%b8%b3%e0%b9%80%e0%b8%ad%e0%b8%87%e0%b8%81%e0%b9%87%e0%b9%84%e0%b8%94%e0%b9%89%e0%b8%87%e0%b9%88%e0%b8%b2%e0%b8%a2%e0%b8%88%e0%b8%b1%e0%b8%87/</link>
		<comments>http://blog.chonla.com/2009/09/method-chaining-%e0%b9%83%e0%b8%99-php-%e0%b8%97%e0%b8%b3%e0%b9%80%e0%b8%ad%e0%b8%87%e0%b8%81%e0%b9%87%e0%b9%84%e0%b8%94%e0%b9%89%e0%b8%87%e0%b9%88%e0%b8%b2%e0%b8%a2%e0%b8%88%e0%b8%b1%e0%b8%87/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 19:03:09 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Object Oriented]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Chainability]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=228</guid>
		<description><![CDATA[บทความนี้ได้แรงบันดาลใจมาจาก chainability ของ jQuery และ query builder ของ kohana (จริง ๆ ผมเข้าใจว่า query builder มีอยู่ใน php framework ตัวอื่นด้วย แต่พอดีท่านรุ่งจากบ้าน PHP.DeeServer.net ซึ่งแนะนำให้ผมรู้จักกับ kohana เค้าแนะนำตัวที่อยู่ใน kohana มาครับ) ไอเดียหลัก ๆ ของการทำ chaining ก็คือ การทำให้มันสามารถเรียกต่อกันได้เป็นทอด ๆ นั่นเอง ยกตัวอย่างใน jQuery ซึ่งมีคุณสมบัติที่เรียกว่า chainability อยู่ ทำให้เราสามารถเรียกคำสั่งได้แบบนี้ $("#submenu").addClass("whitemenu").show("slow"); จะเห็นได้ว่า เราสามารถเรียก .show ต่อเนื่องได้เลย นี่เองที่ทำให้เกิดการเรียกอย่างต่อเนื่อง หรือ การทำ Method chaining นั่นเอง ใน PHP เราสามารถทำให้ object มีคุณสมบัติเดียวกันนี้ได้เช่นกัน [...]]]></description>
			<content:encoded><![CDATA[<p>บทความนี้ได้แรงบันดาลใจมาจาก <a href="http://blog.chonla.com/2008/11/เมื่อฟ้าส่ง-chainability-มาให้กับ-jquery/" target="_blank" title="เมื่อฟ้าส่ง Chainability มาให้กับ jQuery">chainability</a> ของ <a href="http://www.jquery.com" target="_blank" title="jQuery - The Write Less, Do More, JavaScript Library">jQuery</a> และ query builder ของ <a href="http://www.kohanaphp.com/" target="_blank" title="Kohana - The swift PHP Framework">kohana</a> (จริง ๆ ผมเข้าใจว่า query builder มีอยู่ใน php framework ตัวอื่นด้วย แต่พอดีท่านรุ่งจากบ้าน <a href="http://php.deeserver.net" target="_blank" title="PHP.DeeServer.Net">PHP.DeeServer.net</a> ซึ่งแนะนำให้ผมรู้จักกับ kohana เค้าแนะนำตัวที่อยู่ใน kohana มาครับ)</p>
<p>ไอเดียหลัก ๆ ของการทำ chaining ก็คือ การทำให้มันสามารถเรียกต่อกันได้เป็นทอด ๆ นั่นเอง ยกตัวอย่างใน jQuery ซึ่งมีคุณสมบัติที่เรียกว่า chainability อยู่ ทำให้เราสามารถเรียกคำสั่งได้แบบนี้</p>
<pre name="code" class="js">
$("#submenu").addClass("whitemenu").show("slow");
</pre>
<p>จะเห็นได้ว่า เราสามารถเรียก .show ต่อเนื่องได้เลย นี่เองที่ทำให้เกิดการเรียกอย่างต่อเนื่อง หรือ การทำ Method chaining นั่นเอง<br />
<span id="more-228"></span></p>
<p>ใน PHP เราสามารถทำให้ object มีคุณสมบัติเดียวกันนี้ได้เช่นกัน เพียงแต่น่าเสียดายที่คุณสมบัตินี้ มีอยู่ใน PHP ตั้งแต่เวอร์ชั่น 5 ขึ้นไปเท่านั้น สำหรับคนที่ยังใช้ PHP4 อยู่ ผมต้องขอแสดงความเสียใจด้วยครับ ฮ่า ๆ และคาดว่าเหตุนี้เองที่ทำให้ kohana สามารถใช้งานได้กับ PHP5 ขึ้นไปเท่านั้น</p>
<p>หลักการง่าย ๆ ที่ทำให้เราสามารถทำ Method chaining ได้ก็คือ การเขียน class และทำการคืนค่าของ object มันเองกลับออกมาหลังจากที่จบ method ทำนองเดียวกับใน jQuery ตอนที่เขียน plugin </p>
<p>ตอนจบ เราก็จะทำการ return jQuery object กลับออกมาให้เช่นเดียวกัน</p>
<p>ลองมาดูตัวอย่างใน PHP กันดีกว่าครับ</p>
<pre name="code" class="js">
// php5 only
class Database
{
	private $link;

	private $table;
	private $field;
	private $condition;
	private $order;
	private $result;

	// connection functions
	function __construct($config)
	{
		$this->flush();
		$this->link = null;
		$this->connect($config["hostname"],
				$config["username"],
				$config["password"],
				$config["database"]);
	}

	function __destruct()
	{
		$this->disconnect();
	}

	function connect($host = "",
				$user = "",
				$password = "",
				$db = "")
	{
		if ($this->link !== null)
			$this->disconnect();

		$this->link = mysql_connect($host, $user, $password);

		if ($this->link === FALSE)
		{
			echo $this->err();
		}
		else
		{
			if ($db !== "")
			{
				return $this->db($db);
			}
		}
		return $this;
	}

	function disconnect()
	{	// break chain
		if ($this->link !== null)
			mysql_close($this->link);
		$this->link = null;
	}

	function db($db)
	{
		if (mysql_select_db($db, $this->link) === FALSE)
			echo $this->err();
		return $this;
	}

	function errno()
	{
		return mysql_errno($this->link);
	}

	function ok()
	{
		return ($this->errno() == 0);
	}

	function err()
	{	// break chain
		return mysql_error($this->link);
	}

	function execute($sql)
	{
		$this->result = mysql_query($sql, $this->link);
		return $this;
	}

	function records()
	{
		$result = array();
		if ($this->result !== FALSE)
		{
			while (($row = mysql_fetch_assoc($this->result)) !== FALSE)
			{
				$result[] = $row;
			}
		}
		return $result;
	}

	function flush()
	{
		$this->table = "";
		$this->field = "";
		$this->condition = "";
		$this->order = "";
		$this->result = null;
		return $this;
	}

	function safe($value)
	{
		if (!get_magic_quotes_gpc())
		{
			$value = addslashes($value);
		}
		return "'$value'";
	}

	function table($table)
	{
		$this->table = $table;
		return $this;
	}

	function field($field)
	{
		$this->field = $field;
		return $this;
	}

	function condition($condition)
	{
		if (is_array($condition))
		{
			$cond = array();
			foreach ($condition as $f => $v)
			{
				$cond[] = "($f = " . $this->safe($v) . ")";
			}
			$condition = implode(" AND ", $cond);
		}
		$this->condition = $condition;
		return $this;
	}

	function top($num = 1)
	{
		$field = $this->field;
		if ($field == "") $field = "*";
		$sql = "SELECT {$field} FROM {$this->table}";
		if ($this->condition !== "")
			$sql .= " WHERE {$this->condition}";
		if ($this->order !== "")
			$sql .= " ORDER BY {$this->order}";
		$sql .= " LIMIT 0, {$num}";
		return $this->execute($sql)->records();
	}

	function all()
	{
		$field = $this->field;
		if ($field == "") $field = "*";
		$sql = "SELECT {$field} FROM {$this->table}";
		if ($this->condition !== "")
			$sql .= " WHERE {$this->condition}";
		if ($this->order !== "")
			$sql .= " ORDER BY {$this->order}";
		return $this->execute($sql)->records();
	}

	function order($order)
	{
		$this->order = $order;
		return $this;
	}
}
</pre>
<p>code ด้านบนนี้ เป็น code ที่ผมทดสอบ โดยทำเป็นไอเดียเริ่มต้นง่าย ๆ สำหรับการทำ query builder จะเห็นได้ว่า หลาย ๆ method จะมีการ return ตัว object มันเอง ($this) ไอเดียหลักในการกำหนดว่า method ไหนที่ผม return หรือไม่ return $this ก็คือ มีความจำเป็นในการเรียก method ต่อจากนี้หรือไม่นั่นเอง</p>
<p>การใช้งานก็ไม่ได้ยุ่งยากอะไร</p>
<pre name="code" class="js">
$dbconf = array(
	"hostname" => "localhost",
	"username" => "root",
	"password" => "123456",
	"database" => "test"
);
$db = new Database($dbconf);
$rows = $db->table("products")
		->field("product_id, product_name")
		->condition(array(
				"product_group"=>"tyre",
				"product_model"=>"Eagle"))
		->top();
print_r($rows);
</pre>
<p>จากตัวอย่างด้านบน เป็นการ select หา product จาก table products โดยกำหนด criteria ในการค้นหาเป็น product_group = &#8216;tyre&#8217; และ product_model = &#8216;Eagle&#8217; โดยจะเลือกเอาเฉพาะ record แรกสุดเท่านั้น</p>
<p>เห็นมั๊ยครับ หลักการง่าย ๆ แค่ return $this เองครับ ที่สำคัญ อย่าลืมนะครับ PHP5 ขึ้นไปนะครับ</p>
<p>ขอให้สนุกกับการเขียนโปรแกรมครับ</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.chonla.com%2F2009%2F09%2Fmethod-chaining-%25e0%25b9%2583%25e0%25b8%2599-php-%25e0%25b8%2597%25e0%25b8%25b3%25e0%25b9%2580%25e0%25b8%25ad%25e0%25b8%2587%25e0%25b8%2581%25e0%25b9%2587%25e0%25b9%2584%25e0%25b8%2594%25e0%25b9%2589%25e0%25b8%2587%25e0%25b9%2588%25e0%25b8%25b2%25e0%25b8%25a2%25e0%25b8%2588%25e0%25b8%25b1%25e0%25b8%2587%2F&amp;title=Method%20Chaining%20%E0%B9%83%E0%B8%99%20PHP%20%E0%B8%97%E0%B8%B3%E0%B9%80%E0%B8%AD%E0%B8%87%E0%B8%81%E0%B9%87%E0%B9%84%E0%B8%94%E0%B9%89%E0%B8%87%E0%B9%88%E0%B8%B2%E0%B8%A2%E0%B8%88%E0%B8%B1%E0%B8%87" id="wpa2a_12"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2009/09/method-chaining-%e0%b9%83%e0%b8%99-php-%e0%b8%97%e0%b8%b3%e0%b9%80%e0%b8%ad%e0%b8%87%e0%b8%81%e0%b9%87%e0%b9%84%e0%b8%94%e0%b9%89%e0%b8%87%e0%b9%88%e0%b8%b2%e0%b8%a2%e0%b8%88%e0%b8%b1%e0%b8%87/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>ปลั๊กอิน Image rescale สำหรับ jQuery</title>
		<link>http://blog.chonla.com/2009/08/%e0%b8%9b%e0%b8%a5%e0%b8%b1%e0%b9%8a%e0%b8%81%e0%b8%ad%e0%b8%b4%e0%b8%99-image-rescale-%e0%b8%aa%e0%b8%b3%e0%b8%ab%e0%b8%a3%e0%b8%b1%e0%b8%9a-jquery/</link>
		<comments>http://blog.chonla.com/2009/08/%e0%b8%9b%e0%b8%a5%e0%b8%b1%e0%b9%8a%e0%b8%81%e0%b8%ad%e0%b8%b4%e0%b8%99-image-rescale-%e0%b8%aa%e0%b8%b3%e0%b8%ab%e0%b8%a3%e0%b8%b1%e0%b8%9a-jquery/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 19:49:08 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[Homemade Plugin]]></category>
		<category><![CDATA[Image]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Rescale]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=207</guid>
		<description><![CDATA[ช่วงนี้มีโอกาสได้ลองทำ plugin มาใช้กับ jQuery หลายตัวครับ Image rescale plugin นี่เป็นตัวหนึ่งครับ จริง ๆ แล้ว rescale image ด้วย jQuery มันไม่ใช่เรื่องใหญ่โต หรือยุ่งยากมากมายอะไร เพียงแค่ว่า ผมอยากได้แบบที่เป็น plugin ครับ และผมหามันไม่เจอ แค่นั้นเองครับ เลยบ้าพลัง เขียนเองซะเลยครับ หลักการง่าย ๆ กับการทำ rescale กับรูปภาพคือ การคง aspect ratio ของภาพไว้ นั่นคือ ถ้าภาพขนาด 4:3 หมายถึง กว้าง 800 pixels สูง 600 pixels เมื่อย่อลงไปเหลือขนาด กว้าง 200 pixels แล้ว จะต้องได้ความสูง 150 pixels (อัตราส่วนเดิมคือ 4:3 [...]]]></description>
			<content:encoded><![CDATA[<p>ช่วงนี้มีโอกาสได้ลองทำ plugin มาใช้กับ jQuery หลายตัวครับ Image rescale plugin นี่เป็นตัวหนึ่งครับ จริง ๆ แล้ว rescale image ด้วย jQuery มันไม่ใช่เรื่องใหญ่โต หรือยุ่งยากมากมายอะไร เพียงแค่ว่า ผมอยากได้แบบที่เป็น plugin ครับ และผมหามันไม่เจอ แค่นั้นเองครับ เลยบ้าพลัง เขียนเองซะเลยครับ<br />
<span id="more-207"></span><br />
หลักการง่าย ๆ กับการทำ rescale กับรูปภาพคือ การคง aspect ratio ของภาพไว้ นั่นคือ ถ้าภาพขนาด 4:3 หมายถึง กว้าง 800 pixels สูง 600 pixels เมื่อย่อลงไปเหลือขนาด กว้าง 200 pixels แล้ว จะต้องได้ความสูง 150 pixels (อัตราส่วนเดิมคือ 4:3 นั่นเอง)</p>
<p>หลังจากนั้น ก็มาถึงสิ่งที่ผมอยากให้ plugin ตัวนี้มี นั่นก็คือ การกำหนดความกว้าง หรือความสูงสูงสุด นั่นคือ ถ้าผมกำหนดให้ความกว้างที่มากที่สุดมีค่าเป็น 200 pixels และภาพต้นฉบับมีความกว้างเป็น 1024 pixels ภาพที่ย่อแล้ว จะเหลือความกว้างเป็น 200 pixels นั่นเอง</p>
<p>รูปแบบการใช้งาน</p>
<pre class="js">$.imgrescale(options);</pre>
<p>โดยที่ options ในตอนนี้มีแค่ตัวเดียวครับ คือ maxsize ดังนั้นถ้าต้องการกำหนดค่า maxsize ก็จะเรียกแบบนี้ครับ</p>
<pre class="js">$.imgrescale({maxsize:200});</pre>
<p>ลองดูตัวอย่างที่ <a title="LIVE DEMO: jQuery Image Rescale Plugin" href="http://sandbox.chonla.com/imgrescale" target="_blank">LIVE DEMO</a> ได้เลยครับ</p>
<p>สำหรับ source code ที่เป็น minified ก็<a title="jQuery Plugin : MINIFIED IMAGE RESCALE JS" href="http://sandbox.chonla.com/imgrescale/js/jquery.imgrescale.min.js" target="_blank">ดาวน์โหลดได้จากที่นี่เลยครับ</a></p>
<p>ใช้ดีอย่าลืม feedback แล้วบอกต่อนะครับ <img src='http://blog.chonla.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>อ้างอิง</p>
<ul>
<li>Aspect Ratio: <a href="http://en.wikipedia.org/wiki/Aspect_ratio_(image)">http://en.wikipedia.org/wiki/Aspect_ratio_(image)</a></li>
</ul>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.chonla.com%2F2009%2F08%2F%25e0%25b8%259b%25e0%25b8%25a5%25e0%25b8%25b1%25e0%25b9%258a%25e0%25b8%2581%25e0%25b8%25ad%25e0%25b8%25b4%25e0%25b8%2599-image-rescale-%25e0%25b8%25aa%25e0%25b8%25b3%25e0%25b8%25ab%25e0%25b8%25a3%25e0%25b8%25b1%25e0%25b8%259a-jquery%2F&amp;title=%E0%B8%9B%E0%B8%A5%E0%B8%B1%E0%B9%8A%E0%B8%81%E0%B8%AD%E0%B8%B4%E0%B8%99%20Image%20rescale%20%E0%B8%AA%E0%B8%B3%E0%B8%AB%E0%B8%A3%E0%B8%B1%E0%B8%9A%20jQuery" id="wpa2a_14"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2009/08/%e0%b8%9b%e0%b8%a5%e0%b8%b1%e0%b9%8a%e0%b8%81%e0%b8%ad%e0%b8%b4%e0%b8%99-image-rescale-%e0%b8%aa%e0%b8%b3%e0%b8%ab%e0%b8%a3%e0%b8%b1%e0%b8%9a-jquery/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>ทำ floating ads ไว้ใช้เอง</title>
		<link>http://blog.chonla.com/2009/07/%e0%b8%97%e0%b8%b3-scroll-ads-%e0%b9%84%e0%b8%a7%e0%b9%89%e0%b9%83%e0%b8%8a%e0%b9%89%e0%b9%80%e0%b8%ad%e0%b8%87/</link>
		<comments>http://blog.chonla.com/2009/07/%e0%b8%97%e0%b8%b3-scroll-ads-%e0%b9%84%e0%b8%a7%e0%b9%89%e0%b9%83%e0%b8%8a%e0%b9%89%e0%b9%80%e0%b8%ad%e0%b8%87/#comments</comments>
		<pubDate>Mon, 13 Jul 2009 17:13:37 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[Homemade Plugin]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Souce Code]]></category>
		<category><![CDATA[floating layers]]></category>
		<category><![CDATA[Plugin]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=201</guid>
		<description><![CDATA[เดิมที ผมได้โปรเจคจากผู้ว่าจ้างให้ทำ floating video เหมือนในเว็บ http://www.radiopublicity.com/ พอได้ลองเข้าไปดู code ที่เค้าเขียน รู้สึกว่ามันช่างซับซ้อนซ่อนเงื่อนเหลือเกิน ไม่ต้องพูดถึงเรื่อง reusability ครับ ยุ่งยากชิบ(หรือความจริงแล้ว ผมอาจจะโง่เกินกว่าจะเข้าใจ code อัน advanced ของมันก็ได้ครับ) พอนึกออกแล้วใช่มั๊ยครับ ว่าผมจะทำอะไรต่อไป&#8230; ใช่ครับ ทำเองครับ ส่วนผสมของผม หลีกหนีไม่พ้น jQuery ครับ ร่วมกับการเขียน plugin โดยมีคอนเซปท์ว่า จับอะไรก็ได้ บนเว็บ เอามาทำเป็น  floating layer ได้หมด แล้วก็เลื่อนตาม scrollbar ได้ด้วย คิดไปคิดมาต่อยอดได้อีกว่า จะให้มันอยู่ตรงไหนของหน้าจอก็ได้ snap ซ้าย snap ขวา หรือจะอยู่มันตรงกลาง บนล่าง ได้หมด โอ้ว ชักน่าตื่นเต้นแล้วสิ ในที่สุด ผมก็ลองทดสอบตัว prototype ของผมกับเว็บของผู้ว่าจ้างทันทีครับ (http://www.brendabence.com/media-room/) เออ พอใช้ได้แฮะ หลังจากนั้นก็เอามานั่งพัฒนาต่อยอดตามที่ตั้งใจไว้จนออกมาให้ได้ใช้งานกัน [...]]]></description>
			<content:encoded><![CDATA[<p>เดิมที ผมได้โปรเจคจากผู้ว่าจ้างให้ทำ floating video เหมือนในเว็บ <a href="http://www.radiopublicity.com/">http://www.radiopublicity.com/</a> พอได้ลองเข้าไปดู code ที่เค้าเขียน รู้สึกว่ามันช่างซับซ้อนซ่อนเงื่อนเหลือเกิน ไม่ต้องพูดถึงเรื่อง reusability ครับ ยุ่งยากชิบ(หรือความจริงแล้ว ผมอาจจะโง่เกินกว่าจะเข้าใจ code อัน advanced ของมันก็ได้ครับ) พอนึกออกแล้วใช่มั๊ยครับ ว่าผมจะทำอะไรต่อไป&#8230; ใช่ครับ ทำเองครับ</p>
<p>ส่วนผสมของผม หลีกหนีไม่พ้น jQuery ครับ ร่วมกับการเขียน plugin โดยมีคอนเซปท์ว่า จับอะไรก็ได้ บนเว็บ เอามาทำเป็น  floating layer ได้หมด แล้วก็เลื่อนตาม scrollbar ได้ด้วย คิดไปคิดมาต่อยอดได้อีกว่า จะให้มันอยู่ตรงไหนของหน้าจอก็ได้ snap ซ้าย snap ขวา หรือจะอยู่มันตรงกลาง บนล่าง ได้หมด โอ้ว ชักน่าตื่นเต้นแล้วสิ</p>
<p><span id="more-201"></span>ในที่สุด ผมก็ลองทดสอบตัว prototype ของผมกับเว็บของผู้ว่าจ้างทันทีครับ (<a href="http://www.brendabence.com/media-room/">http://www.brendabence.com/media-room/</a>) เออ พอใช้ได้แฮะ หลังจากนั้นก็เอามานั่งพัฒนาต่อยอดตามที่ตั้งใจไว้จนออกมาให้ได้ใช้งานกัน เสร็จแล้วก็ตั้งชื่อให้มันว่า scrollads plugin สำหรับ jQuery ครับ</p>
<p>รูปแบบการใช้งาน</p>
<pre name="code" class="js">
$.scrollads(options);
</pre>
<p>โดยที่ options เนี่ย จะใส่หรือไม่ใส่ก็ได้ครับ ถ้าใส่ก็จะเขียนอยู่ในรูปแบบ JSON โดยที่มี key ตามนี้เลยครับ</p>
<p>closer เป็น selector ที่ระบุปุ่มที่ใช้ปิดตัว layer นี้<br />
hsnap เป็นตัวบอกว่า layer จะอยู่ตำแหน่งไหนในแนวนอน มีค่าเป็น</p>
<ul>
<li>left ชิดซ้าย</li>
<li>center อยู่ตรงกลาง</li>
<li>right ชิดขวา</li>
<li>custom อยู่ตำแหน่งที่ระบุไว้ใน left</li>
<li>none อยู่ตำแหน่งตาม html</li>
</ul>
<p>vsnap เป็นตัวบอกว่า layer จะอยู่ตำแหน่งไหนในแนวตั้ง มีค่าเป็น</p>
<ul>
<li>top ชิดด้านบน</li>
<li>middle อยู่ตรงกลาง</li>
<li>bottom ชิดด้านล่าง</li>
<li>custom อยู่ตำแหน่งที่ระบุไว้ใน top</li>
<li>none อยู่ตำแหน่งตาม html</li>
</ul>
<p>เช่น</p>
<pre name="code" class="js">
$("#floatme").scrollads();
$("#floatme").scrollads({closer:".close"});
$("#floatme").scrollads({closer:".close",hsnap:"center"});
</pre>
<p>ลองไปดู <a title="LIVE DEMO: Floating Layer" href="http://sandbox.chonla.com/scrollads/" target="_blank">LIVE DEMO</a> กันดีกว่าครับ</p>
<p>สำหรับ source code ตัวที่เป็น minified <a title="jQuery Plugin : MINIFIED FLOATING LAYER JS" href="http://sandbox.chonla.com/scrollads/jquery.scrollads.min.js" target="_blank">สามารถดาวน์โหลดได้จากที่นี่ครับ</a></p>
<p>ใช้ดีอย่าลืมมา feedback แล้วบอกต่อนะครับ <img src='http://blog.chonla.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>อัพเดท วันที่ 6 สิงหาคม 2552<br />
+ ผมได้เพิ่ม option smooth ลงไปครับ เพื่อให้ scroll ได้ smooth ขึ้นครับ ถ้าไม่ใส่มันก็จะเลื่อนปึ๊ด ๆ แบบเดิม แต่ถ้าใส่ แล้วกำหนดเป็น &#8220;true&#8221; มันก็จะหยอด effect ลงไปหน่อย ทำให้เลื่อนแล้วดูเนียน ๆ ครับ ลองดูได้ครับ ขอบคุณครับ</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.chonla.com%2F2009%2F07%2F%25e0%25b8%2597%25e0%25b8%25b3-scroll-ads-%25e0%25b9%2584%25e0%25b8%25a7%25e0%25b9%2589%25e0%25b9%2583%25e0%25b8%258a%25e0%25b9%2589%25e0%25b9%2580%25e0%25b8%25ad%25e0%25b8%2587%2F&amp;title=%E0%B8%97%E0%B8%B3%20floating%20ads%20%E0%B9%84%E0%B8%A7%E0%B9%89%E0%B9%83%E0%B8%8A%E0%B9%89%E0%B9%80%E0%B8%AD%E0%B8%87" id="wpa2a_16"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2009/07/%e0%b8%97%e0%b8%b3-scroll-ads-%e0%b9%84%e0%b8%a7%e0%b9%89%e0%b9%83%e0%b8%8a%e0%b9%89%e0%b9%80%e0%b8%ad%e0%b8%87/feed/</wfw:commentRss>
		<slash:comments>33</slash:comments>
		</item>
		<item>
		<title>jTemplates, Template Engine ของ jQuery</title>
		<link>http://blog.chonla.com/2009/05/jtemplates-template-engine-%e0%b8%82%e0%b8%ad%e0%b8%87-jquery/</link>
		<comments>http://blog.chonla.com/2009/05/jtemplates-template-engine-%e0%b8%82%e0%b8%ad%e0%b8%87-jquery/#comments</comments>
		<pubDate>Tue, 19 May 2009 17:10:30 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Souce Code]]></category>
		<category><![CDATA[Template Engine]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[jTemplate]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Template]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=149</guid>
		<description><![CDATA[ได้ไปอ่านบทความเกี่ยวกับ Template Engine ที่เว็บ jquerytips เป็น Template Engine ที่เป็น plugin ของ jQuery น่าสนใจดีครับ เลยเอามาแบ่งปันกัน jTemplate เป็น Template Engine ที่มีลักษณะการเขียน (Syntax) ที่เรียกได้ว่าลอกแบบกันมาจาก Smarty เลยทีเดียว ทำให้คนที่มีพื้นฐานของ Smarty อยู่แล้ว สามารถเรียนรู้ jTemplate ได้โดยง่าย ส่วนรูปแบบของข้อมูลที่รองรับก็จะอยู่ในรูปแบบของ JSON มาดูตัวอย่างการเขียนกันครับ ขั้นแรก ผมจะกำหนด data ที่จะใช้งานก่อนครับ var data = { id: 4, name: "User List", table: [ {id: 1, name: 'Anne', age: 22, mail: 'anne@domain.com'}, [...]]]></description>
			<content:encoded><![CDATA[<p>ได้ไปอ่านบทความเกี่ยวกับ Template Engine ที่เว็บ <a href="http://www.jquerytips.com" target="_blank">jquerytips</a> เป็น Template Engine ที่เป็น plugin ของ jQuery น่าสนใจดีครับ เลยเอามาแบ่งปันกัน<br />
<span id="more-149"></span><br />
jTemplate เป็น Template Engine ที่มีลักษณะการเขียน (Syntax) ที่เรียกได้ว่าลอกแบบกันมาจาก Smarty เลยทีเดียว ทำให้คนที่มีพื้นฐานของ Smarty อยู่แล้ว สามารถเรียนรู้ jTemplate ได้โดยง่าย ส่วนรูปแบบของข้อมูลที่รองรับก็จะอยู่ในรูปแบบของ JSON มาดูตัวอย่างการเขียนกันครับ</p>
<p>ขั้นแรก ผมจะกำหนด data ที่จะใช้งานก่อนครับ</p>
<pre class="js">var data = {
    id: 4,
    name: "User List",
    table: [
        {id: 1, name: 'Anne', age: 22, mail: 'anne@domain.com'},
        {id: 2, name: 'Amelie', age: 24, mail: 'amelie@domain.com'},
        {id: 3, name: 'Polly', age: 18, mail: 'polly@domain.com'},
        {id: 4, name: 'Alice', age: 26, mail: 'alice@domain.com'},
        {id: 5, name: 'Martha', age: 25, mail: 'martha@domain.com'}
    ],
    toString: function() {
        return this.name.bold() + ' (count: ' + this.table.length + ')';
    }
};</pre>
<p>เสร็จแล้วก็มากำหนด Template</p>
<pre class="js">{#template MAIN}
&lt;div id="header"&gt;{$T.name}&lt;/div&gt;
&lt;table&gt;
{#foreach $T.table as r}
    {#include row root=$T.r}
{#/for}
&lt;/table&gt;
{#/template MAIN}

{#template row}
&lt;tr bgcolor="{#cycle values=['#AAAAEE','#CCCCFF']}"&gt;
    &lt;td&gt;{$T.name.bold()}&lt;/td&gt;
    &lt;td&gt;{$T.age}&lt;/td&gt;
    &lt;td&gt;{$T.mail.link('mailto:'+$T.mail)}&lt;/td&gt;
&lt;/tr&gt;
{#/template row}</pre>
<p>ที่เหลือก็แค่เรียกใช้งาน plugin ตัวนี้เท่านั้นเองครับ ง่าย ๆ</p>
<pre class="js">$("#result").setTemplate($("textarea").text()).processTemplate(data);</pre>
<p>ลองไปดูตัวอย่างที่ <a title="LIVE DEMO : jTemplate for jQuery" href="http://sandbox.chonla.com/jtemplate" target="_blank">LIVE DEMO</a> ได้เลยครับ</p>
<p>แหล่งอ้างอิงและ API</p>
<ul>
<li><a href="http://jtemplates.tpython.com/">http://jtemplates.tpython.com/</a></li>
<li><a href="http://www.jquerytips.com/2008/12/07/jtemplate-template-engine-in-javascript/">http://www.jquerytips.com/2008/12/07/jtemplate-template-engine-in-javascript/</a></li>
</ul>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.chonla.com%2F2009%2F05%2Fjtemplates-template-engine-%25e0%25b8%2582%25e0%25b8%25ad%25e0%25b8%2587-jquery%2F&amp;title=jTemplates%2C%20Template%20Engine%20%E0%B8%82%E0%B8%AD%E0%B8%87%20jQuery" id="wpa2a_18"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2009/05/jtemplates-template-engine-%e0%b8%82%e0%b8%ad%e0%b8%87-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Upload progress อัพไปเท่าไหร่แล้ว บอกหน่อยซิ</title>
		<link>http://blog.chonla.com/2009/04/upload-progress-%e0%b8%ad%e0%b8%b1%e0%b8%9e%e0%b9%84%e0%b8%9b%e0%b9%80%e0%b8%97%e0%b9%88%e0%b8%b2%e0%b9%84%e0%b8%ab%e0%b8%a3%e0%b9%88%e0%b9%81%e0%b8%a5%e0%b9%89%e0%b8%a7-%e0%b8%9a%e0%b8%ad%e0%b8%81/</link>
		<comments>http://blog.chonla.com/2009/04/upload-progress-%e0%b8%ad%e0%b8%b1%e0%b8%9e%e0%b9%84%e0%b8%9b%e0%b9%80%e0%b8%97%e0%b9%88%e0%b8%b2%e0%b9%84%e0%b8%ab%e0%b8%a3%e0%b9%88%e0%b9%81%e0%b8%a5%e0%b9%89%e0%b8%a7-%e0%b8%9a%e0%b8%ad%e0%b8%81/#comments</comments>
		<pubDate>Mon, 13 Apr 2009 18:35:26 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[APC]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Souce Code]]></category>
		<category><![CDATA[Progress]]></category>
		<category><![CDATA[Upload]]></category>
		<category><![CDATA[อัพโหลด]]></category>
		<category><![CDATA[เปอร์เซนต์]]></category>
		<category><![CDATA[แถบ]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=163</guid>
		<description><![CDATA[ลองแวะไปดูที่ http://www.zidoupload.com แล้วลองอัพโหลดไฟล์อะไรก็ได้ซักไฟล์นึง จะเห็นว่าระหว่างที่รอ มันจะมีการแสดงผลเป็นแถบว่าตอนนี้เราอัพโหลดไปแล้วกี่เปอร์เซนต์ รวมถึงยังบอกอีกว่า Transfer rate เป็นเท่าไหร่ ตรงนี้แหละครับที่ผมจะมาพูดถึงในวันนี้ การจะทำ Upload progress ด้วย PHP นั้น ส่วนประกอบที่ผมเลือกใช้จะประกอบด้วยส่วนหลัก ๆ อยู่ 3 ส่วนครับ คือ APC ย่อมาจาก Alternative PHP Cache ครับ ซึ่งจะมี library ที่ผมต้องการ นั่นคือ apc_fetch() ครับ Server ที่เราใช้จะต้องสนับสนุน APC ครับ ซึ่งเป็น PECL เข้าไปดาวน์โหลดได้จาก http://pecl.php.net/package/apc ครับ Ajax ในที่นี้ ผมใช้ Ajax ควบคู่กับ JSON ครับ Upload form ก็จะเป็น Form Upload ธรรมดานี่แหละครับ [...]]]></description>
			<content:encoded><![CDATA[<p>ลองแวะไปดูที่ <a title="ZidoUpload.com สุดยอดสังคมเพื่อการแบ่งปัน" href="http://www.zidoupload.com" target="_blank">http://www.zidoupload.co</a>m แล้วลองอัพโหลดไฟล์อะไรก็ได้ซักไฟล์นึง จะเห็นว่าระหว่างที่รอ มันจะมีการแสดงผลเป็นแถบว่าตอนนี้เราอัพโหลดไปแล้วกี่เปอร์เซนต์ รวมถึงยังบอกอีกว่า Transfer rate เป็นเท่าไหร่ ตรงนี้แหละครับที่ผมจะมาพูดถึงในวันนี้<br />
<span id="more-163"></span><br />
การจะทำ Upload progress ด้วย PHP นั้น ส่วนประกอบที่ผมเลือกใช้จะประกอบด้วยส่วนหลัก ๆ อยู่ 3 ส่วนครับ คือ</p>
<ol>
<li>APC ย่อมาจาก Alternative PHP Cache ครับ ซึ่งจะมี library ที่ผมต้องการ นั่นคือ apc_fetch() ครับ Server ที่เราใช้จะต้องสนับสนุน APC ครับ ซึ่งเป็น PECL เข้าไปดาวน์โหลดได้จาก <a title="APC Information" href="http://pecl.php.net/package/apc" target="_blank">http://pecl.php.net/package/apc</a> ครับ</li>
<li>Ajax ในที่นี้ ผมใช้ Ajax ควบคู่กับ JSON ครับ</li>
<li>Upload form ก็จะเป็น Form Upload ธรรมดานี่แหละครับ กำหนด enctypemultipart/form-data ให้เรียบร้อย และ method เป็น POST ให้เรียบร้อยเช่นกันครับ</li>
</ol>
<p>สำหรับไฟล์ที่จำเป็นในการทำ Upload Progress ด้วยวิธีนี้ ก็จะมี 3 ส่วนเช่นกัน ง่าย ๆ ตามนี้เลยครับ</p>
<ol>
<li>Upload Form จะเป็นหน้า Page ที่ User เห็นครับ เอาไว้สำหรับให้ User Browse File และกด Submit ครับ</li>
<li>Upload จะเป็นหน้า Page ที่เอาไว้สำหรับ Upload เลยครับ ในหน้านี้ ให้ทำการอัพโหลดเหมือนปกติครับ คือมีการ move_uploaded_file() อะไรเหมือนปกติืืทุกอย่างครับ</li>
<li>Progress จะเป็นส่วนที่เอาไว้สำหรับให้หน้า Form Upload มา poll ค่า status ของการ Upload ครับ ส่วนนี้แหละครับ ที่จะเป็นตัว return กลับไปว่า อัพโหลดอะไรได้ยังไงเท่าไหร่แล้วครับ</li>
</ol>
<p> </p>
<p><strong>Upload Form</strong></p>
<p>ทีนี้ เมื่อเรามีทุกอย่างพร้อม เราก็จะทำการกำหนด key สำหรับ Upload session เพื่อให้การ Poll ถามข้อมูลนั้นทำได้ถูกต้องครับ การกำหนดเราทำได้โดยการใส่ input hidden ที่ชื่อ APC_UPLOAD_PROGRESS ให้มีค่าเป็น key ที่เราต้องการครับ ผมสมมติให้มีค่าเป็น &#8220;abcd&#8221; ดังนั้น form ที่เราได้ควรจะมีหน้าตาประมาณแบบนี้ครับ (ชื่อ APC_UPLOAD_PROGRESS เราสามารถเปลี่ยนได้ใน php.ini ครับ)</p>
<p> </p>
<pre class="html" name="code">&lt;form enctype="multipart/form-data" action="upload.php" method="post"&gt;
    &lt;input type="hidden" name="APC_UPLOAD_PROGRESS" value="abcd"&gt;
    &lt;input name="upfile" type="file"&gt;&lt;/span&gt;
    &lt;input type="submit" value="Upload"&gt;
&lt;/form&gt;</pre>
<p> </p>
<p><strong>Upload</strong></p>
<p>ในส่วนนี้ผมไม่พูดถึงนะครับ ทำการอัพโหลดไฟล์ตามปกติเลยครับ ในกรณีที่ไฟล์ใหญ่มาก อย่าลืม set ให้ไม่ต้องมี timeout ด้วย function set_time_limit(0) ด้วยนะครับ</p>
<p> </p>
<p><strong>Progress</strong></p>
<p>สำหรับ Progress ไฟล์นั้น จะมีหน้าตาประมาณนี้ครับ</p>
<pre class="php" name="code">&lt;?php
header("content-type:application/json");
$stat = apc_fetch('upload_abcd');
if ($stat)
{
    if (!isset($stat["total"])) $stat["total"] = 0;
    if (!isset($stat["current"])) $stat["current"] = 0;
    if (!isset($stat["rate"])) $stat["rate"] = 0;
    if (!isset($stat["cancel_upload"])) $stat["cancel_upload"] = 0;
    if (!isset($stat["done"])) $stat["done"] = 0;
    f (!isset($stat["filename"])) $stat["filename"] = "";
    printf("[%0d,%0d,%0d,%0d,%0d,\"%s\"]",
    $stat["total"] ,
    $stat["current"] ,
    $stat["rate"] ,
    $stat["cancel_upload"] ,
    $stat["done"],
    addslashes($stat["filename"]));
}
else
{
    echo "null";
}
?&gt;</pre>
<p> </p>
<p>สิ่งที่เราต้องทำคือ ทำการ poll ข้อมูลการอัพโหลดของ key &#8220;abcd&#8221; จาก server เราก็ทำได้โดยเรียก function apc_fetch และกำหนด parameter เป็น string ขึ้นต้นด้วย &#8220;upload_&#8221; และตามด้วย key ของเรา คือ &#8220;abcd&#8221;</p>
<p>ค่าที่ return มาจาก apc_fetch จะได้เป็น associative array โดยมี key ที่เราจะเอามาใช้งานคือ</p>
<ul>
<li>total เป็นขนาดไฟล์</li>
<li>current เป็นขนาดไฟล์ที่อัพโหลดได้แล้ว</li>
<li>rate คือความเร็วในการอัพโหลดครับ</li>
<li>filename เป็นชื่อไฟล์ในเครื่องเราครับ (เช่น C:\Download\file.txt)</li>
</ul>
<p>คราวนี้ เราก็แค่ใช้ ajax มา poll ค่าเหล่านี้ออกไปแสดงเท่านั้นเองครับ ทีนี้ต้องพึ่งฝีมือ dhtml กับ graphic ของคุณเองแล้วล่ะครับ ว่าจะทำ progress bar ออกมาได้สวยแค่ไหน</p>
<p> </p>
<p>บทความนี้ ผมไม่มี LIVE DEMO แต่มีตัวอย่างให้ลองดาวน์โหลดไปทดสอบกันได้ครับ <a href="http://sandbox.chonla.com/uploadprogress/" title="SAMPLE DOWNLOAD : Download Progress">ดาวน์โหลด</a> กับเว็บที่ผมทำให้เอาไปใช้งานจริงครับ แวะลองไปทดสอบและใช้บริการกันได้ที่ <a title="ZidoUpload.com สุดยอดสังคมเพื่อการแบ่งปัน" href="http://www.zidoupload.com" target="_blank">http://www.zidoupload.com</a> ครับ</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.chonla.com%2F2009%2F04%2Fupload-progress-%25e0%25b8%25ad%25e0%25b8%25b1%25e0%25b8%259e%25e0%25b9%2584%25e0%25b8%259b%25e0%25b9%2580%25e0%25b8%2597%25e0%25b9%2588%25e0%25b8%25b2%25e0%25b9%2584%25e0%25b8%25ab%25e0%25b8%25a3%25e0%25b9%2588%25e0%25b9%2581%25e0%25b8%25a5%25e0%25b9%2589%25e0%25b8%25a7-%25e0%25b8%259a%25e0%25b8%25ad%25e0%25b8%2581%2F&amp;title=Upload%20progress%20%E0%B8%AD%E0%B8%B1%E0%B8%9E%E0%B9%84%E0%B8%9B%E0%B9%80%E0%B8%97%E0%B9%88%E0%B8%B2%E0%B9%84%E0%B8%AB%E0%B8%A3%E0%B9%88%E0%B9%81%E0%B8%A5%E0%B9%89%E0%B8%A7%20%E0%B8%9A%E0%B8%AD%E0%B8%81%E0%B8%AB%E0%B8%99%E0%B9%88%E0%B8%AD%E0%B8%A2%E0%B8%8B%E0%B8%B4" id="wpa2a_20"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2009/04/upload-progress-%e0%b8%ad%e0%b8%b1%e0%b8%9e%e0%b9%84%e0%b8%9b%e0%b9%80%e0%b8%97%e0%b9%88%e0%b8%b2%e0%b9%84%e0%b8%ab%e0%b8%a3%e0%b9%88%e0%b9%81%e0%b8%a5%e0%b9%89%e0%b8%a7-%e0%b8%9a%e0%b8%ad%e0%b8%81/feed/</wfw:commentRss>
		<slash:comments>49</slash:comments>
		</item>
	</channel>
</rss>

