<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Alvanweb</title>
	
	<link>http://weblog.alvanweb.com</link>
	<description>یادداشت‌های مرتضی الوانی</description>
	<lastBuildDate>Sun, 21 Mar 2010 09:25:51 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/alvanweb" /><feedburner:info uri="alvanweb" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>alvanweb</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>یا مقلب القلوب و الابصار</title>
		<link>http://feedproxy.google.com/~r/alvanweb/~3/WjQzi_svZxE/</link>
		<comments>http://weblog.alvanweb.com/2010/03/21/happy-norouz-1389/#comments</comments>
		<pubDate>Sun, 21 Mar 2010 09:25:51 +0000</pubDate>
		<dc:creator>مرتضی الوانی</dc:creator>
				<category><![CDATA[مطالب روزمره]]></category>
		<category><![CDATA[Celebration]]></category>
		<category><![CDATA[Norouz]]></category>

		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=196</guid>
		<description><![CDATA[هرچند نوشتن در اینجا را فراموش کرده ام اما به عادت سال های قبل و به رسم این روزها، نوروز را به همه دوستان تبریک گفته و بهترین لحظات را در این سال برایتان آرزومندم.
]]></description>
			<content:encoded><![CDATA[<p>هرچند نوشتن در اینجا را فراموش کرده ام اما به عادت سال های قبل و به رسم این روزها، نوروز را به همه دوستان تبریک گفته و بهترین لحظات را در این سال برایتان آرزومندم.</p>
<img src="http://feeds.feedburner.com/~r/alvanweb/~4/WjQzi_svZxE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://weblog.alvanweb.com/2010/03/21/happy-norouz-1389/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		<feedburner:origLink>http://weblog.alvanweb.com/2010/03/21/happy-norouz-1389/</feedburner:origLink></item>
		<item>
		<title>استفاده از jQuery برای صفحه‌بندی در CakePHP</title>
		<link>http://feedproxy.google.com/~r/alvanweb/~3/YPeE3g9AxXc/</link>
		<comments>http://weblog.alvanweb.com/2009/05/31/pagination-in-cakephp-with-jquery/#comments</comments>
		<pubDate>Sat, 30 May 2009 21:02:02 +0000</pubDate>
		<dc:creator>مرتضی الوانی</dc:creator>
				<category><![CDATA[آژاکس]]></category>
		<category><![CDATA[پی اچ پی]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[کیک پی‌اچ‌پی]]></category>

		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=191</guid>
		<description><![CDATA[بعد از یک مدت تقریبا طولانی ننوشتن در اینجا، در این پست قصد دارم به طور خلاصه درمورد آژاکسی کردن صفحه‌بندی پیشفرض CakePHP توسط  jQuery بنویسم.
ابتدا آخرین نسخه‌ی jQuery را دریافت و آن را به صورت زیر در layout فراخوانی کنید. دقت کنید jQuery تان ویرایش 1.3 یا به بالا باشد چون قرار است [...]]]></description>
			<content:encoded><![CDATA[<p>بعد از یک مدت تقریبا طولانی ننوشتن در اینجا، در این پست قصد دارم به طور خلاصه درمورد آژاکسی کردن صفحه‌بندی پیشفرض CakePHP توسط  jQuery بنویسم.<br />
ابتدا آخرین نسخه‌ی jQuery را <a href="http://jquery.com/">دریافت</a> و آن را به صورت زیر در layout فراخوانی کنید. دقت کنید jQuery تان ویرایش 1.3 یا به بالا باشد چون قرار است از تابع live که در این ویرایش افزوده شده است استفاده کنیم:</p>
<pre class="brush: php;">&lt;?php
echo $javascript-&gt;link('jquery-1.3.2.min');
?&gt;</pre>
<p>پیشنهاد می‌کنم برای تکه کد زیر که قرار است درخواست‌ کلیک بر روی لینک صفحات را به صورت آژاکس ایجاد کند، یک فایل js جدید بسازید یا اینکه می‌توانید آن‌ را مستقیم در layout اضافه کنید:</p>
<pre class="brush: js;">$('a[href*=/page:]').live('click', function(){
    $('#content').load($(this).attr('href'));
    return false;
});</pre>
<p>کار تمام است با کلیک بر روی شماره صفحات محتوا به صورت آژاکس بارگذاری می‌شود. اما یکسری نکات ریز که شاید از قلم انداخته باشید:</p>
<p>کامپوننت RequestHandler را می‌بایستی به کنترلرتان افزوده باشید. دلیل آن روشن است چرا که باید نوع تقاضای کنترلر را، تشخیص دهد و  layout را بصورت خودکار به Ajax تبدیل کند. برای درک بیشتر این موضوع پیشنهاد می‌کنم تغییرات بوجود آمده درپی افزودن یا حذف این کامپوننت را از طریق کنسول <a href="http://getfirebug.com/">FireBug</a> دنبال کنید. <span id="more-191"></span></p>
<p>مقدار <span dir="ltr">#content</span> نشانگر id عنصری است که محتوا را در بر دارد. این مقدار  layout پیشفرض کیک است اگر برای محتوا id یا class دیگری تعریف کرده‌اید روشن است که آن را باید تغییر دهید.</p>
<p><strong>کمی بیشتر</strong><br />
با افزودن <span dir="ltr">a[href*=/sort:]</span> به کد بالا می‌توانید مرتب‌سازی عناصر را هم در یک جدول داده پیشفرض کیک به صورت آژاکس داشته باشید:</p>
<pre class="brush: js;">$('a[href*=/sort:],a[href*=/page:]').live('click', function(){
    $('#content').load($(this).attr('href'));
    return false;
});</pre>
<p><strong>خواندنی‌های کمکی دیگر</strong><br />
+ اگر از ویرایش‌های پایین jQuery استفاده می‌کنید، پلاگین <a href="http://docs.jquery.com/Plugins/livequery">Livequery</a> می توانید جایگزینی برای تابع live  باشد.<br />
+ اگر هنوز نمی‌دانید چگونه صفحه‌بندی را در app تان ایجاد کنید، به مستندات کیک در <a href="http://book.cakephp.org/view/164/Pagination">اینجا</a> مراجعه کنید.<br />
+ همچنین در <a href="http://book.cakephp.org/view/167/AJAX-Pagination">اینجا </a>توضیح داده شده چگونه می‌توانید این کار را بدون jQuery  و البته با استفاده از فریم‌ورک prototype انجام دهید.</p>
<img src="http://feeds.feedburner.com/~r/alvanweb/~4/YPeE3g9AxXc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://weblog.alvanweb.com/2009/05/31/pagination-in-cakephp-with-jquery/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		<feedburner:origLink>http://weblog.alvanweb.com/2009/05/31/pagination-in-cakephp-with-jquery/</feedburner:origLink></item>
		<item>
		<title>یا مقلب القلوب و الابصار</title>
		<link>http://feedproxy.google.com/~r/alvanweb/~3/fmP8IRzjv30/</link>
		<comments>http://weblog.alvanweb.com/2009/03/19/happy-norouz-1388/#comments</comments>
		<pubDate>Thu, 19 Mar 2009 09:55:13 +0000</pubDate>
		<dc:creator>مرتضی الوانی</dc:creator>
				<category><![CDATA[مطالب روزمره]]></category>
		<category><![CDATA[Celebration]]></category>
		<category><![CDATA[Norouz]]></category>

		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=190</guid>
		<description><![CDATA[یک سال دیگر گذشت. سال نو بهانه‌ایی است برای شروع مجدد، شروعی  نو با نگاهی نو به زندگی. سال 1387 برای من سال خوبی نبود بخصوص این ماه‌های آخر. اما امیدوارم سال 1388 که یکی از سرنوشت سازترین سال‌های زندگیمه، سال خوبی باشه.

امیدوارم میمنت سال جدید طلیعه‌ی موفقیت‌های بزرگ هم برای شما و هم [...]]]></description>
			<content:encoded><![CDATA[<p>یک سال دیگر گذشت. سال نو بهانه‌ایی است برای شروع مجدد، شروعی  نو با نگاهی نو به زندگی. سال 1387 برای من سال خوبی نبود بخصوص این ماه‌های آخر. اما امیدوارم سال 1388 که یکی از سرنوشت سازترین سال‌های زندگیمه، سال خوبی باشه.</p>
<div class="center"><img src="http://alvani.googlepages.com/norouz-1388.jpg" title="نوروز 1388 بر همگان مبارک باد" alt="نوروز 1388 بر همگان مبارک باد" /></div>
<p>امیدوارم میمنت سال جدید طلیعه‌ی موفقیت‌های بزرگ هم برای شما و هم برای خودم باشه. در لحظه حلول سال نو با زمزمه کردن دعای عرفانی یا مقلب القلوب و الابصار، دعا گوی ما هم باشید. عید بر همگان مبارک باد </p>
<img src="http://feeds.feedburner.com/~r/alvanweb/~4/fmP8IRzjv30" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://weblog.alvanweb.com/2009/03/19/happy-norouz-1388/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://weblog.alvanweb.com/2009/03/19/happy-norouz-1388/</feedburner:origLink></item>
		<item>
		<title>کاربرد کامپوننت Authentication در CakePHP</title>
		<link>http://feedproxy.google.com/~r/alvanweb/~3/joNHx-d5btc/</link>
		<comments>http://weblog.alvanweb.com/2009/03/11/using-auth-component-in-cakephp/#comments</comments>
		<pubDate>Wed, 11 Mar 2009 19:04:28 +0000</pubDate>
		<dc:creator>مرتضی الوانی</dc:creator>
				<category><![CDATA[پی اچ پی]]></category>
		<category><![CDATA[ACL]]></category>
		<category><![CDATA[Authentication]]></category>
		<category><![CDATA[CakePHP Component]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=185</guid>
		<description><![CDATA[در این پست با یک مثال کاربردی به معرفی کامپوننت Authentication در  فریم‌ورک قدرتمند CakePHP خواهیم پرداخت. بصورت ساده یک مدل تصدیق هویت کاربر ایجاد می‌کنیم که برای ورود به بخش مدیریت، کاربر می‌باید وارد سیستم شود. در پست بعدی در مورد تصدیق هویت در کیک، با اضافه کردن دو کامپوننت ACL و Cookie [...]]]></description>
			<content:encoded><![CDATA[<p>در این پست با یک مثال کاربردی به معرفی کامپوننت <a href="http://book.cakephp.org/view/172/Authentication">Authentication</a> در  فریم‌ورک قدرتمند CakePHP خواهیم پرداخت. بصورت ساده یک مدل تصدیق هویت کاربر ایجاد می‌کنیم که برای ورود به بخش مدیریت، کاربر می‌باید وارد سیستم شود. در پست بعدی در مورد تصدیق هویت در کیک، با اضافه کردن دو کامپوننت ACL و Cookie سیستم پایدارتری ایجاد خواهیم کرد.</p>
<p>در این آموزش فرض شده است اصول کار با کیک را فراگرفته‌اید. می‌توانید کیک را نصب کنید، تنظیمات اولیه را مقداردهی کنید و  Cake Bake  (پختن کیک) را با کنسول انجام دهید و &#8230; اگر آماده نیستید به سری آموزش‌های قبل  (<a href="http://weblog.alvanweb.com/2008/10/24/create-linkdump-with-cakephp-part-3/">ساخت لینکدونی با CakePHP</a>) رجوع کنید و بعدا برگردید. ضمنا از آخرین نسخه پایدار CakePHP و PHP 5 استفاده می‌کنیم.</p>
<p>خوشبختانه نصب و بکارگیری کامپوننت توکار auth ساده‌ترین شکل ممکن برای داشتن یک سیستم ورود کاربر است. مانند همه کامپوننت‌ها، با افزودن &#8216;Auth&#8217; به پارامتر <span dir="ltr">$components</span> کامپوننت به کنترلر شما افزوده می‌شود. چون قصد داریم از این کامپوننت در دیگر کنترلر‌ها نیز استفاده کنیم برای جلوگیری از تکرار، آن را به AppController اضافه می‌کنیم. بنابراین فایلی بنام app_controller.php در شاخه اصلی app تان با محتوای زیر ایجاد کنید:</p>
<pre class="brush: php;">class AppController extends Controller {
	var $components = array('Auth');
}</pre>
<p>روشن است که چون دیگر کنترلر‌ها فرزند AppController هستند خصوصیات آن را به ارث خواهند برد. بگذارید کمی در مورد قوانین توکار این کامپوننت بگویم. بطور پیشفرض این کامپوننت انتظار دارد شما جدولی بنام users با فیلدهایی بنام username و password داشته باشید.‌ اما در برخی موارد خاص، پایگاه داده بدلایل امنیتی اجازه نمی‌دهد که برای یک فیلد نام password را انتخاب کنید. مشکلی نیست ما این عرف را برهم میزنیم و از نام دلخواه خودمان استفاده می‌کنیم. ابتدا یک جدول بصورت زیر بسازید: <span id="more-185"></span></p>
<pre class="brush: sql;">CREATE TABLE users (
  id integer auto_increment,
  email char(50),
  secretpass char(50),
  PRIMARY KEY (id)
);</pre>
<p>از email برای نام کاربری و secretpass برای کلمه عبور استفاده کردیم. در اینجا لازم است با تابع beforeFilter در کیک آشنا شوید. CakePHP یکسری <a href="http://book.cakephp.org/view/60/Callbacks">توابع callbacks</a> توکار دارد که با آن‌ها می‌توان منطقی را بعد یا قبل اجرای یک کنش اضافه کرد. BeforeFilter قبل از هر کنشی در کنترلر اجرا می‌شود. اما در اینجا چه استفاده ایی دارد؟ برای برخی از تنظیمات کامپوننت Auth نیاز داریم قبل از اجرای هر کنشی آن‌ها را مقدار دهی کنیم</p>
<p> اولین موردی که باید به این تابع اضافه شود اعلام تغییر نام فیلدهای جدول users است (چون قوانین توکار این کامپوننت را رعایت نکردیم) بدین منظور کد زیر را مجددا به AppController اضافه می‌کنیم (دلیل این کار روشن است):</p>
<pre class="brush: php;">function beforeFilter() {
$this-&gt;Auth-&gt;fields = array('username' =&gt; 'email', 'password' =&gt; 'secretpass');
}</pre>
<p>حال این کامپوننت می‌تواند با نام‌های جدید فیلدها کار کند. با ساخت این جدول، کنترلر و مدل و همچنین نمای login را برای این جدول bake کنید. به کنترلر users دو کنش login  و logout را بصورت زیر اضافه کنید:</p>
<pre class="brush: php;">function login() {
 //Auth componet does it automatically
}
function logout() {
 $this-&gt;redirect($this-&gt;Auth-&gt;logout());
}</pre>
<p>این کامپوننت بطور پیشفرض مسیر users/login (کنترلری بنام users و کنشی بنام login) را برای ورود در نظر می‌گیرد. می‌توانید با تکه کد زیر در BeforeFilter این مسیر را تغییر دهید:</p>
<pre class="brush: php;">$this-&gt;Auth-&gt;loginAction = array('admin' =&gt; false, 'controller' =&gt; 'members', 'action' =&gt; 'login');</pre>
<p> در اینجا ما همان مسیر پیشفرض را بکار می‌گیریم. همچنین بطور پیشفرض نیازی نیست برای پردازش فرم login.ctp کنش login را کدنویسی کنید خود کامپوننت این کار را بطور خودکار انجام می‌دهد بنابراین آن را در بالا خالی گذاشتیم. حال فرم ورود را در login.ctp بصورت زیر تعریف کنید:</p>
<pre class="brush: php;">if ($session-&gt;check('Message.auth')) {
  $session-&gt;flash('auth');
}
echo $form-&gt;create('User', array('url' =&gt; array('controller' =&gt; 'users', 'action' =&gt; 'login')));
echo $form-&gt;input('email');
echo $form-&gt;input('secretpass', array('type' =&gt; 'password'));
echo $form-&gt;submit('Login');
echo $form-&gt;end();</pre>
<p>این کامپوننت برای رمزنگاری کلمه عبور از یک کلاس امنیتی استفاده می‌کند که این کلاس بصورت پیشفرض از SHA1 بهره می‌گیرد. برای تغییر متد رمزنگاری می‌باید setHash را برحسب md5 ،sha1 یا sha256 در اولین پارامتر مقداردهی کنید. ما از md5 استفاده می‌کنیم بنابراین BeforeFilter به صورت زیر خواهد بود:</p>
<pre class="brush: php;">function beforeFilter() {
Security::setHash('md5');
$this-&gt;Auth-&gt;fields = array('username' =&gt; 'email', 'password' =&gt; 'secretpass');
}</pre>
<p><strong>توجه کنید!</strong> فایل core.php و مقدار امنیتی Security.salt را یادتان هست که در ابتدای تنظیمات کیک مقداردهی می‌کردید؟! درست حدس زده‌اید، کلاس امنیتی برای رمزنگاری بیشتر، از این مقدار نیز استفاده می‌کند بنابراین دقت کنید اگر زمانی خواستید پروژه را از نو با مقادیر قدیمی رمزنگاری شده‌ی موجود در دیتابیس بنویسید این مقدار را مشابه پروژه قبل لحاظ کنید.</p>
<p>در اینجا برای تست نیاز دارید یک نام و کلمه عبور به دیتابیس اضافه کنید. ساخت یک فرم ثبت نام به منظور وارد کردن یک ردیف در جدول users ساده است اما ساده‌تر برای ما که تنها قصد تست برنامه را داریم چیست؟  اگر debug را در تنظیمات (core.php) دستکاری نکردید (برابر مقدار 2 تنظیم شده است) در مرورگر  مسیر users/login را مرور کنید و نام و کلمه عبور را انتخاب کنید. در نوار زیرین مربوط به debug کلمه عبوری که وارد کردید بطور هش شده (رمزنگاری شده) مشاهده می‌شود می‌توانید به phpMyAdmin بروید و این مقدار را بصورت دستی اضافه کنید. اگر هم برایتان دشوار است خط زیر را ایمپورت کنید. حال یک نام عبور alvani  با کلمه عبور 123 دارید:</p>
<pre class="brush: sql;">INSERT INTO 'users' ('id', 'email', 'secretpass') VALUES
(1, 'alvani', 'f6b48e1ff9c21a8fe36a77c1ec839086');</pre>
<p>نگران نباشید در آموزش بعدی که کامپوننت ACL هم وارد شد، فرم ثبت نام هم افزوده می‌شود تا آن زمان خودتان هم می‌توانید با کمی کنجکاوی آن رابسازید.</p>
<p> نوبت آن رسیده است که دسترسی به برخی از کنش‌ها را در برخی کنترلرها محدود کنیم. فرض کنید قسمت مدیریت بصورت users/account باشد. می‌خواهیم برنامه را طوری طراحی کنیم که کاربر با ورود موفق به سیستم به این بخش هدایت شود و همچنین کاربران دیگر بدون ورود مجاز به دیدن این کنش نباشند. کنش account را در کنترلر users ایجاد کنید.</p>
<p>از دو متد allow و deny بدین منظور استفاده می‌کنیم. فرض کنید می‌خواهیم دسترسی به کنش account را در کنترلر users محدود کنیم کافیست تکه کد زیر را به این کنترلر اضافه کنیم:</p>
<pre class="brush: php;">function beforeFilter(){
 parent::beforeFilter();
 $this-&gt;Auth-&gt;deny('account');
}</pre>
<p>تکه کد بالا ابتدا خصوصیات تابع BeforeFilter کنترلر پدر (یعنی AppController را به ارث می‌برد) سپس کنش account را محدود می‌کند. با انجام مراحل فوق تلاش برای مرور users/account شما را به users/login منتقل خواهد کرد. اما بعد از ورود موفق به کجا هدایت خواهید شد؟ این کامپوننت بطور خوردکار پس از ورود موفق شما را به صفحه‌ایی که تلاش می‌کردید آن را ببینید هدایت می کند اما با کد زیر در BeforeFilter چنانچه نیاز باشد می‌توانید کاربر را به کنترلر و کنش دلخواه هدایت کنید:</p>
<pre class="brush: php;">$this-&gt;Auth-&gt;loginRedirect = array('controller' =&gt; 'users', 'action' =&gt; 'account');</pre>
<p>تمرین مناسبی است که BeforeFilter ایی که در  کنترلر users در بالا (به منظور محدود کردن و مجوز دادان) استفاده کردید را حذف کنید و  با استفاده از foreach بصورت زیر، در BeforeFilter کنترلر AppController، تنها با تعریف کنش‌های مجوز داده شده یا محدود شده در ابتدای هر کنترلر آن‌ها را مشخص کنید. مسلما باید ابتدا <span dir="ltr">$allowedActions</span> و <span dir="ltr">$deniedActions</span> را در AppController تعریف کنید:</p>
<pre class="brush: php;">class AppController extends Controller {
var $components = array('Auth');
public $allowedActions = array('index');
public $deniedActions = array();

function beforeFilter() {
Security::setHash('md5');
$this-&gt;Auth-&gt;fields = array('username' =&gt; 'email', 'password' =&gt; 'secretpass');

foreach( $this-&gt;allowedActions as $allowAction ){
	$this-&gt;Auth-&gt;allow( $allowAction );
}

foreach( $this-&gt;deniedActions as $denyAction ){
	$this-&gt;Auth-&gt;deny( $denyAction );
}
}
}</pre>
<p>در اینجا من دسترسی به کنش‌ index را برای همه کنترلرها آزاد تعریف کردم . از طرف دیگر سایر کنش‌ها محدود شده‌اند. حال می‌توانم با مقداردهی مجدد <span dir="ltr">$allowedActions</span> و <span dir="ltr">$deniedActions</span> در ابتدای هر کنترلر کنش‌هایش را از لحاظ دسترسی تعریف کنم. برای مثال اگر بخواهم کنش register را در کنترلر users که بطور پیشفرض محدود است آزاد کنم به کنترلر users کد زیر را اضافه می‌کنم:</p>
<pre class="brush: php;">var $allowedActions = array('register');</pre>
<p>حال تلاش برای نمایش users/register به صفحه users/login منتقل نخواهد شد. تا اینجای کار می‌توانید کنش‌ها را از لحاظ مجوز دسترسی به یک کاربر کنترل کنید اما این کامپوننت انعطاف پذیری‌ خیلی بیشتری دارد در ادامه برخی از آن‌ها بصورت مختصر ذکر می‌گردد.</p>
<p>چگونه خطاها را تغییر دهید؟ اگر دقت کرده باشید وقتی تلاش می‌کنید یک کنش محدود شده را ببینید و به Login منتقل می‌شود خطای عدم مجوز یا هنگامی که نام و کلمه عبورتان درست نیست خطای مربوطه در نمای login نمایش داده می‌شود با مقداردهی دو متغیر زیر در BeforeFilter می‌توانید این خطاها را تغییر دهید:</p>
<pre class="brush: php;">$this-&gt;Auth-&gt;authError = &quot;Access denied!&quot;;
$this-&gt;Auth-&gt;loginError = &quot;That's not the right email or password!&quot;;</pre>
<p>گاهی اوقات نیاز است شرط دیگری را هم برای ورود موفق تعریف کنیم. مثلا کاربری که علاوه بر نام و کلمه عبورش اکانتش فعال هم شده باشد.  یک فیلد دیگر بنام active به جدول users ‌اضافه می‌کنیم. اگر Y بود کاربر فعال اگر N غیرفعال. حال با کد زیر می‌توانیم به کاربران فعال مجوز ورود بدهیم:</p>
<pre class="brush: php;">$this-&gt;Auth-&gt;userScope = array('User.active' =&gt; 'Y');</pre>
<p>وقتی users/logout را برای خروج مرور می‌کنید مستقیم به users/login منتقل می‌شوید با مقداردهی کنترلر و کنش زیر می‌توایند هدایت کاربر بعد از logout را تغییر دهید:</p>
<pre class="brush: php;">$this-&gt;Auth-&gt;logoutRedirect = array(Configure::read('Routing.admin') =&gt; false, 'controller' =&gt; 'members', 'action' =&gt; 'logout');</pre>
<p>سایر متغیرهای کامپوننت authentication را می‌توانید در مستندات کیک در <a href="http://book.cakephp.org/view/248/AuthComponent-Variables">اینجا</a> دنبال کنید . در پست‌های آینده این کامپوننت را با ACL و Cookie ترکیب می‌کنیم تا سیستمی با مجوزها و گروه‌های مختلف بسازیم. هرچند با امکانات کامپوننت authentication به تنهایی می‌توان سیستمی با گروه‌های مختلف ایجاد کرد، نمونه‌اش را می‌توانید <a href="http://www.studiocanaria.com/articles/cakephp_auth_component_users_groups_permissions_revisited">اینجا</a> بیابید. اما انعطاف پذیری ACL بخصوص در پروژه‌های بزرگ که کاربران در گروه‌های مختلف قرار دارند فوق العاده قوی‌تر است.</p>
<p>هرگونه مشکلی در خصوص این کامپوننت دارید در کامنت‌ها مطرح کنید حتما پاسخ خواهم داد بخصوص اینکه فکر می‌کنم در این پست بعضی از نکته‌ها از قلم افتاده‌اند و شاید نیاز به توضیح بیشتر باشد. موفق باشید، مرتضی الوانی اسفندماه 1387.</p>
<img src="http://feeds.feedburner.com/~r/alvanweb/~4/joNHx-d5btc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://weblog.alvanweb.com/2009/03/11/using-auth-component-in-cakephp/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://weblog.alvanweb.com/2009/03/11/using-auth-component-in-cakephp/</feedburner:origLink></item>
		<item>
		<title>نحوه کارکرد سیستم تصدیق هویت در CakePHP</title>
		<link>http://feedproxy.google.com/~r/alvanweb/~3/W5D38JjtGVk/</link>
		<comments>http://weblog.alvanweb.com/2009/03/05/how-work-authentication-system-in-cakephp/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 06:19:03 +0000</pubDate>
		<dc:creator>مرتضی الوانی</dc:creator>
				<category><![CDATA[پی اچ پی]]></category>
		<category><![CDATA[ACL]]></category>
		<category><![CDATA[Authentication]]></category>
		<category><![CDATA[CakePHP Component]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=178</guid>
		<description><![CDATA[از آنجایی که قصد داشتم در مورد  کامپوننت‌های ACL و Authentication در کیک پی‌اچ‌پی بنویسم (و خیلی‌ها کار با ACL در کیک را از مباحث دشوار می‌دانند)، بهتر دیدم برای فهم بیشتر پست‌های آینده، ابتدا مختصری بصورت تئوری در مورد یک مدل تصدیق هویت کاربر توضیح دهم و سپس با مثال‌های عملی شروع کنم.
سیستم‌های [...]]]></description>
			<content:encoded><![CDATA[<p>از آنجایی که قصد داشتم در مورد  کامپوننت‌های <a href="http://book.cakephp.org/view/171/Access-Control-Lists">ACL</a> و <a href="http://book.cakephp.org/view/172/authentication">Authentication</a> در کیک پی‌اچ‌پی بنویسم (و خیلی‌ها کار با ACL در کیک را از مباحث دشوار می‌دانند)، بهتر دیدم برای فهم بیشتر پست‌های آینده، ابتدا مختصری بصورت تئوری در مورد یک مدل تصدیق هویت کاربر توضیح دهم و سپس با مثال‌های عملی شروع کنم.</p>
<p>سیستم‌های تصدیق هویت کاربر بخش رایج بسیاری از برنامه‌های کاربردی تحت وب هستند. در CakePHP چندین سیستم بدین منظور وجود دارد که هر یک اختیارات متفاوتی ایجاد می‌کند. ساده‌ترین آن استفاده از کامپوننت authentication است که در صورت تصدیق کاربر، مجوز ورود  به تمام بخش‌های برنامه می‌دهد.</p>
<p>این کامپوننت می تواند با کامپوننت دیگری بنام <strong>A</strong>ccess <strong>C</strong>ontrol <strong>L</strong>ists برای ساخت مدل‌های پیچیده‌تری که سطوح مختلفی از دسترسی را تعیین می‌کند، ترکیب شود. برای مثال به یک کاربر مجوز دسترسی به بخش‌های عمومی، به دیگری اجازه ویرایش مطالب و به کاربری دیگر مجوز مدیر سیستم را بدهد.</p>
<p>کار با کامپوننت authentication بطور باورنکردنی ساده‌ و سریع است اما کاربرد کامپوننت  ACL شاید برای بار اولی که از ان استفاده می‌کنید کمی مشکل‌تر باشد اما با یادگیری کاربرد آن به یکی از جالب‌ترین و پرقدرت ترین کامپوننت‌های توکار کیک تبدیل خواهد شد. برای شروع یک سناریو ساده به شکل زیر را که در عمل صورت می‌گیرد تصور کنید:</p>
<p>1- تلاش برای مشاهده آدرس. در ابتدا فرض کنید کاربری بنام محسن سعی میکند محتویات صفحه‌ایی به آدرس http://alvanweb.com/article/edit را مشاهده کند.</p>
<p>2- تجزیه‌ آدرس. هنگامی که درخواست کاربر از طریق مرورگر ارسال می‌شود، کامپوننت authentication تشخیص می‌دهد که آدرس درخواستی با کنترلری بنام article و کنشی بنام edit (که خود با کنشی از نوع update رابطه دارد) در ارتباط است.</p>
<p>3- آیا صفحه محدود شده است؟ همچنین این کامپوننت تشخیص می‌دهد که دسترسی به این کنش در کنترلر article محدود شده است. بنابراین بررسی می‌کند که آیا کاربر وارد سیستم شده است یا خیر. <span id="more-178"></span></p>
<p>4- نمایش فرم ورود کاربر. تا هنگامی که کاربر وارد نشده باشد هر درخواستی برای مشاهده این آدرس به صفحه‌ایی حاوی فرم ورود هدایت می‌شود تا کاربر بتواند با درج نام و کلمه عبور وارد سیستم شود.</p>
<p>5- تطبیق نام‌ و کلمه عبور کاربر. پس از ارسال فرمی که منطبق با اطلاعات موجود در بانک‌داده است، این کامپوننت تشخصی می‌دهد که نام‌کاربری mohsen است. تا اینجا فقط صحبت از کامپوننت authentication بود&#8230;</p>
<p>6- پرسش از ACL برای دسترسی. کامپوننت authentication از ACL می‌پرسد که آیا کاربر mohsen اجازه دارد کنش update رابرای کنترلر article بکار برد یا خیر.</p>
<p>7- ACL دسترسی را تشخصی می‌دهد. حال کامپوننت ACL با بررسی جدول‌های داده تشخیص می‌دهد که کاربر mohsen بطور صریح به هیچکدام از صفحات این سایت بمنظور ویرایش دسترسی ندارد اما این کاربر جز‌ء گروه ویراستار‌ها (Editors) می‌باشد و هر کاربری جزء این گروه قابلیت ویرایش مقالات را دارد. بنابراین کامپوننت ACL این‌گونه پاسخ می‌دهد: تا هنگامی که کاربر mohsen یک ویراستار است، وی مجوز ویرایش مقالات را به ارث می‌برد.</p>
<p>8- authentication هدایت می‌کند. بمحض تشخیص این دسترسی مجددا کامپوننت authentication وارد می‌شود تا کاربر را به صفحه درخواستی هدایت کند.</p>
<p><strong>نکته کلیدی:</strong> کامپوننت ACL می‌بایستی با یک سیستم ورود کاربر بکار گرفته شود.<br />
آنچه مدل بالا در این نوع از کاربرد نشان می‌دهد، نقش کامپوننت ACL بررسی مجوزهای خاص برای دسترسی به بخش‌های مختلف سیستم است بدین دلیل می‌توانیم استدلال کنیم، این کامپوننت باید با کامپوننتی در ارتباط باشد که شامل موارد زیر باشد:</p>
<p><strong>+</strong> نام و کلمه عبور را ذخیره کند.<br />
<strong>+</strong> نام و کلمه عبور را از فرم ورود بگیرد.<br />
<strong>+</strong> نام  و کلمه عبور را با مقادیر ذخیره شده تطبیق دهد.<br />
<strong>+</strong> بمحض تطبیق موفق، نام کاربری را  با اطلاعات نوع درخواست به کامپوننت ACL ارسال کند.<br />
<strong>+</strong> صفحه در خواستی را نمایش دهد یا اینکه با توجه به مجوزی که کامپوننت ACL تعیین می‌کند به صفحه دیگری هدایت کند.</p>
<p>بنابراین می‌توان دریافت کامپوننت توکار authentication یک انتخاب طبیعی برای داشتن یک سیستم ورود کاربر است. که می‌تواند در کنار ACL بکار گرفته شود.</p>
<p>نمونه بالا تنها یک تفکیک وظیفه میان این دو کامپوننت بود. در پست‌های آینده در مورد این کامپوننت و کاربرد آن خواهم نوشت سپس کار با کامپوننت ACL را فرا می‌گیرد در نهایت در مثال <a href="http://weblog.alvanweb.com/2008/10/22/create-linkdump-with-cakephp-part-1/">ساخت لینکدونی با CakePHP</a> که در همین وبلاگ آموزش داده شد از این دو کامپوننت استفاده می‌کنیم.</p>
<img src="http://feeds.feedburner.com/~r/alvanweb/~4/W5D38JjtGVk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://weblog.alvanweb.com/2009/03/05/how-work-authentication-system-in-cakephp/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://weblog.alvanweb.com/2009/03/05/how-work-authentication-system-in-cakephp/</feedburner:origLink></item>
		<item>
		<title>معرفی کتاب: برنامه‌نویسی پیشرفته در پی‌اچ‌پی</title>
		<link>http://feedproxy.google.com/~r/alvanweb/~3/ZUFPQZHqr6Y/</link>
		<comments>http://weblog.alvanweb.com/2009/02/28/advanced-php-programming-book-review/#comments</comments>
		<pubDate>Fri, 27 Feb 2009 21:32:33 +0000</pubDate>
		<dc:creator>مرتضی الوانی</dc:creator>
				<category><![CDATA[پی اچ پی]]></category>
		<category><![CDATA[کتاب]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Review]]></category>

		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=171</guid>
		<description><![CDATA[هرچند این روزها فرصتی نیست که مانند گذشته کتاب بخوانم اما در عوض فرصت مناسبی است تا کتاب‌هایی که در گذشته خوانده‌ام  را معرفی کنم  و از کمبود سوژه مناسب برای نوشتن در این وبلاگ بکاهم. در این پست‌ و پست‌های آتی بدنبال لینک دانلود کتاب نباشید. تنها آنچه می‌خوانید برداشت شخصی  [...]]]></description>
			<content:encoded><![CDATA[<p>هرچند این روزها فرصتی نیست که مانند گذشته کتاب بخوانم اما در عوض فرصت مناسبی است تا کتاب‌هایی که در گذشته خوانده‌ام  را معرفی کنم  و از کمبود سوژه مناسب برای نوشتن در این وبلاگ بکاهم. در این پست‌ و پست‌های آتی بدنبال لینک دانلود کتاب نباشید. تنها آنچه می‌خوانید برداشت شخصی  من  از کتاب‌ها است.<br />
<center><img src="http://alvani.googlepages.com/advanced-php-programming-book-review.jpg" alt="Advanced PHP Programming Book Review" /></center><br />
کتابی که برای این پست در نظر گرفته‌‌ام کتاب <a href="http://www.amazon.com/gp/product/0672325616/">برنامه‌نویسی پیشرفته در پی‌اچ‌پی</a> نوشته <a href="http://www.schlossnagle.org/~george/blog/">جورج شلاس‌نیگل</a> است (مشخصات دقیق لاتین و ترجمه کتاب در انتهای پست آمده است). اولین چاپ کتاب فوریه سال 2004 بوده و در اسفندماه 1385 توسط مهندس محسن مسگر هروی تحت نام برنامه‌نویسی پیشرفته در PHP 5 به زبان فارسی ترجمه شده است.</p>
<p>برنامه‌نویسانی که با PHP مقدماتی آشنایی داشته و مباحث اولیه وب را بشناسند می‌توانند با مطالعه این کتاب اطلاعات مفیدی را در زمینه‌هایی مانند سبک‌های برنامه‌نویسی، شی‌گرایی، بالا بردن کارایی و سرعت و افزایش امنیت به دست آورند. به کسانی که در  PHP مبتدی هستند توصیه می‌شود پیش از خواندن کتاب به کتب مقدماتی در این زمینه مراجعه کنند.</p>
<p>برخلاف عنوان فارسی و همچنین توضیح روی جلد لاتین، محتوا کاملا منطبق با PHP 5 نیست و هیچ چیز به طور خاص محدود به PHP 5 نمی‌شود! کتاب بیشتر روی ایده‌ها و استراتژی‌ها (بخصوص در قسمت بهبود کد به منظور افزایش سرعت، دقت و طراحی) تمرکز کرده است و صرفا یک آموزش گام به گام نیست و از این جنبه در کتاب‌های نوع خود عالیست. <span id="more-171"></span></p>
<p>اگر قبلا دو یا سه یا تعداد بیشری پروژه‌ی متوسط و بزرگ با  PHP‌ انجام داده‌اید این کتاب مناسب شماست. چرا که  ایده‌های مطرح شده می‌توانند در تغییر افق‌های دید در جهت بهینه‌سازی کد موثر باشند. بنظرم یکی از اصول برنامه‌نویسی حرفه‌ایی، نوشتن کد قابل نگهداری و خوانا است زیرا کدی را که خوب نوشته شده بهتر می‌توان بهینه کرد تا کدی که بهینه بوده اما بد نوشته شده است. این کتاب مقداری شما را با این اصول آشنا می‌کند.</p>
<p>کتاب اصلی (لاتین) 5 بخش (23 فصل) دارد اما در ترجمه فارسی تنها 3 بخش (16 فصل) آورده شده است و دو بخش آخر حذف شده است. بخش چهارم در مورد کارایی و بخش پنجم در مورد توسعه پذیری  (توسعه PHP و Zend Engine) بحث می‌کند که هر دو جزء مهمترین مباحث این کتاب هستند اما نمی‌دانم چرا مترجم آن‌ها را حذف کرده است؟! فهرست کتاب لاتین به صورت زیر است:</p>
<ul class="intro" style="direction:ltr">
<li style="text-align:left">
<strong>I-Implementation and Development Methodologies</strong><br />
1-Coding Styles<br />
2-Object-Oriented Programming Through Design Patterns<br />
3-Error Handling<br />
4-Implementing with PHP: Templates and the Web<br />
5-Implementing with PHP: Standalone Scripts<br />
6-Unit Testing<br />
7-Managing the Development Environment<br />
8-Designing a Good API</p>
<p><strong>II-Caching</strong><br />
9-External Performance Tunings<br />
10-Data Component Caching<br />
11-Computational Reuse</p>
<p><strong>III-Distributed Applications</strong><br />
12-Interacting with Databases<br />
13-User Authentication and Session Security<br />
14-Session Handling<br />
15-Building a Distributed Environment<br />
16-RPC: Interacting with Remote Services</p>
<p><strong>IV-Performance</strong><br />
17-Application Benchmarks: Testing an Entire Application<br />
18-Profiling<br />
19-Synthetic Benchmarks: Evaluating Code Blocks and Functions</p>
<p><strong>V-Extensibility</strong><br />
20-PHP and Zend Engine Internals<br />
21-Extending PHP: Part I<br />
22-Extending PHP: Part II<br />
23-Writing SAPIs and Extending the Zend Engine
</li>
</ul>
<p>ترجمه فارسی کتاب خوب است اما توصیه می‌کنم دو فصل آخر را هم بخوانید (خوشبختانه کتاب جدید نیست و با یک جستجوی کوچک می‌توانید فرمت PDF لاتین آن را دانلود کنید)</p>
<p>لازم به ذکر است که تمام مثال‌های این کتاب روی سیستم‌عامل لینوکس نوشته شده است هرچند بسیاری از کدها با تغییراتی اندک روی ویندوز نیز اجرا می‌شوند اما بعضی از مثال‌ها غیر قابل انتقال هستند. همچنین در پایان هر فصل لیستی از منابع آنلاین برای مطالعه بیشتر عنوان شده است.</p>
<ul class="intro">
<li>
<strong>+ مشخصات لاتین کتاب:</strong><br />
عنوان: Advanced PHP Programming<br />
مولف: George Schlossnagle<br />
ناشر: Sams</p>
<p><strong>+ مسخصات ترجمه کتاب:</strong><br />
عنوان: برنامه‌نویسی پیشرفته در PHP 5</p>
<p>مترجم: محسن مسگر هروی<br />
ناشر: موسسه فرهنگی هنری دیباگران تهران
</li>
</ul>
<img src="http://feeds.feedburner.com/~r/alvanweb/~4/ZUFPQZHqr6Y" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://weblog.alvanweb.com/2009/02/28/advanced-php-programming-book-review/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://weblog.alvanweb.com/2009/02/28/advanced-php-programming-book-review/</feedburner:origLink></item>
		<item>
		<title>معرفی فیدرول نسخه 1.2.0</title>
		<link>http://feedproxy.google.com/~r/alvanweb/~3/YpBAYPwaxRA/</link>
		<comments>http://weblog.alvanweb.com/2009/01/21/feedroll_introduction_version1_2_0/#comments</comments>
		<pubDate>Tue, 20 Jan 2009 22:28:16 +0000</pubDate>
		<dc:creator>مرتضی الوانی</dc:creator>
				<category><![CDATA[پروژه‌ ها]]></category>
		<category><![CDATA[FeedRoll]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Project]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[آژاکس]]></category>

		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=165</guid>
		<description><![CDATA[در پست قبل حدود بیست روز پیش فیدرول را معرفی کردم آن زمان قرار بود فیدرول یک سیستم برای منظم سازی خوراک‌ها براساس زمان آپدیت و جزئیات مختصر دیگری باشد اما مشورت با چند نفر از دوستان و ایده‌های جالب دیگر کارکرد پروژه را عوض کرد.

فیدرول قرار است یک آنالیزگر خوراک‌ برای وبلاگ‌های فارسی باشد. [...]]]></description>
			<content:encoded><![CDATA[<p>در پست قبل حدود بیست روز پیش فیدرول را معرفی کردم آن زمان قرار بود فیدرول یک سیستم برای منظم سازی خوراک‌ها براساس زمان آپدیت و جزئیات مختصر دیگری باشد اما مشورت با چند نفر از دوستان و ایده‌های جالب دیگر کارکرد پروژه را عوض کرد.<br />
<center><a href="http://feedroll.alvanweb.com"><img src="http://alvani.googlepages.com/FeedRoll_Logo.png" alt="صفحه اصلی پروژه فیدرول" title="صفحه اصلی پروژه فیدرول" /></a></center><br />
فیدرول قرار است یک آنالیزگر خوراک‌ برای وبلاگ‌های فارسی باشد. فعلا پروژه تکمیل نشده و در حال توسعه است. برخی از قابلیت‌ها بعلت پهنای باند و فضای محدود هاست رایگان تا تهیه یک هاست مناسب به حالت تعلیق درآمده‌اند و در آینده نزدیک قابلیت‌های جدید دیگری افزوده خواهد شد. فیدرول را می‌توانید فعلا <a href="http://feedroll.alvanweb.com">اینجا</a> ببینید.</p>
<p><ul class="intro">
<li>
<strong>قابلیت‌های فعلی:</strong><br />
+ امکان افزودن خوراک وبلاگ‌ به‌نهایت سادگی و آگاهی از وضعیت آن<br />
+ بروزرسانی خوراک‌ها هر 5 دقیقه یکبار<br />
+ منظم سازی بر اساس زمان بروزرسانی، حروف الفبا، تعداد مشترکین فید‌برنر<br />
+ نمایش عنوان 10 مطلب اخیر وبلاگ‌های ثبت شده<br />
+ جستجوی پیشرفته در نام‌وبلاگ‌ها، زمان بروز‌رسانی و تعداد مشترکین فیدبرنر<br />
+ خروجی RSS با قابلیت سفارشی‌سازی
</li>
</ul>
<p>تمام قابلیت‌های فوق توسط آژاکس (تماماً کتابخانه <a href="http://jquery.com/">JQuery</a>)  و زبان قدرتمند PHP و بانک اطلاعاتی MySQl پیاده‌سازی شده و سعی شده نهایت کاربر پسند بودن در آن لحاظ شود. برخلاف خواسته‌ام ناگزیر شدم <a href="http://cakephp.org">CakePHP </a>را در این پروژه کنار بگذارم و کلاس‌ها را از نو بنویسم. </p>
<p>خوراک چندی از وبلاگ‌های دوستان اضافه شده ‌است می‌توانید خوراک وبلاگتان را اضافه کنید اگه در سیستم موجود باشد هم مطلع خواهید شد. اما چگونه خوراک اضافه کنید. بدین منظور فیلد مناسبی در بالای صفحه تعبیه شده که به سهولت می‌توانید خوراک‌ها را اضافه کنید لازم است توضیحی در مورد محتوای خوراک‌ها بدهم. قرار است روی خوراک‌ها کار آماری شود و علاوه برآن لیست سازی انجام شود پس لازم است به این نکات توجه کنید: <span id="more-165"></span></p>
<p><strong>چگونه خوراک اضافه کنید؟</strong><br />
 قبل از هر چیز می‌بایست خوراکتان معتبر باشد. منظور از اعتبار رعایت معیارهایی است که توسط کنسرسیوم جهانی وب تعریف شده است. اگر وبلاگتان دو خوراک یا بیشتر دارد فقط مجاز هستید یکی را اضافه کنید (خوراکی که مشتمل بر محتوای اصلی وبلاگ‌تان است) خوراک‌ها فقط می‌بایست مخصوص وبلاگ باشند نه وب‌سایت‌هایی نظیر مجله‌ها یا دانلود سنتر‌ها و&#8230;</p>
<p>بهتر است از فیدبرنر استفاده کنید و اگر وبلاگتان این خوراک را دارد آن را اضافه کنید. چرا که تعداد مشترکین فیدبرنر یکی از معیارهای منظم‌سازی است. اگر هم فیدبرنر دارید و از روی ناآگاهی Awareness API غیرفعال است  و مایلید دیگران به تعداد مشترکین خوراکتان دسترسی داشته باشند بهتر است Awareness API را فعال کنید در غیراین‌صورت سیستم تعداد مشترکان را صفر لحاظ می‌کند.</p>
<p>از آنجایی که پس از خرید فیدبرنر توسط گوگل برخی از خوراک‌ها در حال انتقال از سیستم قدیمی به سیستم جدید هستند همه خوراک‌های فیدبرنر (سازگار با API قدیمی و جدید، شامل دامنه‌های feedburner.com و feedproxy.google.com) پشتیبانی می‌شوند.</p>
<p>انتخاب شمار مشترکان فیدبرنر بصورت خام (فیدبرنر آمار روز قبل را ارائه می‌دهد) معیار چندان مناسبی برای منظم‌سازی نیست در آینده از تغییرات در یک بازه زمانی بصورت درصد افزایش یا کاهش هم استفاده خواهد شد. ضمنا منظور از تعداد مشترکان آیتم circulation فیدبرنر است نه تعداد هیت! </p>
<p>پیام‌های موجود در نتیجه افزودن خوراک، گویا هستند اما فعال بودن و غیر فعال بود و درانتظار تایید بودن به چه منظور است. کارکرد سیستم گونه‌ایی است که خوراک‌ها باید تایید شود. پیام معتبر نیست یعنی یا خوراک شرایط اعتبار را ندارد یا سیستم نمی‌تواند خوراک را بخواند. پیام در انتظار تایید یعنی خوراک ثبت شده اما هنوز تایید نشده است. پیام فعال یعنی خوراک در سیستم پردازش می‌شود. فعلا خوراک غیر فعال نداریم اما اگر محتویات خوراک‌ها در سیستم اختلال ایجاد کند غیرفعال خواهد شد.</p>
<p><strong>چگونه خوراک‌ها را مرتب کنید؟</strong><br />
با یک کلیک! در حالت پیشفرض خوراک‌ها بر اساس زمان بروزرسانی(صعودی به نزولی از پایین به بالا) منظم هستند با بردن نشانگر ماوس روی عنوان ستون‌ها و کلیک بر روی آن‌ها می‌توانید بر اساس همان ستون خوراک‌ها را بصورت نزولی و صعودی درآورید و با دکمه‌های زیرین آن‌ها را پیمایش کنید. همچنین با کشیدن ستون‌ها می‌توانید‌ آن‌ها را بزرگ و کوچک کنید. دقیقا همانند کار با سلول‌ها در اکسل.</p>
<p><strong>چگونه در خوراک‌ها جستجو کنید؟</strong><br />
برای شروع جستجو بر روی نماد جستجو در پایین سمت چپ کلیک کنید. نماد کناری عمل بروزرسانی را انجام می‌دهد. پنجره معلق جستجو قابل جابجا شدن است آن را می‌توانید به گوشه‌ایی خارج از جدول بکشید و براساس فیلدها و عملگرهای کاملا هوشمند، جستجوی پیشرفته‌ایی در تمام خوراک‌ها انجام دهید.</p>
<p><strong>محتویات خوراک‌ها را چگونه مشاهده کنید؟</strong><br />
محتویات کامل خوراک‌ها فعلا مقدور نیست (فضا و پهنای باند کافی برای این کار نداریم) منحصرا لیست 10 مطلب اخیر هر خوراک با کلیک بر روی علامت مربع دراولین ستون کنار هر خوراک قابل مشاهده است.</p>
<p><strong>چگونه از خروجی RSS استفاده کنید؟</strong><br />
فعلا خروجی RSS (خوراک فیدرول) بصورت صعودی به نزولی از آخرین آپدیت‌ها مرتب می‌شود تعداد آیتم‌ها را می‌توانید مشخص کنید برای مثال خروجی 20 وبلاگی که اخیراً بروزرسانی شده‌اند به صورت زیر است:</p>
<pre class="brush: php;">http://feedroll.izfree.com/rss.php?nu=20
nu = Item Count </pre>
<p>بزودی خروجی براساس تعداد مشترکین فیدبرنر و سایر معیارها با قابلیت offset برای دسترسی به آیتم‌های داخلی اضافه می‌شود. قابلیت‌های دیگری نیز به زودی افزوده خواهند شد. از هر نظر یا پیشنهاد شما برای بهبود عملکرد فیدرول مشتاقانه استقبال می‌شود. ضمنا یادتان نرود خوراک وبلاگ‌تان را اضافه کنید.</p>
<img src="http://feeds.feedburner.com/~r/alvanweb/~4/YpBAYPwaxRA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://weblog.alvanweb.com/2009/01/21/feedroll_introduction_version1_2_0/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		<feedburner:origLink>http://weblog.alvanweb.com/2009/01/21/feedroll_introduction_version1_2_0/</feedburner:origLink></item>
		<item>
		<title>این روزها، پروژه FeedRoll</title>
		<link>http://feedproxy.google.com/~r/alvanweb/~3/pw46oh_-K0U/</link>
		<comments>http://weblog.alvanweb.com/2009/01/02/nowadays-and-feedroll-project/#comments</comments>
		<pubDate>Fri, 02 Jan 2009 16:01:18 +0000</pubDate>
		<dc:creator>مرتضی الوانی</dc:creator>
				<category><![CDATA[مطالب روزمره]]></category>
		<category><![CDATA[پروژه‌ ها]]></category>
		<category><![CDATA[پی اچ پی]]></category>
		<category><![CDATA[Blogrolling]]></category>
		<category><![CDATA[Feed]]></category>
		<category><![CDATA[FeedRoll]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Project]]></category>
		<category><![CDATA[SimplePie]]></category>
		<category><![CDATA[کیک پی‌اچ‌پی]]></category>

		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=159</guid>
		<description><![CDATA[قرار بود دسامبر سال قبل این مطلب رو بنویسم اما بنابر گرفتاری همیشگی و مشکلی که برای هاست پروژه جدید پیش اومد فرصت نشد. مدت‌ها پیش (همان زمان‌هایی که سرور بلاگرولینگ مرتبا به علت پینگ‌های زیاد  از کار می‌افتاد) قصد داشتم سیستمی مشابه بلاگرولینگ با استفاده از فید بنویسم اما فرصت زیادی نداشتم.
چند وقت [...]]]></description>
			<content:encoded><![CDATA[<p>قرار بود دسامبر سال قبل این مطلب رو بنویسم اما بنابر گرفتاری همیشگی و مشکلی که برای هاست پروژه جدید پیش اومد فرصت نشد. مدت‌ها پیش (همان زمان‌هایی که سرور بلاگرولینگ مرتبا به علت پینگ‌های زیاد  از کار می‌افتاد) قصد داشتم سیستمی مشابه بلاگرولینگ با استفاده از فید بنویسم اما فرصت زیادی نداشتم.</p>
<p>چند وقت پیش در یک پروژه کوچک با کلاس <a href="http://simplepie.org">SimplePie</a> آشنا شدم. انصافا در تجزیه عناصر درونی فید عالی عمل می‌کرد به خصوص اینکه مکانیزم caching مناسبی داشت. دو هفته قبل تصمیم گرفتم از این کلاس در قالب یه کامپونت برای <a href="http://cakephp.org">CakePHP</a> بمنظور ایجاد سیستمی مشابه بلاگرولینگ استفاده کنم. </p>
<p>خوشبختانه تا امروز با وجود کمبود وقتی که داشتم این وب اپلیکیشن کوچک رو تا یه جایی رسوندم نتیجه‌اش هم بلاگرول همین‌جاست. بعلت پهنای باند محدودم مجبور شدم فعلا پروژه را روی یک سرور رایگان ران کنم. هنوز پروژه تکمیل نشده و اگه فرصتم اجازه بده روی مولتی یوزر بودنش کار می‌کنم. (البته خبرهای خوشی از <a href="http://status.blogrolling.com/">تیم توسعه بلاگرولینگ</a> به گوش میرسه شاید تا اون زمان دوباره همه برگشتیم)</p>
<p> مهمترین دلیلم برای عدم استفاده از یه تجزیه‌گر فید ساده بمنظور لیست کردن وبلاگ‌ها، عدم ویرایش عناصر فیدها بود. حالا با استفاده از یه مکانیزم کش مناسب و ذخیره آخرین فید هر بلاگ در  MySQL هم عناصر عنوان و توضیحات فیدها قابل ویرایش هستند و هم از لحاظ بهینه‌سازی بار سرور برای لیست‌های طولانی کمتر می‌شه.</p>
<p>لیست بلاگرول اینجا هر 15 دقیقه رفرش می‌شه خروجی فید بلاگرول من هم <a href="http://feedroll.coolpage.biz/rss.php">اینجاست</a>. این‌ها همه رو گفتم برای این که بگم با گسترش کاربرد فید‌ها  تگ pubDate خیلی مهمه. خیلی‌ها هنوز آیتم‌های فیدشون این برچسپ رو نداره یا مقدارش معتبر نیست!</p>
<img src="http://feeds.feedburner.com/~r/alvanweb/~4/pw46oh_-K0U" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://weblog.alvanweb.com/2009/01/02/nowadays-and-feedroll-project/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://weblog.alvanweb.com/2009/01/02/nowadays-and-feedroll-project/</feedburner:origLink></item>
		<item>
		<title>پیکربندی Eclipse برای کار با CakePHP (بخش اول)</title>
		<link>http://feedproxy.google.com/~r/alvanweb/~3/_STgwC4ions/</link>
		<comments>http://weblog.alvanweb.com/2008/11/26/setting-up-eclipse-to-work-with-cakephp/#comments</comments>
		<pubDate>Wed, 26 Nov 2008 18:01:56 +0000</pubDate>
		<dc:creator>مرتضی الوانی</dc:creator>
				<category><![CDATA[پی اچ پی]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHP Framework]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[کیک پی‌اچ‌پی]]></category>

		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=158</guid>
		<description><![CDATA[ از آنجایی که خیلی از دوستان در رابطه با انتخاب یک IDE مناسب برای کار با کیک با مشکل مواجه بودند. این پست نوشته شد، امیدوارم مفید واقع شود. در این پست و پست آتی تنظیمات ادیتور قدرتمند Eclipse برای کار با فریم‌ورک CakePHP به ترتیب زیر آورده شده است:


+ بخش اول:
1- معرفی اجمالی [...]]]></description>
			<content:encoded><![CDATA[<p> از آنجایی که خیلی از دوستان در رابطه با انتخاب یک IDE مناسب برای کار با کیک با مشکل مواجه بودند. این پست نوشته شد، امیدوارم مفید واقع شود. در این پست و پست آتی تنظیمات ادیتور قدرتمند <a href="http://eclipse.org">Eclipse</a> برای کار با فریم‌ورک <a href="http://cakephp.org">CakePHP </a>به ترتیب زیر آورده شده است:</p>
<ul class="intro">
<li>
<strong>+ بخش اول:</strong><br />
1- معرفی اجمالی Eclipse و ایجاد workspace و project<br />
2- پیوند هسته کیک به پروژه جهت استفاده از قابلیت‌های توکار Eclipse<br />
3- پیکربندی برای شناسایی فایل‌های thtml  یا  ctp<br />
4- پیکربندی برای طبخ کیک بطور مستقیم با کنسول CakePHP</p>
<p><strong>+ بخش دوم:</strong><br />
5- دسترسی به پایگاه داده  MySQL به کمک پلاگ‌‌این QuantumDB<br />
6- افزودن پشتیبانی از Subversion به کمک پلاگ‌این Subclipse</p>
<p><strong>آنچه بدین منظور نیاز دارید:</strong><br />
+‌ نسخه‌ای از Eclipse که شامل ابزارهای توسعه‌ی پی‌اچ‌پی است (3.3.2)<br />
+ نسخه‌ای از XAMPP که بطور پیشفرض در C:xampp نصب شده است<br />
+ نسخه‌ای از CakePHP که بطور پیشفرض در C:xampphtdocscake قرار دارد<br />
+ سیستم عامل ویندوز ایکس‌پی
</li>
</ul>
<p><strong>چرا از Eclipse استفاده می‌کنم؟</strong><br />
اول اینکه کد باز است و تعداد زیادی پلاگ‌این برای آن نوشته شده است که همه‌ی نیازهای یک توسعه دهنده‌ی وب را پوشش می‌دهد بطوریکه با اطمینان می توان گفت این نرم‌افزار به تنهایی یک توسعه دهنده را راضی خواهد کرد.</p>
<p>دوم اینکه بزرگ و قدتمند است اما در عین حال ساده برای بکارگیری. Eclipse یک IDE خاص نیست بلکه برای طیف وسیعی از زبان‌های برنامه‌نویسی منتشر شده است. حتی خیلی از ادیتورهایی که جدیدا عرضه می‌شوند بر پایه‌ی Eclipse بنا شده‌اند. از آن جمله می‌توان نرم‌افزار Carbide.ui Theme Edition شرکت نوکیا که برای طراحی تم‌های گوشی‌های موبایل ساخته شده است را نام برد یا جای دوری نرویم همین <a href="http://www.aptana.com/">Aptana</a> که برای کار با فریم‌ورک‌های جاوااسکریپت پیشنهاد می‌شود و &#8230; <span id="more-158"></span></p>
<p><strong>نصب Eclipse برای PHP</strong><br />
گفتم که Eclipse یک IDE کلی هست. در پروژه‌ایی تحت نام PHP Development Tools معروف به PDT (ابزارهای توسعه پی‌اچ‌پی) آنچه برای توسعه‌ی پی‌اچ‌پی مورد نیاز است به این IDE افزوده شده است. </p>
<p>براساس<a href="http://www.eclipse.org/pdt/"> وب سایت</a> PDT، پکیج All-in-One شامل مجموعه کاملی است برای آنکه بتوان بی‌درنگ از PDT استفاده کرد. آخرین نسخه پایدار برای ویندوز را می توانید از <a href="http://download.eclipse.org/tools/pdt/downloads/">اینجا</a> دریافت کنید.<br />
خوشبختانه نصب eclipse بسیار ساده است چرا که هیچ مرحله‌ای برای نصب ندارد. کافیست آن را از حالت فشرده خارج کنید و در جایی مناسب کپی کنید سپس برنامه را اجرا کنید. برای اولین اجرا احتمالا سوالی برایتان پیش خواهد آمدکه &#8230;</p>
<p><strong>workspace چیست؟</strong><br />
معمولا افراد از تعریف workspace تعابیر متفاوتی دارند. من آن را فضای کاری ترجمه می‌کنم. workspace در حقیقت مکانی است که پروژه‌هایتان را در آنجا نگه می‌دارید (در مثال ما خود فریم‌ورک CakePHP بعنوان workspace شناخته می‌شود) ساده بگویم یک دایرکتوری روی هارد. برای اولین بار اجرای  eclipse باید workspace را تعریف کنید.</p>
<div class="center"><a href="http://alvanweb.files.wordpress.com/2008/11/defining_your_workspace.jpg"><img src="http://alvanweb.files.wordpress.com/2008/11/defining_your_workspace_small.jpg" alt="Defining workspace" title="برای بزرگ دیدن تصویر کلیک کنید" /></a></div>
<p><strong>تعریف‌ کردن workspace</strong><br />
قاعده ثابتی بدین منظور وجود ندارد، اما من توصیه می‌کنم آن را برابر <span dir="ltr">C:xampphtdocs</span> مقدار‌دهی کنید. همچنین از طریق منو File و Switch Workspace می توانید workspace متفاوت دیگری مشخص کنید.</p>
<p><strong>پروژه (Project) چیست؟</strong><br />
همانگونه که شما می‌دانید پروژه‌ی کاری، برنامه‌ا‌‌ی که در حال توسعه دادن است تعریف می‌شود. در مورد CakePHP پروژه‌ایی که در حال توسعه‌دادن است یک کپی از فولدر app کیک است. بنابراین نیاز داریم تا یک پروژه تعریف کنیم.</p>
<p><strong>تعریف کردن پروژه</strong><br />
از منو File گزینه New و سپس PHP Project را انتخاب کنید. در صورتی که این گزینه وجود ندارد در قسمت Other و زیر شاخه PHP می‌توانید PHP Project را بیابید.  تنظیمات بعدی را مطابق شکل انجام دهید (برای دیدن تصاویر در سایز واقعی روی آن‌ها کلیک کنید):</p>
<div class="center"><a href="http://alvanweb.files.wordpress.com/2008/11/defining_projects.jpg"><img src="http://alvanweb.files.wordpress.com/2008/11/defining_projects_small.jpg" alt="Defining projects" title="برای بزرگ دیدن تصویر کلیک کنید" /></a></div>
<p>در eclipse هنگام تعریف پروژه چنانچه دایرکتوری پروژه محتوی فایل باشد پنجره‌ایی به شکل زیر برای تایید مسیر پروژه نمایان خواهد شد: </p>
<div class="center"><a href="http://alvanweb.files.wordpress.com/2008/11/project_location_verification.jpg"><img src="http://alvanweb.files.wordpress.com/2008/11/project_location_verification_small.jpg" alt="project location verification" title="برای بزرگ دیدن تصویر کلیک کنید" /></a></div>
<p>این پنجره هشدار می‌دهد که محلی که برای تعیین پروژه انتخاب کرده‌اید حاوی فایل است و پاک کردن پروژه در محیط eclipse فایل‌ها را پاک خواهد نمود. با انتخاب گزینه پیشفرض یعنی گزینه دوم، برنامه در مسیر داده شده یک فولدر جدید (هم‌ نام پروژه) می‌سازد و عملیات توسعه در آن انجام خواهد شد. اما از آنجایی که برای توسعه کیک می‌بایستی عملیات توسعه بر روی فایل‌هایی که از فولدر app کپی گرفته‌ایم انجام شود گزینه اول را انتخاب می‌کنیم. دقت کنید که در این حالت پاک کردن پروژه از داخل محیط IDE تمامی فایل‌های آن دایرکتوری را پاک خواهد کرد. هم اکنون می‌بایستی در ستون سمت چپ، پروژه‌تان را مشاهده کنید. می‌توانید هر فولدر را بسهولت باز و ساختار فایل‌های آن را مشاهده کنید.</p>
<p><strong>پیوند هسته کیک به پروژه</strong><br />
حال نوبت آن رسیده است که این پروژه را به هسته کیک پیوند دهیم. به این معنی که بتوانید از کلاس‌ها و ثابت‌های کیک (classes &#038; constants) با قابلیت تکمیل خودکار (auto-complete) استفاده کنید. علاوه بر این می‌توانید به فایل‌های هسته کیک دسترسی داشته باشید. یک راهنمای دم دست!<br />
ابتدا هسته کیک را بعنوان یک پروژه تعریف می‌کنیم. دقیقا شبیه قبل از منو File گزینه New و سپس PHP Project را انتخاب کنید و سپس مطابق شکل زیر عمل کنید:</p>
<div class="center"><a href="http://alvanweb.files.wordpress.com/2008/11/defining_cakephp_core_project.jpg"><img src="http://alvanweb.files.wordpress.com/2008/11/defining_cakephp_core_project_small3.jpg" alt="Defining Cakephp core project" title="برای بزرگ دیدن تصویر کلیک کنید" /></a></div>
<p>مجددا در پنجره تاییدیه مسیر پروژه، گزینه اول را انتخاب کنید. حال می‌بایستی بین این دو پروژه پیوند برقرار کنیم بدین منظور در نمای PHP explorer بر روی پروژه اصلی (نه پروژه‌ایی که بعنوان هسته تعریف شد) راست کلیک کرده و گزینه Configure Include Path را انتخاب می‌کنیم. در تب projects با انتخاب add پروژه‌ی Cake را تیک می‌زنیم (دقت کنید چنانچه پروژه Cake بسته باشد در این قسمت موجود نخواهد بود)</p>
<p>حالا می‌توانید نتیجه عملیات رو آزمایش کنید. برای برنامه‌ایی که در نظر دارید یک کنترلر باز یا ایجاد کنید و به نمای Outline بروید. همانطور که مشاهده می کنید کلاس‌ها، توابع و متغیر‌ها را تشخیص داده است. حتی وراثت کلاس را به خوبی مشخص می‌کند بطوری که می توانید به سادگی تمام زیرشاخه‌ها را وارسی کنید. خیلی جالبه نه! و جالب تر اینکه در ویرایشگر PHP قابلیت تکمیل خودکار خیلی هوشمندانه عمل می‌کنه (می‌توانید با میان‌بر Ctrl+Space آزمایش کنید)</p>
<div class="center"><a href="http://alvanweb.files.wordpress.com/2008/11/linking_project_to_core_in_ide.jpg"><img src="http://alvanweb.files.wordpress.com/2008/11/linking_project_to_core_in_ide_small.jpg" alt="Linking Project to core in IDE" title="برای بزرگ دیدن تصویر کلیک کنید" /></a></div>
<p><strong>پیکربندی برای شناسایی فایل‌های thtml  یا  ctp</strong><br />
بسته به اینکه از چه نسخه‌ایی از کیک استفاده می کنید با فایل‌هایی با فرمت thtml (برای نسخه 1.1 کیک) و یا ctp (برای نسخه 1.2 کیک) که برای ایجاد نما (view) استفاده می‌شوند، سر و کار خواهید داشت. این فایل‌ها در حقیقت محتوای PHP‌ دارند. برای اینکه بتوان از قابلیت های‌لایت و تکمیل کد استفاده کنیم بهتر است به روش زیر این فایل‌ها را برای Eclipse بعنوان فایل PHP تعریف کنیم.</p>
<p>بدین منظور از منو Window گزینه Preferences و سپس General را انتخاب کنید. در قسمت Content types شاخه‌ی text را باز کنید و PHP content type را انتخاب کنید. حال در قسمت file associations بر روی add کلیک کنید و <span dir="ltr">*.ctp</span> و <span dir="ltr">*.thtml</span> را در مراحلی جداگانه اضافه کنید.</p>
<div class="center"><a href="http://alvanweb.files.wordpress.com/2008/11/recognise_thtml_or_ctp_files.jpg"><img src="http://alvanweb.files.wordpress.com/2008/11/recognise_thtml_or_ctp_files_small.jpg" alt="recognise thtml or ctp files" title="برای بزرگ دیدن تصویر کلیک کنید" /></a></div>
<p>حالا دوباره به preferences برگردید و اینبار Editors و از آنجا File Associations را انتخاب کنید. با انتخاب add مجددا فرمت‌های فوق را اضافه کنید. سپس با انتخاب این فرمت‌ها بطور جداگانه در قسمت Associated Editors با انتخاب add آن‌ها را به PHP Editor بطور پیشفرض اضافه کنید. حال می توانید یک فایل با فرمت ctp در کیک 1.2 باز کنید و های‌لایت کدها را ببینید.</p>
<p><strong>پیکربندی برای طبخ کیک بطور مستقیم</strong><br />
این یک مجتمع‌سازی ماهرانه است و یکی از جالبترین بخش‌هایی است که می‌بایستی در تنظیمات eclipse لحاظ کرد. بسته به اینکه از چه نسخه‌ایی از کیک استفاده می کنید، تنظیمات متفاوت خواهد بود:</p>
<p><strong>برای نسخه 1.1</strong><br />
از منو Run گزینه External Tools  و از آنجا Open External Tools Dialogue را انتخاب کنید. بر روی Program  از سمت چپ، راست کلیک کنید و New را انتخاب کنید. تنظیمات تب main را مطابق شکل زیر لحاظ کنید:</p>
<div class="center"><a href="http://alvanweb.files.wordpress.com/2008/11/bake_script_1_1.jpg"><img src="http://alvanweb.files.wordpress.com/2008/11/bake_script_1_1_small.jpg" alt="bake script 1_1" title="برای بزرگ دیدن تصویر کلیک کنید" /></a></div>
<p>Apply و سپس Close کنید. حال از منوی run‌  گزینه External tools و از آنجا Organise favourites را انتخاب و با کلیک روی add و تیک دار کردن Bake_1_1 آن را به لیست اجرا اضافه کنید.</p>
<p><strong>برای نسخه 1.2</strong><br />
ابتدا می‌بایستی کنسول CakePHP را در ویندوز پیکربندی کنید. هر چند یک فیلم آموزشی در این مورد در <a href="http://cakephp.org/screencasts/view/6">اینجا</a> موجود است اما مراحل را توضیح می‌دهم:<br />
به Control Panel از آنجا System و تب Advanced بروید. Environment Variables را انتخاب و از قسمت System variables متغیر سیستمی Path را باز کنید و در فیلد Variable Value در ادامه محتویات مقادیر زیر را قرار دهید (دقت کنید قبل از وارد کردن این مقادیر، در انتهای مقدار موجود علامت سیمیکولون یعنی ;  را بگذارید):</p>
<pre class="brush: php;">C:xamppphp;C:xampphtdocscakecakeconsole;</pre>
<p>پنجره‌ها را بترتیب ok کنید. در قسمت run منوی استارت cmd را تایپ کنید تا محیط Command Prompt باز شود در خط فرمان cake تایپ کنید چنانچه پیام خوش‌آمدگویی کنسول کیک را مشاهده کردید پیکربندی کنسول روی ویندوز درست انجام شده است. می توانید با استفاده از دستور cd به شاخه نصب کیک بروید تا مسیرهای صحیح Current Patch را ببینید (هر چند نیازی نیست)</p>
<p>به Eclipse برمی‌گردیم. برای اینکه تنظیمات پیکربندی کنسول در محیط IDE هم لحاظ شود Eclipse را ببندید و مجدد اجرا کنید.  از منو Run گزینه External Tools  و از آنجا Open External Tools Dialogue را انتخاب کنید. بر روی Program  از سمت چپ، راست کلیک کنید و New را انتخاب کنید. تنظیمات تب main را مطابق شکل زیر لحاظ کنید:</p>
<div class="center"><a href="http://alvanweb.files.wordpress.com/2008/11/bake_script_1_2.jpg"><img src="http://alvanweb.files.wordpress.com/2008/11/bake_script_1_2_small.jpg" alt="bake script 1_2" title="برای بزرگ دیدن تصویر کلیک کنید" /></a></div>
<p>Apply و سپس Close کنید. حال از منوی run‌  گزینه External tools و از آنجا Organise favourites را انتخاب و با کلیک روی add و تیک دار کردن Bake_1_2 آن را به لیست اجرا اضافه کنید.</p>
<p><strong>چگونه کیک را طبخ کنیم؟</strong><br />
برای  Bake کردن (که من طبخ کردن ترجمه‌اش کردم) run external tool را انتخاب و برحسب نسخه کیک bake_1_1 یا bake_1_2 را اجرا کنید. از طریق منوی run و گزینه External tools نیز قابل دسترسی هستند.<br />
اگر از کیک 1.2 استفاده می‌کنید همانطور که در تنظیمات فوق مشاهده کردید برای آدرس دایرکتوری کاری مقدار <span dir="ltr">${project_loc}</span> را جایگزین کردیم که بطور خودکار به پروژه‌ایی اشاره دارد که انتخاب شده است. یعنی در هنگام Bake کردن، پروژه‌ای که انتخاب شده باشد را Bake خواهد کرد نه سایر پروژه‌ها را. بنابراین باید دقت کنید که قبل از شروع عملیات طبخ پروژه را انتخاب کرده باشید (پروژه کاری نه پروژه‌ایی که بعنوان هسته کیک تعریف شد)</p>
<p>حال با کنسول CakePHP بسادگی می‌توانید پروژه‌های جدید ایجاد کنید، مدل، کنترلر و نما بسازید و دیتابیس را پیکربندی کنید. امیدوارم طباخی یاد داشته باشید. چون توضیح این قسمت خارج از حوصله من است اگر مشکلی داشتید مطرح کنید. </p>
<p>در ادامه این مطلب در پست‌های آینده، دسترسی به پایگاه داده MySQL به کمک پلاگ‌‌این QuantumDB و همچنین افزودن پشتیبانی از Subversion به کمک پلاگ‌این  Subclipse توضیح داده خواهد شد.</p>
<img src="http://feeds.feedburner.com/~r/alvanweb/~4/_STgwC4ions" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://weblog.alvanweb.com/2008/11/26/setting-up-eclipse-to-work-with-cakephp/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://weblog.alvanweb.com/2008/11/26/setting-up-eclipse-to-work-with-cakephp/</feedburner:origLink></item>
		<item>
		<title>ساخت لینکدونی با CakePHP (بخش سوم)</title>
		<link>http://feedproxy.google.com/~r/alvanweb/~3/mnG2pHtjBh4/</link>
		<comments>http://weblog.alvanweb.com/2008/10/24/create-linkdump-with-cakephp-part-3/#comments</comments>
		<pubDate>Thu, 23 Oct 2008 21:40:09 +0000</pubDate>
		<dc:creator>مرتضی الوانی</dc:creator>
				<category><![CDATA[پی اچ پی]]></category>
		<category><![CDATA[Linkdump]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHP Framework]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[کیک پی‌اچ‌پی]]></category>

		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=157</guid>
		<description><![CDATA[پیش نیازها: ساخت لینکدونی با CakePHP (بخش اول) و (بخش دوم)
در مراحل قبل داده‌ها را از دیتابیس خواندیم و در قالب لینک نمایش دادیم. در این بخش قصد داریم امکان افزودن لینک جدید، ویرایش و حذف لینک را اضافه کنیم و مختصری هم با Routes در کیک پی‌اچ‌پی آشنا شویم. 
ساخت فرم و افزودن لینک
طبق [...]]]></description>
			<content:encoded><![CDATA[<p><strong>پیش نیازها:</strong> ساخت لینکدونی با CakePHP (<a href="http://weblog.alvanweb.com/2008/10/22/create-linkdump-with-cakephp-part-1/">بخش اول</a>) و (<a href="http://weblog.alvanweb.com/2008/10/23/create-linkdump-with-cakephp-part-2/">بخش دوم</a>)<br />
در مراحل قبل داده‌ها را از دیتابیس خواندیم و در قالب لینک نمایش دادیم. در این بخش قصد داریم امکان افزودن لینک جدید، ویرایش و حذف لینک را اضافه کنیم و مختصری هم با Routes در کیک پی‌اچ‌پی آشنا شویم. </p>
<div class="post_caption">ساخت فرم و افزودن لینک</div>
<p>طبق نمونه‌های گذشته به فایل links_controller.php کنش add  را بصورت زیر اضافه می‌کنیم تا بتوانیم لینک‌های جدیدی در دیتابیس اضافه کنیم:</p>
<pre class="brush: php;">&lt;?php
class LinksController extends AppController {
  var $name = 'Links';
  function index() {
    $this-&gt;set('links', $this-&gt;Link-&gt;find('all'));
  }
  function view($id = null) {
    $this-&gt;Link-&gt;id = $id;
    $this-&gt;set('link', $this-&gt;Link-&gt;read());
  }
  function add() {
    if (!empty($this-&gt;data)) {
     if ($this-&gt;Link-&gt;save($this-&gt;data)) {
$this-&gt;flash('Your link has been saved.', '/links');
     }
    }
  }
}
?&gt;</pre>
<p>تابع add را به این صورت تعریف می‌کنیم که چنانچه فرم ارسال شده خالی نبود، با استفاده از مدل Link سعی شود داده ذخیره شود اما چنانچه بنا به دلایلی ذخیره نشد، نما نمایش داده شود. این خود فرصتی را در اختیارمان قرار می‌دهد تا خطاهای ناشی از محتوای فیلدهای ارسالی را نمایش دهیم. <span id="more-157"></span></p>
<p>هنگامی کاربر به روش POST داده‌ها را به برنامه ارسال می‌کند، این اطلاعات در <span dir="ltr">$this->data</span> وجود دارند با استفاده از تابع pr‌ می‌توانید آن‌ها را چاپ کنید. تابع <span dir="ltr">$this->flash()</span> یک متد کنترلر است که برای چند ثانیه پیامی را به کاربر نشان می‌دهد. سپس کاربر را به صفحه‌ای که به عنوان پارامتر دوم دریافت می‌کند هدایت می‌کند. (در اینجا کاربر به صفحه‌ی links هدایت می‌شود)</p>
<p>در اینجا لازم است در مورد اشکال زدایی توکار فریم‌ورک (Debug) توضیح بدهم. کیک برای اشکال زدایی دو حالت تولید (Production) و توسعه (Development) دارد. حالت تولید مربوط به زمانی است که پروژه تان با کیک اتمام یافته و قصد دارید آن را ارائه کنید. حالت توسعه هم گویای زمان توسعه پروژه است. این حالت‌ها در فایل  appconfigcore.php با مقداردهی عددی از 0 تا 3 برای debug  قابل تنظیم است. </p>
<p>مقدار 0 مربوط به حالت تولید می‌شود، در این حالت هیچ خطا و هشداری مشاهده نمی‌شود و تابع Flash که در بالا معرفی شد بصورت redirect عمل میکند (بطور خودکار کاربر به صفحه دیگر منتقل می‌شود) در حالتی که این مقدار بزرگتراز صفر تنظیم شود فریم‌ورک در حالت توسعه است و تابع  Flash بطور خودکار عمل انتقال کاربر به صفحه جدید را انجام نمی‌دهد (بطور پیشفرض مقدار روی 2 تنظیم شده است)</p>
<p>متد save خطاها را بررسی خواهد کرد و چنانچه خطایی رخ دهد عمل ذخیره انجام نخواهد شد. در قسمت بعد توضیح خواهم داد که چگونه این خطاها را کنترل کنید.</p>
<div class="post_caption">معتبرسازی داده</div>
<p>هر برنامه‌نویس تحت وبی رویکردی برای بررسی صحت اطلاعات وارد شده در فیلدهای فرم‌ها دارد و تقریبا معتبرسازی اطلاعات وارد شده و هدایت کاربر به پرکردن صحیح فرم‌ها کار وقت گیری است. کیک در این مورد بی‌اندازه متنوع و انعطاف‌پذیر است.</p>
<p>برای بهره‌گیری از قابلیت‌های معتبرسازی فرم‌ها کافیست از FormHelper کیک استفاده کنید. FormHelper  بطور پیشفرض در همه نماها که در آن عملگر <span dir="ltr">$form</span>  بکار رود موجود است. نمای add را بصورت زیر ایجاد می‌کنیم:</p>
<pre class="brush: php;">/app/views/links/add.ctp
&lt;h1&gt;Add Link&lt;/h1&gt;
&lt;?php
echo $form-&gt;create('Link');
echo $form-&gt;input('title');
echo $form-&gt;input('url');
echo $form-&gt;input('body', array('rows' =&gt; '3'));
echo $form-&gt;end('Save Link');
?&gt;</pre>
<p>در اینجا از <span dir="ltr">$form->create()</span>  بمنظور ایجاد تگ باز form استفاده کردیم این کد خروجی زیر را تولید می‌کند:</p>
<pre class="brush: html;">&lt;form id=&quot;LinkAddForm&quot; method=&quot;post&quot; action=&quot;/cake/links/add&quot;&gt;</pre>
</form>
<p>اگر تابع create  هیچ پارامتری نداشته باشد، بطور پیشفرض کیک action و method را مقدار‌دهی می‌کند. از <span dir="ltr">$form->input()</span> هم برای ایجاد عناصر فرم با همان نامی که به عنوان پارامتر می‌گیرد استفاده می‌شود. کیک توسط اولین پارامتر تشخیص می‌دهد که فیلد از چه نوعی است و دومین پارامتر این امکان را فراهم می کند که آرایه وسیعی با اختیارات فراوان تعیین کنیم. در اینجا تعداد سطرهای textarea لحاظ شده است. <span dir="ltr">input()</span> عناصر فرمی متفاوتی را، مبنی بر مدل فیلد مشخص شده، ایجاد می‌کند و این یکی از شگردهای کیک است.<br />
با فراخوانی <span dir="ltr">$form->end()</span> یک کلید ارسال ایجاد، و تگ form بسته می‌شود. رشته‌ای که به عنوان اولین پارامتر <span dir="ltr">end()</span> قرار می‌گیرد، برابر مقدار (value) کلید ارسال خواهد بود.</p>
<p>حال اجازه بدهید به صفحه اصلی لینکدونی برگردیم و در فایل app/views/links/index.ctp لینک  صفحه جدیدی را که بمنظور افزودن داده به دیتابیس ساختیم، قبل از جدول اضافه کنیم:</p>
<pre class="brush: php;">&lt;?php echo $html-&gt;link('Add Link','/links/add')?&gt;</pre>
<p>ممکنه تعجب کنید که چطور کیک صحت اعتبار این فیلدها را بررسی می‌کند. قاعده‌های معتبر‌سازی در مدل تعریف می‌شوند. بدین منظور مجدداً به مدل Link بر می‌گردیم و اصلاحاتی را به شکل زیر لحاظ می‌کنیم:</p>
<pre class="brush: php;">&lt;?php
class Link extends AppModel {
   var $name = 'Link';
   var $validate = array(
     'title' =&gt; array(
     'rule' =&gt; array('minLength', 1)
    ),
     'url' =&gt; array(
     'rule' =&gt; array('minLength', 1)
    ),
     'body' =&gt; array(
     'rule' =&gt; array('minLength', 1)
    )
  );
}
?&gt;</pre>
<p>آرایه <span dir="ltr">$validate</span> به کیک می‌گوید که هنگامی که متد <span dir="ltr">save()</span> فراخوانی شد چگونه صحت اطلاعات بررسی شود. در اینجا سه فیلد عنوان، آدرس و توضیحات را چک می‌کنیم که نبایستی خالی باشد. یکبار دیگر تکرار می‌کنم موتور معتبرسازی کیک بسیار قوی است چرا که شمار زیادی از قواعد پیش‌ساخته شده (بررسی صحت آدرس ایمیل، شماره کارت اعتباری، تلفن و &#8230;) در آن گنجانده شده است و سفارشی سازی آنها انعطاف پذیری فوق العاده‌ای دارد. برای اطلاعات بیشر می توانید به <a href="http://book.cakephp.org/view/125/data-validation">اینجا</a> رجوع کنید.</p>
<p>هم‌اکنون قواعد معتبرسازی لحاظ شده‌اند. فرم افزودن لینک را با فیلدهای خالی تست کنید تا ببینید چگونه کار می‌کند. هنگامی که از <span dir="ltr">input()</span> برای ایجاد عناصر فرم استفاده می‌کنیم، خطاهای مربوط به عدم صحت داده بطور خودکار نمایش داده می‌شوند.</p>
<div class="post_caption">حذف کردن لینک</div>
<p>قصد داریم امکانی را ایجاد کنیم که کاربران بتوانند لینک‌ها را از دیتابیس پاک کنند. خوب! با کنش <span dir="ltr">delete()</span>  در LinksControlle  به شکل زیر شروع می کنیم:</p>
<pre class="brush: php;">function delete($id) {
$this-&gt;Link-&gt;del($id);
$this-&gt;flash('The link with id: '.$id.' has been deleted.', '/links');
}</pre>
<p>این تابع با گرفتن <span dir="ltr">$id</span> هر لینک، آن را از دیتابیس پاک می‌کند و با استفاده از <span dir="ltr">flash()</span> پیام تاییدی را مبنی بر حذف لینک قبل از ری‌دایرکت (انتقال خودکار) شدن به صفحه‌ی <span dir="ltr">/links</span> به کاربر نشان می‌دهد. با این وجود یکبار دیگر باید فایل index.ctp را بصورت زیر ویرایش کنیم و قابلیت حذف هر لینک را به آن بیفزاییم:</p>
<pre class="brush: php;">&lt;h1&gt;Links:&lt;/h1&gt;
&lt;p&gt;&lt;?php echo $html-&gt;link('Add Link','/links/add')?&gt;&lt;/p&gt;

&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;Id&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;th&gt;Actions&lt;/th&gt;
&lt;th&gt;Created&lt;/th&gt;
&lt;/tr&gt;
&lt;?php foreach ($links as $link): ?&gt;
&lt;tr&gt;
&lt;td&gt;&lt;?php echo $link['Link']['id']; ?&gt;&lt;/td&gt;
&lt;td&gt;&lt;?php echo $html-&gt;link($link['Link']['title'],
&quot;/links/view/&quot;.$link['Link']['id']); ?&gt;&lt;/td&gt;
&lt;td&gt;&lt;?php echo $html-&gt;link('Delete', &quot;/links/delete/{$link['Link']['id']}&quot;, null, 'Are you sure?' )?&gt;&lt;/td&gt;
&lt;td&gt;&lt;?php echo $link['Link']['created']; ?&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;?php endforeach; ?&gt;
&lt;/table&gt;</pre>
<p>کد بالا از قابلیت توکار HtmlHelper  بمنظور ایجاد یک دیالوگ جاوااسکریپتی تایید حذف لینک، قبل از اینکه کاربر لینک را حذف کند، استفاده می کند. می‌بینید این فریم‌ورک تا چه اندازه همه چیز را ساده کرده است!</p>
<div class="post_caption">ویرایش لینک </div>
<p>اگر مراحل قبل را فراگرفته باشید از الان شما یک حرفه‌‌ای کیک پی‌اچ‌پی هستید! پس می‌بایستی الگوی ادامه کار را حدس بزنید. یک کنش می‌سازیم و سپس نما را اضافه می‌کنیم. در زیر کنش <span dir="ltr">edit()</span> را که باید در LinksControlle لحاظ شود می‌بینید:</p>
<pre class="brush: php;">function edit($id = null) {
 $this-&gt;Link-&gt;id = $id;
 if (empty($this-&gt;data)) {
  $this-&gt;data = $this-&gt;Link-&gt;read();
 } else {
  if ($this-&gt;Link-&gt;save($this-&gt;data)) {
$this-&gt;flash('Your link has been updated.','/links');
  }
 }
}</pre>
<p>این تابع ابتدا داده ارسالی فرم را  بررسی می‌کند ، اگر هیچ چیزی فرستاده نشده باشد لینک‌ها را به نما منتقل می‌کند. اگر داده‌ای در نتیجه تغییر، ارسال شده باشد سعی می‌کند از طریق مدل Link داده‌ جدید را در دیتابیس ذخیره کند (یا خطاهای ناشی از عدم اعتبار داده را نشان خواهد داد) نمای edit بصورت زیر است:</p>
<pre class="brush: php;">/app/views/links/edit.ctp
&lt;h1&gt;Edit Link&lt;/h1&gt;
&lt;?php
echo $form-&gt;create('Link', array('action' =&gt; 'edit'));
echo $form-&gt;input('title');
echo $form-&gt;input('url');
echo $form-&gt;input('body', array('rows' =&gt; '3'));
echo $form-&gt;input('id', array('type'=&gt;'hidden'));
echo $form-&gt;end('Save Link');
?&gt;</pre>
<p>خروجی کد بالا فرمی خواهد بود که درفیلدهای آن اطلاعات لینکی که درخواست ویرایش آن داده شده قرار دارد. باید در اینجا توجه کنید که id هر لینک بصورت یک عنصر مخفی (hidden) در فرم آمده است. در حقیقت هنگامی که id هر لینک با اطلاعات ارسال شده باشد کیک تشخیص می‌دهد که این لینک باید ویرایش شود در صورتی که اگر id با اطلاعات ارسالی نباشد هنگامی که تابع <span dir="ltr">save()</span> فراخوانی می‌شود یک لینک جدید اضافه خواهد شد.</p>
<p>مجدداً به نمای index برمی‌گردیم و قابلیت ویرایش هر لینک را به صورت زیر در کنار پیوند مربوط به حذف لینک اضافه می‌کنیم (تا در صفحه‌ی اصلی قابلیت ویرایش لینک را داشته باشیم):</p>
<pre class="brush: php;">&lt;?php echo $html-&gt;link('Edit', '/links/edit/'.$link['Link']['id']);?&gt;</pre>
<p>تا اینجا آموختید که چگونه با  CakePHP یک لینکدونی ساده بسازید. قابلیت‌هایی نظیر افزودن، ویرایش و حذف لینک تنها به این دلیل بود که با نحوه ایجاد کنش در کنترلر آشنا شوید و بتوانید نماهای مربوطه را ایجاد کنید. به ادمه بحث در مورد Routes (مسیرها) می‌پردازیم.</p>
<div class="post_caption">مسیرها (Routes) در CakePHP</div>
<p>برای بعضی‌ها تنظیمات پیشفرض کیک در مورد مسیرها کافی است. اما توسعه دهندگان نسبت به کاربرپسند کردن URL‌ها و سازگاری با موتورهای جستجو حساس هستند. از اینرو می‌توانند از تنظیمات Routes استفاده کنند. در این آموزش تغییرات ناچیزی را در این مورد لحاظ می‌کنیم برای اطلاعات بیشتر و تکنیک‌های مسیر‌دهی پیشرفته، بخش <a href="http://book.cakephp.org/view/46/">Routes Configuration</a> در مستندات کیک را ببینید.</p>
<p>تا اینجا که لینکدونی را ایجاد کردیم چنانچه کاربری به صفحه‌ی اصلی (شاخه دایرکتوری اصلی) به نشانی example.com/cake مراجعه کند بطور پیشفرض PagesController فراخوانی می‌شود و نمایی بنام home رندر می‌شود. قصد داریم مسیر را طوری تعیین کنیم که با درخواست شاخه اصلی، لیست لینک‌ها نمایش داده شود. </p>
<p>مسیرها در فایل app/config/routes.php تعیین می‌شوند. خط زیر مسیر پیشفرض شاخه اصلی را تعیین می‌کند. آن را توسط کامنت (//) غیرفعال کنید یا این خط را پاک کنید:</p>
<pre class="brush: php;">Router::connect('/', array('controller' =&gt; 'pages', 'action' =&gt; 'display', 'home'));</pre>
<p>خط فوق آدرس &#8216;/&#8217; را با صفحه پیشفرض کیک مرتبط می‌کند. ما می‌خواهیم آن را با کنترلر خودمان ارتباط دهیم بنابراین خط زیر را به این فایل اضافه می‌کنیم:</p>
<pre class="brush: php;">Router::connect('/', array('controller' =&gt; 'links', 'action' =&gt; 'index'));</pre>
<p>حال با رفتن به صفحه اصلی کیک به نشانی example.com/cake بجای صفحه پیشفرض لیست لینک‌ها را می‌بینید. می‌توانید نام شاخه اصلی را که در بخش اول آموزش cake گذاشتید، به linkdump تغییر دهید (تا هخوانی بیشتری  با پروژه داشته باشد) بنابراین آدرس صفحه اصلی به example.com/linkdump تغییر خواهد کرد.</p>
<p>اگر نام شاخه را از cake به  linkdump تغییر دادید فایل‌های تمپ را پاک کنید تا صفحه اصلی را ببینید. تنها جهت آشنایی شما با خطاهای پیکربندی اولیه کیک، نام دایرکتوری را ابتدا cake انتخاب کردم چون می‌توانست از همان ابتدا linkdump انتخاب شود.</p>
<div class="post_caption">سخن آخر</div>
<p>نوشتن این لینکدونی در اینجا به پایان رسید. ساده نبود؟! یادتان باشد این آموزش پایه بود CakePHP خیلی خیلی قابلیت‌های بیشتری از آنچه گفته شد دارد و بیش از آنچه تصور کنید انعطاف‌پذیر است. متاسفم از اینکه باید بگویم فرصت کافی ندارم تا آنچه از کیک می‌دانم بزبان ساده بیان کنم.</p>
<p> از همین الان می‌توانید پروژه‌های آزمایشی را با کیک  شروع کنید. بزرگترین راهنما یعنی <a href="http://book.cakephp.org/">Manual</a> و <a href="http://api.cakephp.org/">API</a> کیک در اختیار شماست. اگر مشکلی داشتید در حد دانشم درخدمتم. موفق باشید. (مرتضی الوانی، آبانماه 1387)</p>
<div class="post_caption">دریافت فایل‌های ضمیمه</div>
<p><strong><a href="http://alvani.googlepages.com/cake_app_linkdump.zip">[+]</a></strong> دایرکتوری app این پروژه بهمراه فایل sql ساخت جدول<br />
<strong><a href="http://alvani.googlepages.com/create_linkdump_with_cakephp.zip">[+]</a></strong> آموزش کامل (بخش‌های اول و دوم و سوم) بصورت PDF</p>
<img src="http://feeds.feedburner.com/~r/alvanweb/~4/mnG2pHtjBh4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://weblog.alvanweb.com/2008/10/24/create-linkdump-with-cakephp-part-3/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://weblog.alvanweb.com/2008/10/24/create-linkdump-with-cakephp-part-3/</feedburner:origLink></item>
		<item>
		<title>ساخت لینکدونی با CakePHP (بخش دوم)</title>
		<link>http://feedproxy.google.com/~r/alvanweb/~3/cmfLvJQFuiE/</link>
		<comments>http://weblog.alvanweb.com/2008/10/23/create-linkdump-with-cakephp-part-2/#comments</comments>
		<pubDate>Wed, 22 Oct 2008 20:43:33 +0000</pubDate>
		<dc:creator>مرتضی الوانی</dc:creator>
				<category><![CDATA[پی اچ پی]]></category>

		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=156</guid>
		<description><![CDATA[پیش نیاز: ساخت لینکدونی با CakePHP (بخش اول)
در پست قبل تا ساخت پایگاه‌ داده و مقداردهی فایل database.php  بمنظور ارتباط با MySQL پیش رفتیم. حال یک جدول بنام links با شش فیلد زیر در دیتابیس linkdump که قبلاً ساخته‌ایم ایجاد می‌کنیم. همچنین جهت تست دو لینک اضافه می‌کنیم:
/* First, create our links table: */
CREATE [...]]]></description>
			<content:encoded><![CDATA[<p><strong>پیش نیاز:</strong> <a href="http://weblog.alvanweb.com/2008/10/22/create-linkdump-with-cakephp-part-1/">ساخت لینکدونی با CakePHP (بخش اول)</a><br />
در پست قبل تا ساخت پایگاه‌ داده و مقداردهی فایل database.php  بمنظور ارتباط با MySQL پیش رفتیم. حال یک جدول بنام links با شش فیلد زیر در دیتابیس linkdump که قبلاً ساخته‌ایم ایجاد می‌کنیم. همچنین جهت تست دو لینک اضافه می‌کنیم:</p>
<pre class="brush: sql;">/* First, create our links table: */
CREATE TABLE links (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
url VARCHAR(255),
title VARCHAR(255),
body TEXT,
created DATETIME DEFAULT NULL,
modified DATETIME DEFAULT NULL
);
/* Then insert some links for testing: */
INSERT INTO links (url, title, body, created) VALUES
('http://alvanweb.com', 'Alvanweb', 'All about web design and progrmming', NOW()),
('http://cakephp.org', 'CakePHP', 'The rapid development php framework', NOW());</pre>
<p>نام‌ جدول و ستون‌ها اختیاری نیستند! اگر از قواعد نامگذاری جداول و کلاس‌های کیک پیروی کنید خواهید توانست از مزایای توابع توکار کیک بدون پیکر‌بندی براحتی استفاده کنید. کیک تا انجا انعطاف پذیر است که حتی با وجود عدم تطابق با طرح‌های پیشفرض می‌توانید آن را سفارشی کنید اما استفاده از قواعد در صرفه‌جویی زمان موثر است. </p>
<p>برای اطلاعات بیشتر در مورد این قواعد نامگذاری <a href="http://book.cakephp.org/view/22/">اینجا</a> را ببینید. اما همین اندازه کافی است که بدانید جدول links بطور خودکار به مدلی بنام link اشاره دارد و همچنین فیلدهای created و modified بطور منطقی و خودکار توسط کیک مدیریت می‌شوند. <span id="more-156"></span></p>
<div class="post_caption">ایجاد یک مدل</div>
<p>به سراغ کدنویسی کیک می‌رویم. اولین فایلی که باید ایجاد کنیم یک مدل برای لینک‌ها است. به زبان ساده بگویم مدل در واقع نان و کره‌ی یک برنامه نوشته شده با کیک است. با ایجاد یک مدل با دیتابیس ارتباط برقرار کرده‌ایم. در ابتدا پایه کد را می‌نویسیم سپس اعمالی نظیر نمایش، افزودن، ویرایش و حذف لینک را اضافه خواهیم کرد.</p>
<p>کلاسی که به عنوان مدل تعریف می‌شود در app/models  قرار می‌گیرد و محتویات فایلی که در app/models/link.php ذخیره خواهد شد بصورت زیر است:</p>
<pre class="brush: php;">&lt;?php
class Link extends AppModel {
   var $name = 'Link';
}
?&gt;</pre>
<p>یادتان نرود قواعد نامگذاری در کیک بسیار مهم است. با نامیدن مدل بنام Link کیک بطور خودکار می‌تواند تشخیص دهد که این مدل توسط کنترلری بنام LinksController بکار گرفته خواهد شد و با جدولی بنام links در دیتابیس در ارتباط است.</p>
<p>اگر کیک نتواند فایلی مطابق با مدل در app/models بیابد، بطور داینامیک یک آبجکت مدل ایجاد می‌کند. این همچنین به این معناست که اگر بطور تصادفی نام فایل مدل را اشتباه تایپ کنید (مثلا بجای link.php نام فایل links.php شود) کیک هیچ کدام از تنظیمات شما را لحاظ نمی کند و در عوض مقادیر پیشفرض خودش را جانشین خواهد کرد.</p>
<div class="post_caption">ایجاد یک کنترل‌کننده</div>
<p>در این مرحله برای لینک هایمان یک کنترلر ایجاد می‌کنیم. کنترلر جایی است که قصد داریم جزئیات لینک ها را استخراج کنیم. فایلی بنام links_controller.php را با محتویات پایه‌ی زیر در app/controllers ایجاد می‌کنیم:</p>
<pre class="brush: php;">&lt;?php
class LinksController extends AppController {
   var $name = 'Links';
}
?&gt;</pre>
<p>حال اجازه دهید یک کنش (Action) به کنترلر بیفزایم. کنش اغلب به یک تابع در برنامه اشاره دارد. برای مثال وقتی کاربران درخواست example.com/cake/links/index را ‌می‌دهند (که با example.com/cake/links  مشابه است) انتظار دارند با لیستی از لینک‌ها مواجه شوند. کدی که این کنش را تعریف می‌کند بصورت زیر است:</p>
<pre class="brush: php;">&lt;?php
class LinksController extends AppController {
   var $name = 'Links';
   function index() {
     $this-&gt;set('links', $this-&gt;Link-&gt;find('all'));
   }
}
?&gt;</pre>
<p>با تعریف تابع index در LinksController، کاربران می‌توانند به درخواستی مانند این example.com/cake/links/index دسترسی داشته باشند. بطور مشابه اگر تابعی بنام foobar تعریف کنیم کاربران قادر خواهند بود به درخواست example.com/links/foobar دسترسی داشته باشند.</p>
<p>ممکن است کنجکاو شوید تا به طریقی نام‌های کنترلر و کنش را تغییر دهید. فعلاً دست نگهدارید و از قواعد کیک بمنظور ایجاد کنش‌های قابل فهم استفاده کنید. در آینده بدین منظور با routes در کیک آشنا خواهید شد.</p>
<p>در این کنش از تابع set برای گذر داده از کنترل‌کننده به نمایش (view) استفاده می‌کنیم. این خط، متغیر links را برابر مقدار بازگشتی از <span dir="ltr">find(&#8216;all&#8217;)</span> تنظیم می‌کند. مدل لینک بطور خودکار در <span dir="ltr">$this->Link</span> موجود خواهد بود چراکه از قواعد نامگذاری کیک استفاده کردیم.</p>
<div class="post_caption">ایجاد یک نما</div>
<p>تا هم اکنون با جریان داده به مدل، منطق برنامه و روند تعریف شده توسط کنترلر آشنا شدید حال اجازه دهید یک نما برای کنش index که در بالا تعریف شد ایجاد کنیم. نماهای کیک در واقع نمایش  اجزایی هستند که در طرح‌بندی (layout)  برنامه کنار هم قرار میگیرند. برای بیشتر برنامه‌ها HTML مخلوط با PHP استفاده می‌شود اما می تواند بصورت XML، CSV یا حتی داده باینری باشد.</p>
<p>آخرین قسمت عنوان قبل را بیاد آورید، که چگونه متغیر links را با متد set به نما ارجاع می‌دادیم؟ خروجی آرایه را می‌توانیم به صورت زیر نشان دهیم:</p>
<pre class="brush: php;">// print_r($links) output:
Array
(
 [0] =&gt; Array
  (
	[Link] =&gt; Array
	 (
	 [id] =&gt; 1
	 [url] =&gt; http://alvanweb.com
	 [title] =&gt; Alvanweb
 [body] =&gt; All about web design and progrmming
	 [created] =&gt; 2008-10-22 20:29:21
	 [modified] =&gt;
	 )
  )
 [1] =&gt; Array
  (
	Link] =&gt; Array
	 (
	 [id] =&gt; 2
	 [url] =&gt; http://cakephp.org
	 [title] =&gt; CakePHP
 [body] =&gt; The rapid development php framework
	 [created] =&gt; 2008-10-22 20:29:21
	 [modified] =&gt;
	 )
  )
)</pre>
<p>فایل‌های مربوط به نما در app/views در فولدری همنام با واژ‌ه‌ای که در کنترلر تعریف می‌شود، ذخیره می‌شوند. (در اینجا می‌بایستی نام فولدر ما links باشد) برای فرم‌دادن به داده‌ی لینک‌هایمان در قالب یک جدول زیبا(ایجاد صفحه‌ای برای کنش index)، از کد زیر استفاده می‌کنیم:</p>
<pre class="brush: html;">/app/views/links/index.ctp
&lt;h1&gt;Links:&lt;/h1&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;Id&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;th&gt;Created&lt;/th&gt;
&lt;/tr&gt;
&lt;?php foreach ($links as $link): ?&gt;
&lt;tr&gt;
&lt;td&gt;&lt;?php echo $link['Link']['id']; ?&gt;&lt;/td&gt;
&lt;td&gt;&lt;?php echo $html-&gt;link($link['Link']['title'],
&quot;/links/view/&quot;.$link['Link']['id']); ?&gt;&lt;/td&gt;
&lt;td&gt;&lt;?php echo $link['Link']['created']; ?&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;?php endforeach; ?&gt;
&lt;/table&gt;</pre>
<p>احتمالاً متوجه استفاده از آبجکتی بنام <span dir="ltr">$html</span> شده‌اید. این یک نمونه از کلاس HtmlHelper کیک است. کیک‌ پی‌اچ‌پی مجموعه‌ای از این آبجکت‌ها را تحت نام view helpers در خود گنجانده است مواردی از قبیل لینک‌گذاری، خروجی فرم، جاوااسکریپت و آژاکس از این دسته‌اند. اطلاعات تکمیلی درمورد کار با آنها را می‌توانید <a href="http://book.cakephp.org/view/181/">اینجا</a> بیابید. اما انچه در اینجا مهم است که بدان اشاره شود متد link است که بوسیله‌ی پارامترهایی که گرفته است، یک لینک HTML را ایجاد خواهد کرد. در این مرحله می بایستی بتوانید در مرورگرتان مسیر example.com/cake/links/index را ببینید.</p>
<p>اگر بر روی هر یک از لینک‌ها کلیک کنید تا توضیحاتش را ببینید با صفحه‌ی خطایی مواجه خواهید شد مبنی بر این که کنش مربوطه در فایل کنترل‌کننده هنوز تعریف نشده است. بنابراین مجدداً به فایل links_controller.php بر‌ می‌گردیم تا یک کنش بنام view بمنظور نمایش اطلاعات هر لینک ایجاد کنیم:</p>
<pre class="brush: php;">&lt;?php
class LinksController extends AppController {
  var $name = 'Links';
  function index() {
    $this-&gt;set('links', $this-&gt;Link-&gt;find('all'));
  }
  function view($id = null) {
    $this-&gt;Link-&gt;id = $id;
    $this-&gt;set('link', $this-&gt;Link-&gt;read());
  }
}
?&gt;</pre>
<p>خوب با set که از قبل آشنایی دارید اما نکته‌ای که در اینجا لازم است به آن اشاره کنیم این است که بجای <span dir="ltr">find(&#8216;all&#8217;)</span> از read استفاده کردیم چراکه قصد داریم اطلاعات تنها یک لینک را استخراج کنیم.</p>
<p>دقت کنید کنش view یک پارامتر می‌گیرد که برابر با ID هر لینک است. این پارامتر از طریق درخواست از طریق URL مقداردهی می‌شود بطوریکه اگر کاربری links/view/2 را درخواست دهد، مقدار 2 برابر ID خواهد بود. حال اجازه دهید نمای view را برای این کنش در app/views/links بصورت زیر ایجاد کنیم:</p>
<pre class="brush: php;">/app/views/links/view.ctp
&lt;h1&gt;&lt;?php echo $html-&gt;link($link['Link']['title'],
$link['Link']['url']); ?&gt;&lt;/h1&gt;
&lt;p&gt;&lt;small&gt;Created: &lt;?php echo $link['Link']['created']?&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;&lt;?php echo $link['Link']['body']?&gt;&lt;/p&gt;</pre>
<p>حال با کلیک بر روی هر لینک اطلاعات مربوط به آن لینک در صفحه‌ای دیگر نمایش داده خواهد شد. در پست بعدی سایر مراحل را دنبال خواهیم کرد.<br />
<strong>ادامه:</strong> ساخت لینکدونی با CakePHP (<a href="http://weblog.alvanweb.com/2008/10/24/create-linkdump-with-cakephp-part-3/">بخش سوم</a>)</p>
<img src="http://feeds.feedburner.com/~r/alvanweb/~4/cmfLvJQFuiE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://weblog.alvanweb.com/2008/10/23/create-linkdump-with-cakephp-part-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://weblog.alvanweb.com/2008/10/23/create-linkdump-with-cakephp-part-2/</feedburner:origLink></item>
		<item>
		<title>ساخت لینکدونی با CakePHP (بخش اول)</title>
		<link>http://feedproxy.google.com/~r/alvanweb/~3/EiWtZCbkuzc/</link>
		<comments>http://weblog.alvanweb.com/2008/10/22/create-linkdump-with-cakephp-part-1/#comments</comments>
		<pubDate>Wed, 22 Oct 2008 16:03:54 +0000</pubDate>
		<dc:creator>مرتضی الوانی</dc:creator>
				<category><![CDATA[پی اچ پی]]></category>
		<category><![CDATA[کیک پی‌اچ‌پی]]></category>

		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=155</guid>
		<description><![CDATA[در پست قبل با فریم‌ورک قدرتمند CakePHP و ساختار MVC آشنا شدیم. از آنجایی که فراگیری این ساختار جز با تمرین و در عمل ممکن نیست، در این پست و پست‌های آتی قصد داریم یک پروژه‌ی کوچک را با این فریم‌ورک مرحله به مرحله با هم دنبال کنیم. در ابتدا ساخت یک لینکدونی ساده که [...]]]></description>
			<content:encoded><![CDATA[<p>در <a href="http://weblog.com/blog/2008/09/21/mvc-architecture-in-cakephp/">پست قبل</a> با فریم‌ورک قدرتمند CakePHP و ساختار MVC آشنا شدیم. از آنجایی که فراگیری این ساختار جز با تمرین و در عمل ممکن نیست، در این پست و پست‌های آتی قصد داریم یک پروژه‌ی کوچک را با این فریم‌ورک مرحله به مرحله با هم دنبال کنیم. در ابتدا ساخت یک لینکدونی ساده که قابلیت افزودن، ویرایش و حذف لینک را دارد هدف نهایی است و در مرحله بعد در صورتیکه فرصت محدودم اجازه بیشتری  بدهد قابلیت‌های دیگری نظیر شمارش کلیک، دسته‌بندی و امکان نظر‌دهی افزوده خواهد شد.</p>
<div class="post_caption">آنچه برای شروع کار با کیک مورد نیاز است</div>
<p><strong>1)</strong> سرور HTTP،‌ ترجیاً Apache با mod_rewrite فعال (برای کاربرپسند کردن URL‌ها و کار با فایل‌های htaccess بهتر است قابلیت mod rewrite را فعال کنید. بدین منظور می‌بایستی فایل httpd.conf سرور آپاچی را ویرایش کنید)   </p>
<p><strong>2)</strong> پی‌‌اچ‌پی 4.3.2  یا بالاتر، کیک پی‌اچ‌پی با نسخه‌های 4 و 5 پی‌اچ‌پی کاملاً سازگار است. برای نصب PHP تحت ویندوز خواندن <a href="http://www.toofani.net/archive/2008/05/05/install-php-on-windows-step-by-step.aspx">این مطلب</a> پیشنهاد می‌شود.</p>
<p>برای اجرای کیک موارد فوق کافی است اما در مورد ساخت لینکدونی به یک پایگاه داده نیاز داریم. ترجیحاً از <a href="http://dev.mysql.com/downloads/mysql/">MySQL</a> استفاده می‌کنیم. برای نصب و راه‌اندازی مای ‌اس‌کیو‌ال سرور، خواندن <a href="http://www.toofani.net/archive/2008/06/28/install-mysql-on-windows-step-by-step.aspx">این مطلب</a> پیشنهاد می‌شود. لازم به ذکر است، CakePHP علاوه بر MySQL از پایگا‌ه‌های داده زیر پشتیبانی می‌کند:</p>
<ul class="intro" style="direction:ltr">
<li style="text-align:left">
PostgreSQL| Firebird DB2 | Microsoft SQL Server | Oracle | SQLite | ODBC
</li>
</ul>
<p>برای راحت‌کار کردن با MySQL بهتر است از رابط تحت وب phpmyadmin استفاده کنید یا با استفاده از رابط گرافیکی MySQL GUI Tools دیتابیس را مدیریت کنید. <span id="more-155"></span></p>
<div class="post_caption">نحوه نصب و پیکربندی CakePHP</div>
<p>کیک کاملاً رایگان و کد‌باز است. به دو طریق می‌توانید آخرین نسخه از آن را دریافت کنید. اول اینکه یک نسخه فشرده شده‌ی (zip/tar.gz/tar.bz2) آن را از <a href="http://www.cakephp.org/">اینجا</a> بگیرید یا از مخزن SVN (برای سری 1.2.x.x از <a href="https://svn.cakephp.org/repo/branches/1.2.x.x">اینجا</a>) استفاده کنید. تمامی متعلقات کیک در پروژه‌ای بنام CakeForge جمع آوری شده است. دریافت مستقیم کیک بهمراه مستندات نسخه‌های 1.1 و 1.2 آن در <a href="http://cakeforge.org/projects/cakephp">اینجا</a> موجود است. در این آموزش از سری 1.2 این فریم‌ورک استفاده می کنیم.</p>
<p>پس از دریافت کیک آن را به وب سرور خود منتقل کنید ساختار فولدر‌ها و فایل‌های بیس کیک به صورت زیر است:</p>
<div class="center"><img src="http://alvani.googlepages.com/cakephp_files_structure.jpg" alt="CakePHP Files Structure" /></div>
<p>از فولدر App شروع می‌کنیم، این همان فولدری است که بیشترین کار توسعه پروژه‌ در آن انجام می شود. هر چند نام فایل‌ها و فولدر‌های موجود در این شاخه گویای همه چیز است اما اجازه دهید نگاه دقیقتری به محتویات آن داشته باشیم:</p>
<p><strong>Config </strong>فایل‌های مربوط به پیکربندی برنامه معمولا در اینجا قرار دارند. دقت کنید این فایلها تنظیمات مربوط به هسته فریم ورک را شامل نمیشود (تنها تنظیمات مختصری در مورد پروژه‌ی کاریمان نظیر جزییات اتصال به پایگاه داده، محل قرار گیری فایل‌ها روی سرور و &#8230;)</p>
<p><strong>Controllers </strong>کنترل‌گرها و مولفه‌ها‌ی (کامپونت‌ها‌ی) پروژه‌ در این فولدر قرار خواهند گرفت. پیش از این گفتیم کنترل کننده (کنترلر) درخواست‌هایی که توسط کلاینت ایجاد شده را بررسی و به یه مسیر صحیح هدایت می کند.</p>
<p><strong>Locale </strong>برای فایل‌های مربوط به بومی‌سازی پروژه مورد استفاده قرار می‌گیرد. برای مثال قصد دارید پروژه‌ای را شروع کنید که به چند زبان مختلف موجود باشد، فایل‌های حاوی سایر زبان‌ها در اینجا قرار می‌گیرند.</p>
<p><strong>Models </strong>مدل‌‌های پروژه ‌در این فولدر قرار خواهند گرفت. قبلاً گفتیم که که مدل‌ها به نوعی به داده برنامه اشاره دارد. معمولاً جداول پایگاه‌های داده در اینجا مورد بحث قرار می‌گیرند بطوریکه به ازای هر جدول پایگاه داده، یک فایل در این فولدر قرار خواهد گرفت که بدان جدول اشاره دارد.</p>
<p><strong>Plugins </strong>پکیج‌های پلاگین چنانچه در صورت نیاز برای پروژه نوشته شود در اینجا قرار خواهد گرفت. پس از اتمام پروژه می توانید افزونه‌هایی بنویسید که بدون تغییر اساسی در پروژه قابلیت‌های جداگانه‌ای بدان اضافه کند.</p>
<p><strong>Tmp </strong>در این فولدر اطلاعات تمپ (موقتی) ذخیره می‌شوند. نحوه ذخیره اطلاعات به تنظیمات کیک بستگی خواهد داشت، اما بطور معمول توضیحات مدل، فایل‌های ثبت وقایع و گاهی اوقات اطلاعات نشست‌ها در این فولدر ذخیره می‌شوند.</p>
<p><strong>Vendors </strong>کلاس‌ها یا کتابخانه‌هایی که توسط شخص برنامه‌نویس برای استفاده در برنامه نوشته می‌شوند باید در اینجا قرار بگیرند. جلوتر خواهید دید که بایک تابع توکار براحتی می‌توانید این محتویات را به پروژه‌ الحاق و از آنها استفاده کنید.</p>
<p><strong>Views </strong>صفحات بصری که به نوعی با کاربر در ارتباط است شامل صفحات  مربوط به طرح‌بندی، عناصر، خطا‌ها، راهنماها در اینجا قرار می‌گیرند.</p>
<p><strong>Webroot </strong>در نهایت این فولدر در نصب برنامه می‌بایستی به عنوان root (شاخه اصلی) پروژه بکار گرفته شود. همچنین این فولدر فایل‌های مربوط به CSS، تصاویر و جاوااسکریپت را در بر خواهد داشت.</p>
<p>به فولدر اصلی بر‌میگردیم. دو فولدر cake و vendors   هسته این فریم‌ورک را تشکیل می‌دهند و همین اندازه آشنایی با این دو فولدر برای کار با این فریم‌ورک کافی است (اگر مشتاقید به جمع توسعه دهندگان این فریم‌ورک بپوندید مستندات کیک درمورد توابع و کلاس‌های سازنده هسته کاملاً روشن است)</p>
<p>هر چند توضیحات ساختاری فایل‌ها و فولدرها می توانست بیش از این به تفصیل بیان شود اما بعلت کمبود وقت و دورشدن از هدف اصلی از آنها عبور می‌کنیم . </p>
<div class="post_caption">تنظیمات و مراحل ساخت لینکدونی</div>
<p>یک فولدر بنام cake در وب سرور می‌سازیم و محتویات کیک‌پی‌اچ‌پی را به آن منتقل می‌کنیم. در مرورگر آدرس دایرکتوری که فایل‌های پروژه در آن قرار دارد به صورت زیر خواهد بود:</p>
<div class="center"><img src="http://alvani.googlepages.com/cake_base_address.jpg" alt="CakePHP Base Address" /></div>
<p>اگر وب سرور را اجرا کرده باشید پس از ارسال درخواست صفحه‌‌ی خوش آمد کیک را مشاهده خواهید نمود. چنانچه  چیدمان مطالب موجود آرایش منظمی ندارد (صفحه فاقد تصویر و استایل است)، احتمالاً mod rewrite سرور فعال نیست. بدین منظور فایل httpd.conf وب سرور آپاچی را با یک ویرایشگر متن با کرده و بدنبال خط زیر بگردید و با حذف علامت # از ابتدای خط، mod_rewrite.so را به ماژول‌های وب سرور اضافه کنید. حال وب سرور را ریستارت کنید و صفحه را ریفرش کنید مشکل باید حل شده باشد. </p>
<pre class="brush: html;">#LoadModule rewrite_module modules/mod_rewrite.so</pre>
<p>برای اجرای صحیح کیک بطور پیشفرض، تاکید بر این است که mod rewrite سرور فعال باشد اما چنانچه بنا به دلایلی نخواستید این ماژول را به وب سرور اضافه کنید، می‌بایستی تمامی فایل‌های htaccess را از فولدرهای کیک حذف کنید و در فایل app/config/core.php با حذف علامت کامنت (//) از ابتدای خط زیر، کیک را بدون mod rewrite اجرا کنید:</p>
<pre class="brush: css;">Configure::write('App.baseUrl', env('SCRIPT_NAME'));</pre>
<p>برای اولین مرتبه که کیک راه‌اندازی می‌شود، در صفحه اصلی هشدارهایی را خواهید دید. در نسخه 1.2 کیک، استایل بکار رفته با رنگ‌های زرد و سبز، کاربر را راهنمایی می‌کند. ابتدا فایل app/config/core.php را باز کنید. Security.salt  را پیدا کنید و آن را به دلخواه تغییر دهید (می توانید دو سه کاراکتر آن رشته را تغییر دهید) این یک رشته تصادفی است که کیک برای رمزنگاری از آن استفاده می‌کند تا هنگامی که مقدار پیشفرض آن را تغییر ندهید خطای زرد رنگ مبنی بر تغییر آن در صفحه اصلی وجود خواهد داشت.</p>
<div class="center"><a href="http://alvani.googlepages.com/first_Cakephp_welcome_page_big.jpg"><img src="http://alvani.googlepages.com/first_Cakephp_welcome_page_small.jpg" alt="CakePHP Welcome Page" title="برای بزرگ دیدن تصویر کلیک کنید" /></a></div>
<p>خطای زرد رنگ دیگری که در این صفحه خواهید دید مربوط به تنظیمات پایگاه داده است. بمنظور رفع آن فایل app/config/ database.php.default را به database.php تغییر نام دهید. پایگاه‌ داده‌ای بنام linkdump درMySQL بسازید و  بمنظور ارتباط پایگاه داده به کیک فایل  database.php را باز کنید و آرایه default را با آنچه قبلاً در نصب پایگاه داده وارد کرده‌اید تنظیم کنید:</p>
<pre class="brush: php;">var $default = array(
'driver' =&gt; 'mysql',
'persistent' =&gt; false,
'host' =&gt; 'localhost',
'login' =&gt; 'root',
'password' =&gt; 'nbuser',
'database' =&gt; 'linkdump',
'prefix' =&gt; '',
);</pre>
<p>خطای دیگری که ممکن است موجود باشد مربوط به فولدر app\tmp است. قبلاً گفتیم که tmp برای ذخیره‌ی فایل‌های موقتی نظیر ثبت وقایع و نشست‌ها استفاده می‌شود از این رو می‌بایستی مجوز آن را طوری تعیین کنید که قابلیت نوشتن در فولدر فعال باشد. در صورتی که موارد فوق را درست انجام داده باشید صفحه‌ی اصلی کیک به صورت زیر خواهد بود:</p>
<div class="center"><a href="http://alvani.googlepages.com/second_Cakephp_welcome_page_big.jpg"><img src="http://alvani.googlepages.com/second_Cakephp_welcome_page_small.jpg" alt="CakePHP Welcome Page" title="برای بزرگ دیدن تصویر کلیک کنید" /></a></div>
<p>در پست بعدی سایر مراحل را دنبال خواهیم کرد.<br />
<strong>ادامه:</strong> ساخت لینکدونی با CakePHP (<a href="http://weblog.alvanweb.com/2008/10/23/create-linkdump-with-cakephp-part-2/">بخش دوم</a>) و (<a href="http://weblog.alvanweb.com/2008/10/24/create-linkdump-with-cakephp-part-3/">بخش سوم</a>)</p>
<img src="http://feeds.feedburner.com/~r/alvanweb/~4/EiWtZCbkuzc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://weblog.alvanweb.com/2008/10/22/create-linkdump-with-cakephp-part-1/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		<feedburner:origLink>http://weblog.alvanweb.com/2008/10/22/create-linkdump-with-cakephp-part-1/</feedburner:origLink></item>
		<item>
		<title>مقدمه‌ای بر معماری MVC در CakePHP</title>
		<link>http://feedproxy.google.com/~r/alvanweb/~3/3DUBppEXM_U/</link>
		<comments>http://weblog.alvanweb.com/2008/09/21/mvc-architecture-in-cakephp/#comments</comments>
		<pubDate>Sun, 21 Sep 2008 14:17:59 +0000</pubDate>
		<dc:creator>مرتضی الوانی</dc:creator>
				<category><![CDATA[پی اچ پی]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[کیک پی‌اچ‌پی]]></category>

		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=154</guid>
		<description><![CDATA[همانطور که در پست قبل گقتم CakePHP از معماری MVC استفاده می کند. این معماری یه الگوی طراحی نرم‌افزاره که برنامه‌نویسی بر این مبنا، برنامه رو به سه بخش اصلی تقسیم می‌کنه:
1- Model مدل به داده برنامه اشاره دارد (معمولا جداول پایگاه داده). 2- View شاید هیچ لفظ فارسی جز خود این واژه نتونه جایگزین [...]]]></description>
			<content:encoded><![CDATA[<p>همانطور که در پست قبل گقتم <a href="http://cakephp.org">CakePHP</a> از معماری <a href="http://en.wikipedia.org/wiki/Model-view-controller" title="Model View Controller">MVC</a> استفاده می کند. این معماری یه الگوی طراحی نرم‌افزاره که برنامه‌نویسی بر این مبنا، برنامه رو به سه بخش اصلی تقسیم می‌کنه:</p>
<p>1- <strong>Model</strong> مدل به داده برنامه اشاره دارد (معمولا جداول پایگاه داده). 2- <strong>View</strong> شاید هیچ لفظ فارسی جز خود این واژه نتونه جایگزین خوبی باشه اما این واژه را &#8220;نما&#8221; تعریف می‌کنم. نما در حقیقت یه رندر تصویری از داده مدل هست که در انتها به مرورگر کاربر ارسال میشه. 3- <strong>Controller</strong> کنترل کننده (کنترلر) درخواست‌هایی که توسط کلاینت ایجاد شده را بررسی و به یه مسیر صحیح هدایت می کند.</p>
<p>نمودار زیر چرخه معماری MVC را در CakePHP توضیح  می ده:</p>
<div class="center"><img src="http://alvani.googlepages.com/basic_mvc_alvanweb.png" alt="A Basic MVC Request" title="A Basic MVC Request" /></div>
<p>برای مثال فرض کنید یه کلاینت بنام ریکاردو بر روی یک لینک (بالفرض خرید کیک که لینکی شبیه زیر داره) در صفحه اصلی برنامه کلیک کنه بنابراین درخواست از مرورگر وی به وب سرور منتقل می‌شه.</p>
<pre class="brush: html;">http://www.example.com/cakes/buy</pre>
<p>در اینجا dispatcher آدرس درخواستی رو بررسی می‌کنه (cakes/buy/) و این درخواست رو به یک کنترلر صحیح هدایت می‌کند. کنترلر، منطق مشخص برنامه رو انجام می‌ده، برای مثال چک می کنه آیا ریکاردو تا حالا لاگین کرده یا نه. علاوه براین کنترلر بمنظور دستیابی به داده‌های برنامه از مدل ها استفاده می کنه. مدل ها معمولا نمایانگر جداول پایگاه داده هستند اما می تونن معرف ورودی‌های <a href="http://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol" title="Lightweight Directory Access Protocol">LDAP</a>، فیدهای RSS یا فایل‌های روی سیستم هم باشند. بعنوان مثال در اینجا کنترلر یه مدل رو به کار می‌بره تا آخرین خرید ریکاردو رو از دیتابیس بکشه بیرون (به اصطلاح Fetch کنه). <span id="more-154"></span></p>
<p>وقتی کنترلر کار خودش رو بر روی داده انجام داد نوبت مرحله نما می‌رسه. همانطور که گفتم در نما داده هایی که آماده‌سازی شدن به کلاینت عرضه می‌شن. بعبارت ساده‌تر کلایت بطور معمول می تونه از طریق مرورگر نتیجه رو مشاهده کنه. در کیک، خروجی نما، بصورت HTML است اما بر حسب نیاز می تونه بسادگی به فرمت‌ PDF، XML و <a href="http://en.wikipedia.org/wiki/JSON" title="JavaScript Object Notation">JSON</a> تبدیل بشه.</p>
<p>اما <strong>مزایا استفاده از MVC چیست؟</strong><br />
ببینید این معماری مورد آزمون قرار گرفته و بعنوان یک الگوی طرحی نرم‌افزار مورد قبول واقع شده چرا که برنامه رو قابل نگاهداری و ماژولار می‌کنه و به امر توسعه سرعت می‌ده. تقسیم عملکرد برنامه در سه بخش مدل، نما و کنترلر پایداری رو بدنبال داره. ویژگی های جدید بسهولت افزوده می‌شن و چهره جدید ویژگی های قدیمی رو بهبود می ده. </p>
<p>همچنین طراحی جداگانه و ماژولار به طراحان و توسعه‌دهندگان این اجازه رو می‌ده که همزمان با هم کار کنند و به سرعت بر توانایی نمونه اولیه بیفزایند. جداسازی یه خوبی دیگه هم داره اینکه به توسعه‌دهندگان این امکان رو میده که تغیرات مورد نظر رو در یک بخش لحاظ کنند بدون اینکه نیازی باشه سایر بخش‌ها تغییری بکنه.</p>
<p>اگر تا حالا برنامه ای رو به این سبک نساخته اید، یه خورده وقت می‌‌بره تا این معماری رو بکار ببرید. اما مطمنم برای اولین بار که یه برنامه با کیک پی‌اچ‌پی بسازید دیگه حاضر نخواهید شد از یه روش دیگر انجامش بدید. در پست‌های آینده به شرح تنظیمات و پیکربندی CakePHP خواهم پرداخت.<br />
+ [<a href="http://book.cakephp.org/view/10/Understanding-Model-View-Controller">منبع</a>]</p>
<img src="http://feeds.feedburner.com/~r/alvanweb/~4/3DUBppEXM_U" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://weblog.alvanweb.com/2008/09/21/mvc-architecture-in-cakephp/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://weblog.alvanweb.com/2008/09/21/mvc-architecture-in-cakephp/</feedburner:origLink></item>
		<item>
		<title>کار با CakePHP</title>
		<link>http://feedproxy.google.com/~r/alvanweb/~3/W8nuuN_F1js/</link>
		<comments>http://weblog.alvanweb.com/2008/09/18/building-web-application-with-cakephp/#comments</comments>
		<pubDate>Wed, 17 Sep 2008 20:42:12 +0000</pubDate>
		<dc:creator>مرتضی الوانی</dc:creator>
				<category><![CDATA[مطالب روزمره]]></category>
		<category><![CDATA[پی اچ پی]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[کیک پی‌اچ‌پی]]></category>

		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=153</guid>
		<description><![CDATA[بیشتر پروژه‌ها را تاجایی که امکان داره با CakePHP انجام میدم. ساختار  MVC، معتبرسازی توکار، سفارشی کردن URL‌ها و انعطاف پذیری فوق العاده، دلایل عمده من برای انتخاب این فریم‌ورک PHP هستن. فکر میکنم کسانی که با Ruby on Rails کار کردن حرفمو تایید کنن.
منابع زیادی برای آموزش این فریم‌ورک روی وب هست. برای [...]]]></description>
			<content:encoded><![CDATA[<p>بیشتر پروژه‌ها را تاجایی که امکان داره با <a href="http://cakephp.org/">CakePHP</a> انجام میدم. ساختار  <a href="http://en.wikipedia.org/wiki/Model-view-controller">MVC</a>، معتبرسازی توکار، سفارشی کردن URL‌ها و انعطاف پذیری فوق العاده، دلایل عمده من برای انتخاب این فریم‌ورک PHP هستن. فکر میکنم کسانی که با <a href="http://www.rubyonrails.org/">Ruby on Rails</a> کار کردن حرفمو تایید کنن.</p>
<p>منابع زیادی برای آموزش این فریم‌ورک روی وب هست. برای دو نسخه 1.1 و 1.2 که با هم تفاوت‌هایی دارند، بطور جداگانه <a href="http://book.cakephp.org/">راهنمای کاملی</a> در سایت اصلی کیک پی‌اچ‌پی موجوده. قسمت مثال‌ها و بخصوص <a href="http://book.cakephp.org/view/219/Blog">The Cake Blog Tutorial</a> محبوب‌ترین قسمت این راهنما است. در این آموزش یاد میگیرید که چطور بر پایه این فریم‌ورک یه وبلاگ ساده بسازید.</p>
<p>هدفم از کیک پی‌اچ‌پی و راهنما گفتنش معرفی پست‌های <a href="http://www.jamesfairhurst.co.uk/">James Fairhurst</a> در این رابطه هست. حدود آوریل امسال James یه سری آموزش در رابطه با ایجاد یک کاتالوگ DVD با  CakePHP‌ رو شروع کرد. این آموزش‌ شامل 12 قسمته که دو هفته قبل قسمت آخرش تموم شد. لیست این پست ها رو در زیر آوردم که انصافا‍ یکی از دیگری بهتره:</p>
<ul class="intro" style="direction:ltr">
<li style="text-align:left">
+ <a href="http://www.jamesfairhurst.co.uk/posts/view/full_cakephp_application_part_1">Part 1</a>: Setup of CakePHP and creation of the tables and models<br />
+ <a href="http://www.jamesfairhurst.co.uk/posts/view/full_cakephp_application_part_2">Part 2</a>: Creating the first controller and the corresponding views<br />
+ <a href="http://www.jamesfairhurst.co.uk/posts/view/full_cakephp_application_part_3">Part 3</a>: Creating two more controllers with the respective views<br />
+ <a href="http://www.jamesfairhurst.co.uk/posts/view/full_cakephp_application_part_4">Part 4</a>: File upload and introduction of <a href="http://jquery.com/">jQuery</a><br />
+ <a href="http://www.jamesfairhurst.co.uk/posts/view/full_cakephp_application_part_5">Part 5</a>: Working with a HABTM association<br />
+ <a href="http://www.jamesfairhurst.co.uk/posts/view/full_cakephp_application_part_6">Part 6</a>: Adding authentication to the application<br />
+ <a href="http://www.jamesfairhurst.co.uk/posts/view/full_cakephp_application_part_7">Part 7</a>: Graphical design of the application<br />
+ <a href="http://www.jamesfairhurst.co.uk/posts/view/full_cakephp_application_part_8">Part 8</a>: Realizing the design with HTML and CSS<br />
+ <a href="http://www.jamesfairhurst.co.uk/posts/view/full_cakephp_application_part_9">Part 9</a>: Introduction to layouts and elements<br />
+ <a href="http://www.jamesfairhurst.co.uk/posts/view/full_cakephp_application_part_10">Part 10</a>: Defining the start page<br />
+ <a href="http://www.jamesfairhurst.co.uk/posts/view/full_cakephp_application_part_11">Part 11</a>: Using requestAction<br />
+ <a href="http://www.jamesfairhurst.co.uk/posts/view/full_cakephp_application_part_12">Part 12</a>: Finishing the application
</li>
</ul>
<p>فقط کافیه یه خورده زمان داشته باشید و البته اشتیاق برای یادگیری این فریم‌ورک. نتیجه‌ی نهایی آموزش بالا رو می‌تونید <a href="http://cakecatalog.jamesfairhurst.co.uk/">اینجا</a> ببینید. سعی می‌کنم پست‌های آینده ام بیشتر در رابطه با توضیح ساختار MVC و آموزش CakePHP باشه.</p>
<img src="http://feeds.feedburner.com/~r/alvanweb/~4/W8nuuN_F1js" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://weblog.alvanweb.com/2008/09/18/building-web-application-with-cakephp/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://weblog.alvanweb.com/2008/09/18/building-web-application-with-cakephp/</feedburner:origLink></item>
		<item>
		<title>بدون شرح</title>
		<link>http://feedproxy.google.com/~r/alvanweb/~3/79iKi8qV1q8/</link>
		<comments>http://weblog.alvanweb.com/2008/08/17/be-right-back/#comments</comments>
		<pubDate>Sun, 17 Aug 2008 18:42:25 +0000</pubDate>
		<dc:creator>مرتضی الوانی</dc:creator>
				<category><![CDATA[مطالب روزمره]]></category>

		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=152</guid>
		<description><![CDATA[این روزها به شدت گرفتار دو سه پروژه J2SE و PHP هستم. امیدوارم درآینده نزدیک کم کاری‌های گذشته رو بتونم جبران کنم. از دوستانی که به اینجا سر می‌زدن و با ایمیل های پرمهرشون جویای حالم بودن هم ممنونم.

]]></description>
			<content:encoded><![CDATA[<p>این روزها به شدت گرفتار دو سه پروژه J2SE و PHP هستم. امیدوارم درآینده نزدیک کم کاری‌های گذشته رو بتونم جبران کنم. از دوستانی که به اینجا سر می‌زدن و با ایمیل های پرمهرشون جویای حالم بودن هم ممنونم.</p>
<div class="center"><img src="http://alvani.googlepages.com/return_soon.jpg" alt="Be Right Back" title="Be Right Back" /></div>
<img src="http://feeds.feedburner.com/~r/alvanweb/~4/79iKi8qV1q8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://weblog.alvanweb.com/2008/08/17/be-right-back/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://weblog.alvanweb.com/2008/08/17/be-right-back/</feedburner:origLink></item>
		<item>
		<title>رنگارنگی کمتر در صفحات وب</title>
		<link>http://feedproxy.google.com/~r/alvanweb/~3/ZZKC4wpVUKM/</link>
		<comments>http://weblog.alvanweb.com/2008/05/31/make-the-web-a-less-colorful-place/#comments</comments>
		<pubDate>Sat, 31 May 2008 12:04:35 +0000</pubDate>
		<dc:creator>مرتضی الوانی</dc:creator>
				<category><![CDATA[طراحی وب]]></category>

		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=151</guid>
		<description><![CDATA[وب یه مکان رنگارنگه. می‌تونید هر رنگی که تصورش رو بکنید انتخاب کنید و در طراحی ازش استفاده کنید. بدون اینکه مشکل درهم آمیختگی رنگ‌ها رو داشته باشید یا در مورد هزینه چاپ رنگ‌ها نگران باشید.
داشتن یه صفحه وب رنگارنگ کار خیلی راحت و وسوسه انگیزی است. اما آیا گزینه‌های دیگری هم برای کاربرد رنگ [...]]]></description>
			<content:encoded><![CDATA[<p>وب یه مکان رنگارنگه. می‌تونید هر رنگی که تصورش رو بکنید انتخاب کنید و در طراحی ازش استفاده کنید. بدون اینکه مشکل درهم آمیختگی رنگ‌ها رو داشته باشید یا در مورد هزینه چاپ رنگ‌ها نگران باشید.</p>
<p>داشتن یه صفحه وب رنگارنگ کار خیلی راحت و وسوسه انگیزی است. اما آیا گزینه‌های دیگری هم برای کاربرد رنگ در طراحی وجود داره؟ </p>
<p><strong>طرح‌های تک رنگ (Monochromatic Design)</strong><br />
همانطور که از اسمش  معلومه، طرح تک رنگ طراحی با یک رنگه. یه رنگ رو به عنوان پایه انتخاب می‌کنید و سفید و سیاه رو بهش اضافه می‌کنید تا سایه‌های متفاوت از اون رنگ بسازید. در این حالت طرحتون منحصراً یک پالت تک رنگ داره و چندین سایه‌ی رو به سفید یا تیره شدن. شکل زیر این بیان رو می‌تونه کاملاً مشخص کنه:</p>
<div class="center"><img src="http://alvani.googlepages.com/color_palette.gif" alt="Color Palette" /></div>
<p><strong>مزایای طرح‌های تک‌ رنگ</strong><br />
ساخت یک پالت تک رنگ خیلی ساده است. رنگ دلخواه رو انتخاب کنید و سیاه و سفید رو بهش اضافه کنید. همین! </p>
<p>وقتی از یک رنگ واحد استفاده می‌کنید، رنگ‌ها هرگز نمی تونن برخورد داشته باشند. اگر رنگ‌ها رو بطور ناگهانی انتخاب کنید، طرح تک رنگ نسبتاً یه گزینه ایمن برای انتخابه.</p>
<p>طرح حالت ساده پیدا می‌کنه. سادگی طرح رنگ، خودش رو به طرح بسط می‌ده و هیچگونه مقایسه و رقابتی بین رنگ‌های مختلف بوجود نمیاد بطوریکه در عین سادگی طرح آرامش و سکون پسندیده‌ای رو تداعی می کنه.</p>
<p>به شما اجازه می‌ده تا به المان‌های مهم اهمیت بدین. اگرچه تمام طرحتون یه پالت تک رنگ داره اما می‌تونید کنتراست رنگ رو برای المان هایی که می‌خواهید اهمیت بیشتری بهشون بدین تغییر بدین. برای نمونه آیکون خروجی فید. <span id="more-151"></span></p>
<p><strong>معایب طرح‌های تک رنگ</strong><br />
تغییر ناچیز در طرح. نبود تنوع و تباین، دلبستگی دیداری طرح رو کم می‌کنه. اما در مقابل گزینه سادگی طرح رو داره که می‌تونه یه طرح رو از شلوغی نجات بده.</p>
<p>سختی در خواندن متن. اغلب بین رنگ متن نوشته و رنگ پس زمینه کنتراست خیلی کمی وجود داره و خواندن متون دشوار می‌شه. بهتره در این حالت تیرگی رو نسبت به پس زمینه بیشتر کرد.</p>
<p>ناامیدی. محدودیت در پالت رنگ در هنگامی که برای اولین بار باهاش کار می‌کنید خیلی ناامید کننده است. گاهی اوقات ممکنه وسوسه انگیز باشه که قاعده رو بهم بزنید و چند رنگ بیشتر اضافه کنید. گاهی اوقات انتخاب خوبیه اما گاهی اوقات نه، به تجربه نیاز داره.</p>
<p><strong>نمونه‌ایی از طرح‌ تک رنگ</strong></p>
<div class="center"><a title="Jeff Croft" href="http://jeffcroft.com/"><img src="http://alvani.googlepages.com/jeffcroft.jpg" alt="Jeff Croft" /></a></div>
<p><strong>طرح های بی رنگ (Achromatic Design)</strong><br />
در طرح‌های بی‌رنگ هیچ رنگی وجود نداره جز سایه‌های ساده‌ای از تیرگی. مزایا و معایب طرح‌های بی‌ رنگ مشابه طرح‌های تک رنگ بالا هستن اما یه خورده بیشتر. مثلا عنوان کردیم با طرح‌های تک رنگ حالت ساده ای رو داریم که آرامش رو تداعی می کنه باید بگم یه طرح بی رنگ می تونه این حالت رو بیشتر بوجود بیاره یا همانطور که یک طرح تک رنگ می تونه متمایز از رنگارنگ بودن باشه یک طرح بی رنگ می تونه خیلی بیشتر این تمایز رو دارا باشه.</p>
<p>یافتن طرح‌های بی‌رنگ خالص روی وب مشکله. بیشترشون کمی قانون شکنی می‌کنند و کمی از رنگ دیگری رو اضافه می کنند. البته منحصراً برای تاکید روی یک المان‌های معین و برای اینکه بی تنوعی رو از بین ببرند. طرح زیر می‌تونه جز این دسته باشه:</p>
<div class="center"><a title ="Cameron Moll's Authentic Boredom" href="http://www.cameronmoll.com/"><img src="http://alvani.googlepages.com/cameronmoll.jpg" alt="Cameron Moll's Authentic Boredom" /></a></div>
<p><strong>نتیجه‌گیری</strong><br />
لزوماً استفاده از رنگ‌های بیشتر مساوی یه طرح بهتر نیست. اگر طرح نیازی به اون رنگ نداره لزومی نداره با  رنگ‌های گوناگون جاذبه رو بیشتر کنید.</p>
<p>اگر نوشته‌های وبلاگتون ساده و بدون تکلفه، یه طرح تک رنگ یا بدون رنگ می‌تونه اثر‌گذاری بیشتری روی خوانندگان و بازدیدکنندگان داشته باشه. در کل این طرح‌ها مناسبه برای وبلاگ‌های شخصی و وبلاگ‌هایی که به نوعی لایف استایل هستن.</p>
<p>پس بهتره همیشه به فکر طرح‌های رنگارنگ نباشید و وب رو اندکی کم‌رنگ تر کنید. </p>
<p>قبلاً هم در مورد طرح های بدون آلایش در <a href="http://weblog.alvanweb.com/2006/01/06/adorn-schemes/">اینجا</a> نوشتم. از اونجایی که به طرح‌های تک رنگ علاقه زیادی دارم،  <a href="http://www.problogdesign.com/design/make-the-web-a-less-colorful-place/">پست تخصصی</a> Michael Martin در آخرین یادداشت وبلاگش در این مورد، این پست وبلاگ من رو ساخت.راستی بنظر شما الوان وب جز کدوم یکی از این طرح‌هاست؟</p>
<img src="http://feeds.feedburner.com/~r/alvanweb/~4/ZZKC4wpVUKM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://weblog.alvanweb.com/2008/05/31/make-the-web-a-less-colorful-place/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		<feedburner:origLink>http://weblog.alvanweb.com/2008/05/31/make-the-web-a-less-colorful-place/</feedburner:origLink></item>
		<item>
		<title>حذف انتخابگرهای زاید CSS</title>
		<link>http://feedproxy.google.com/~r/alvanweb/~3/fmFz9KXDgMQ/</link>
		<comments>http://weblog.alvanweb.com/2008/04/21/using-dust-me-selectors-plugin-to-find-unused-css-selectors/#comments</comments>
		<pubDate>Mon, 21 Apr 2008 16:47:50 +0000</pubDate>
		<dc:creator>مرتضی الوانی</dc:creator>
				<category><![CDATA[سی اس اس]]></category>
		<category><![CDATA[طراحی وب]]></category>
		<category><![CDATA[فایرفاکس]]></category>

		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=150</guid>
		<description><![CDATA[بارها برایم پیش آمده است که در هنگام انجام یک پروژه یک (یا چندین) انتخابگر برای تست ایجاد کرده‌ام و با بالارفتن حجم کدنویسی، یادم رفته است که آن‌ها را پاک کنم. یا برعکس انتخابگری را تعریف کرده‌ام که المانش را به دلایلی پاک کرده‌ام یا نامش را تغییر داده‌ام. شاید برای شما هم اتفاق [...]]]></description>
			<content:encoded><![CDATA[<p>بارها برایم پیش آمده است که در هنگام انجام یک پروژه یک (یا چندین) انتخابگر برای تست ایجاد کرده‌ام و با بالارفتن حجم کدنویسی، یادم رفته است که آن‌ها را پاک کنم. یا برعکس انتخابگری را تعریف کرده‌ام که المانش را به دلایلی پاک کرده‌ام یا نامش را تغییر داده‌ام. شاید برای شما هم اتفاق افتاده باشد.</p>
<p><a href="http://www.sitepoint.com/">SitePoint</a>  افزونه‌ای بنام <a href="http://www.sitepoint.com/dustmeselectors/">Dust-Me Selectors</a> برای فایرفاکس منتشر کرده است که به شما کمک می‌کند به راحتی این سلکتورها را شناسایی کنید.</p>
<p>برای کار با این افزونه طرح مورد نظر را در مرورگر فراخوانی کرده و بر روی آیکونی که در پایین سمت راست فایرفاکس ایجاد شده است، کلیک کنید. این افزونه فایل سی‌اس‌اس طرحتان را آنالیز کرده و با توجه به المانهایی که در صفحه جاری بکار رفته است انتخابگرهایی که مورد استفاده قرار نگرفته‌اند را در مشخص می‌کند.</p>
<p>توجه کنید شاید سایر سلکتورها را در المانهایی در سایر صفحات طرحتان بکار برده‌اید، بنابراین با آنالیز یک صفحه همانطور که در بالا اشاره شد سلکتورهای استفاده نشده در آن صفحه به عنوان unused شناخته می‌شوند. اما با آنالیز سایر صفحات طرحتان تعداد سلکتورهای unused مرتبا کم می‌شود تا جایی که سلکتورهای زاید پیدا شوند.</p>
<p>نسخه جدید این افزونه می‌تواند به عنوان یک اسپایدر صفحه‌های طرحتان را آنالیز کند تنها کافیست آدرس <a href="http://www.sitemaps.org/protocol.php">Sitemap</a> را به آن بدهید. اگر کل صفحات در Sitemap نیامده است دادن آدرس همان صفحه اول هم کفایت می‌کند البته اگر لینک سایر صفحات در آن موجود باشد. به این روش دیگر نیازی به آنایز تک تک صفحات بصورت منوال نیست.</p>
<p>+ برای ساخت Sitemap می توانید از <a href="http://www.xml-sitemaps.com/">این</a> سرویس استفاده کنید. وردپرسی ها هم می‌توانند با سرویس گوگل به کمک <a href="http://www.arnebrachhold.de/projects/wordpress-plugins/google-xml-sitemaps-generator/">این پلاگین</a> Sitemap بسازند.</p>
<img src="http://feeds.feedburner.com/~r/alvanweb/~4/fmFz9KXDgMQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://weblog.alvanweb.com/2008/04/21/using-dust-me-selectors-plugin-to-find-unused-css-selectors/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://weblog.alvanweb.com/2008/04/21/using-dust-me-selectors-plugin-to-find-unused-css-selectors/</feedburner:origLink></item>
		<item>
		<title>یا مقلب القلوب و الابصار</title>
		<link>http://feedproxy.google.com/~r/alvanweb/~3/kr-Dhme79ME/</link>
		<comments>http://weblog.alvanweb.com/2008/03/20/norouz-1387/#comments</comments>
		<pubDate>Wed, 19 Mar 2008 19:52:09 +0000</pubDate>
		<dc:creator>مرتضی الوانی</dc:creator>
				<category><![CDATA[مطالب روزمره]]></category>

		<guid isPermaLink="false">http://weblog.alvanweb.com/2008/03/20/norouz-1387/</guid>
		<description><![CDATA[خوب این هم روزهای سال  1386 خورشیدی که به سرعت گذشت. حرف‌های من در آستانه سال نو حرف جدیدی نیست‌ همان حرف‌های تکراری چهار- پنج ساله گذشته.
 امسال برای من سال خیلی بدی نبود هر چند  لحظات تلخی  رو در این سال تجربه کردم ولی در کنار اون شیرین‌ترین‌ها هم وجود داشت. [...]]]></description>
			<content:encoded><![CDATA[<p>خوب این هم روزهای سال  1386 خورشیدی که به سرعت گذشت. حرف‌های من در آستانه سال نو حرف جدیدی نیست‌ همان حرف‌های تکراری چهار- پنج ساله گذشته.</p>
<p> امسال برای من سال خیلی بدی نبود هر چند  لحظات تلخی  رو در این سال تجربه کردم ولی در کنار اون شیرین‌ترین‌ها هم وجود داشت. به بعضی از اهداف و خواسته‌هام رسیدم، باقی یا نیمه‌کاره موند یا اصلا بهشون نرسیدم و رفت برای سال آینده.</p>
<p>امیدوارم سال جدید طلیعه‌ی موفقیت‌های بزرگ برای شما و هم برای خودم باشه. در لحظه حلول سال نو با زمزمه کردن دعای عرفانی یا مقلب القلوب و الابصار، دعاگوی ما هم باشید. عید بر همگان مبارک باد.</p>
<img src="http://feeds.feedburner.com/~r/alvanweb/~4/kr-Dhme79ME" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://weblog.alvanweb.com/2008/03/20/norouz-1387/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://weblog.alvanweb.com/2008/03/20/norouz-1387/</feedburner:origLink></item>
		<item>
		<title>پشتیبانی از jQuery در Dreamweaver</title>
		<link>http://feedproxy.google.com/~r/alvanweb/~3/aswF0nYe-BU/</link>
		<comments>http://weblog.alvanweb.com/2008/02/14/support-jquery-in-adobe-dreamweaver/#comments</comments>
		<pubDate>Thu, 14 Feb 2008 13:10:58 +0000</pubDate>
		<dc:creator>مرتضی الوانی</dc:creator>
				<category><![CDATA[آژاکس]]></category>
		<category><![CDATA[طراحی وب]]></category>

		<guid isPermaLink="false">http://weblog.alvanweb.com/2008/02/14/support-jquery-in-adobe-dreamweaver/</guid>
		<description><![CDATA[دیر وقت است کار با Adobe Dreamweaver  را کنار گذاشته‌ام، Eclipse را بیشتر می‌پسندم به خصوص این مدت که به سمت برنامه‌نویسی جاوا و کار با لینوکس هم کشیده شده‌ام.  اگر شما هم با Eclipse کار کرده‌اید یقینا Aptana هم می‌تواند نیازهایتان  را در زمینه توسعه وب برآورده کند.
Aptana را در کار [...]]]></description>
			<content:encoded><![CDATA[<p>دیر وقت است کار با <a href="http://www.adobe.com/products/dreamweaver/">Adobe Dreamweaver</a>  را کنار گذاشته‌ام، <a href="http://www.eclipse.org/">Eclipse</a> را بیشتر می‌پسندم به خصوص این مدت که به سمت برنامه‌نویسی جاوا و کار با لینوکس هم کشیده شده‌ام.  اگر شما هم با Eclipse کار کرده‌اید یقینا <a href="http://www.aptana.com/">Aptana</a> هم می‌تواند نیازهایتان  را در زمینه توسعه وب برآورده کند.</p>
<p>Aptana را در کار با فریم‌ورک‌های جاوا اسکریپت پیشنهاد می‌کنم اما اگر هنوز از Dreamweaver استفاده می‌کنید و از عدم پشتیبانی از فریم‌ورک‌های جاوا اسکریپت خسته شده‌اید، دیگر نگران نباشید.  Chris Charlton افزونه‌ای برای Dreamweaver نوشته است که مشکل را حل می‌کند.</p>
<p>این افزونه برای دو فریم‌ورک <a href="http://jquery.com/">jQuery</a>  و   <a href="http://prototypejs.org/">Prototype </a>از<a href="http://xtnd.us/"> اینجا</a> قابل دریافت است. گویا پشتیبانی از سایر کتابخانه‌ها از جمله <a href="http://mootools.net/">MooTools</a> و <a href="http://developer.yahoo.com/yui/">YUI</a> نیز در حال انجام است.</p>
<p><strong>درهمین رابطه:</strong><br />
+ تنظیمات مربوط به پکربندی فریم‌ورک jQuery را برای Aptana می‌توانید در <a href="http://www.aptana.com/docs/index.php/Getting_started_with_Aptana_and_jQuery">اینجا</a> بیابید.<br />
+ <a href="http://www.spket.com">Spket</a>  را هم فراموش نکنید، نحوه بکارگیری jQuery در این IDE هم <a href="http://www.spket.com/jquery.html">اینجاست</a>.</p>
<img src="http://feeds.feedburner.com/~r/alvanweb/~4/aswF0nYe-BU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://weblog.alvanweb.com/2008/02/14/support-jquery-in-adobe-dreamweaver/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://weblog.alvanweb.com/2008/02/14/support-jquery-in-adobe-dreamweaver/</feedburner:origLink></item>
		<item>
		<title>افزایش سرعت بارگذاری فایل‌های PHP</title>
		<link>http://feedproxy.google.com/~r/alvanweb/~3/lMRl7Eoa7TA/</link>
		<comments>http://weblog.alvanweb.com/2008/02/05/increase-website-loading-speed-with-php-speedy/#comments</comments>
		<pubDate>Tue, 05 Feb 2008 12:11:43 +0000</pubDate>
		<dc:creator>مرتضی الوانی</dc:creator>
				<category><![CDATA[پی اچ پی]]></category>

		<guid isPermaLink="false">http://weblog.alvanweb.com/2008/02/05/increase-website-loading-speed-with-php-speedy/</guid>
		<description><![CDATA[در وبگردی ‌های امروز با PHP Speedy آشنا شدم. این اسکریپت پی‌اچ‌پی بطور قابل ملاحظه‌ای زمان بارگذاری ‌فایل‌های پی‌اچ‌پی را کاهش می‌دهد.
PHP Speedy بطور خودکار تمام فایل‌های لازم را با یكدیگر ترکیب و بصورت فشرده در می‌آورد که این خود بار درخواستی سرور و همچنین اندازه فایل‌ها را کاهش می‌دهد. در نتیچه زمان بارگذاری کاهش [...]]]></description>
			<content:encoded><![CDATA[<p>در وبگردی ‌های امروز با <a href="http://aciddrop.com/php-speedy/">PHP Speedy</a> آشنا شدم. این اسکریپت پی‌اچ‌پی بطور قابل ملاحظه‌ای زمان بارگذاری ‌فایل‌های پی‌اچ‌پی را کاهش می‌دهد.</p>
<p>PHP Speedy بطور خودکار تمام فایل‌های لازم را با یكدیگر ترکیب و بصورت فشرده در می‌آورد که این خود بار درخواستی سرور و همچنین اندازه فایل‌ها را کاهش می‌دهد. در نتیچه زمان بارگذاری کاهش خواهد یافت.</p>
<p> این اسکریپت به دو صورت خودکار و دستی می‌تواند نصب شود. بعد از نصب، کدهای این اسکریپت می‌بایستی درابتدای فایل اصلی وب‌سایت (در بیشتر موارد index.php) الحاق شود. نتایج زیر را مشاهده کنید:</p>
<p>قبل از نصب اسکریپت (14 درخواست در مدت زمان 4.44 ثانیه)</p>
<div class="center">
<img src="http://alvani.googlepages.com/faster-php-by_alvanweb1.gif" alt="PHP Speedy" /></div>
<p>بعد از نصب اسکریپت (4 درخواست در مدت زمان 1.1 ثانیه)</p>
<div class="center">
<img src="http://alvani.googlepages.com/faster-php-byalvanweb2.gif" alt="PHP Speedy" /></div>
<p>اگر <a href="http://www.getfirebug.com/">Firebug</a> بر روی مرورگرتان ندارید تفاوت را با <a href="http://tools.pingdom.com/fpt/">این</a> ابزار آنلاین (Pingdom) میتوانید مشاهده کنید. قبلا Pingdom  در <a href="http://weblog.alvanweb.com/2007/06/15/page-load-testing-tool/">این یادداشت</a> بطور کامل معرفی شد.</p>
<img src="http://feeds.feedburner.com/~r/alvanweb/~4/lMRl7Eoa7TA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://weblog.alvanweb.com/2008/02/05/increase-website-loading-speed-with-php-speedy/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://weblog.alvanweb.com/2008/02/05/increase-website-loading-speed-with-php-speedy/</feedburner:origLink></item>
	</channel>
</rss>
