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

<channel>
	<title>یادداشتهای بیت نیمسوز &#187; json</title>
	<atom:link href="http://cyberrabbits.net/tag/json/feed/" rel="self" type="application/rss+xml" />
	<link>http://cyberrabbits.net</link>
	<description>یک وبلاگ دیگر از یک برنامه نویس دیگر</description>
	<lastBuildDate>Wed, 25 Jan 2012 08:37:11 +0000</lastBuildDate>
	<language>fa</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>گراواتار</title>
		<link>http://cyberrabbits.net/313/gravatar/</link>
		<comments>http://cyberrabbits.net/313/gravatar/#comments</comments>
		<pubDate>Mon, 03 May 2010 18:10:52 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[متفرقه]]></category>
		<category><![CDATA[Gravatar]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHPClasses]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[xmlrpc]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=313</guid>
		<description><![CDATA[گراواتار سیستمیه که همه ی کسانی که با WordPress سر و کار دارن میشناسنش. این سیستم به شما امکان میده یه آواتار رو ایجاد کنید، و از این آواتار در همه سیستمهایی که از گراواتار پشتیبانی میکنن استفاده کنید. اما گراواتار چطوری کار میکنه؟ خیلی ساده، شما اونجا یه اکانت میسازید و میتونید بیشتر از&#8230;
پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/885/string-array-php/' rel='bookmark' title='رشته ها و آرایه ها PHP'>رشته ها و آرایه ها PHP</a> <small>امروز درگیر یک کد بودم شبیه این : به نظر...</small></li>
<li><a href='http://cyberrabbits.net/740/regular-expression-part%db%b2/' rel='bookmark' title='عبارات با قاعده در PHP – بخش دوم'>عبارات با قاعده در PHP – بخش دوم</a> <small>توی نوشته قبلی، درباره عبارات با قاعده نوشتم، و حالا...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://gravatar.com">گراواتار</a> سیستمیه که همه ی کسانی که با WordPress سر و کار دارن میشناسنش. این سیستم به شما امکان میده یه آواتار رو ایجاد کنید، و از این آواتار در همه سیستمهایی که از گراواتار پشتیبانی میکنن استفاده کنید. اما گراواتار چطوری کار میکنه؟<br />
خیلی ساده، شما اونجا یه اکانت میسازید و میتونید بیشتر از یک میل رو هم به یه اکانت نسبت بدید و هم میتونید که برای هر ایمیل خودتون یه آواتار جداگانه ایجاد کنید.<br />
گراواتار یه سیستم خیلی ساده داره. شما آدرس ایمیل شخصی رو که میخواید تصویرشو بگیرید رو به حروف کوچک تبدیل میکنید،‌ بعد آدرس ایمیل رو به صورت md5 درمیارید و همین. دیگه آدرس عکس رو دارید، در حقیقت لینک آدرس عکس رو توی PHP میتونید اینجوری بدست بیارید : </p>
<pre class="brush: php; title: ; notranslate">
$email = &quot;someone@somewhere.com&quot;;
$default = &quot;http://www.somewhere.com/homestar.jpg&quot;;
$size = 40;
$rate = 'g';
$grav_url = &quot;http://www.gravatar.com/avatar/&quot; . md5( strtolower( $email ) ) .
&quot;?default=&quot; . urlencode( $default ) .
&quot;&amp;size=&quot; . $size .
&quot;&amp;r=&quot; . $rate;

echo &quot;&lt;img src=\&quot;$grav_url\&quot; alt=\&quot;\&quot; /&gt;&quot;;
</pre>
<p>سه تا مقدار default (که آدرس عکس پیشفرضه شماست که اگه نبود اون عکس نمایش داده بشه) و size که اندازه عکس مورد نظر شماست (که اندازه یه ظلع مربع عکسه) که بیشتر از ۵۱۲ هم نمیتونه باشه. (باشه هم مهم نیست، 512 برمیگردونه)‌ و rate (که میگه سایت شما جزو چه دسته ای هست، G ، PG ،R ،X ) که هر سه اختیاری هستن.<br />
خوب، این روش کلی مزیت داره. مزیتاش یکی همین یه دست بودن آواتار کاربر همه جاست. از نظر ریاضیاتی میشه ثابت کرد تعداد کلماتی که md5 برابر داشته باشن بی نهایته :)‌ &#8211; تعداد حالت های مختلف md5 ، محدوده. یعنی ۲ به توان ۱۲۸ حالت مختلف. ولی تعداد کلمات چند تاست؟ بی نهایت. خوب یعنی بی نهایت کلمه هست که md5 یکسان داشته باشه، ولی خوب چقدر احتمال داره که دو تا ایمیل یک md5 داشته باشن؟ به نظر من یه احتمال نزدیک به صفر &#8211; پس این زیاد مهم نیست. ولی با این روش،‌آدرس لینک نمیتونه ایمیل رو لو بده، و رباتهای مزاحم نمیتونن که از طریق عکسهای گراواتار، آدرس ایمیل رو بگیرن. کاربر هم میتونه یه جا عکس رو عوض کنه و کلی جای دیگه این عکس رو داشته باشه. این سیستم، جدیدا xmlrpc رو هم پیاده سازی کرده که امکانات بیشتری میتونه به شما بده (طراح های WordPress علاقه زیادی به xmlrpc دارن ولی من به شخصه json رو ترجیح میدم که از طریق javascript هم به راحتی قابل دسترسیه. نه این که xmlrpc نیست، ولی json خیلی راحت تره) کلاس PHP هم براش پیاده سازی کردن و توی<a href="http://www.phpclasses.org/package/5700-PHP-Send-requests-to-the-Gravatar-API-about-images.html"> این آدرس</a> هست. فقط من که تا حالا نتونستم بفهمم API Key واسه این xmlrpc رو از کجا باید بگیرم! </p>
<p><ins datetime="2010-05-07T07:21:32+00:00">یه میل زدم برای ساپورت درباره API Key و اونا گفتن که API Key همونه که توی <a href="http://wordpress.com">WordPress.com</a> به شما میدن. همونی که مثلا برای <a href="http://akismet.com/">Akismet</a> هم استفاده میشده. خوب مشکل حل شد :)<br />
</ins><br />
راستی اینم گراواتار من :</p>
<p><img src="http://www.gravatar.com/avatar/f6c5947ff77ff642f370d78017cf04fc?s=80&#038;r=g" alt="گراواتار من " /></p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/313/gravatar/"></g:plusone></div><p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/885/string-array-php/' rel='bookmark' title='رشته ها و آرایه ها PHP'>رشته ها و آرایه ها PHP</a> <small>امروز درگیر یک کد بودم شبیه این : به نظر...</small></li>
<li><a href='http://cyberrabbits.net/740/regular-expression-part%db%b2/' rel='bookmark' title='عبارات با قاعده در PHP – بخش دوم'>عبارات با قاعده در PHP – بخش دوم</a> <small>توی نوشته قبلی، درباره عبارات با قاعده نوشتم، و حالا...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/313/gravatar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>مترجم گوگل</title>
		<link>http://cyberrabbits.net/134/gtranslate/</link>
		<comments>http://cyberrabbits.net/134/gtranslate/#comments</comments>
		<pubDate>Sun, 17 Jan 2010 20:36:39 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[PHPClasses]]></category>
		<category><![CDATA[Translate]]></category>
		<category><![CDATA[WebService]]></category>
		<category><![CDATA[مترجم گوگل]]></category>
		<category><![CDATA[وب سرویس]]></category>
		<category><![CDATA[گوگل]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=134</guid>
		<description><![CDATA[همون طور که مطمئنا میدونید مترجم گوگل یکی از ابزارهای قدرتمندیه که توی وب خیلی میتونه کاربردی باشه و کمک کنه. اگه بخواید از این مترجم توی طرف کلاینت استفاده کنید مثلا با کمک جاوا اسکریپت، تقریبا هیچ کاری نداره، چون گوگل API اونو در اختیارتون گذاشته و با افزودن یه سری کد جاوااسکریپت به&#8230;
پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/142/firebug/' rel='bookmark' title='FireBug'>FireBug</a> <small>شاید اگر FireBug نبود اینقدر FireFox رو دوست نداشتم. سالهاست...</small></li>
<li><a href='http://cyberrabbits.net/131/open-search-php/' rel='bookmark' title='Open Search &#8211; PHP'>Open Search &#8211; PHP</a> <small>خیلی وقت پیش یه کلاسی نوشته بودم برای پیاده سازی...</small></li>
<li><a href='http://cyberrabbits.net/811/zend-translate-and-gnugettext/' rel='bookmark' title='Zend_Translate و GnuGetText'>Zend_Translate و GnuGetText</a> <small>یکی از اصولی که سعی میکنم هنگام طراحی رعایت کنم،...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>همون طور که مطمئنا میدونید مترجم گوگل یکی از ابزارهای قدرتمندیه که توی وب خیلی میتونه کاربردی باشه و کمک کنه. اگه بخواید از این مترجم توی طرف کلاینت استفاده کنید مثلا با کمک جاوا اسکریپت، تقریبا هیچ کاری نداره، چون گوگل API اونو در اختیارتون گذاشته و با افزودن یه سری کد جاوااسکریپت به کد صفحتون، همه چی در اختیار شماست.<br />
اما اگه بخواید از این کد برای طرف سرور استفاده کنید مثلا برای PHP مشکلاتی پیش میاد. چند تا کلاس توی <a href="http://www.phpclasses.org/">PHPClasses</a> پیدا کردم واسه این کار ولی همه یه روش نسبتا بد داشتن، صفحه مربوط به گوگل رو میخوندن، درخواستو میفرستادن و بعد هم در نهایت صفحه بازگشتی رو بررسی میکردن برای جواب که اصولا روش خیلی بدیه! اگه گوگل یه تغییری تو صفحه بده (که داد)‌ دیگه اون کدها کار نمیکنن.<br />
این شد که نشستم و یه کد واسه این کار نوشتم، یه کد که خیلی ساده به وب سرویس اصلی درخواست رو ارسال میکنه و پاسخ رو که <a href="http://www.json.org/">json</a> هم هست، رو به آرایه تبدیل میکنه و در اختیار قرار میده.<br />
این کلاس برای ارسال درخواست از <a href="http://php.net/manual/en/book.curl.php">CURL</a> استفاده میکنه اما در صورت در دسترس نبودن از <a href="http://snoopy.sourceforge.net/">Snoopy</a> استفاده میکنه. قابلیت شناسایی زبان هم وجود داره که میتونه در مواردی مفید باشه.<br />
این کلاس بالاخره امروز تایید شد و در <a href="http://www.phpclasses.org/browse/package/5931.html">این آدرس</a> قرار گرفت.<br />
البته دموی این کد رو هم میتونید <a href="http://cyberrabbits.net/non/gtranslate/index.php">اینجا</a> ببینید.</p>
<p><ins datetime="2010-01-19T13:26:39+00:00">به روز رسانی : بلافاصله بعد از انتشار کلاس، یک نفر خبر داد که این کلاس با نسخه جدید مترجم گوگل کاملا سازگار نیست، این شد که نشستم و این کلاس رو برای نسخه جدید مترجم هم آپدیت کردم. </ins></p>
<p><ins datetime="2010-03-25T17:04:51+00:00">برای دانلود، از انتهای همین پست هم میتونید استفاده کنید.</ins><br />
<ins datetime="2010-11-26T06:55:54+00:00">دوباره آپدیت شد در تاریخ Friday, November 26 2010</ins></p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/134/gtranslate/"></g:plusone></div><p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/142/firebug/' rel='bookmark' title='FireBug'>FireBug</a> <small>شاید اگر FireBug نبود اینقدر FireFox رو دوست نداشتم. سالهاست...</small></li>
<li><a href='http://cyberrabbits.net/131/open-search-php/' rel='bookmark' title='Open Search &#8211; PHP'>Open Search &#8211; PHP</a> <small>خیلی وقت پیش یه کلاسی نوشته بودم برای پیاده سازی...</small></li>
<li><a href='http://cyberrabbits.net/811/zend-translate-and-gnugettext/' rel='bookmark' title='Zend_Translate و GnuGetText'>Zend_Translate و GnuGetText</a> <small>یکی از اصولی که سعی میکنم هنگام طراحی رعایت کنم،...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/134/gtranslate/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Ajax &#8211; jQuery &#8211; PHP ترکیب دوست داشتنی</title>
		<link>http://cyberrabbits.net/87/lovely-ajax-jquery-php-part1/</link>
		<comments>http://cyberrabbits.net/87/lovely-ajax-jquery-php-part1/#comments</comments>
		<pubDate>Fri, 25 Dec 2009 10:55:19 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[آژاکس]]></category>
		<category><![CDATA[راهنمای قدم به قدم]]></category>
		<category><![CDATA[Ajax-tutorial]]></category>
		<category><![CDATA[json]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=87</guid>
		<description><![CDATA[یه چند وقتی هست میخوام یه مطلبی درباره آژاکس بنویسم البته با کمک jQuery . قبل از اینکه اینکارو انجام بدم، چند تا مساله هست که میخوام توضیح بدم قبل از شروع. اول اینکه تو این مطلب میخوام از خود هسته jQuery استفاده کنم نه از افزونه ها دوم اینکه میخوام طوری این کد رو&#8230;
پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/108/ajax-jquery-php-part2/' rel='bookmark' title='Ajax &#8211; jQuery &#8211; PHP قسمت دوم'>Ajax &#8211; jQuery &#8211; PHP قسمت دوم</a> <small>تو قسمت قبلی یه توضیح مختصر درباره اصل برنامه دادم،‌خیلی...</small></li>
<li><a href='http://cyberrabbits.net/119/ajax-again-part3/' rel='bookmark' title='باز هم آژاکس &#8211; قسمت سوم'>باز هم آژاکس &#8211; قسمت سوم</a> <small>توی دو پست قبلی توضیح دادم که چطوری میشه بدون...</small></li>
<li><a href='http://cyberrabbits.net/162/menu-mysql-and-every-m-thing/' rel='bookmark' title='Menu، MySQL و کلا هر چی با M شروع میشه'>Menu، MySQL و کلا هر چی با M شروع میشه</a> <small>اولین بار،‌برای ایجاد کردن یک منوی تو در تو،‌ از...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>یه چند وقتی هست میخوام یه مطلبی درباره آژاکس بنویسم البته با کمک <a href="http://jquery.com/">jQuery </a>. قبل از اینکه اینکارو انجام بدم، چند تا مساله هست که میخوام توضیح بدم قبل از شروع.</p>
<p>اول اینکه تو این مطلب میخوام از خود هسته jQuery استفاده کنم نه از افزونه ها<br />
دوم اینکه میخوام طوری این کد رو بنویسم که حتی اگه شخصی جاوا اسکریپت رو هم غیر فعال کرد بدون مشکل کار کنه، و فقط دیگه آژاکس نباشه.</p>
<p>دلیل اولی معلومه، نمیخوام کد بیخودی شلوغ بشه، ولی در حالت عادی افزونه ها خیلی مفیدن. اما دومی وسواس منه. اینکه بدون آژاکس همه چی درست باشه. اما چرا؟ علتش اینه که مهمترین مشتری های یک سایت! معمولا روباتهای موتورهای جستجوگر هستن، و اونا کاری با جاوا اسکریپت ندارن. اگه راستشو بخواید این راهنمای کوچک که من تو این پست و دو سه تا پست بعدی مینویسم، بیشتر از اینکه در مورد آژاکس باشه درباره اینه که چطور میشه همزمان یه صفحه با آژاکس و بی آژاکس کار کنه. البته این مثال به خصوص هیچ نیازی نداره به این قابلیت ولی میتونه راهنمای خوبی باشه برای افرادی که دوست دارن این رو امتحان کنن.</p>
<h2>0- پیشنیازها!</h2>
<p>آشنایی با jQuery و سیستم انتخاب عناصر اون ( Selector ) و اصولا آشنایی با روش زنجیری فراخوانی توابع، آشنایی با مدیریت رویدادها با jQuery</p>
<p>آشنایی با PHP در حدی که بتونید کد رو دنبال کنید.</p>
<h2>1- هدف</h2>
<p>اول از همه هدف چی هست؟ یعنی قصد دارم چه کاری انجام بدم؟ خیلی ساده! میخوام یه جدول داشته باشم، اطلاعات رو از تو دیتابیس (و در این مثال خاص دیتابیسی که با کمک جلسات شبیه سازی شده) بخونم نمایش بدم، اضافه کنم، حذف کنم و ویرایش کنم. مثالی که خیلی وقتها برای کسایی که تو کلاسای PHP من هستن میزنم، فقط ایندفعه بنابه دلایلی نمیخوام از دیتابیس استفاده کنم؛ میخوام از یه شبیه ساز ساده استفاده کنم. اینکه برنامه چه کاری انجام میده رو <a href="http://cyberrabbits.net/non/ajax/simple-1.php">اینجا</a> ببینید، سورس هم که آخر این پست هست. دانلود کنید.</p>
<p>تا اینجا مشکلی نیست، فقط کافیه که سورس رو ببینید، ولی از این جا به بعد میخوام قابلیت آژاکس رو هم بهش اضافه کنم. البته چون نه من الان حوصله دارم، و نه میخوام یه پست بیش از حد طولانی بشه فعلا فقط قسمت افزودن اطلاعات رو به صورت آژاکس دربیارم تا بعد، تو پستهای بعدی تکمیل ترش کنم.<br />
<span id="more-87"></span></p>
<h2>2-طرف سرور</h2>
<p>در حالت عادی یه فرم انتهای صفحه هست به این صورت :</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php if ($mode=='add') : ?&gt;
&lt;form action=&quot;&lt;?=$_SERVER['PHP_SELF'];?&gt;&quot; method=&quot;post&quot; id=&quot;addform&quot;&gt;
	&lt;label for &quot;data&quot;&gt;Your new data :&lt;input type=&quot;text&quot; name=&quot;data&quot;/&gt;&lt;/label&gt;
	&lt;input type=&quot;hidden&quot; name=&quot;oper&quot; value=&quot;add&quot; /&gt;
	&lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;Add&quot; /&gt;
&lt;/form&gt;
&lt;?php else : ?&gt;
</pre>
<p>این همون فرم مورد نظر منه. قسمت پردازش این فرم هم بالاتر، تو ابتدای کد هست :</p>
<pre class="brush: php; title: ; notranslate">	//Check for add request :
	if (isset($_POST['oper']) &amp;&amp; $_POST['oper']=='add'){
		$data=$_POST['data'];
		//Check point : Check user input here! its so important, but not for this example!
		//We just check for reject empty value
		if (!empty($data))
			if ($affected=add($data)) {
				$msg=&quot;OK, Done&quot;;
				$class=&quot;message&quot;;
			}else{
				$msg=&quot;OOps! more than 100 row! just for fun!&quot;;
				$class=&quot;errmessage&quot;;
			}
		else{
			$msg=&quot;Data is invalid (empty).&quot;;
			$class=&quot;errmessage&quot;;
		}
	}
	}
</pre>
<p>البته من یه کم لقمه رو دور سرم چرخوندم، مثلا در حالت عادی نیازی به افزودن یه فیلد اضافه به فرم (در این مثال فیلد oper ) ، نیست. ولی چون می خوام بعدا دچار مشکل نشم این کارو از همین الان انجام میدم. تابع add توی شبیه ساز دیتابیس خیلی ساده شبیه INSERT عمل میکنه، موفق بشه آخرین id اضافه شده رو برمیگردونه، نشه هم false (البته نشدن که نداره، من عمدا یه شرط الکی گذاشتم که مثلا بعد از 100 دیگه هیچی اضافه نشه) کلا همین. توی کد هم فقط بررسی شده که مبادا کاربر اطلاعات خال بفرستد، وگرنه در مثال واقعی باید بررسی های بیشتری بشه که بسته به نیاز میتونه متفاوت باشه مثلا اینکه اگه قراره که اطلاعات توی دیتابیس قرارداده بشه حتما عمل escape انجام بشه و &#8230;.</p>
<p>اینجا یه پیغام هست که به کاربر نشون داده میشه، موفقیت آمیز بوده نبوده و &#8230; یه کلاس هست که واسه نشون دادن پیغام به کاربر از اون کلاس توی CSS استفاده میشه (در مورد مثال من دو تا کلاس هست message برای پیغامهای موفقیت آمیز و errmessage برای پیغامهای خطا) و در نهایت یه متغیر affected که در حالتی که آژاکس نباشه اصلا به کار نمیاد و بود و نبودش بی معنیه. فقط تو این کد از این متغیر برای زمانی استفاده میشه که آژاکس باشه . این متغیر آخرین id رو نشون میده که در آخرین عمل تحت تاثیر قرار گرفته، مقدارش یه عدد صحیح مثبت یا -1 یا false خواهد بود که دو تای آخری نشانگر خطاست.</p>
<p>خوب اولین کار اینه که کد مورد نیاز رو اضافه کنیم. اول طرف PHP . باید یه جوری بفهمیم که این درخواست (Request ) فعلی به صورت معمولی بوده یا اینکه نه، این درخواست از طریق Ajax انجام شده.</p>
<p>jQuery و تقریبا تمام FrameWork های دیگه مثل mootools وقتی یه درخواست آژاکس میفرستن، یه سرآمد به درخواست اضافه میکنن به صورت X-Requested-With که مقدارش حاوی فرستنده آژاکس هست، البته مقدارش برای ما مهم نیست، فقط اینکه باشه کافیه که بفهمیم این درخواست با آژاکس فرستاده شده. تو PHP کلیه این متغییر ها که با یه درخواست فرستاده میشن تو $_SERVER قرار میگیرن، با یه HTTP_ اولشون و به صورت تماما حروف بزرگ، پس کافیه اینطوری این رو بررسی کنیم :</p>
<pre class="brush: php; title: ; notranslate">
$isAjax=isset($_SERVER['HTTP_X_REQUESTED_WITH']);
</pre>
<p>الان متغیر isAjax نشون میده که درخواست از طریق آژاکس بوده یا نه. چرا این مهمه؟ جواب یه درخواست آژاکس باید ساده باشه نه کل صفحه. در حقیقت به جای اینکه دوباره کل صفحه دوباره ایجاد بشه و پس فرستاده بشه، کافیه که اطلاعات مورد نیاز برای به روز رسانی صفحه فرستاده بشه. برای فرستادن این اطلاعات میشه از هر روشی استفاده کرد، ولی من بدون هیچ شکی از <a href="http://www.json.org/">json </a>استفاده میکنم، چون jQuery خیلی ساده اونو پردازش میکنه، از طرفی توی PHP دو تا تابع هست که از PHP 5.2 به بعد دیگه جزیی از هسته PHP هستن، این توابع ، عبارتند از json_encode و json_decode خیلی ساده، اولی یه آرایه میگیره اونو به فرمت json برمیگردونه، و دومی برعکس رشته مربوط به json رو میگیره، و آرایه معادلشو میده. توی درخواستهای آژاکسی، جواب یه چیزی هست شبیه به این :</p>
<pre class="brush: plain; title: ; notranslate">
{&quot;class&quot;:&quot;message&quot;,&quot;msg&quot;:&quot;OK, Done&quot;,&quot;affected&quot;:4}
</pre>
<p>هر فیلد دقیقا همون متغیرهایی هستن که بالاتر توضیح دادم. برای اینکار آخر بلوک کد، قبل از هر خروجی دیگه ای، این کد رو اضافه کردم :</p>
<pre class="brush: php; title: ; notranslate">
	if ($isAjax) {

		$data=array('class'=&gt;$class,'msg'=&gt;$msg,'affected'=&gt;$affected);
		echo json_encode($data); //Send data in json format
		exit();		//Finish the script, in ajax mode it's critical, just result data in
					//proper format, not anything else
	}
</pre>
<h2>3- طرف کلاینت</h2>
<p>همین و کل تغییری که باید توی کد PHP بدید تمومه. باقیش همونه که بود. فقط به کد HTML خروجی یه کم باید کد جاوا اسکریپت اضافه کنید. اول از همه یادتون نره که jQuery رو اضافه کنید :</p>
<pre class="brush: xml; title: ; notranslate">
&lt;script type=&quot;text/javascript&quot; src=&quot;js/jquery-1.3.2.min.js&quot;&gt;&lt;/script&gt;
</pre>
<p>بعد هم کافیه کد مورد نظرتونو تو یه بلوک script بنویسید، کد کلا اینه :</p>
<pre class="brush: xml; title: ; notranslate">
&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
	$(function() {
		//1- Change add form
		$('#addform').submit(function(){
			//1-1 :Get add form target
			var target=$(this).attr('action');
			//1-2 : collect data, in very simple way, you can use plugins or better way to do this,
			// But I want this to be simple.
			var postData=new Object();
			postData.oper='add';
			postData.data=$('#addform input[name=data]').attr('value');
			//1-3 : Post data to server using post method
			$.post(
				target, // The form target (action)
				postData, //The form data
				function(data){ // callback function , fired on success, with data recived from server
					//Since we use json, data is an object with json data as field =&gt; data
					//The data format for this example is very simple, class and message and code, (the id
					//when insert done and -1 when fail) . no more
					//1-4 : show message
					$(&quot;#msg&quot;).removeClass('message')  //Remove any old class, just in case
							 .removeClass('errmessage')
							 .addClass(data.class) //Add new class
							 .html(data.msg);	//change message(innerHTML)
					//1-5 : add new data to list (html table) if insert was a success.
					if(data.affected&gt;-1){
						var id=data.affected;
						var delLink=&quot;&lt;a href='&lt;?=$_SERVER['PHP_SELF'];?&gt;?del=&quot;+id+&quot;' class='dellink' rel='row_&quot;+id+&quot;'&gt;Del&lt;/a&gt;&quot;;
						var editLink=&quot;&lt;a href='&lt;?=$_SERVER['PHP_SELF'];?&gt;?edit=&quot;+id+&quot;' class='editlink' rel='row_&quot;+id+&quot;'&gt;Edit&lt;/a&gt;&quot;;
						//Create new table row with new data, see the table rows, this is just a duplicate of that.
						$(&quot;&lt;tr id='row_&quot;+id+&quot;'&gt;&lt;td&gt;&quot;+id+&quot;&lt;/td&gt;&lt;td&gt;&quot;+postData.data+&quot;&lt;/td&gt;&lt;td&gt;&quot;+delLink+&quot;&lt;/td&gt;&lt;td&gt;&quot;+
							editLink+&quot;&lt;/td&gt;&lt;/tr&gt;&quot;)
							.appendTo('#dataList tbody'); //Append it to end of table
					}
				},
				&quot;json&quot; //Data type, json is simplest , since json extension in php is very simple and good :),
					   // But you can use other format like xml (then you should pass data in php in xml format) or
					   // simply use text, then data is a string not object
			);
			//make sure to return false to override default send.
			return false;
		})
	});
//]]&gt;
&lt;/script&gt;
</pre>
<p>حالا توضیح تکه به تکه، اگه با jQuery آشنایی ندارید، چگونگی انتخاب عناصر رو نمیدونید بالاتر هم گفتم قبلش برید و در این مورد مطالعه کنید :)</p>
<p>اولین کار اینه که به جای اینکه فرم از طریق روش عادی، ارسال بشه ما عمل submit رو مدیریت کنیم و اجازه این کارو به مرورگر ندیم. برای اینکار تابع submit باید حتما false برگردونه و گرنه اطلاعات باز هم از طریق متد عادی فرستاده میشه، چیزی که ما نمیخوایم. پس یه return false به انتهای این تابع که خروجی تابع هم هست اضافه میکنیم.</p>
<p>خیلی ها میان و action فرم رو مثلا میدن # ، در این صورت فرم اگه جاوا اسکریپت نباشه اصلا ارسال نمیشه، چیزی که من میخوام اینطور نباشه.</p>
<p>گام اول اینه که action فرم رو بگیریم، چون میخوایم ما هم اطلاعات رو به همون جا پست کنیم. (1-1 )</p>
<pre class="brush: jscript; title: ; notranslate">
var target=$(this).attr('action');
</pre>
<p>حالا وقتشه که اطلاعات فرم رو جمع و جور کنیم. اینجا شما میتونید از افزونه هایی که هست استفاده کنید و یا اینکه یه سری روتین های تعیین اعتبار رو هم اضافه کنید مثلا اینکه مطمئن شید فرم کاملا پر شده و از این حرفا، ولی روش من یعنی ساده ترین روش :)</p>
<p>تک تک اطلاعات رو میگیریم و به یه شی جاوا اسکریپت اضافه میکنیم :</p>
<pre class="brush: jscript; title: ; notranslate">
//1-2 : collect data, in very simple way, you can use plugins or better way to do this,
// But I want this to be simple.
var postData=new Object();
postData.oper='add';
postData.data=$('#addform input[name=data]').attr('value');
</pre>
<p>همون oper که بالا هم در موردش توضیح دادیم، اینبار add هست (معلومه دیگه! ما میخوایم فرم add رو شبیه سازی کنیم) حالا متن داخل فیلد data رو هم میخونیم و به شی اضافه میکنیم.</p>
<p>گام بعدی هم، ارسال اطلاعاته، از طریق متد post کلاس jQuery .</p>
<pre class="brush: jscript; title: ; notranslate">
			$.post(
				target, // The form target (action)
				postData, //The form data
				function(data){ // callback function , fired on success, with data recived from server
					//Since we use json, data is an object with json data as field =&gt; data
					//The data format for this example is very simple, class and message and code, (the id
					//when insert done and -1 when fail) . no more
					//1-4 : show message
					$(&quot;#msg&quot;).removeClass('message')  //Remove any old class, just in case
							 .removeClass('errmessage')
							 .addClass(data.class) //Add new class
							 .html(data.msg);	//change message(innerHTML)
					//1-5 : add new data to list (html table) if insert was a success.
					if(data.affected&gt;-1){
						var id=data.affected;
						var delLink=&quot;&lt;a href='&lt;?=$_SERVER['PHP_SELF'];?&gt;?del=&quot;+id+&quot;' class='dellink' rel='row_&quot;+id+&quot;'&gt;Del&lt;/a&gt;&quot;;
						var editLink=&quot;&lt;a href='&lt;?=$_SERVER['PHP_SELF'];?&gt;?edit=&quot;+id+&quot;' class='editlink' rel='row_&quot;+id+&quot;'&gt;Edit&lt;/a&gt;&quot;;
						//Create new table row with new data, see the table rows, this is just a duplicate of that.
						$(&quot;&lt;tr id='row_&quot;+id+&quot;'&gt;&lt;td&gt;&quot;+id+&quot;&lt;/td&gt;&lt;td&gt;&quot;+postData.data+&quot;&lt;/td&gt;&lt;td&gt;&quot;+delLink+&quot;&lt;/td&gt;&lt;td&gt;&quot;+
							editLink+&quot;&lt;/td&gt;&lt;/tr&gt;&quot;)
							.appendTo('#dataList tbody'); //Append it to end of table
					}
				},
				&quot;json&quot; //Data type, json is simplest , since json extension in php is very simple and good :),
					   // But you can use other format like xml (then you should pass data in php in xml format) or
					   // simply use text, then data is a string not object
			);
</pre>
<p>آرگومان اول صفحه مقصده، همون action فرم، آرگومان دوم اطلاعات فرمه که ما گذاشتیمش توی شی postData سومی هم تابعی هست که وقتی عمل موفقیت آمیز باشه فراخوانی میشه، (توضیح بیشتر چند خط پایینتر :D ) و در نهایت آرگومان آخر مشخص میکنه فرمت اطلاعات پاسخ چی باشه. همونطور که گفتم تو این مثال (و من تنبل تقریبا همیشه ) از json استفاده میکنیم.</p>
<p>اما تابعی که تو لیست آرگومانها هست، آرگومان سوم. این تابع وقتی فراخوانی میشه که اطلاعات با موفقیت پست شده باشن، و جواب هم توی متغییر data گذاشته میشه و به عنوان آرگومان این تابع در دسترس هست. اینجا، اطلاعات بازگشتی به صورت json بود، خود jQuery این اطلاعات رو پردازش میکنه و به صورت فیلد به شی data اضافه میکنه، در بعضی موارد (مثلا اگه اطلاعات بازگشتی متنی باشه ) این data به صورت string هست نه object تو این مثال و کلا همیشه برای این فرمت json آرگومان object هست.</p>
<pre class="brush: jscript; title: ; notranslate">
function(data){ // callback function , fired on success, with data recived from server
	//Since we use json, data is an object with json data as field =&gt; data
	//The data format for this example is very simple, class and message and code, (the id
	//when insert done and -1 when fail) . no more
	//1-4 : show message
	$(&quot;#msg&quot;).removeClass('message')  //Remove any old class, just in case
			 .removeClass('errmessage')
			 .addClass(data.class) //Add new class
			 .html(data.msg);	//change message(innerHTML)
	//1-5 : add new data to list (html table) if insert was a success.
	if(data.affected&gt;-1){
		var id=data.affected;
		var delLink=&quot;&lt;a href='&lt;?=$_SERVER['PHP_SELF'];?&gt;?del=&quot;+id+&quot;' class='dellink' rel='row_&quot;+id+&quot;'&gt;Del&lt;/a&gt;&quot;;
		var editLink=&quot;&lt;a href='&lt;?=$_SERVER['PHP_SELF'];?&gt;?edit=&quot;+id+&quot;' class='editlink' rel='row_&quot;+id+&quot;'&gt;Edit&lt;/a&gt;&quot;;
		//Create new table row with new data, see the table rows, this is just a duplicate of that.
		$(&quot;&lt;tr id='row_&quot;+id+&quot;'&gt;&lt;td&gt;&quot;+id+&quot;&lt;/td&gt;&lt;td&gt;&quot;+postData.data+&quot;&lt;/td&gt;&lt;td&gt;&quot;+delLink+&quot;&lt;/td&gt;&lt;td&gt;&quot;+
			editLink+&quot;&lt;/td&gt;&lt;/tr&gt;&quot;)
			.appendTo('#dataList tbody'); //Append it to end of table
	}
}
</pre>
<p>اول پیغام رو بدون کم و کاست نشون میدیم. قبلا یه div واسش توی کد در نظر گرفته بودیم، با ID=msg . اونو انتخاب میکنیم، هم کلاس message و هم errmessage رو ازش حذف میکنیم، (که میتونه از آخرین پیغام قبلی باقی مونده باشه) حالا کلاس جدید رو از متغییر data میخونیم و به این div اضافه میکنیم، بعد هم متن داخل این div رو با متن جواب عوض میکنیم.</p>
<p>گام دوم اینه که تغییر داده شده رو اضافه کنیم به انتهای لیست. میتونید اطلاعات اضافه شده رو هم از سرور به این پاسخ اضافه کنید ولی ما فقط id اضافه شده رو میخوایم، و متن رو هم میتونیم از داخل همون فیلد بخونیم (البته این چندان جالب نیست، مثلا اگه طرف بعد از ارسال ولی قبل از رسیدن جواب متنو عوض کرده باشه که اونم کلی راه حل داره :) ) حالا اگه جواب مثبت باشه (مبارکه) این متنو به انتهای لیست اضافه میکنیم.</p>
<p>اول دو تا لینک حذف و ویرایش رو بدون کم و کاست ایجاد میکنیم (دقیقا شبیه همین لینک ها توی PHP ) دست آخر هم یه سطر جدول رو ایجاد میکنیم و با متد appendTo به انتهای جدول اضافه میکنیم (قسمت tbody ) همین! حالا شما یک صفحه آژاکس دارید که هم بدون آژاکس کار میکنه هم با آژاکس. میتونید نتیجه رو <a href="http://cyberrabbits.net/non/ajax/simple-2.php">اینجا</a> ببینید.</p>
<p>قسمتهای بعدی (که فکر میکنم دست کم 3 قسمت دیگه باشه) به زودی اضافه میکنم، سعی میکنم دست کم هر هفته یه قسمت رو آماده کنم، ولی خدا رو چه دیدی ! شاید زودتر شد یا شاید دیرتر!</p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/87/lovely-ajax-jquery-php-part1/"></g:plusone></div><p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/108/ajax-jquery-php-part2/' rel='bookmark' title='Ajax &#8211; jQuery &#8211; PHP قسمت دوم'>Ajax &#8211; jQuery &#8211; PHP قسمت دوم</a> <small>تو قسمت قبلی یه توضیح مختصر درباره اصل برنامه دادم،‌خیلی...</small></li>
<li><a href='http://cyberrabbits.net/119/ajax-again-part3/' rel='bookmark' title='باز هم آژاکس &#8211; قسمت سوم'>باز هم آژاکس &#8211; قسمت سوم</a> <small>توی دو پست قبلی توضیح دادم که چطوری میشه بدون...</small></li>
<li><a href='http://cyberrabbits.net/162/menu-mysql-and-every-m-thing/' rel='bookmark' title='Menu، MySQL و کلا هر چی با M شروع میشه'>Menu، MySQL و کلا هر چی با M شروع میشه</a> <small>اولین بار،‌برای ایجاد کردن یک منوی تو در تو،‌ از...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/87/lovely-ajax-jquery-php-part1/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

