<?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>$i-&#62;php(); &#187; CakePHP</title>
	<atom:link href="http://i-php.net/category/cakephp/feed/" rel="self" type="application/rss+xml" />
	<link>http://i-php.net</link>
	<description>Hãy tiết kiệm điện và sử dụng opensource để bảo vệ môi trường</description>
	<lastBuildDate>Fri, 26 Feb 2010 07:29:32 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Đa ngôn ngữ trong CakePHP</title>
		<link>http://i-php.net/2010/02/da-ngon-ng%e1%bb%af-v%e1%bb%9bi-d%e1%bb%af-li%e1%bb%87u-tinh-trong-cakephp/</link>
		<comments>http://i-php.net/2010/02/da-ngon-ng%e1%bb%af-v%e1%bb%9bi-d%e1%bb%af-li%e1%bb%87u-tinh-trong-cakephp/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 04:18:55 +0000</pubDate>
		<dc:creator>nguyetnt</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://i-php.net/?p=584</guid>
		<description><![CDATA[Đa ngôn ngữ với dữ liệu tĩnh trên trang
- Tạo file định nghĩa đa ngôn ngữ
Bình thường, khi làm đa ngôn ngữ với php. Bạn cần tạo ra một file để định nghĩa tất cả các cụm từ cần dịch. Việc tìm ra từng cụm từ, gán cho nó một hằng và định nghĩa hằng [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Đa ngôn ngữ với dữ liệu tĩnh trên trang</strong><br />
<strong>- Tạo file định nghĩa đa ngôn ngữ</strong><br />
Bình thường, khi làm đa ngôn ngữ với php. Bạn cần tạo ra một file để định nghĩa tất cả các cụm từ cần dịch. Việc tìm ra từng cụm từ, gán cho nó một hằng và định nghĩa hằng đó sẽ mất rất nhiều thời gian và nhàm chán. CakePHP hỗ trợ bạn tạo file định nghĩa đó một cách dễ dàng nếu bạn viết theo đúng qui cách.<br />
Ví dụ site của bạn cần 2 ngôn ngữ là Tiếng Việt(vie) và tiếng Anh (eng). Ta thực hiện các bước sau:<br />
Đầu tiên, thiết lập các thư mục chứa file định nghĩa. Tạo lập các thư mục mới trong thư mục app/locale:<br />
cmd<br />
cd your_app/app/locale<br />
mkdir vie<br />
mkdir vie/LC_MESSAGES<br />
mkdir eng<br />
mkdir eng/LC_MESSAGES<br />
Sau khi file định nghĩa được gen ra sẽ được đưa vào các thư mục LC_MESSAGES.<br />
Qui cách để cakePHP tìm được từ, cụm từ cần định nghĩa là với thêm cặp ngoặc __(&#8221;) hoặc __(&#8221;,true). Tham số thứ 2 cho biết từ đó cần trả về giá trị hay hiển thị qua hàm echo. Ví dụ:</p>
<blockquote><p>
&lt;h1&gt;&lt;?php __(&#8216;Xin chào&#8217;);?&gt;&lt;/h1&gt;<br />
&lt;?php __(&#8216;Đây là một ví dụ về đa ngôn ngữ&#8217;); ?&gt;&lt;br/&gt;<br />
&lt;?php $text=__(&#8216;Đây là một ví dụ về đa ngôn ngữ&#8217;,true); echo $text?&gt;&lt;br/&gt;</p></blockquote>
<p>Vào chương trình console của cakePHP và bắt đầu thực hiện việc gen file định nghĩa của bạn:<br />
cd path_your_app/cake/console<br />
cakephp i18n<br />
- Chọn e để gen file, chọn i để tạo bảng i18n trong database hiện thời&#8230; chọn e.<br />
- Cake hỏi bạn đường dẫn tuyệt đối tới thư mục app của ứng dụng của bạn: path_to_app/app (VD:c:\xampp\htdocs\your_site\app &#8211; windows)<br />
- Cake hỏi bạn đường dẫn tuyệt đối tới thư ban muốn gen file, thường là thư mục locale.<br />
path_to_app/app/locale<br />
- Nếu bạn muốn gen các định nghĩa ra một file chọn y hoặc ngược lại.<br />
- Sửa tên file: Chọn y. nếu không file sẽ có tên mặc định là default.pot. trong ví dụ này, tôi để tên mặc định.<br />
- Sau khi thực hiện xong, một file có trong thư mục bạn muốn gen file sẽ có một file deafult.pot. Thay đổi đuôi .pot->.po. Copy file default.po vào thư mục LC_MESSAGES đã tạo:<br />
- Bây giờ, bạn mở file default.po và dịch. Trong ví dụ của tôi thì file các deafult.po sẽ như sau :</p>
<blockquote><p>
// locale/vie/LC_MESSAGES/default.po<br />
msgid &#8220;Xin chào&#8221;<br />
msgstr &#8220;Xin chào&#8221;</p>
<p>msgid &#8220;Đây là một ví dụ về đa ngôn ngữ&#8221;<br />
msgstr &#8220;Đây là một ví dụ về đa ngôn ngữ&#8221;</p>
<p>// locale/eng/LC_MESSAGES/default.po<br />
msgid &#8220;Xin chào&#8221;<br />
msgstr &#8220;Hello&#8221;</p>
<p>msgid &#8220;Đây là một ví dụ về đa ngôn ngữ&#8221;<br />
msgstr &#8220;This is an multi language example &#8221;
</p></blockquote>
<p><strong>- Thay đổi ngôn ngữ: </strong>CakePHP xác định ngôn ngữ hiện thời của trang bằng một Session(Config.language). Cho nên việc của bạn khi thay đổi ngôn ngữ là thay đổi giá trị của Session đó. Bạn làm như thế này:<br />
Đầu tiên, tạo file p28n.php trong thư mục component. copy đoạn code:</p>
<blockquote><p>&lt;?php<br />
class P28nComponent extends Object {<br />
var $components = array(&#8216;Session&#8217;, &#8216;Cookie&#8217;);<br />
function startup() {<br />
if (!$this-&gt;Session-&gt;check(&#8216;Config.language&#8217;)) {<br />
$this-&gt;change(($this-&gt;Cookie-&gt;read(&#8216;lang&#8217;) ? $this-&gt;Cookie-&gt;read(&#8216;lang&#8217;) : DEFAULT_LANGUAGE));<br />
}<br />
}<br />
function change($lang = null) {<br />
if (!empty($lang)) {<br />
$this-&gt;Session-&gt;write(&#8216;Config.language&#8217;, $lang);<br />
$this-&gt;Cookie-&gt;write(&#8216;lang&#8217;, $lang, null, &#8216;+350 day&#8217;);<br />
}<br />
}<br />
}<br />
?&gt;</p></blockquote>
<p>DEFAULT_LANGUAGE là một hằng được định nghĩa trong thư mục app/config/bootstrap.php: define(&#8216;DEFAULT_LANGUAGE&#8217;,'vie&#8217;);</p>
<p>- Tạo controller P28n: controller này được gọi đến khi người dùng click link chuyển ngôn ngữ.</p>
<blockquote><p>&lt;?php<br />
class P28nController extends AppController {<br />
var $name = &#8216;P28n&#8217;;<br />
var $uses = null;<br />
var $components = array(&#8216;P28n&#8217;);<br />
function change($lang = null) {<br />
$this-&gt;P28n-&gt;change($lang);<br />
$this-&gt;redirect($this-&gt;referer(null, true));<br />
}<br />
function shuntRequest() {<br />
$this-&gt;P28n-&gt;change($this-&gt;params['lang']);<br />
$args = func_get_args();<br />
$this-&gt;redirect(&#8220;/&#8221; . implode(&#8220;/&#8221;, $args));<br />
}<br />
}<br />
?&gt;</p></blockquote>
<p>- trong file app/app_controller.php chúng ta cần gọi tới component P28n</p>
<blockquote><p>&lt;?php<br />
//app_controller.php<br />
class AppController extends Controller {<br />
var $components = array(&#8216;P28n&#8217;);<br />
}<br />
?&gt;</p></blockquote>
<p>- Cấu hình trong file app/config/routes.php giúp link của chúng ta dễ hiểu hơn với người dùng và đẹp hơn.</p>
<blockquote><p>//route to switch locale<br />
Router::connect(&#8216;/lang/*&#8217;, array(&#8216;controller&#8217; =&gt; &#8216;p28n&#8217;, &#8216;action&#8217; =&gt; &#8216;change&#8217;));</p>
<p>//forgiving routes that allow users to change the lang of any page<br />
Router::connect(&#8216;/eng/*&#8217;, array(<br />
&#8216;controller&#8217; =&gt; &#8220;p28n&#8221;,<br />
&#8216;action&#8217; =&gt; &#8220;shuntRequest&#8221;,<br />
&#8216;lang&#8217; =&gt; &#8216;eng&#8217;<br />
));</p>
<p>Router::connect(&#8216;/vie/*&#8217;, array(<br />
&#8216;controller&#8217; =&gt; &#8220;p28n&#8221;,<br />
&#8216;action&#8217; =&gt; &#8220;shuntRequest&#8221;,<br />
&#8216;lang&#8217; =&gt; &#8216;vie&#8217;<br />
));</p></blockquote>
<p>Cuối cùng, tạo link để thay đổi ngôn ngữ:</p>
<blockquote><p>&lt;!&#8211; Ví dụ các từ cần định nghĩa &#8211;&gt;<br />
&lt;h1&gt;&lt;?php __(&#8216;Xin chào&#8217;);?&gt;&lt;/h1&gt;<br />
&lt;?php __(&#8216;Đây là một ví dụ về đa ngôn ngữ&#8217;); ?&gt;&lt;br/&gt;<br />
&lt;?php $text=__(&#8216;Đây là một ví dụ về đa ngôn ngữ&#8217;,true); echo $text?&gt;&lt;br/&gt;<br />
&lt;!&#8211; Thay đổi ngôn ngữ và ở trang hiện tại //&#8211;&gt;<br />
&lt;?php echo $html-&gt;link($html-&gt;image(&#8216;vie.gif&#8217;), &#8216;/lang/vie&#8217;, null, null, false); ?&gt;<br />
&lt;?php echo $html-&gt;link($html-&gt;image(&#8216;eng.gif&#8217;), &#8216;/lang/eng&#8217;, null, null, false); ?&gt;<br />
&lt;!&#8211;  Thay đổi ngôn ngữ và chuyển tới một trang mới nào đó//&#8211;&gt;<br />
&lt;?php echo $html-&gt;link($html-&gt;image(&#8216;vie.gif&#8217;), &#8216;/vie/news&#8217;, null, null, false); ?&gt;<br />
&lt;?php echo $html-&gt;link($html-&gt;image(&#8216;eng.gif&#8217;), &#8216;/eng/news&#8217;, null, null, false); ?&gt;</p></blockquote>
<p>Xong, bạn đã hoàn thành việc đa ngôn ngữ với dữ liệu tĩnh trên trang của bạn. Với đa ngôn ngữ dữ liệu động, bạn có thể tham khảo chi tiết tại trang:<br />
<a href="http://book.cakephp.org/view/92/Translate">http://book.cakephp.org/view/92/Translate</a></p>
]]></content:encoded>
			<wfw:commentRss>http://i-php.net/2010/02/da-ngon-ng%e1%bb%af-v%e1%bb%9bi-d%e1%bb%af-li%e1%bb%87u-tinh-trong-cakephp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cách rewrite url trong cake php</title>
		<link>http://i-php.net/2010/02/cach-rewrite-url-trong-cake-php/</link>
		<comments>http://i-php.net/2010/02/cach-rewrite-url-trong-cake-php/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 09:10:13 +0000</pubDate>
		<dc:creator>chinhvd</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://i-php.net/?p=580</guid>
		<description><![CDATA[Trong cakephp mặc định sãn url sẽ là: &#8230;/controller/action
vd: http://vnland.vn/frontpages/preview/Ban-chung-cu-cao-cap
Rõ ràng url trên ta không thấy được nhiều thông tin,nhưng với url
http://vnland.vn/bat-dong-san/can-ban/chi-tiet/Ban-chung-cu-cao-cap
Cùng một nội dung hiển thị như nhau nhưng rõ ràng url thứ 2 mang nhiều thông tin và nhìn đẹp hơn url đầu.Hơn thế nữa việc rewrite lại url còn giúp cho các [...]]]></description>
			<content:encoded><![CDATA[<p>Trong cakephp mặc định sãn url sẽ là: &#8230;/controller/action</p>
<p>vd: http://vnland.vn/frontpages/preview/Ban-chung-cu-cao-cap</p>
<p>Rõ ràng url trên ta không thấy được nhiều thông tin,nhưng với url</p>
<p>http://vnland.vn/bat-dong-san/can-ban/chi-tiet/Ban-chung-cu-cao-cap</p>
<p>Cùng một nội dung hiển thị như nhau nhưng rõ ràng url thứ 2 mang nhiều thông tin và nhìn đẹp hơn url đầu.Hơn thế nữa việc rewrite lại url còn giúp cho các bộ máy tìm kiếm dễ dàng tìm ra trang web của bạn.</p>
<p>Ok,có thể thấy việc rewrite lại url mang lại khá nhiều điều,và chỉ cần một số thao tác bạn có thể rewrite lại url như mong muốn,hãy làm theo các bước sau:</p>
<p>bước1:mở file routes.php trong thư mục app/config/routes.php.</p>
<p>bước 2:chèn đoạn mã sau vào:</p>
<p>Router::connect(&#8216;/bat-dong-san/:gi-cung-duoc-1/:gi-cung-duoc-2/:id&#8217;, array(&#8216;controller&#8217; =&gt; &#8216;frontpages&#8217;,'action&#8217;=&gt;&#8217;preview&#8217;),<br />
array( &#8216;pass&#8217; =&gt; array(<br />
&#8216;id&#8217;<br />
)<br />
)<br />
);</p>
<p>Nhìn vào dòng code trên các bạn có thể thấy &#8230;/frontpages/preview được thay thế bằng &#8230;/bat-dong-san/:gi-cung-duoc-1/:gi-cung-duoc-2/</p>
<p>Còn cái &#8220;:id&#8221; và array( &#8216;pass&#8217; =&gt; array(&#8216;id&#8217;) ) giúp bạn truyền tham số từ url xuống controller(nó là cái $id hay sử dụng trong các function edit($id){})</p>
<p>còn ở 2 cái &#8220;:gi-cung-duoc-1&#8243; và &#8230;&#8221;:gi-cung-duoc-n&#8221; bạn có thể thay bằng bất cứ nội dung gì để url của bạn nhìn cho đẹp và đủ thông tin,lưu ý là số lượng &#8220;:gi-cung-duoc&#8221; bao nhiêu là tùy bạn nhưng cần đảm bảo số lượng phải đủ trên url mà bạn gọi ở vd trên mình dùng là 2:/:gi-cung-duoc-1/:gi-cung-duoc-2/ trên url là /can-ban/chi-tiet/.</p>
<p>Ok,vậy là các bạn đã có một url như mong muốn.^-^.</p>
]]></content:encoded>
			<wfw:commentRss>http://i-php.net/2010/02/cach-rewrite-url-trong-cake-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sử dụng plugin chat trong cakephp 1.2</title>
		<link>http://i-php.net/2009/10/s%e1%bb%ad-d%e1%bb%a5ng-plugin-chat-trong-cakephp-12/</link>
		<comments>http://i-php.net/2009/10/s%e1%bb%ad-d%e1%bb%a5ng-plugin-chat-trong-cakephp-12/#comments</comments>
		<pubDate>Wed, 28 Oct 2009 14:07:35 +0000</pubDate>
		<dc:creator>hoanbn</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[chat]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://i-php.net/?p=545</guid>
		<description><![CDATA[Xin chào các bạn!
Đây là môt plugin do tôi tự viết dựa trên các tính năng chat của livechat. Chương trình livechat tôi tham khảo được viết bằng php, để có thể quản trị được các chức năng tôi thấy có nhiều cái thừa  không cần thiết trong trường hợp của tôi. Tôi đã dựa [...]]]></description>
			<content:encoded><![CDATA[<p>Xin chào các bạn!</p>
<p>Đây là môt plugin do tôi tự viết dựa trên các tính năng chat của livechat. Chương trình livechat tôi tham khảo được viết bằng php, để có thể quản trị được các chức năng tôi thấy có nhiều cái thừa  không cần thiết trong trường hợp của tôi. Tôi đã dựa vào livechat để viết plugin với tính năng tương tự. Plugin này có sử dụng jquery.</p>
<p><strong>Các chức năng chính:</strong></p>
<p>1)  Hiển thị danh sách người chat và danh sách người quản trị đang chat. Tôi tạm gọi là guests và operators.</p>
<p>2) Guest chỉ việc nhập tên và email, sau đó sẽ hiển thị màn hình chat. Operators sẽ thấy trạng thái chát của guest và bắt đầu chat. Một guest có thể do nhiều operators chat.</p>
<p>3) Operators sử dụng luôn bảng users.</p>
<p>3) Các chức năng hoặc động trong cửa sổ window riêng biệt (popup window).</p>
<p>Để sử dụng các bạn <a href="http://i-php.net/chat.zip">download plugin tại đây</a>. (Để hểu rõ hơn về plugin bạn có thể tham khảo tại <a href="http://i-php.net/2009/08/s%E1%BB%AD-d%E1%BB%A5ng-plugin-trong-cakephp-12/">đây</a>)</p>
<p><strong>Cài đặt:</strong></p>
<p>1) Đưa toàn bộ nội dung của plugin chat vào trong app/plugin</p>
<p>2) Bạn chạy file sqlChat trong thu mục app/plugins/chat/config/sql .</p>
<p>3) Copy file chat.ctp trong thu muc app/plugins/chat/views/layout vào trong thu mục app/views/layout.</p>
<p><strong>Sử dụng:</strong></p>
<p>Do các chức năng chat đểu hiển thị ra các cửa sổ riêng biệt. Do vậy ta chỉ việc tạo ra link gọi đến là ok.</p>
<p>Ví dụ:</p>
<pre class="php">&lt;?php
//Hiển thị link để guest mở cửa sổ chat với admin
echo $html-&gt;link('Chat with Amdmin', '/chat/chats/form_guest', array('onclick' =&gt; "window.open('{$html-&gt;url('/chat/chats/form_guest')}','mywin','left=20,top=20,width=460,height=440,toolbar=0,resizable=0'); return false;"));
echo '&lt;br /&gt;';
//Hiển thị link quản trị chat
echo $html-&gt;link('Manager chatting', '/chat/chats/chat_users', array('onclick' =&gt; "window.open('{$html-&gt;url('/chat/chats/chat_users')}','mywin','left=20,top=20,width=460,height=440,toolbar=0,resizable=0'); return false;"));
?&gt;</pre>
<p>Vậy là xong, chúc các bạn vui vẻ <img src='http://i-php.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://i-php.net/2009/10/s%e1%bb%ad-d%e1%bb%a5ng-plugin-chat-trong-cakephp-12/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Upload ảnh có đóng dấu bản quyền &#8211; cakephp 1.2</title>
		<link>http://i-php.net/2009/10/upload-%e1%ba%a3nh-co-dong-d%e1%ba%a5u-b%e1%ba%a3n-quy%e1%bb%81n-cakephp-12/</link>
		<comments>http://i-php.net/2009/10/upload-%e1%ba%a3nh-co-dong-d%e1%ba%a5u-b%e1%ba%a3n-quy%e1%bb%81n-cakephp-12/#comments</comments>
		<pubDate>Sun, 18 Oct 2009 05:14:59 +0000</pubDate>
		<dc:creator>tuannh</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://i-php.net/?p=529</guid>
		<description><![CDATA[Đóng dấu cho ảnh thật sự cần thiết khi chúng ta muốn giữ bản quyền cho ảnh đó. Bài viết này sẽ hướng dẫn mọi người làm việc đó một cách dễ dàng. Bắt dầu nào :
Đầu tiên là tạo cơ sở dữ liệu :

CREATE TABLE `images` (
`id` INT( 4 ) NOT NULL AUTO_INCREMENT PRIMARY [...]]]></description>
			<content:encoded><![CDATA[<p>Đóng dấu cho ảnh thật sự cần thiết khi chúng ta muốn giữ bản quyền cho ảnh đó. Bài viết này sẽ hướng dẫn mọi người làm việc đó một cách dễ dàng. Bắt dầu nào :<br />
Đầu tiên là tạo cơ sở dữ liệu :</p>
<pre name="code" class="mysql">
CREATE TABLE `images` (
`id` INT( 4 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`images` VARCHAR( 255 ) NOT NULL
)
</pre>
<p>Vậy là xong bước đầu tiên. Tiếp đến chúng ta sẽ tạo controller / model / views</p>
<p>Đầu tiên là controller : app/controllers/images_controller.php:</p>
<pre name="code" class="php">
&lt;?php
class ImagesController extends AppController
{
var $name = 'Images';
var $components = array('Upload');

function add()
{
if(! empty ($this-&gt;data))
{
$this-&gt;Image-&gt;create ();
if($this-&gt;Upload-&gt;upload ($this-&gt;data['Image']['image'], WWW_ROOT . 'img' . DS))
{
$this-&gt;data['Image']['images'] = $this-&gt;data['Image']['image']['name'];
}
if($this-&gt;Image-&gt;save ($this-&gt;data))
{
$this-&gt;Session-&gt;setFlash (__ ('The Image has been saved', true));
$this-&gt;redirect ($this-&gt;referer());
}else
{
$this-&gt;Session-&gt;setFlash (__ ('The Image could not be saved. Please, try again.', true));
}
}
}
}
?&gt;</pre>
<p>Tiếp đến là model : app/models/image.php</p>
<pre name="code" class="php">
&lt;?php
class Image extends AppModel {
var $name = 'Image';
}
?&gt;</pre>
<p>Cuối cùng là views : app/views/images/add.ctp</p>
<pre name="code" class="php">
&lt;div class="images form"&gt;
&lt;?php $session-&gt;flash();?&gt;
&lt;?php echo $form-&gt;create('Image', array('type' =&gt; 'file')); ?&gt;
&lt;fieldset&gt;
&lt;legend&gt;&lt;?php __('Add image');?&gt;&lt;/legend&gt;
&lt;div class="group"&gt;
&lt;div&gt;&lt;?php __('Image');?&gt;&lt;/div&gt;
&lt;div&gt;&lt;?php echo $form-&gt;file('image',array('label'=&gt;'',)); ?&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/fieldset&gt;
&lt;?php echo $form-&gt;end('add');?&gt;
&lt;/div&gt;</pre>
<p>Để có thể upload được ảnh ta sẽ sử dụng  components. Ở đây ta sẽ tạo 1 file có tên là upload.php trong components</p>
<p>app/controllers/components/upload.php</p>
<pre name="code" class="php">
&lt;?php
class UploadComponent extends Object {
function upload(&amp;$file, $dir) {
$return = false;
// current time in miliseconds
$time = microtime ( 1 ) * 1000;
$file['name']=md5($time).$file['name'];

if(@move_uploaded_file($file['tmp_name'],$dir.$file['name']))
{
//Dòng này là ảnh sẽ được upload
$main_img         = $dir.$file['name']; // main big photo / picture

//Dòng này là ảnh sẽ đóng dấu lên ảnh được upload
$watermark_img    = "watermark.gif"; // use GIF or PNG, JPEG has no tranparency support
$padding         = 3; // distance to border in pixels for watermark image
$opacity        = 100;    // image opacity for transparent watermark

$watermark     = imagecreatefromgif($dir.$watermark_img); // create watermark
$image         = imagecreatefromjpeg($main_img); // create main graphic

if(!$image || !$watermark) die("Error: main image or watermark could not be loaded!");

$watermark_size     = getimagesize($dir.$watermark_img);
$watermark_width     = $watermark_size[0];
$watermark_height     = $watermark_size[1];

$image_size     = getimagesize($main_img);
$dest_x         = $image_size[0] - $watermark_width - $padding;
$dest_y         = $image_size[1] - $watermark_height - $padding;

// copy watermark on main image
imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, $opacity);

// print image to screen
header("content-type: image/jpeg");
imagejpeg($image);
imagedestroy($image);
imagedestroy($watermark);
$return = true;
}
return $return;
}
}
?&gt;</pre>
<p>file ảnh watemark.gif được đặt trong thư mục : app/webroot/img/watermark.gif.</p>
<p>Muốn cho ảnh watermark.gif mờ đi thì ta chỉ việc chỉnh độ opacity là được.</p>
<p>Bạn có thể download file ảnh watermark.gif tại <a href="http://www.cafewebmaster.com/demo/image-watermark/watermark.gif">đây</a></p>
]]></content:encoded>
			<wfw:commentRss>http://i-php.net/2009/10/upload-%e1%ba%a3nh-co-dong-d%e1%ba%a5u-b%e1%ba%a3n-quy%e1%bb%81n-cakephp-12/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sử dụng plugin Paypal IPN trong CakePHP</title>
		<link>http://i-php.net/2009/10/s%e1%bb%ad-d%e1%bb%a5ng-plugin-paypal-ipn-trong-cakephp/</link>
		<comments>http://i-php.net/2009/10/s%e1%bb%ad-d%e1%bb%a5ng-plugin-paypal-ipn-trong-cakephp/#comments</comments>
		<pubDate>Sat, 17 Oct 2009 13:18:39 +0000</pubDate>
		<dc:creator>hoanbn</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://i-php.net/?p=516</guid>
		<description><![CDATA[Xin chào mọi người!
Plugin paypal IPN này thật sự cần thiết cho những ai muốn sử dụng Paypal IPN trong cakephp. Tôi đã tìm kiếm trên mạng và sử dụng plugin này, thấy thật sự mang lại tiện ích rất lớn. Helper trong plugin sẽ giúp ta dẽ dàng tạo ra các nút Checkout, Add [...]]]></description>
			<content:encoded><![CDATA[<p>Xin chào mọi người!</p>
<p>Plugin paypal IPN này thật sự cần thiết cho những ai muốn sử dụng Paypal IPN trong cakephp. Tôi đã tìm kiếm trên mạng và sử dụng plugin này, thấy thật sự mang lại tiện ích rất lớn. Helper trong plugin sẽ giúp ta dẽ dàng tạo ra các nút <em>Checkout, Add to Cart, Subscribe, và Donate </em> một cách dễ dàng. Chức năng chính của plugin này là tạo ra các nút add to cart, subscribe &#8230; trong paypal để gửi thông tin lên paypal, thực hiện giao dịch và lưu trữ dữ liệu giao dịch trả về vào trong log và CSDL. (Cách sử dụng plugin bạn tham khảo tại <a href="http://i-php.net/2009/08/s%E1%BB%AD-d%E1%BB%A5ng-plugin-trong-cakephp-12/">đây</a>).</p>
<p><strong>Paypal IPN plugin.  (Paypal Instant Payment Notification)</strong><br />
<strong>Version 1.4</strong><br />
<strong>Tác giả:</strong> Nick Baker (nick@webtechnick.com)</p>
<p><strong>Website:</strong> <a href="http://www.webtechnick.com/">http://www.webtechnick.com</a></p>
<p>Browse, Download, hoặc  Checkout Plugin.<br />
<strong>Browse:</strong> <a href="http://projects.webtechnick.com/paypal_ipn">http://projects.webtechnick.com/paypal_ipn</a><br />
<strong>Download:</strong> <a href="http://projects.webtechnick.com/paypal_ipn.tar.gz">http://projects.webtechnick.com/paypal_ipn.tar.gz</a><br />
<strong>SVN:</strong> <a href="https://svn2.xp-dev.com/svn/nurvzy-paypal-ipn">https://svn2.xp-dev.com/svn/nurvzy-paypal-ipn</a></p>
<p>Các bước cài đặt như sau:</p>
<p>1) Copy plugin vào trong project /app/plugins/paypal_ipn.</p>
<p>2) Import file  /plugins/paypal_ipn/paypal_ipn.sql vào trong cơ sở dữ liệu.</p>
<p>3) Thêm những dòng dưới đây vào router: /app/config/routes.php fil</p>
<pre class="php" name="code">&lt;?php
  /* Paypal IPN plugin */
  Router::connect('/paypal_ipn/process', array('plugin' =&gt; 'paypal_ipn', 'controller' =&gt; 'instant_payment_notifications', 'action' =&gt; 'process'));

  /* Optional Routes, but nice for administration */
  Router::connect('/paypal_ipn/edit/:id', array('admin' =&gt; true, 'plugin' =&gt; 'paypal_ipn', 'controller' =&gt; 'instant_payment_notifications', 'action' =&gt; 'edit'), array('id' =&gt; '[a-zA-Z0-9\-]+', 'pass' =&gt; array('id')));
  Router::connect('/paypal_ipn/view/:id', array('admin' =&gt; true, 'plugin' =&gt; 'paypal_ipn', 'controller' =&gt; 'instant_payment_notifications', 'action' =&gt; 'view'), array('id' =&gt; '[a-zA-Z0-9\-]+', 'pass' =&gt; array('id')));
  Router::connect('/paypal_ipn/delete/:id', array('admin' =&gt; true, 'plugin' =&gt; 'paypal_ipn', 'controller' =&gt; 'instant_payment_notifications', 'action' =&gt; 'delete'), array('id' =&gt; '[a-zA-Z0-9\-]+', 'pass' =&gt; array('id')));
  Router::connect('/paypal_ipn/add', array('admin' =&gt; true, 'plugin' =&gt; 'paypal_ipn', 'controller' =&gt; 'instant_payment_notifications', 'action' =&gt; 'edit'));
  Router::connect('/paypal_ipn', array('admin' =&gt; true, 'plugin' =&gt; 'paypal_ipn', 'controller' =&gt; 'instant_payment_notifications', 'action' =&gt; 'index'));/*
  /* End Paypal IPN plugin */
?&gt;</pre>
<p>Router này sẽ chuyển cách gọi các controller và action trong plugin này về cách gọi thông thường. (nhìn code bạn sẽ hiểu ngay !^_^! )</p>
<p>Tạo tài khoản paypal:</p>
<p>Để sự dụng được plugin này bạn phải có một tài khoản paypal (tham khảo cách tạo tài khoản paypal tại <a href="http://www.epayvn.info/2007/10/paypal-cho-ngi-vit-nam.html">đây</a>). Với các lập trình viên, paypal có hỗ trợ cho việc tạo tài khoản ảo để test, địa chỉ <a href="https://developer.paypal.com/">https://developer.paypal.com</a>. Khi tạo xong tài khoản, bật (enable) IPN trong tài khoản của bạn.</p>
<p>Sử dụng trong administator (tùy chọn): đây là trường hợp bạn thêm và lưu thông tin thông qua giao diện admin</p>
<p>1) Bạn phải đăng nhập vào trong phần quản trị với tài khoản administrator thông qua component Auth.</p>
<p>2) Sử dụng plugin tại <a href="http://www.yoursite.com/paypal_ipn">http://www.yoursite.com/paypal_ipn</a></p>
<p>Sự dụng helper paypal (tùy chọn): Trong trường hợp bạn muốn sử dụng helper hoặc các button trong helper.</p>
<p>1) Cấu hình lại với thông tin của bạn tại  /paypal_ipn/config/paypal_ipn_config.php</p>
<p>2) Thêm &#8216;PaypalIpn.Paypal&#8217; vào trong danh sách helper của app_controller.php:</p>
<pre class="php" name="code">&lt;?php
       var $helpers = array('Html','Form','PaypalIpn.Paypal');
?&gt;</pre>
<p>3) cách sử dụng (tham khảo thêm tại /paypal_ipn/views/helpers/paypal.php)</p>
<p>$paypal-&gt;button(String tittle, Options array);</p>
<p>ví dụ:</p>
<pre class="php" name="code">&lt;?php
//Pay Now Button
echo $paypal-&gt;button('Pay Now', array('amount' =&gt; '12.00', 'item_name' =&gt; 'test item'));
//Pay Now Button with Image
echo $paypal-&gt;button('pay_now.jpg', array('amount' =&gt; '12.00', 'item_name' =&gt; 'test item'));

//Subscribe Button
echo $paypal-&gt;button('Subscribe', array('type' =&gt; 'subscribe', 'amount' =&gt; '60.00', 'term' =&gt; 'month', 'period' =&gt; '2'));

//Donate Button
echo $paypal-&gt;button('Donate', array('type' =&gt; 'donate', 'amount' =&gt; '60.00'));

//Add To Cart
echo $paypal-&gt;button('Add To Cart', array('type' =&gt; 'addtocart', 'amount' =&gt; '15.00'));
?&gt;</pre>
<p>Ta cũng có thể thêm một số thuộc tính Paypal hợp lệ vào trong options của button.</p>
<p>Ví dụ :</p>
<pre class="php" name="code">&lt;?php echo $paypal-&gt;button('Pay Now', array('amount' =&gt; '12.00', 'item_name' =&gt; 'Stuff', 'return' =&gt; 'http://www.yoursite.com/thankyou')); ?&gt;</pre>
<p>Ngoài việc sử dụng các helper button đẻ tạo ra các button paypal ta còn có thể tạo ra thông các các thẻ html. Khi sử dụng thẻ form html ta phải sử dụng notify_url để gán tới <span style="color: #000000;">http://www.yoursite.com/paypal_ipn/process</span><br />
ví dụ:</p>
<pre class="php" name="code">&lt;form action="https://www.paypal.com/cgi-bin/webscr" method="post"&gt;
...
...
&lt;input type="hidden" name="notify_url" value="http://www.yoursite.com/paypal_ipn/process" /&gt;
...
&lt;/form&gt;</pre>
<p>Khi thông tin giao dịch được trả về từ paypal, dữ liệu sẽ được lưu vào trong cơ sở dữ liệu và hàm afterPaypalNotification sẽ được gọi (nếu nó tồn tại). Đây sẽ là nơi bạn xử lý các thao tác login khác liên quan đến giao dịch sau khi giao dịch thành công.</p>
<p>Tạo ra function trong /app/app_controller.php như sau:</p>
<pre class="php" name="code">&lt;?php
  function afterPaypalNotification($txnId){
    //Here is where you can implement code to apply the transaction to your app.
    //for example, you could now mark an order as paid, a subscription, or give the user premium access.
    //retrieve the transaction using the txnId passed and apply whatever logic your site needs.

    $transaction = ClassRegistry::init('PaypalIpn.InstantPaymentNotification')-&gt;findById($txnId);
    $this-&gt;log($transaction['InstantPaymentNotification']['id'], 'paypal');

    //Tip: be sure to check the payment_status is complete because failure transactions
    //     are also saved to your database for review.

    if($transaction['InstantPaymentNotification']['payment_status'] == 'Completed'){
      //Yay!  We have monies!
    }
    else {
      //Oh no, better look at this transaction to determine what to do; like email a decline letter.
    }
  }
?&gt;</pre>
<p>Chú ý:</p>
<p>1) Với các bạn chưa lần nào làm về paypal, các bạn có thể tìm hiểu qua về cách tạo một trang web trực tuyển qua paypal một cách đơn giản tại <a href="http://cdth6lt.com/forum/showthread.php?t=1130">đây</a>. Sau khi làm xong ví dụ này, tôi nghĩ các bạn sẽ hiểu rõ hơn nguyên tắc hoặt động của plugin này.</p>
<p>2) Plugin này hiện tại (version 2.1) theo tôi được biết thì chỉ có hỗ trợ 2 button chính là Paynow và Subscribe. Còn các nút AddToCart&#8230; thì chưa hỗ trợ việc lưu dữ liệu. Hi vọng khi các bạn sử dụng thì đã hỗ trợ đủ.</p>
<p>Chúc các bạn thành công  !^_^!</p>
]]></content:encoded>
			<wfw:commentRss>http://i-php.net/2009/10/s%e1%bb%ad-d%e1%bb%a5ng-plugin-paypal-ipn-trong-cakephp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>So sánh cách lấy dữ liệu tự động và lấy theo query trong cakephp</title>
		<link>http://i-php.net/2009/08/so-sanh-cach-l%e1%ba%a5y-d%e1%bb%af-li%e1%bb%87u-t%e1%bb%b1-d%e1%bb%99ng-va-l%e1%ba%a5y-theo-query-trong-cakephp/</link>
		<comments>http://i-php.net/2009/08/so-sanh-cach-l%e1%ba%a5y-d%e1%bb%af-li%e1%bb%87u-t%e1%bb%b1-d%e1%bb%99ng-va-l%e1%ba%a5y-theo-query-trong-cakephp/#comments</comments>
		<pubDate>Tue, 25 Aug 2009 18:07:25 +0000</pubDate>
		<dc:creator>hoanbn</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://i-php.net/?p=493</guid>
		<description><![CDATA[I. So sánh
Trong cakephp, có 2 cách lấy dữ liệu chính là lấy dự liệu tự động thông qua các hàm viết sẵn của cakephp và lấy dữ liệu từ câu lệnh query trực tiếp.
Ưu nhược điểm của 2 phương pháp trên:
1. Lấy dữ liệu tự động
a) Ưu điểm
- Lấy dữ liệu từ các bảng [...]]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal"><strong><span lang="EN-US">I. So sánh</span></strong></p>
<p class="MsoNormal"><span lang="EN-US">Trong cakephp, có 2 cách lấy dữ liệu chính là lấy dự liệu tự động thông qua các hàm viết sẵn của cakephp và lấy dữ liệu từ câu lệnh query trực tiếp.</span></p>
<p class="MsoNormal"><span lang="EN-US">Ưu nhược điểm của 2 phương pháp trên:</span></p>
<p class="MsoNormal"><strong><em><span lang="EN-US">1. Lấy dữ liệu tự động</span></em></strong></p>
<p class="MsoNormal"><span lang="EN-US">a) Ưu điểm</span></p>
<p class="MsoNormal"><span lang="EN-US">- Lấy dữ liệu từ các bảng sẽ được thực hiện tự động thông qua khai báo quan hệ ở model</span></p>
<p class="MsoNormal"><span lang="EN-US">- Việc thêm quan hệ hoặc thay đổi quan hệ giữa các bảng sẽ được thực hiện ở model, vì vậy khi quan hệ với bảng khác hoặc thay đổi dữ liệu chỉ cần thay đổi quan hệ ở model.</span></p>
<p class="MsoNormal"><span lang="EN-US">- Dễ dàng hơn trong việc phân trang, phân trang tìm kiếm.</span></p>
<p class="MsoNormal"><span lang="EN-US">- Dữ liệu lấy ra đã được đưa theo cấu trúc mảng hình cây hợp lý, làm cho việc hiển thị dữ liệu trở lên đơn giản và dễ dàng hơn.</span></p>
<p class="MsoNormal"><span lang="EN-US">b) Nhược điểm</span></p>
<p class="MsoNormal"><span lang="EN-US">- Việc lấy dữ liệu sẽ trở lên vô cùng nhiều và chậm do lấy dữ liệu từ tẩt cả các bảng quan hệ nếu không sử dụng hợp lý recursive và bindModel (cách dùng sẽ có ở dưới).</span></p>
<p class="MsoNormal"><span lang="EN-US">c) Định dạng dữ liệu lấy ra</span></p>
<p class="MsoNormal"><span lang="EN-US">Dữ liệu lấy ra sẽ được hiển thị theo nhiều định dang, tùy theo từng mối quan hệ là một – một, một nhiều hay nhiều nhiều. </span></p>
<p class="MsoNormal"><span lang="EN-US">-<span> </span>Với quan hệ một &#8211; một: </span></p>
<pre><span style="font-size: 8pt;">Array</span></pre>
<pre><span style="font-size: 8pt;">(</span></pre>
<pre><span style="font-size: 8pt;"><span>    </span>[User] =&gt; Array</span></pre>
<pre><span style="font-size: 8pt;"><span>        </span>(</span></pre>
<pre><span style="font-size: 8pt;"><span>            </span>[id] =&gt; 121</span></pre>
<pre><span style="font-size: 8pt;"><span>            </span>[name] =&gt; Gwoo the Kungwoo</span></pre>
<pre><span style="font-size: 8pt;"><span>            </span>[created] =&gt; 2007-05-01 10:31:01</span></pre>
<pre><span style="font-size: 8pt;"><span>        </span>)</span></pre>
<pre><span style="font-size: 8pt;"><span>    </span>[Profile] =&gt; Array</span></pre>
<pre><span style="font-size: 8pt;"><span>        </span>(</span></pre>
<pre><span style="font-size: 8pt;"><span>            </span>[id] =&gt; 12</span></pre>
<pre><span style="font-size: 8pt;"><span>            </span>[user_id] =&gt; 121</span></pre>
<pre><span style="font-size: 8pt;"><span>            </span>[skill] =&gt; Baking Cakes</span></pre>
<pre><span style="font-size: 8pt;"><span>            </span>[created] =&gt; 2007-05-01 10:31:01</span></pre>
<pre><span style="font-size: 8pt;"><span>        </span>)</span></pre>
<pre><span style="font-size: 8pt;">)</span></pre>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US">- Với quan hệ một nhiều:</span></p>
<pre><span style="font-size: 8pt;">Array</span></pre>
<pre><span style="font-size: 8pt;">(<span>  </span></span></pre>
<pre><span style="font-size: 8pt;"><span>    </span>[User] =&gt; Array</span></pre>
<pre><span style="font-size: 8pt;"><span>        </span>(</span></pre>
<pre><span style="font-size: 8pt;"><span>            </span>[id] =&gt; 121</span></pre>
<pre><span style="font-size: 8pt;"><span>            </span>[name] =&gt; Gwoo the Kungwoo</span></pre>
<pre><span style="font-size: 8pt;"><span>            </span>[created] =&gt; 2007-05-01 10:31:01</span></pre>
<pre><span style="font-size: 8pt;"><span>        </span>)</span></pre>
<pre><span style="font-size: 8pt;"><span>    </span>[Comment] =&gt; Array</span></pre>
<pre><span style="font-size: 8pt;"><span>        </span>(</span></pre>
<pre><span style="font-size: 8pt;"><span>            </span>[0] =&gt; Array</span></pre>
<pre><span style="font-size: 8pt;"><span>                </span>(</span></pre>
<pre><span style="font-size: 8pt;"><span>                    </span>[id] =&gt; 123</span></pre>
<pre><span style="font-size: 8pt;"><span>                    </span>[user_id] =&gt; 121</span></pre>
<pre><span style="font-size: 8pt;"><span>                 </span><span>   </span>[title] =&gt; On Gwoo the Kungwoo</span></pre>
<pre><span style="font-size: 8pt;"><span>                    </span>[body] =&gt; The Kungwooness is not so Gwooish</span></pre>
<pre><span style="font-size: 8pt;"><span>                    </span>[created] =&gt; 2006-05-01 10:31:01</span></pre>
<pre><span style="font-size: 8pt;"><span>                </span>)</span></pre>
<pre><span style="font-size: 8pt;"><span>            </span>[1] =&gt; Array</span></pre>
<pre><span style="font-size: 8pt;"><span>                </span>(</span></pre>
<pre><span style="font-size: 8pt;"><span>                    </span>[id] =&gt; 124</span></pre>
<pre><span style="font-size: 8pt;"><span>                    </span>[user_id] =&gt; 121</span></pre>
<pre><span style="font-size: 8pt;"><span>                    </span>[title] =&gt; More on Gwoo</span></pre>
<pre><span style="font-size: 8pt;"><span>                    </span>[body] =&gt; But what of the ‘Nut?</span></pre>
<pre><span style="font-size: 8pt;"><span>                    </span>[created] =&gt; 2006-05-01 10:41:01</span></pre>
<pre><span style="font-size: 8pt;"><span>                </span>)</span></pre>
<pre><span style="font-size: 8pt;"><span>        </span>)</span></pre>
<pre><span style="font-size: 8pt;">)</span></pre>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US">- Quan hệ nhiều – một</span></p>
<pre><span style="font-size: 8pt;">Array</span></pre>
<pre><span style="font-size: 8pt;">(</span></pre>
<pre><span style="font-size: 8pt;"><span>   </span>[Profile] =&gt; Array</span></pre>
<pre><span style="font-size: 8pt;"><span>        </span>(</span></pre>
<pre><span style="font-size: 8pt;"><span>            </span>[id] =&gt; 12</span></pre>
<pre><span style="font-size: 8pt;"><span>            </span>[user_id] =&gt; 121</span></pre>
<pre><span style="font-size: 8pt;"><span>            </span>[skill] =&gt; Baking Cakes</span></pre>
<pre><span style="font-size: 8pt;"><span>            </span>[created] =&gt; 2007-05-01 10:31:01</span></pre>
<pre><span style="font-size: 8pt;"><span>        </span>)<span>    </span></span></pre>
<pre><span style="font-size: 8pt;"><span>    </span>[User] =&gt; Array</span></pre>
<pre><span style="font-size: 8pt;"><span>        </span>(</span></pre>
<pre><span style="font-size: 8pt;"><span>            </span>[id] =&gt; 121</span></pre>
<pre><span style="font-size: 8pt;"><span>            </span>[name] =&gt; Gwoo the Kungwoo</span></pre>
<pre><span style="font-size: 8pt;"><span>            </span>[created] =&gt; 2007-05-01 10:31:01</span></pre>
<pre><span style="font-size: 8pt;"><span>        </span>)</span></pre>
<pre><span style="font-size: 8pt;">)</span></pre>
<p>- Quan hệ nhiều nhiều</p>
<pre><span style="font-size: 8pt;">Array</span></pre>
<pre><span style="font-size: 8pt;">(<span>  </span></span></pre>
<pre><span style="font-size: 8pt;"><span>    </span>[Recipe] =&gt; Array</span></pre>
<pre><span style="font-size: 8pt;"><span>        </span>(</span></pre>
<pre><span style="font-size: 8pt;"><span>            </span>[id] =&gt; 2745</span></pre>
<pre><span style="font-size: 8pt;"><span>            </span>[name] =&gt; Chocolate Frosted Sugar Bombs</span></pre>
<pre><span style="font-size: 8pt;"><span>            </span>[created] =&gt; 2007-05-01 10:31:01</span></pre>
<pre><span style="font-size: 8pt;"><span>            </span>[user_id] =&gt; 2346</span></pre>
<pre><span style="font-size: 8pt;"><span>        </span>)</span></pre>
<pre><span style="font-size: 8pt;"><span>    </span>[Tag] =&gt; Array</span></pre>
<pre><span style="font-size: 8pt;"><span>        </span>(</span></pre>
<pre><span style="font-size: 8pt;"><span>            </span>[0] =&gt; Array</span></pre>
<pre><span style="font-size: 8pt;"><span>                </span>(</span></pre>
<pre><span style="font-size: 8pt;"><span>                    </span>[id] =&gt; 123</span></pre>
<pre><span style="font-size: 8pt;"><span>                    </span>[name] =&gt; Breakfast</span></pre>
<pre><span style="font-size: 8pt;"><span>                </span>)</span></pre>
<pre><span style="font-size: 8pt;"><span>           </span>[1] =&gt; Array</span></pre>
<pre><span style="font-size: 8pt;"><span>                </span>(</span></pre>
<pre><span style="font-size: 8pt;"><span>            </span><span>        </span>[id] =&gt; 124</span></pre>
<pre><span style="font-size: 8pt;"><span>                    </span>[name] =&gt; Dessert</span></pre>
<pre><span style="font-size: 8pt;"><span>                </span>)</span></pre>
<pre><span style="font-size: 8pt;"><span>           </span>[2] =&gt; Array</span></pre>
<pre><span style="font-size: 8pt;"><span>                </span>(</span></pre>
<pre><span style="font-size: 8pt;"><span>                    </span>[id] =&gt; 125</span></pre>
<pre><span style="font-size: 8pt;"><span>                    </span>[name] =&gt; Heart Disease</span></pre>
<pre><span style="font-size: 8pt;"><span>                </span>)</span></pre>
<pre><span style="font-size: 8pt;"><span>        </span>)</span></pre>
<pre><span style="font-size: 8pt;">)</span></pre>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><strong><em><span lang="EN-US">2. Lấy dữ liệu từ câu lệnh query</span></em></strong></p>
<p class="MsoNormal"><span lang="EN-US">a) Ưu điểm</span></p>
<p class="MsoNormal"><span lang="EN-US">- Việc lấy dữ liệu sẽ không còn phụ thuộc vào quan hệ ở model, mà chỉ phụ thuộc vào quan hệ khi khai báo ở câu query</span></p>
<p class="MsoNormal"><span lang="EN-US">- Việc lấy dữ liệu sẽ thực hiện nhanh hơn, liên kết giữa các bảng sẽ rõ ràng hơn dựa vào câu lệnh liên kết ở query.</span></p>
<p class="MsoNormal"><span lang="EN-US">b) Nhược điểm</span></p>
<p class="MsoNormal"><span lang="EN-US">- Khi thay đổi quan hệ giữa các bảng, hoặc thêm quan hệ với một bảng mới, phải sửa lại câu query.</span></p>
<p class="MsoNormal"><span lang="EN-US">- Việc phân trang sẽ trở nên khó khăn phức tạp hơn</span></p>
<p class="MsoNormal"><span lang="EN-US">- Dữ liệu lấy ra dưới dạng mảng, nhưng chưa được sắp xếp lại theo cấu trúc. </span></p>
<p class="MsoNormal"><span lang="EN-US">- Khi sử dụng câu lệnh query, ta phải hiểu rất rõ quan hệ và sử dụng thành thao các lệnh trong query</span></p>
<p class="MsoNormal"><span lang="EN-US">c) Định dạng dữ liệu lấy ra</span></p>
<p class="MsoNormal"><span lang="EN-US">Khi lấy dữ liệu thông qua câu lệnh query, thì với tất cả các quan hệ dữ liệu dữ liệu lấy ra từ câu lệnh query đểu có định dạng như sau: </span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">Array</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">(</span></p>
<pre><span style="font-size: 8pt;"><span>   </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[0] =&gt; Array</span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">
</span><span style="font-size: 8pt;"><span>   </span></span><span style="font-size: 8pt;"><span>   </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">(</span></pre>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span>[Category] =&gt; Array</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span>(</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span>[id] =&gt; 1</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span>[name] =&gt; Thông tin thị trường </span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span>[alias] =&gt; tin_tuc</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[parent_id] =&gt; </span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[root_path] =&gt; </span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[level] =&gt; 0</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[order] =&gt; </span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[lang] =&gt; </span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[represent] =&gt; </span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[is_hyperlink] =&gt; 0</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[active] =&gt; 0</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[layout] =&gt; 0</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[created] =&gt; 0000-00-00 00:00:00</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">)</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"> </span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span>[NewsCategory] =&gt; Array</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">(</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[id] =&gt; 16</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[news_id] =&gt; 4</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[category_id] =&gt; 1</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">)</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"> </span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">)</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"> </span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span>[1] =&gt; Array</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span>(</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[Category] =&gt; Array</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">(</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[id] =&gt; 2</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[name] =&gt; Phân tích thị trường </span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[alias] =&gt; </span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[parent_id] =&gt; </span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[root_path] =&gt; </span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[level] =&gt; 0</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[order] =&gt; </span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[lang] =&gt; </span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[represent] =&gt; </span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[is_hyperlink] =&gt; 0</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[active] =&gt; 0</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[layout] =&gt; 0</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[created] =&gt; 0000-00-00 00:00:00</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">)</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"> </span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[NewsCategory] =&gt; Array</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">(</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[id] =&gt; 17</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[news_id] =&gt; 4</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">[category_id] =&gt; 2</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span></span><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;">)</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"> </span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"><span> </span>)</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;" lang="EN-US"><span> </span>&#8230;</span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 8pt; font-family: &quot;Courier New&quot;;"> </span></p>
<p class="MsoNormal"><span style="font-size: 8pt; line-height: 115%;" lang="EN-US">)<span> </span></span></p>
<p class="MsoNormal"><strong><em><span lang="EN-US">3. So sánh tốc độ</span></em></strong></p>
<p class="MsoNormal"><span lang="EN-US">Thực tế, cách sử dụng query và cách sử dụng lấy dữ liệu tự động thông qua các hàm find, findAll… sẽ không khác nhau là mấy hay nói đúng hơn là không khác gì nhau khi ta xác định rõ ràng recursive trong từng trường hơp cụ thể, kết hợp với sự dụng bindModel và unbindModel để xác định số lượng các bảng tham gia inner join.</span></p>
<p class="MsoNormal"><strong><span lang="EN-US">II. Tối ưu dữ liệu theo cách lấy tự động</span></strong></p>
<p class="MsoNormal"><strong><em><span lang="EN-US">1. Sử dụng Recursive</span></em></strong></p>
<p class="MsoNormal"><span lang="EN-US">Recursive trong cakephp thể hiện mức tham chiếu quan hệ nông, sâu giữa các bảng với nhau, trong cakephp có 4 mức thể hiện tham chiếu được thể hiện qua ví dụ sau đây:</span></p>
<p class="MsoNormal"><span lang="EN-US">Giả sử ta có tất cả 4 bảng bao gồm: domains, groups, users và news. Và mối quan hệ giữa các bảng như sau: Một domain có rất nhiều group, trong mỗi một group lại có rất nhiều user. Một user lại có thể đăng lên rất nhiều bài viết khác nhau. Vậy là ta có thể xác định các bảng có quan hệ tham chiếu đến nhau.</span></p>
<p class="MsoNormal"><span lang="EN-US">Ta có thể hình dung như sau:</span></p>
<table class="MsoTableGrid" style="border: medium none; border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="border: 1pt solid black; padding: 0cm 5.4pt; width: 92.4pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">table</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.4pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">domains</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.4pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">groups</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.45pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">users</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.45pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">News</span></p>
</td>
</tr>
<tr>
<td style="padding: 0cm 5.4pt; width: 92.4pt;" width="123" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="color: red;" lang="EN-US">domains</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.4pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US"> </span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.4pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">hasMany</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.45pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US"> </span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.45pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US"> </span></p>
</td>
</tr>
<tr>
<td style="padding: 0cm 5.4pt; width: 92.4pt;" width="123" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="color: red;" lang="EN-US">groups</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.4pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">belongsTo</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.4pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US"> </span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.45pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">hasMany</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.45pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US"> </span></p>
</td>
</tr>
<tr>
<td style="padding: 0cm 5.4pt; width: 92.4pt;" width="123" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="color: red;" lang="EN-US">users</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.4pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US"> </span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.4pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">belongsTo</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.45pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US"> </span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.45pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">hasMany</span></p>
</td>
</tr>
<tr style="height: 13.55pt;">
<td style="padding: 0cm 5.4pt; width: 92.4pt; height: 13.55pt;" width="123" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="color: red;" lang="EN-US">news</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.4pt; height: 13.55pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US"> </span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.4pt; height: 13.55pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US"> </span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.45pt; height: 13.55pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">belongsTo</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.45pt; height: 13.55pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US"> </span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US">Giả sử ta muốn lấy dữ liệu ở bảng group theo câu lệnh $this-&gt;Group-&gt;find(‘all’). Việc sử dụng giá trị recursive sẽ cho phép ta lấy dữ liệu khác nhau.</span></p>
<p class="MsoNormal"><span lang="EN-US">Cú pháp sử dụng recursive trong trường hợp này là: </span></p>
<p class="MsoNormal"><span lang="EN-US">$this-&gt;Group-&gt;recursive = 1</span></p>
<table class="MsoTableGrid" style="border: medium none; border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="border: 1pt solid black; padding: 0cm 5.4pt; width: 47.95pt;" width="64" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span lang="EN-US">Deapth</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 414.15pt;" width="552" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span lang="EN-US">Mô tả</span></p>
</td>
</tr>
<tr>
<td style="padding: 0cm 5.4pt; width: 47.95pt;" width="64" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span lang="EN-US">-1</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 414.15pt;" width="552" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span lang="EN-US">Lấy dữ liệu ở bảng   Group, không lấy thêm bất cứ bảng nào khác</span></p>
</td>
</tr>
<tr>
<td style="padding: 0cm 5.4pt; width: 47.95pt;" width="64" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span lang="EN-US">0</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 414.15pt;" width="552" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span lang="EN-US">Lấy dữ liệu ở bảng   Group và dữ liệu domain tương ứng</span></p>
</td>
</tr>
<tr>
<td style="padding: 0cm 5.4pt; width: 47.95pt;" width="64" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span lang="EN-US">1</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 414.15pt;" width="552" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span lang="EN-US">Lấy dữ liệu ở bảng   Group, Domain và dữ liệu ở bảng User tương ứng</span></p>
</td>
</tr>
<tr>
<td style="padding: 0cm 5.4pt; width: 47.95pt;" width="64" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span lang="EN-US">2</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 414.15pt;" width="552" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span lang="EN-US">Lấy dữ liệu ở bảng   Group, Domain, User và dữ liệu ở bảng News tương ứng</span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US">Nhìn qua bảng trên ta thấy tùy từng giá trị recursive khác nhau mà cakephp thực hiện liên kết với (inner join) thích hợp. Giả sử như ta cho recursive bằng 2, có nghĩa là ta lấy ra dữ liệu của các group, dữ liệu domain tương ứng với mỗi group đó, đồng thời là một danh sách các user nằm trong từng group, trong mỗi user đấy lại lấy ra các tin tức do các user ấy đăng. Vậy có nghĩa là sẽ có 4 bảng liên kết với nhau. Với recursive là 1 thì chỉ có 3 bảng thôi.</span></p>
<p class="MsoNormal"><span lang="EN-US">Như vậy là tùy tường trường hợp cụ thể mà ta có thể khai báo giá trị recursive khác nhau. Trong trường hợp ta chỉ cần lấy dữ liệu từ mỗi bảng group thì ta chỉ cần khai báo giá trị recursive là -1. Nếu muốn lấy thêm dữ liệu ở bảng domain thì khai báo recursive = 0…. Việc khai báo recursive cho từng trường hợp sẽ làm tăng tốc độ query vì ta sẽ kiểm soát được số lượng các bảng liên kết với nhau.</span></p>
<p class="MsoNormal"><strong><em><span lang="EN-US">2</span>. </em></strong><strong><em><span lang="EN-US">Sử dụng bindModel và unbindModel</span></em></strong></p>
<p class="MsoNormal"><span lang="EN-US">Trong một số trường hợp, với cùng một model chúng ta sẽ phải khai báo thêm một số quan hệ hoặc bỏ bớt một số quan hệ với các bảng khác, điều này xảy ra khi:</span></p>
<p class="MsoNormal"><span lang="EN-US">-<span> </span>Bạn cần giảm bớ số lượng dữ liệu và mối quan hệ của các bảng lien quan cần lấy đến, trong khi khởi tạo ở model ta đã khai báo tất cả các quan hệ ấy rồi. (ví dụ như trong model group ở trên, ta chỉ muốn lấy dữ liệu từ 2 bảng là group và user, trong khi đó theo quan hệ ta sẽ phải join đồng thời cả<span> </span>3 bảng user, group và domain. Như vậy việc truy xuất dữ liệu sẽ chậm hơn)</span></p>
<p class="MsoNormal"><span lang="EN-US">- Bạn muốn thay đổi cách liên kết của một model xác định để sẵp xếp hoặc lọc dữ liệu liên quan.</span></p>
<p class="MsoNormal"><span lang="EN-US">Khi muốn thêm một liên kết ta sẽ dùng đến bindModel và khi muốn xóa một liên kết ta sẽ sử dụng unbindModel. (Cách sử dụng bindModel va unbindMode sẽ được bàn sau)</span></p>
]]></content:encoded>
			<wfw:commentRss>http://i-php.net/2009/08/so-sanh-cach-l%e1%ba%a5y-d%e1%bb%af-li%e1%bb%87u-t%e1%bb%b1-d%e1%bb%99ng-va-l%e1%ba%a5y-theo-query-trong-cakephp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sử dụng recursive, bindModel và unbindModel trong cakephp</title>
		<link>http://i-php.net/2009/08/s%e1%bb%ad-d%e1%bb%a5ng-recursive-bindmodel-va-unbindmodel-trong-cakephp/</link>
		<comments>http://i-php.net/2009/08/s%e1%bb%ad-d%e1%bb%a5ng-recursive-bindmodel-va-unbindmodel-trong-cakephp/#comments</comments>
		<pubDate>Tue, 25 Aug 2009 16:04:21 +0000</pubDate>
		<dc:creator>hoanbn</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[bindModel]]></category>
		<category><![CDATA[recursive]]></category>
		<category><![CDATA[unbindModel]]></category>

		<guid isPermaLink="false">http://i-php.net/?p=480</guid>
		<description><![CDATA[Sử dụng recursive, bindModel và unbindModel sẽ giúp mọi người kiểm soát dữ liệu lấy ra trong cakephp.
1. Sử dụng Recursive
Recursive trong cakephp thể hiện mức tham chiếu quan hệ nông, sâu giữa các bảng với nhau, trong cakephp có 4 mức thể hiện tham chiếu được thể hiện qua ví dụ sau đây:
Giả sử [...]]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal">Sử dụng recursive, bindModel và unbindModel sẽ giúp mọi người kiểm soát dữ liệu lấy ra trong cakephp.<strong><em></em></strong></p>
<p class="MsoNormal"><strong><em><span lang="EN-US">1. Sử dụng Recursive</span></em></strong></p>
<p class="MsoNormal"><span lang="EN-US">Recursive trong cakephp thể hiện mức tham chiếu quan hệ nông, sâu giữa các bảng với nhau, trong cakephp có 4 mức thể hiện tham chiếu được thể hiện qua ví dụ sau đây:</span></p>
<p class="MsoNormal"><span lang="EN-US">Giả sử ta có tất cả 4 bảng bao gồm: domains, groups, users và news. Và mối quan hệ giữa các bảng như sau: Một domain có rất nhiều group, trong mỗi một group lại có rất nhiều user. Một user lại có thể đăng lên rất nhiều bài viết khác nhau. Vậy là ta có thể xác định các bảng có quan hệ tham chiếu đến nhau.</span></p>
<p class="MsoNormal"><span lang="EN-US">Ta có thể hình dung như sau:</span></p>
<table class="MsoNormalTable" style="border: medium none ; border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="border: 1pt solid black; padding: 0cm 5.4pt; width: 92.4pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">table</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.4pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">domains</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.4pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">groups</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.45pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">users</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.45pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">News</span></p>
</td>
</tr>
<tr>
<td style="padding: 0cm 5.4pt; width: 92.4pt;" width="123" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="color: red;" lang="EN-US">domains</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.4pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US"> </span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.4pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">hasMany</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.45pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US"> </span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.45pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US"> </span></p>
</td>
</tr>
<tr>
<td style="padding: 0cm 5.4pt; width: 92.4pt;" width="123" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="color: red;" lang="EN-US">groups</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.4pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">belongsTo</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.4pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US"> </span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.45pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">hasMany</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.45pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US"> </span></p>
</td>
</tr>
<tr>
<td style="padding: 0cm 5.4pt; width: 92.4pt;" width="123" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="color: red;" lang="EN-US">users</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.4pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US"> </span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.4pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">belongsTo</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.45pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US"> </span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.45pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">hasMany</span></p>
</td>
</tr>
<tr style="height: 13.55pt;">
<td style="padding: 0cm 5.4pt; width: 92.4pt; height: 13.55pt;" width="123" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="color: red;" lang="EN-US">news</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.4pt; height: 13.55pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US"> </span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.4pt; height: 13.55pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US"> </span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.45pt; height: 13.55pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">belongsTo</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 92.45pt; height: 13.55pt;" width="123">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US"> </span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US">Giả sử ta muốn lấy dữ liệu ở bảng group theo câu lệnh $this-&gt;Group-&gt;find(‘all’). Việc sử dụng giá trị recursive sẽ cho phép ta lấy dữ liệu khác nhau.</span></p>
<p class="MsoNormal"><span lang="EN-US">Cú pháp sử dụng recursive trong trường hợp này là: </span></p>
<p class="MsoNormal"><span lang="EN-US">$this-&gt;Group-&gt;recursive = 1</span></p>
<table class="MsoNormalTable" style="border: medium none ; border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="border: 1pt solid black; padding: 0cm 5.4pt; width: 47.95pt;" width="64" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span lang="EN-US">Deapth</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 414.15pt;" width="552" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span lang="EN-US">Mô   tả</span></p>
</td>
</tr>
<tr>
<td style="padding: 0cm 5.4pt; width: 47.95pt;" width="64" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span lang="EN-US">-1</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 414.15pt;" width="552" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span lang="EN-US">Lấy   dữ liệu ở bảng Group, không lấy thêm bất cứ bảng nào khác</span></p>
</td>
</tr>
<tr>
<td style="padding: 0cm 5.4pt; width: 47.95pt;" width="64" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span lang="EN-US">0</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 414.15pt;" width="552" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span lang="EN-US">Lấy   dữ liệu ở bảng Group và dữ liệu domain tương ứng</span></p>
</td>
</tr>
<tr>
<td style="padding: 0cm 5.4pt; width: 47.95pt;" width="64" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span lang="EN-US">1</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 414.15pt;" width="552" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span lang="EN-US">Lấy   dữ liệu ở bảng Group, Domain và dữ liệu ở bảng User tương ứng</span></p>
</td>
</tr>
<tr>
<td style="padding: 0cm 5.4pt; width: 47.95pt;" width="64" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span lang="EN-US">2</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 414.15pt;" width="552" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span lang="EN-US">Lấy   dữ liệu ở bảng Group, Domain, User và dữ liệu ở bảng News tương ứng</span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US">Nhìn qua bảng trên ta thấy tùy từng giá trị recursive khác nhau mà cakephp thực hiện liên kết với (inner join) thích hợp. Giả sử như ta cho recursive bằng 2, có nghĩa là ta lấy ra dữ liệu của các group, dữ liệu domain tương ứng với mỗi group đó, đồng thời là một danh sách các user nằm trong từng group, trong mỗi user đấy lại lấy ra các tin tức do các user ấy đăng. Vậy có nghĩa là sẽ có 4 bảng liên kết với nhau. Với recursive là 1 thì chỉ có 3 bảng thôi.</span></p>
<p class="MsoNormal"><span lang="EN-US">Như vậy là tùy tường trường hợp cụ thể mà ta có thể khai báo giá trị recursive khác nhau. Trong trường hợp ta chỉ cần lấy dữ liệu từ mỗi bảng group thì ta chỉ cần khai báo giá trị recursive là -1. Nếu muốn lấy thêm dữ liệu ở bảng domain thì khai báo recursive = 0…. Việc khai báo recursive cho từng trường hợp sẽ làm tăng tốc độ query vì ta sẽ kiểm soát được số lượng các bảng liên kết với nhau.</span></p>
<p class="MsoNormal"><strong><em><span lang="EN-US">2</span>. </em></strong><strong><em><span lang="EN-US">Sử dụng bindModel và unbindModel</span></em></strong></p>
<p class="MsoNormal"><span lang="EN-US">Trong một số trường hợp, với cùng một model chúng ta sẽ phải khai báo thêm một số quan hệ hoặc bỏ bớt một số quan hệ với các bảng khác, điều này xảy ra khi:</span></p>
<p class="MsoNormal"><span lang="EN-US">-<span> </span>Bạn cần giảm bớ số lượng dữ liệu và mối quan hệ của các bảng lien quan cần lấy đến, trong khi khởi tạo ở model ta đã khai báo tất cả các quan hệ ấy rồi. (ví dụ như trong model group ở trên, ta chỉ muốn lấy dữ liệu từ 2 bảng là group và user, trong khi đó theo quan hệ ta sẽ phải join đồng thời cả<span> </span>3 bảng user, group và domain. Như vậy việc truy xuất dữ liệu sẽ chậm hơn)</span></p>
<p class="MsoNormal"><span lang="EN-US">- Bạn muốn thay đổi cách liên kết của một model xác định để sẵp xếp hoặc lọc dữ liệu liên quan.</span></p>
<p><span style="font-size: 11pt; line-height: 115%; font-family: &quot;Arial&quot;,&quot;sans-serif&quot;;" lang="EN-US">Khi muốn thêm một liên kết ta sẽ dùng đến bindModel và khi muốn xóa một liên kết ta sẽ sử dụng unbindModel. </span></p>
<p class="MsoNormal"><span lang="EN-US">Giả sử giờ ta có 2 model là user và group. Một group sẽ chứa nhiều user và mỗi user nằm trong 1 group.</span></p>
<p class="MsoNormal"><span lang="EN-US">Trươc tiên chúng ta sẽ khai báo 2 model</span></p>
<blockquote>
<pre class="code" style="display: block;">&lt;?php
//app/models/group.php
class Group extends AppModel {
    var $name = 'Group';

    var $hasMany = array(
        'User' =&gt; array(
            'className' =&gt; 'User'
        )
    );
}

?&gt;

&lt;?php
//app/models/user.php

class User extends AppModel {
    var $name = 'User';
}

?&gt;</pre>
</blockquote>
<p>Giờ chúng ta sẽ xem cách hoạt động của bindModel và unbindModel qua ví dụ dưới đây. Trong groupController chúng ta sẽ lấy dữ liệu của group bằng $this-&gt;Group-&gt;find(), dữ liệu sẽ lấy luôn cả dữ liệu của user. Ví dụ minh họa dưới đây sẽ cho ta hiểu rõ hơn cách sử dùng và làm việc của bindModel và unbindModel.</p>
<blockquote>
<pre class="code" style="display: block;">function someAction() {
    // Lấy dữ liệu của group, ta sẽ lấy được cả dữ liệu của user trong từng group ấy
    $group = $this-&gt;Group-&gt;find('all');
    echo 'Lấy theo model'
    debug($group);

    // Bỏ quan hệ hasMany...
    $this-&gt;Group-&gt;unbindModel(
        array('hasMany' =&gt; array('User'))
    );

    // Sử dụng lại chức năng find()
    // Hiên thị group, không có user
    $group = $this-&gt;Group-&gt;find('all');
    echo 'Bỏ quan hệ với bảng user';
    debug($group);

    // Thêm quan hệ hasMany...

   $this-&gt;Group-&gt;bindModel(
        array('hasMany' =&gt; array(
                'User' =&gt; array(
                    'className' =&gt; 'User'
                )
            )
        )
    );

    // Sử dụng lại chức năng find()
    // Hiên thị group, có user
    $group = $this-&gt;Group-&gt;find('all');
    echo 'Thêm quan hệ với bảng user';
    debug($group);

    // Bỏ quan hệ hasMany lần 2...
    $this-&gt;Group-&gt;unbindModel(
        array('hasMany' =&gt; array('User'))
    );

    // Sử dụng lại chức năng find()
    // Hiên thị group, không có user
    $group = $this-&gt;Group-&gt;find('all');
    echo 'Bỏ quan hệ với bảng user lần 2';
    debug($group);

    //Chú ý: unbindModel và bindModel chỉ hiệu quả
    // duy nhất trong lần lấy dữ liệu tiếp theo,
    // sau lần thứ 2 sẽ lấy thông tin mặc định từ model

    // Chúng ta sẽ sử dụng lại hàm find('all') sau unbindModel(),
    // Dữ liệu lấy ra sẽ bao gổm cả group và user
    echo 'Lấy dữ liệu mặc định';
    $group = $this-&gt;Group-&gt;find('all');
    debug($group);
}</pre>
</blockquote>
<p>Cú pháp chuẩn của unbindModel</p>
<blockquote>
<pre class="code" style="display: block;">$this-&gt;Model-&gt;unbindModel(
    array('associationType' =&gt; array('associatedModelClassName'))
);</pre>
</blockquote>
<p>Cú pháp chuẩn của bindModel</p>
<blockquote>
<pre class="code" style="display: block;">$this-&gt;Model-&gt;bindModel(
        array('associationName' =&gt; array(
                'associatedModelClassName' =&gt; array(
                    // normal association keys go here...
                )
            )
        )
    );</pre>
</blockquote>
<p>Sử dụng hiệu quả recursive, bindModel và unbindModel sẽ giúp mọi người tăng tốc độ truy vấn query của cakephp vì với mỗi trường hợp lấy dữ liệu tôi đã xác định rõ các bảng cần lấy và quan hệ giữa chúng, vì vậy giảm thiều việc liên kết thừa giữa các bảng mà chúng ta không cần lấy.  Chúc mọi người có một ngày vui vẻ @(^_^)@</p>
]]></content:encoded>
			<wfw:commentRss>http://i-php.net/2009/08/s%e1%bb%ad-d%e1%bb%a5ng-recursive-bindmodel-va-unbindmodel-trong-cakephp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sử dụng plugin trong cakephp 1.2!</title>
		<link>http://i-php.net/2009/08/s%e1%bb%ad-d%e1%bb%a5ng-plugin-trong-cakephp-12/</link>
		<comments>http://i-php.net/2009/08/s%e1%bb%ad-d%e1%bb%a5ng-plugin-trong-cakephp-12/#comments</comments>
		<pubDate>Mon, 10 Aug 2009 21:50:51 +0000</pubDate>
		<dc:creator>hoanbn</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://i-php.net/?p=475</guid>
		<description><![CDATA[Hello cả nhà!
Hôm nay tôi xin giới thiệu với mọi người về cách sử dụng plugin trong cakephp. Như mọi người đều biết, cakephp là một framework hỗ trợ lập trình php một cách nhanh chóng và hiệu quả nhất. Sử dụng cakephp sẽ làm tăng tốc độ phát triển các dự án lên nhiều [...]]]></description>
			<content:encoded><![CDATA[<p>Hello cả nhà!</p>
<p>Hôm nay tôi xin giới thiệu với mọi người về cách sử dụng plugin trong cakephp. Như mọi người đều biết, cakephp là một framework hỗ trợ lập trình php một cách nhanh chóng và hiệu quả nhất. Sử dụng cakephp sẽ làm tăng tốc độ phát triển các dự án lên nhiều lần. Trong quá trình phát triển dự án, việc sử dụng đi sử dụng lại các đoạn code viết sẵn là đỉều tất yếu. Vậy sử dụng lại code như thế nào cho hiệu quả cũng là một bài toán đáng để quan tâm. Nếu như mọi người cứ copy nguyên code các dự án đã có rồi phát triển nên, sẽ làm cho code ngày càng nhiều khó quản lý và tái sử dụng ở các lần sau. Với cakephp, việc tái sử dụng code sẽ trở nên đơn giản hơn thông qua sử dụng tiện ích plugin. Các module chức năng sẽ được tách riêng ra thành các plugin, và khi sử dụng module chức năng nào, ta chỉ việc đưa plugin đó vào trong cakephp mà thôi. Việc sử dụng plugin sẽ làm cho các chức năng trở nên rõ ràng, tách biệt và dễ quản lý, maintain cũng như phát triên nên.</p>
<p>Việc tạo một plugin trong cakephp vô cùng đơn giản và dễ hiểu. Để tạo ra một plug, chúng ta sẽ đưa vào trong thư mục app/plugins. Ví dụ sau đây chúng ta sẽ tạo ra một plugin tin tức với các chức năng thêm sửa xóa. Đâu tiên sẽ là tạo ra CSDL tên là plugin trong đó có bảng news:</p>
<p>CREATE TABLE IF NOT EXISTS `news` (<br />
`id` int(4) NOT NULL AUTO_INCREMENT,<br />
`title` varchar(255) DEFAULT NULL,<br />
`description` text,<br />
`content` text,<br />
`created` datetime DEFAULT NULL,<br />
`user_id` int(4) DEFAULT NULL,<br />
PRIMARY KEY (`id`)<br />
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;</p>
<p>CREATE TABLE IF NOT EXISTS `users` (<br />
`id` int(4) NOT NULL AUTO_INCREMENT,<br />
`name` varchar(255) DEFAULT NULL,<br />
`username` varchar(255) DEFAULT NULL,<br />
`password` varchar(255) DEFAULT NULL,<br />
PRIMARY KEY (`id`)<br />
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;<br />
Việc cấu hình database kết nối đến CSDL mới tạo tôi sẽ để mọi người tự làm nhé (Đây là công việc cơ bản mà ^_^ ). Tiếp theo ta sẽ tạo ra một plugin tintuc bằng cách thêm một thư mục tintuc như sau : app/plugins/tintuc . Cấu trúc bên trong thư mục tin tức sẽ giống hệt như là cấu trúc bên trong thư mục app. Ta sẽ có một thư thư mục cơ bản cần thiết như sau:</p>
<p>+ Thư mục controller như sau: app/plugins/tintuc/controllers.</p>
<p>+ Thư mục view như sau:  app/plugins/tintuc/view</p>
<p>+ Thư mục models như sau:  app/plugins/tintuc/models</p>
<p>+ Thư mục layout như sau:  app/plugins/tintuc/layouts</p>
<p>+ Thư mục helpers như sau:  app/plugins/tintuc/view/helpers</p>
<p>+ Thư mục components như sau:  app/plugins/tintuc/controllers/components</p>
<p>+ Tệp tin TintucAppController: app/plugins/tintuc/tintuc_app_controller.php</p>
<p>+ Tệp tin TintucAppModel: app/plugins/tintuc/tintuc_app_model.php</p>
<p>+ &#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;</p>
<p>Như đã thấy ở trên, cấu trúc các thư mục trong plugin sẽ tương tự như cấu trúc thư mục như trong phần app. Riêng 2 file tintuc_app_controller.php và tintuc_app_model.php sẽ có nội dung như sau:</p>
<pre name="code" class="php">//app/plugins/tintuc/tintuc_app_controller.php

&lt;?php
class TinTucAppController extends AppController {

}
?&gt;

//app/plugins/tintuc/tintuc_app_model.php

&lt;?php
class TintucAppModel extends AppModel {

}
?&gt;</pre>
<p>Tiếp theo ta sẽ khai báo một news_controllers theo app/plugins/tintuc/controllers/news_controller.php</p>
<pre name="code" class="php">&lt;?php
class NewsController extends TintucAppController
{

var $name = 'News';
var $uses = array('Tintuc.News');
var $helpers = array('Html', 'Form', 'Javascript');

function index($param=null)
{
$this-&gt;News-&gt;recursive = 0;
$this-&gt;paginate = array('limit' =&gt; 15, 'page' =&gt; 1, 'order' =&gt; array('News.created' =&gt; 'desc'));
$this-&gt;set ('news', $this-&gt;paginate ('News'));
}

function add()
{
$this-&gt;layout = 'homepage';
if(! empty ($this-&gt;data))
{
$this-&gt;News-&gt;create ();
if($this-&gt;News-&gt;save ($this-&gt;data))
{
$this-&gt;Session-&gt;setFlash (__ ('The News has been saved', true));
$this-&gt;redirect ('/tintuc/news/index');
}else
{
$this-&gt;Session-&gt;setFlash (__ ('The News could not be saved. Please, try again.', true));
}
}
}

function edit($id = null)
{
if(! $id &amp;&amp; empty ($this-&gt;data))
{
$this-&gt;Session-&gt;setFlash (__ ('Invalid News', true));
$this-&gt;redirect (array('action' =&gt; 'index'));
}
$news = $this-&gt;News-&gt;read (null, $id);
if(! empty ($this-&gt;data))
{
if($this-&gt;News-&gt;save ($this-&gt;data))
{
$this-&gt;Session-&gt;setFlash (__ ('The News has been saved', true));
$this-&gt;redirect ('/tintuc/news/index');
}else
{
$this-&gt;Session-&gt;setFlash (__ ('The News could not be saved. Please, try again.', true));
}
}

if(empty ($this-&gt;data))
{
$this-&gt;data = $news;
}
}

function delete($id = null)
{
if(! $id)
{
$this-&gt;Session-&gt;setFlash (__ ('Invalid id for News', true));
$this-&gt;redirect ('/tintuc/news/index');
}
$del_news = $this-&gt;News-&gt;findById ($id);
if($this-&gt;News-&gt;del ($id))
{
$this-&gt;Session-&gt;setFlash (__ ('News deleted', true));
$this-&gt;redirect ('/tintuc/news/index');
}
}

}
?&gt;</pre>
<p>Khai báo tiếp một file model news.php theo đường dẫn app/plugins/tintuc/models/news.php</p>
<pre name="code" class="php">&lt;?php
class News extends TintucAppModel {
var $name = 'News';
var $belongsTo = array('User');
}
?&gt;</pre>
<p>Vậy là đã xong controller và model. Giờ tôi sẽ tạo ra 3 view là index, add và edit</p>
<pre name="code" class="php">//app/plugins/tintuc/views/news/add.ctp

&lt;?php
echo $form-&gt;create('News', array('url' =&gt; '/tintuc/news/add'));
echo $form-&gt;input('title');
echo $form-&gt;input('description');
echo $form-&gt;input('created');
echo $form-&gt;input('content');
echo $form-&gt;end('Submit');
?&gt;

//app/plugins/tintuc/views/news/edit.ctp

&lt;?php
echo $form-&gt;create('News');
echo $form-&gt;hidden('id');
echo $form-&gt;input('title');
echo $form-&gt;input('description');
echo $form-&gt;input('created');
echo $form-&gt;input('content');
echo $form-&gt;end('Submit');
?&gt;

//app/plugins/tintuc/views/news/index.ctp

&lt;h2&gt;Index&lt;/h2&gt;

&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;th&gt;User&lt;/th&gt;
&lt;th&gt;Created&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;?php
foreach ($news as $n)
{
?&gt;
&lt;tr&gt;
&lt;td&gt;&lt;?=$n['News']['title']?&gt;&lt;/td&gt;
&lt;td&gt;&lt;?=$n['User']['name']?&gt;&lt;/td&gt;
&lt;td&gt;&lt;?=$n['News']['created']?&gt;&lt;/td&gt;
&lt;td&gt;
&lt;?=$html-&gt;link('Edit', '/tintuc/news/edit/'.$n['News']['id']);?&gt;
&lt;?=$html-&gt;link('Delete', '/tintuc/news/delete/'.$n['News']['id'], null, sprintf(__('Are you sure you want to delete # %s?', true), $n['News']['id']));?&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;?php
}
?&gt;
&lt;/table&gt;

&lt;?=$html-&gt;link('Add', '/tintuc/news/add')?&gt;</pre>
<p>Tôi đã vừa hoàn thành một plugin cơ bản trong cakephp. Bây giờ tôi sẽ lấy dữ liệu từ plugin thông qua một test_controller như sau:</p>
<pre name="code" class="php">//app/controllers/tests_controllers.php

&lt;?php
class TestController extends AppController {

var $name = 'Test';
var $uses = array('Tintuc.News);

function index()
{
debug($this-&gt;News-&gt;find('all'));
die();
}
}
?&gt;</pre>
<p>Trong plugin ta còn có thể tạo ra các components, helpers, layouts riêng cho mình. Các file này sẽ nằm ở các thư mục tương ứng trong plugins. Việc tao ra các class components, helpers, layout tương tự như thêm components, helpers hoặc layout bình thường.  Sử dụng các components, helpers, layouts trong controller như sau:</p>
<pre name="code" class="php">
var $components = array('Tintuc.Comp');
</pre>
<p>Như vậy là ta chỉ thêm tên các plugin phía trước các components và helper mà thôi, riêng với layout tao khai báo như bình thương, vì nó sẽ mặc định là chồng đề lên thư mục app/views/layouts.</p>
<pre name="code" class="php">var $layout = 'temp_layout';</pre>
<p>Việc chỉ định sử dụng các file javascript, css và ảnh sẽ được lưu vào trong các thư mục tương ứng là <code>tintuc/vendors/js</code>, <code>tintuc/vendors/css</code> and <code>tintuc/vendors/img </code>và sẽ được gọi như sau:</p>
<pre name="code" class="php">
&lt;?php echo $html-&gt;image('/tintuc/img/my_image.png'); ?&gt;

&lt;?php echo $html-&gt;css('/tintuc/css/my_css'); ?&gt;

&lt;?php echo $javascript-&gt;link('/tintuc/js/do_cool_stuff'); ?&gt;
</pre>
<pre class="code" style="display: block;">Tôi đã trình bày mọi thứ cơ bản liên quan đến plugin với mọi người rồi, giờ mọi người hãy tự trải nghiêm nhé. Chúc cả nhà vui vẻ @(^_^)@.</pre>
<input id="gwProxy" type="hidden" />
<p><!--Session data--><br />
<input id="jsProxy" onclick="jsCall();" type="hidden" />
<input id="gwProxy" type="hidden" /><!--Session data--><br />
<input id="jsProxy" onclick="jsCall();" type="hidden" />
]]></content:encoded>
			<wfw:commentRss>http://i-php.net/2009/08/s%e1%bb%ad-d%e1%bb%a5ng-plugin-trong-cakephp-12/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Phân trang tìm kiếm đầy đủ với cakephp 1.2</title>
		<link>http://i-php.net/2009/07/phan-trang-tim-ki%e1%ba%bfm-d%e1%ba%a7y-d%e1%bb%a7-v%e1%bb%9bi-cakephp-12/</link>
		<comments>http://i-php.net/2009/07/phan-trang-tim-ki%e1%ba%bfm-d%e1%ba%a7y-d%e1%bb%a7-v%e1%bb%9bi-cakephp-12/#comments</comments>
		<pubDate>Fri, 24 Jul 2009 01:12:12 +0000</pubDate>
		<dc:creator>hoanbn</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web server]]></category>
		<category><![CDATA[pagination]]></category>
		<category><![CDATA[paginator]]></category>

		<guid isPermaLink="false">http://i-php.net/?p=465</guid>
		<description><![CDATA[Chào cả nhà!
Thật không nhớ nổi đây là lần thứ mấy tôi viết bài với tiêu đề phân trang tìm kiếm cho cakephp nữa. Vậy tại sao lại còn có bài viết này nữa. Việc phân trang tìm kiếm với cakephp đã không biết bao nhiêu lần làm tôi đâu đầu rồi. Sau nhiều lần [...]]]></description>
			<content:encoded><![CDATA[<p>Chào cả nhà!</p>
<p>Thật không nhớ nổi đây là lần thứ mấy tôi viết bài với tiêu đề phân trang tìm kiếm cho cakephp nữa. Vậy tại sao lại còn có bài viết này nữa. Việc phân trang tìm kiếm với cakephp đã không biết bao nhiêu lần làm tôi đâu đầu rồi. Sau nhiều lần tìm kiếm các giải pháp, nay tôi cũng đa tìm ra một giải pháp ứng ý trong việc tìm kiếm phân trang với cakephp. Sau đây tôi sẽ chia sẽ với mọi người giải pháp ấy, được minh họa thông qua ví dụ tìm kiếm sản phẩm dưới đây.</p>
<p>Việc đâu tiên là tôi phải tạo csdl. Trong ví dụ này tôi tạo csdl có tên là phantrang:</p>
<p>CREATE DATABASE phantrang;</p>
<p>CREATE TABLE IF NOT EXISTS `products` (<br />
`id` int(4) NOT NULL AUTO_INCREMENT,<br />
`name` varchar(255) DEFAULT NULL,<br />
`model` varchar(255) NOT NULL,<br />
`price` int(16) DEFAULT NULL,<br />
`created` datetime DEFAULT NULL,<br />
`type` enum(&#8216;Loai 1&#8242;,&#8217;Loai 2&#8242;,&#8217;Loai 3&#8242;) DEFAULT NULL,<br />
`description` text NOT NULL,<br />
PRIMARY KEY (`id`)<br />
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;</p>
<p>Vậy là tôi đã tạo xong CSDL, còn việc config để kết nối vào CSDL vừa tạo thì mọi người tự làm nhé. Dữ liệu trong đây thì mọi người tự thêm vào nhé.(^_^).</p>
<p>Công việc tiếp theo là tôi sẽ tạo ra một /app/controllers/products_controllers.php như sau:</p>
<blockquote><p>/*  app/controllers/products_controller.php */</p>
<p>&lt;?php<br />
class ProductsController extends AppController {</p>
<p>var $name = &#8216;Products&#8217;;<br />
var $scaffold;</p>
<p>}<br />
?&gt;</p></blockquote>
<p>Với các chức năng như add, edit, delete trong ví dụ này tôi sẽ dùng chức năng scaffold của cakephp, và quả thật những trường hợp như thế này thì scaffold quá tuyệt vời. Trong bài viết này tôi sẽ chỉ chú trọng vào chức năng tìm kiếm mà thôi. Tiếp đến tôi sẽ tạo một function search trong products_controller như sau:</p>
<blockquote><p>/*  app/controllers/products_controller.php */</p>
<p>&lt;?php<br />
class ProductsController extends AppController {</p>
<p>var $name = &#8216;Products&#8217;;<br />
var $scaffold;</p>
<p><strong> function search() {</strong></p>
<p><strong> }</strong></p>
<p>}<br />
?&gt;</p></blockquote>
<p>Cả nhà chú ý nhé, khi tôi thêm dữ liệu vào thì tôi sẽ copy lại nguyên nội dung của cả trang để mọi người dễ hiểu hơn, chỉ phần nào thêm mới tôi sẽ in đậm lên thôi. Bây giờ tôi sẽ tạo một trang view search như sau app/views/products/search.ctp</p>
<blockquote><p>//  app/view/products/search.ctp</p>
<p>&lt;?php<br />
echo $form-&gt;create(&#8216;Search&#8217;, array(&#8216;url&#8217; =&gt; &#8216;/products/dataSearch&#8217;));<br />
echo $form-&gt;input(&#8216;name&#8217;);<br />
echo $form-&gt;input(&#8216;price&#8217;);<br />
echo $form-&gt;input(&#8216;model&#8217;);<br />
echo $form-&gt;input(&#8216;type&#8217;, array(&#8216;options&#8217; =&gt; array(&#8221; =&gt; &#8221;,&#8217;Loai 1&#8242; =&gt; &#8216;Loại 1&#8242;, &#8216;Loai 2&#8242; =&gt; &#8216;Loại 2&#8242;, &#8216;Loai 3&#8242; =&gt; &#8216;Loai 3&#8242;)));<br />
echo $form-&gt;input(&#8216;description&#8217;);<br />
echo $form-&gt;end(&#8216;Search&#8217;);</p>
<p>?&gt;</p></blockquote>
<p>Phần form search vừa rồi tôi đã đề &#8216;url&#8217; trỏ đến action &#8216;dataSearch&#8217;. Action &#8216;dataSearch&#8217; này trong đây sẽ thực hiện công việc xử lý dữ liệu trong form tìm kiếm và chuyển lên url. Tôi thêm function <strong>dataSearch</strong> trong <strong>products_controller</strong> như sau:</p>
<blockquote><p>/*  app/controllers/products_controller.php */</p>
<p>&lt;?php<br />
class ProductsController extends AppController {</p>
<p>var $name = &#8216;Products&#8217;;<br />
var $scaffold;</p>
<p>function search()<br />
{<br />
}</p>
<p><strong> function dataSearch()<br />
{<br />
// the page we will redirect to<br />
$url['controller'] = &#8216;products&#8217;;<br />
$url['action'] = &#8217;search&#8217;;</strong></p>
<p><strong>// build a URL will all the search elements in it<br />
// the resulting URL will be<br />
// example.com/cake/posts/index/Search.keywords:mykeyword/Search.tag_id:3<br />
foreach ($this-&gt;data as $k=&gt;$v){<br />
foreach ($v as $kk=&gt;$vv){<br />
$url[$k.'.'.$kk]=$vv;<br />
}<br />
}</strong></p>
<p><strong>// redirect the user to the url<br />
$this-&gt;redirect($url, null, true);<br />
}</strong><br />
}<br />
?&gt;</p></blockquote>
<p>Hàm dataSearch sẽ thực hiện chức năng chuyển tòan bộ dữ liệu vừa được gửi (submit) vào trong một mảng và sau đó thông qua hàm &#8216;redirect&#8217; chuyến sang một trang mới. Việc chuyển đến trang nào sẽ được quyết định thông qua 2 biến &#8220;<strong>$url['controller']&#8221; </strong>và &#8220;<strong>$url['action']&#8221; </strong>. Nếu bạn nào chưa hiểu hàm này thực hiện những công việc gì thì các bạn cũng không cần tìm hiểu đâu, vì hàm này sẽ không bào giờ thay đổi cả, chỉ cần thay đổi giá trị 2 biến đó thôi. Cả nhà có thể tạm hiểu là hàm này thực hiện việc chuyển tất cả dữ liệu được submit lên trên url.</p>
<p>Vậy là sau khi hàm dataSearch xử lý xong, sẽ chuyển dữ liệu về action &#8220;search&#8221; trong products_controller. Lúc này sẽ tồn tại một biến mảng &#8220;$this-&gt;passedArgs&#8221; chứa dữ liệu của trang search khi submit. Hay nói đúng hơn biến &#8220;$this-&gt;passedArgs&#8221; chứa các dữ liệu được truyền ở phía trên url và đưa vào thành các mảng tương ứng. Ta sẽ xử lý dữ liệu truyền vào để tạo điều kiện lọc như sau:</p>
<blockquote><p>/*  app/controllers/products_controller.php */</p>
<p>&lt;?php<br />
class ProductsController extends AppController {</p>
<p>var $name = &#8216;Products&#8217;;<br />
var $scaffold;</p>
<p>function search()<br />
{<br />
<strong> $conditions = array();<br />
if (!empty($this-&gt;passedArgs))<br />
{<br />
if (isset($this-&gt;passedArgs['Search.name']))<br />
{<br />
$conditions[]["Product.name LIKE"] = &#8220;%{$this-&gt;passedArgs['Search.name']}%&#8221;;<br />
$this-&gt;data['Search']['name'] = $this-&gt;passedArgs['Search.name'];<br />
}</strong></p>
<p><strong>if (isset($this-&gt;passedArgs['Search.price']))<br />
{<br />
$conditions[]["Product.price "] = $this-&gt;passedArgs['Search.price'];<br />
$this-&gt;data['Search']['price'] = $this-&gt;passedArgs['Search.price'];<br />
}</strong></p>
<p><strong>if (isset($this-&gt;passedArgs['Search.model']))<br />
{<br />
$conditions[]["Product.model"] = $this-&gt;passedArgs['Search.model'];<br />
$this-&gt;data['Search']['model'] = $this-&gt;passedArgs['Search.model'];<br />
}</strong></p>
<p><strong>if (isset($this-&gt;passedArgs['Search.type']))<br />
{<br />
$conditions[]["Product.type"] = $this-&gt;passedArgs['Search.type'];<br />
$this-&gt;data['Search']['type'] = $this-&gt;passedArgs['Search.type'];<br />
}<br />
}</strong></p>
<p><strong>$this-&gt;paginate = array(&#8216;limit&#8217; =&gt; &#8216;1&#8242;, &#8216;order&#8217; =&gt; &#8216;Product.created DESC&#8217;);<br />
$this-&gt;set(&#8216;products&#8217;, $this-&gt;paginate(&#8216;Product&#8217;, $conditions));</strong><br />
}</p>
<p>function dataSearch()<br />
{<br />
// the page we will redirect to<br />
$url['controller'] = &#8216;products&#8217;;<br />
$url['action'] = &#8217;search&#8217;;</p>
<p>// build a URL will all the search elements in it<br />
// the resulting URL will be<br />
// example.com/cake/posts/index/Search.keywords:mykeyword/Search.tag_id:3<br />
foreach ($this-&gt;data as $k=&gt;$v){<br />
foreach ($v as $kk=&gt;$vv){<br />
$url[$k.'.'.$kk]=$vv;<br />
}<br />
}</p>
<p>// redirect the user to the url<br />
$this-&gt;redirect($url, null, true);<br />
}<br />
}<br />
?&gt;</p></blockquote>
<p>Trong phần controller này ta sẽ thưc hiện phân trang như bình thường trong cakephp, chỉ khác là sẽ có thêm điều kiện tìm kiếm như ở phía trên thôi.</p>
<p>Việc tiếp theo sẽ là hiển thị kết quả tìm kiếm ra trang search. Ta sẽ thêm vào view search như sau:</p>
<blockquote><p>/*  app/views/products/search.ctp */</p>
<p>&lt;?php<br />
echo $form-&gt;create(&#8216;Search&#8217;, array(&#8216;url&#8217; =&gt; &#8216;/products/dataSearch&#8217;));<br />
echo $form-&gt;input(&#8216;name&#8217;);<br />
echo $form-&gt;input(&#8216;price&#8217;);<br />
echo $form-&gt;input(&#8216;model&#8217;);<br />
echo $form-&gt;input(&#8216;type&#8217;, array(&#8216;options&#8217; =&gt; array(&#8221; =&gt; &#8221;,&#8217;Loai 1&#8242; =&gt; &#8216;Loại 1&#8242;, &#8216;Loai 2&#8242; =&gt; &#8216;Loại 2&#8242;, &#8216;Loai 3&#8242; =&gt; &#8216;Loai 3&#8242;)));<br />
echo $form-&gt;input(&#8216;description&#8217;);<br />
echo $form-&gt;end(&#8216;Search&#8217;);</p>
<p>?&gt;</p>
<p><strong>&lt;?php<br />
echo $paginator-&gt;counter(array(<br />
&#8216;format&#8217; =&gt; &#8216;Page %page% of %pages%, showing %current% records out of<br />
%count% total, starting on record %start%, ending on %end%&#8217;<br />
));<br />
?&gt;<br />
&lt;table cellpadding=&#8221;1&#8243; cellspacing=&#8221;0&#8243;&gt;<br />
&lt;tr&gt;<br />
&lt;th&gt;ID&lt;/th&gt;<br />
&lt;th&gt;Name&lt;/th&gt;<br />
&lt;th&gt;Model&lt;/th&gt;<br />
&lt;th&gt;Price&lt;/th&gt;<br />
&lt;th&gt;Created&lt;/th&gt;<br />
&lt;th&gt;Type&lt;/th&gt;<br />
&lt;th&gt;Description&lt;/th&gt;<br />
&lt;/tr&gt;<br />
&lt;?php<br />
foreach ($products as $product)<br />
{<br />
?&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;?=$product['Product']['id']?&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;?=$product['Product']['name']?&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;?=$product['Product']['model']?&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;?=$product['Product']['price']?&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;?=$product['Product']['created']?&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;?=$product['Product']['type']?&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;?=$product['Product']['description']?&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;?php<br />
}<br />
?&gt;<br />
&lt;/table&gt;</strong></p>
<p><strong>&lt;!&#8211; Shows the next and previous links &#8211;&gt;</strong></p>
<p><strong>&lt;?php<br />
$paginator-&gt;options(array(&#8216;url&#8217; =&gt; $this-&gt;passedArgs));<br />
echo $paginator-&gt;prev(&#8216;« Previous &#8216;);<br />
echo $paginator-&gt;numbers();<br />
echo $paginator-&gt;next(&#8216; Next »&#8217;);<br />
?&gt; </strong></p></blockquote>
<p>Trong phần view trên thì dòng quan trọng nhất chính là &#8220;$paginator-&gt;options(array(&#8216;url&#8217; =&gt; $this-&gt;passedArgs));&#8221;. Dòng này có tác dụng là sẽ truyền toàn bộ các tham số trong mảng &#8220;$this-&gt;passedArgs&#8221; lên trên url của các link phân trang trong cake. Như vậy có nghĩa là các điều kiện tìm kiếm sẽ vẫn còn khi mọi người chuyển trang. Vậy là tôi đã thực hiện xong việc phân trang tìm kiếm trong cakephp1.2 rồi. Mọi người vào đọc thấy có gì thấy khó hiểu thì comment vào nhé. Tôi sẽ sửa lại cho dễ hiểu hơn.</p>
<p>Chúc cả nhà vui vẻ với cakephp nhé.</p>
<input id="gwProxy" type="hidden" />
<p><!--Session data--></p>
<input id="jsProxy" onclick="jsCall();" type="hidden" />
<input id="gwProxy" type="hidden" />
<p><!--Session data--></p>
<input id="jsProxy" onclick="jsCall();" type="hidden" />
<input id="gwProxy" type="hidden" />
<p><!--Session data--></p>
<input id="jsProxy" onclick="jsCall();" type="hidden" />
<input id="gwProxy" type="hidden" />
<p><!--Session data--></p>
<input id="jsProxy" onclick="jsCall();" type="hidden" />
<input id="gwProxy" type="hidden" />
<p><!--Session data--></p>
<input id="jsProxy" onclick="jsCall();" type="hidden" />
<input id="gwProxy" type="hidden" />
<p><!--Session data--></p>
<input id="jsProxy" onclick="jsCall();" type="hidden" />
<input id="gwProxy" type="hidden" />
<p><!--Session data--><br />
<input id="jsProxy" onclick="jsCall();" type="hidden" />
<input id="gwProxy" type="hidden"><!--Session data--></input>
<input id="jsProxy" onclick="jsCall();" type="hidden" />
]]></content:encoded>
			<wfw:commentRss>http://i-php.net/2009/07/phan-trang-tim-ki%e1%ba%bfm-d%e1%ba%a7y-d%e1%bb%a7-v%e1%bb%9bi-cakephp-12/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Triển khai Latex</title>
		<link>http://i-php.net/2009/07/deploy-latex/</link>
		<comments>http://i-php.net/2009/07/deploy-latex/#comments</comments>
		<pubDate>Thu, 09 Jul 2009 04:09:14 +0000</pubDate>
		<dc:creator>hoangnd</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Khái niệm]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web server]]></category>
		<category><![CDATA[equotion]]></category>
		<category><![CDATA[latex]]></category>
		<category><![CDATA[math]]></category>

		<guid isPermaLink="false">http://i-php.net/?p=454</guid>
		<description><![CDATA[Sử dụng Latex sẽ đá bay những vấn đề khó khăn gặp phải khi cần hiển thị những công thức toán học như căn bậc n, hàm số, tích phân&#8230; trên website.

Với những yêu cầu hiển thị thông thường trên website, blog, wiki thì định dạng text đã thỏa mãn được gần hết, khó khăn [...]]]></description>
			<content:encoded><![CDATA[<p>Sử dụng Latex sẽ đá bay những vấn đề khó khăn gặp phải khi cần hiển thị những công thức toán học như căn bậc n, hàm số, tích phân&#8230; trên website.</p>
<p><img class="aligncenter" title="math" src="http://ts1.images.live.com/images/thumbnail.aspx?q=863022493012&amp;id=6a02e85a84ce8b5062c72db0024388d5&amp;url=http%3a%2f%2fwww.kaitaia.com%2ffunny%2fg2%2fd%2f8172-2%2fbizarre_math.jpg" alt="" width="145" height="160" /></p>
<p>Với những yêu cầu hiển thị thông thường trên website, blog, wiki thì định dạng text đã thỏa mãn được gần hết, khó khăn ở chỗ những bài viết chuyên ngành toán, lý&#8230; cần thể hiện những công thức tính toán phức tạp thì text hay thậm chí là ảnh cũng pó tay, hhuh? Vậy phải lèm seo?</p>
<p>Đồng thanh hô nèo</p>
<h1 style="text-align: center;"><strong>LaTeX</strong></h1>
<p><span style="text-decoration: underline;"><strong>là gì?</strong></span> không phải word processor, mà là &#8221; <a class="mw-redirect" title="Document markup language" href="http://en.wikipedia.org/wiki/Document_markup_language">document markup language</a> and <a title="Word processor" href="http://en.wikipedia.org/wiki/Word_processor">document preparation system</a> for the <a title="TeX" href="http://en.wikipedia.org/wiki/TeX">TeX</a> <a title="Typesetting" href="http://en.wikipedia.org/wiki/Typesetting">typesetting</a> program. Within the typesetting system, its name is styled as <span class="image"><img src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/92/LaTeX_logo.svg/48px-LaTeX_logo.svg.png" alt="\LaTeX" width="48" height="20" /></span>&#8221; (-wikipedia).</p>
<p>chào hàng thế thôi, thông tin đầy đủ có ở <a href="http://www.latex-project.org/intro.html" target="_blank">đây</a> và ở <a title="http://en.wikipedia.org/wiki/LaTeX" href="http://en.wikipedia.org/wiki/LaTeX" target="_blank">đây</a> <img src='http://i-php.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p><span style="text-decoration: underline;"><strong>để làm gì?</strong></span> tất nhiên là để hỗ trợ gõ &#8211; chuyển đổi &#8211; hiển thị công thức toán học trên website.</p>
<ul>
<li>gõ tức là phải &#8230; tự gõ, cũng có nghĩa là có cú pháp &amp; định dạng riêng, cũng có nghĩa là miễn gõ tùm lum, như vậy là phải học gõ ke ke.</li>
<li>chuyển đổi nôm na như là dịch, dịch đống ký tự mình gõ sang đống gì đó mà máy nó hiểu, mà phải làm cho máy nó hiểu thì nó mới chạy được.</li>
<li>hiển thị đơn giản là show hàng, hàng là cái cục (thường là ảnh) mà máy nó trả về sau khi nó &#8216;chạy&#8217;, nhớ là nó &#8216;chạy&#8217; được thì nó phải hiểu, để nó hiểu thì mình phải ra lệnh, ra lệnh xong phải có thằng nó dịch lệnh mình cho máy <img src='http://i-php.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ) <img src='http://i-php.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> )</li>
</ul>
<p>ví dụ cái,</p>
<ol>
<li>gõ như này đây [code][tex]a^2 + b^2[/tex][/code]</li>
<li>dịch dịch dịch dịch dịch &#8230;. bịch bịch bịch &#8230;</li>
<li>hiển thị cái này <img class="alignnone" title="can bac 2" src="http://www.khuvuc.com/pictures/91dcd1eb2fc092f982e5e87b8685d280_1247109898.png" alt="" width="50" height="15" /></li>
</ol>
<p>eh, ai thèm xài cái này? thì thầy cô giáo, chuyên gia, guru viết bài giảng, blog kỹ thuật hay sinh viên thảo luận trên diễn đàn &#8230; nghe pro^` vãi <img src='http://i-php.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ) <img src='http://i-php.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> )</p>
<p><span style="text-decoration: underline;"><strong>xài ra làm sao?</strong></span> có mới xài được chứ =)). Hiển nhiên là muốn có thì phải lao động <img src='http://i-php.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>bỏ qua các dịch vụ sẵn có, mình đi mua đồ về tự nấu cho nó chủ động &amp; ngon lành. bếp = server, đồ ăn = các gói cài đặt và đầu bếp = ai đang đọc <img src='http://i-php.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ) <img src='http://i-php.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> )</p>
<p><strong>thực hiện nấu nướng</strong></p>
<p>đi chợ nhớ mua các gói sau</p>
<p><strong>ubuntu server</strong></p>
<blockquote><p>[code]sudo apt-get install texlive texmaker[code]</p></blockquote>
<p><strong>centOS 5.x</strong></p>
<blockquote><p>[code]yum install tetex tetex-fonts tetex-dvips tetex-latex ghostscript</p>
<p>yum install ImageMagick[code]<br />
(cài imageMagick nếu chưa có)</p></blockquote>
<p>dung lượng kiếm về khoảng 60 - 200M, chế biến cài đặt xong khoảng 200M <img src='http://i-php.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ) <img src='http://i-php.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ) vãi hàng, nấu cho cả xóm ăn.</p>
<p>xong rùi thì chiến thôi, kiếm thêm gia vị &amp; bày bàn. giả sử tại VPS này có thư mục tên latex trong /var/www/html. trong đó có 2 thư mục pictures &amp; tmp, quan trọng nữa là 2 file php class.latexrender.php và latex.php. Như vậy là ngon rồi, viết them file demo.php nữa để test thôi, nhớ là phải refer đến 2 file trên.</p>
<p>[bonus]</p>
<p>trên đây là bộ latex render viết bằng code php, tác giả là Benzamin Mayer (http://www.mayer.dial.pipex.com/tex.htm), xài ngon, được làng xóm đánh giá cao. khi sử dụng chỉ cần để ý đến các tham số cơ bản sau trong file latex.php</p>
<ul>
<li>$latexrender_path = "đường dẫn chứa bộ latex render (gồm file class.latexrender.php)";</li>
<li>$latexrender_path_http = "đường dẫn hiển thị website" - phải chính xác để có thể show ảnh công thức được render.</li>
<li>$imageformat = "định dạng ảnh - png hoặc gif" - có nghĩa là phải có thư viện render ảnh trên server, đang xài ImageMagick.</li>
</ul>
<p>[/bonus]</p>
<p><strong>tóm tắt hoạt động </strong></p>
<p>để hình thành công thức, người dùng phải gõ nội dung theo quy tắc định trước của latex. khi dữ liệu gửi đi, regular expression sẽ được gọi để bóc tách các phần chính trong nội dung nhận được để render ra dưới dạng ảnh, lưu vào một vị trí trên server &amp; đặt đường dẫn hiển thị trên website.</p>
<p><strong>tham khảo thêm</strong></p>
<ul>
<li>trang chủ dự án latex: http://www.latex-project.org/guides/</li>
<li>trên wiki: http://en.wikipedia.org/wiki/LaTeX</li>
<li>thư viện của mayer: http://www.mayer.dial.pipex.com/tex.htm</li>
<li>một bài hướng dẫn hay: http://www.linuxjournal.com/article/7870</li>
<li>demo: http://khuvuc.com/demo.php (/var/www/html/latex)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://i-php.net/2009/07/deploy-latex/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
