<?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>Moshtaghi.ir</title>
	
	<link>http://weblog.moshtaghi.ir</link>
	<description>وبلاگ شخصی مهدی مشتاقی</description>
	<lastBuildDate>Mon, 01 Mar 2010 10:48:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.2</generator>
	<language>fa</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/Moshtaghi" /><feedburner:info uri="moshtaghi" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>Moshtaghi</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FMoshtaghi" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FMoshtaghi" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2FMoshtaghi" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/Moshtaghi" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FMoshtaghi" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FMoshtaghi" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FMoshtaghi" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2FMoshtaghi" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2FMoshtaghi" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2FMoshtaghi" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsalloy.com/?rss=http%3A%2F%2Ffeeds.feedburner.com%2FMoshtaghi" src="http://www.newsalloy.com/subrss3.gif">Subscribe with NewsAlloy</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2FMoshtaghi" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FMoshtaghi" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://www.yourminis.com/subscribe.aspx?u=http%3A%2F%2Ffeeds.feedburner.com%2FMoshtaghi" src="http://www.yourminis.com/images/addtoyourminisbadge.gif">Subscribe with Yourminis.com</feedburner:feedFlare><feedburner:feedFlare href="http://download.attensa.com/app/get_attensa.html?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FMoshtaghi" src="http://www.attensa.com/blogs/attensa/WindowsLiveWriter/BadgeredintoBadges_10C02/attensa_feed_button5.gif">Subscribe with Attensa for Outlook</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FMoshtaghi" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://hub.netomat.net/account/account.autoSubscribe.jspa?urls=http%3A%2F%2Ffeeds.feedburner.com%2FMoshtaghi" src="http://www.netomat.net/blogger/images/icon_netomat_feedbutton.gif">Subscribe with netomat Hub</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FMoshtaghi" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.flurry.com/pushRssFeed.do?r=fb&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2FMoshtaghi" src="http://www.flurry.com/images/flurry_rss_logo2.gif">Subscribe with Flurry</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2FMoshtaghi" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2FMoshtaghi" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><feedburner:browserFriendly>از اینکه مشترک وبلاگ بنده می‌شوید، متشکرم.&#xD;
من به شخصه از گوگل ریدر برای مرور فید‌ها استفاده می‌کنم! شما چطور؟</feedburner:browserFriendly><item>
		<title>تنظیم zypper برای بهبود در تراکنش دانلود</title>
		<link>http://feedproxy.google.com/~r/Moshtaghi/~3/y6Xq12Y-7ZI/</link>
		<comments>http://weblog.moshtaghi.ir/2010/03/config-zypper-to-improve-download-transaction/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 10:44:42 +0000</pubDate>
		<dc:creator>مهدی</dc:creator>
				<category><![CDATA[لینوکس]]></category>
		<category><![CDATA[openSUSE]]></category>
		<category><![CDATA[zypper]]></category>

		<guid isPermaLink="false">http://weblog.moshtaghi.ir/?p=473</guid>
		<description><![CDATA[zypper نرم‌افزاری‌ست که با آن می‌توانید از طریق خط‌فرمان بسته‌های  نرم‌افزاری را نصب، حذف و به‌روز کنید. همچنین با استفاده از zypper  می‌توانید مخازن نرم‌افزاری را مدیریت (اضافه،حذف و ویرایش) کنید. توجه  کنید که برای استفاده از zypper باید در حالت کاربر ریشه (root) باشید.

همانطور که می‌دانید شما در اوپن‌سوزه و با ]]></description>
			<content:encoded><![CDATA[<blockquote><p>zypper نرم‌افزاری‌ست که با آن می‌توانید از طریق خط‌فرمان بسته‌های  نرم‌افزاری را نصب، حذف و به‌روز کنید. همچنین با استفاده از zypper  می‌توانید مخازن نرم‌افزاری را مدیریت (اضافه،حذف و ویرایش) کنید. توجه  کنید که برای استفاده از zypper باید در حالت کاربر ریشه (root) باشید.</p></blockquote>
<p><img class="aligncenter size-full wp-image-480" title="zypper" src="http://www.moshtaghi.ir/weblog/wp-content/uploads/2010/03/zypper.png" alt="zypper" width="300" height="150" /><br />
همانطور که می‌دانید شما در اوپن‌سوزه و با استفاده از دستور zypper dup می‌توانید کل سیستم را بروز کنید. حال اگر برخی بسته‌ها بهنگام بروز رسانی ریست شوند ممکن است یک ریست ناموفق قبل از تنظیم فایل‌های پیکره بندی رخ دهد. این مورد مخصوصاً در مواقعی خطرناک می‌شود که سرویس‌های در حال اجرا نیازمند بسته‌هایی باشند که در حال بروز رسانی هستند.</p>
<p>برخی موارد هم توسط کابران ذکر شده که از آنجایی که zypper به هنگام کار یکی یکی بسته‌ها را دریافت و نصب می‌کند و بین دانلود فاصله می‌اندازد، کاهش آزار دهنده‌ای در سرعت دانلود رخ می‌دهد! حتی راه حل‌های جالب و مبتکرانه‌ای برای این مشکل هم اختراع شده!</p>
<blockquote><p>برای مثال در هنگام کاهش سرعت دانلود توسط  zypper با استفاده از برنامه‌های مدیریت دانلودی همچون wget یا … فایلی را دانلود کنید تا پهنای باند را کشیده و zypper را تحریک کند. و جالب اینجا که این شیوه جواب می‌دهد! (رابطه‌اش را نه <a title="erghezi" href="http://ilinux.wordpress.com/">مخترع</a> و نه من نفهمیدیم!)</p></blockquote>
<h3>اما راه حل بهتر و اصولی چیست؟</h3>
<p>همانطور که می‌دانید در لینوکس همه چیز آزاد است و قابل تنظیم! پس ما باید برای این قبیل موارد بدنبال گزینه‌ای باشیم تا این سبک دانلود و نصب متداول بسته‌ها را به دانلود کلیه بسته‌ها و سپس نصب آن‌ها تبدیل کند.<span id="more-473"></span></p>
<p>پس به فایل پیکره‌بندی zypper در مسیر /etc/zypp/zypp.conf می‌رویم و مقدار</p>

<div class="wp_syntax"><div class="code"><pre class="io" style="font-family:monospace;">Set commit.downloadMode =</pre></div></div>

<p>به مقدار</p>

<div class="wp_syntax"><div class="code"><pre class="io" style="font-family:monospace;">Set commit.downloadMode = DownloadInAdvance</pre></div></div>

<p>تغییر می‌دهیم!</p>
<p>توجه به این نکته لازم است که تراکنش دانلود در این حالت مستلزم مقدار زیادی فضای خالی در مسیر /var می‌باشد.</p>
<p>این گزینه حالت‌های دیگری هم دارد که شرح آن در جدول زیر آمده است.</p>
<table border="0" cellspacing="0">
<thead>
<tr>
<th>مقدار</th>
<th>شرح</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>DownloadOnly</code></td>
<td>فقط تمامی بسته‌ها را در یک کش محلی دانلود می‌کند ولی نصب نمی‌کند</td>
</tr>
<tr>
<td><code>DownloadInAdvance</code></td>
<td>ابتدا تمامی بسته‌ها را در یک کش محلی دانلود می‌کند و سپس همه را با هم نصب می‌کند</td>
</tr>
<tr>
<td><code>DownloadInHeaps</code></td>
<td>تقریباً مشابه DownloadInAdvance است با این تفاوت که سعی می‌کند تراکنش ها را در جایی که آخر هر بخش وضعیت پایدار موجود است به قسمت‌های مختلفی تقسیم کند!!! <span style="color: #ff0000;">*</span></td>
</tr>
<tr>
<td><code>DownlodAsNeeded</code></td>
<td>بسته‌ها بطور متناوب دانلود و نصب می‌شوند. همان یبک معمول و پیشفرض</td>
</tr>
</tbody>
</table>
<p>برای دریافت اطلاعات بیشتر راجع به zypper و چکونگی کار با آن به <a title="نصب نرم‌افزار، مدیریت مخازن و به‌روزرسانی با zypper" href="http://forum.opensuse.ir/index.php/topic,95.0.html">اینجا</a> (زبان فارسی) و <a title="ویکی رسمی openSUSE" href="http://en.opensuse.org/Zypper">اینجا</a> مراجعه کنید.</p>
<p><span style="color: #ff0000;">*</span> ترجمه بنده ظعیف هست، متن دقیق اینه:</p>
<blockquote>
<p style="text-align: left;">Similar to DownloadInAdvance, but try to split the transaction into heaps, where at the end of each heap a consistent system state is reached.</p>
</blockquote>
<img src="http://www.moshtaghi.ir/weblog/?ak_action=api_record_view&id=473&type=feed" alt="" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=y6Xq12Y-7ZI:BfCDMB39SdU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?i=y6Xq12Y-7ZI:BfCDMB39SdU:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=y6Xq12Y-7ZI:BfCDMB39SdU:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=y6Xq12Y-7ZI:BfCDMB39SdU:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=y6Xq12Y-7ZI:BfCDMB39SdU:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?i=y6Xq12Y-7ZI:BfCDMB39SdU:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=y6Xq12Y-7ZI:BfCDMB39SdU:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=y6Xq12Y-7ZI:BfCDMB39SdU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=y6Xq12Y-7ZI:BfCDMB39SdU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?i=y6Xq12Y-7ZI:BfCDMB39SdU:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Moshtaghi/~4/y6Xq12Y-7ZI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://weblog.moshtaghi.ir/2010/03/config-zypper-to-improve-download-transaction/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		<feedburner:origLink>http://weblog.moshtaghi.ir/2010/03/config-zypper-to-improve-download-transaction/</feedburner:origLink></item>
		<item><title>Links for 2009-11-24 [del.icio.us]</title><link>http://feedproxy.google.com/~r/Moshtaghi/~3/-Mae1MMZwxY/mehdimm</link><pubDate>Wed, 25 Nov 2009 00:00:00 PST</pubDate><guid isPermaLink="false">http://del.icio.us/mehdimm#2009-11-24</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://forum.opensuse.ir/index.php/topic,194.0.html"&gt;&amp;#1608;&amp;#1740;&amp;#1583;&amp;#1574;&amp;#1608;&amp;zwnj;&amp;#1607;&amp;#1575;&amp;#1740; &amp;#1570;&amp;#1605;&amp;#1608;&amp;#1586;&amp;#1588;&amp;#1740; &amp;#1576;&amp;#1585;&amp;#1575;&amp;#1740; &amp;#1606;&amp;#1585;&amp;#1605; &amp;#1575;&amp;#1601;&amp;#1586;&amp;#1575;&amp;#1585; Gimp&lt;/a&gt;&lt;br/&gt;
با حجم تقریبی ۷۰۰مگ، برای تازه‌کارایی مثل من چیز خیلی خوبیه و سرعت استارت رو تا حد بسیاری بالا می‌بره- تا باشه از دست فوتوشاپ راحت شیم!&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/Moshtaghi/~4/-Mae1MMZwxY" height="1" width="1"/&gt;</description><feedburner:origLink>http://del.icio.us/mehdimm#2009-11-24</feedburner:origLink></item><item><title>Links for 2009-10-12 [del.icio.us]</title><link>http://feedproxy.google.com/~r/Moshtaghi/~3/48hx5oOE6hQ/mehdimm</link><pubDate>Tue, 13 Oct 2009 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/mehdimm#2009-10-12</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.problogdesign.com/resources/33-websites-for-vector-image-downloads/"&gt;33 Websites For Vector Image Downloads&lt;/a&gt;&lt;br/&gt;
دیگه حرفی توش نیست، چیزی که توی طراحی اینترفیس وب خیلی بکار میاد و کلاس هم داره!!!&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/Moshtaghi/~4/48hx5oOE6hQ" height="1" width="1"/&gt;</description><feedburner:origLink>http://del.icio.us/mehdimm#2009-10-12</feedburner:origLink></item><item>
		<title>نصب بسته lamp روی openSUSE با استفاده از XAMPP for Linux</title>
		<link>http://feedproxy.google.com/~r/Moshtaghi/~3/hMy8U46H1QI/</link>
		<comments>http://weblog.moshtaghi.ir/2009/10/installing-lamp-on-opensuse-using-xampp-for-linux/#comments</comments>
		<pubDate>Mon, 05 Oct 2009 21:48:06 +0000</pubDate>
		<dc:creator>مهدی</dc:creator>
				<category><![CDATA[ابزار طراحی وب]]></category>
		<category><![CDATA[لینوکس]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[lampp]]></category>
		<category><![CDATA[my sql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[xampp]]></category>

		<guid isPermaLink="false">http://weblog.moshtaghi.ir/?p=464</guid>
		<description><![CDATA[برای داشتن یک محیط توسعه php یکی از بهترین و راحت‌ترین راه‌ها استفاده از بسته XAMPP است. این بسته که یک نسخه آماده استفاده از بسته‌های Apache, PHP, My SQL  و perl می‌باشد که بسیار راحت قابل نصب و استفاده است. با سادگی دانلود، کپی و بازکردن فایل فشرده!!!
برای نصب این بسته مراحل زیر ]]></description>
			<content:encoded><![CDATA[<blockquote><p>برای داشتن یک محیط توسعه php یکی از بهترین و راحت‌ترین راه‌ها استفاده از بسته <a href="http://www.apachefriends.org/en/xampp-linux.html" target="_blank">XAMPP</a> است. این بسته که یک نسخه آماده استفاده از بسته‌های Apache, PHP, My SQL  و perl می‌باشد که بسیار راحت قابل نصب و استفاده است. با سادگی دانلود، کپی و بازکردن فایل فشرده!!!</p></blockquote>
<h3>برای نصب این بسته مراحل زیر را دنبال می‌کنیم:</h3>
<p>۱- دریافت از سایت رسمی پروژه با حجم تقریبی 63MB که شامل تمامی بسته‌های زیر می‌باشد.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">Apache 2.2.12, MySQL 5.1.37, PHP 5.3.0 <span style="color: #000000; font-weight: bold;">&amp;</span>amp; PEAR + SQLite 2.8.17<span style="color: #000000; font-weight: bold;">/</span>3.6.16 + multibyte <span style="color: #7a0874; font-weight: bold;">&#40;</span>mbstring<span style="color: #7a0874; font-weight: bold;">&#41;</span> support, Perl 5.10.0, ProFTPD 1.3.2a,
 phpMyAdmin 3.2.0.1, OpenSSL 0.9.8k, GD 2.0.1, Freetype2 2.1.7, libjpeg 6b, libpng 1.2.12, gdbm 1.8.0, zlib 1.2.3, expat <span style="color: #000000;">1.2</span>, Sablotron <span style="color: #000000;">1.0</span>, libxml 2.7.2,
 Ming 0.4.2, Webalizer <span style="color: #000000;">2.21</span>-02, pdf class 009e, ncurses <span style="color: #000000;">5.3</span>, mod_perl 2.0.4, FreeTDS <span style="color: #000000;">0.63</span>, <span style="color: #c20cb9; font-weight: bold;">gettext</span> <span style="color: #000000;">0.17</span>, IMAP C-Client 2007e, OpenLDAP <span style="color: #7a0874; font-weight: bold;">&#40;</span>client<span style="color: #7a0874; font-weight: bold;">&#41;</span> 2.3.11,
 mcrypt 2.5.7, mhash 0.8.18, eAccelerator 0.9.5.3, cURL 7.19.3, libxslt 1.1.8, phpSQLiteAdmin <span style="color: #000000;">0.2</span>, libapreq <span style="color: #000000;">2.08</span>, FPDF <span style="color: #000000;">1.6</span>, XAMPP Control Panel <span style="color: #000000;">0.6</span>,
 bzip 1.0.5, PBXT 1.0.08-rc, PBMS 0.5.08-alpha, ICU4C Library 4.2.1</pre></div></div>

<blockquote><p>نکته: نسخه‌های بالا مربوط به نسخه XAMPP for Linux 1.7.2  در تاریخ  2009/8/10 می‌باشد.</p></blockquote>
<p>۲- پس از اتمام دانلود وارد ترمینال شده و با دسترسی کاربر ریشه (su) فایل مربوطه را در پوشه /opt از حالت فشرده خارج کنید.<span id="more-464"></span></p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">tar</span> xvfz xampp-linux-1.7.2.tar.gz <span style="color: #660033;">-C</span> <span style="color: #000000; font-weight: bold;">/</span>opt</pre></div></div>

<blockquote><p>نکته: حتماْ با استفاده از همین دستور فایل رو از حالت فشرده خارج کنید!</p></blockquote>
<p>۳- تموم شد، متاسفم که منتظر مرحله بعد بودی (به یاد اینستالر  wordpress فارسی). حالا XAMPP  در پوشه /opt/lampp نصب شده و با اجرای دستور زیر اجرا می‌شه.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>lampp<span style="color: #000000; font-weight: bold;">/</span>lampp start</pre></div></div>

<p>مرورگر خود را باز کنید و برای آزمایش به آدرس http://localhost مراجعه کنید.</p>
<h3>پارامتر‌های مورد نیاز دیگر</h3>
<p>در این جدول لیستی از پارامتر‌هایی رو که در اجرا و استفاده از XAMPP لازم می‌شوند را مشاهده می‌کنید:</p>
<table class="leftt" border="0" cellspacing="0">
<tbody>
<tr valign="top">
<td colspan="4">START AND STOP PARAMETERS</td>
</tr>
<tr valign="top">
<td>Parameter</td>
<td>Description</td>
</tr>
<tr valign="top">
<td><tt>start</tt></td>
<td>Starts XAMPP.</td>
</tr>
<tr valign="top">
<td><tt>stop</tt></td>
<td>Stops XAMPP.</td>
</tr>
<tr valign="top">
<td><tt>restart</tt></td>
<td>Stops and starts XAMPP.</td>
</tr>
<tr valign="top">
<td><tt>startapache</tt></td>
<td>Starts only the Apache.</td>
</tr>
<tr valign="top">
<td><tt>startssl</tt></td>
<td>Starts the Apache SSL support. This command activates the SSL support permanently, e.g. if you restarts XAMPP in the future SSL will stay activated.</td>
</tr>
<tr valign="top">
<td><tt>startmysql</tt></td>
<td>Starts only the MySQL database.</td>
</tr>
<tr valign="top">
<td><tt>startftp</tt></td>
<td>Starts the ProFTPD server. Via FTP you can upload files for your web server (user &#8220;nobody&#8221;, password &#8220;lampp&#8221;). This command activates the ProFTPD permanently, e.g. if you restarts XAMPP in the future FTP will stay activated.</td>
</tr>
<tr valign="top">
<td><tt>stopapache</tt></td>
<td>Stops the Apache.</td>
</tr>
<tr valign="top">
<td><tt>stopssl</tt></td>
<td>Stops the Apache SSL support. This command deactivates the SSL support permanently, e.g. if you restarts XAMPP in the future SSL will stay deactivated.</td>
</tr>
<tr valign="top">
<td><tt>stopmysql</tt></td>
<td>Stops the MySQL database.</td>
</tr>
<tr valign="top">
<td><tt>stopftp</tt></td>
<td>Stops the ProFTPD server. This command deactivates the ProFTPD permanently, e.g. if you restarts XAMPP in the future FTP will stay deactivated.</td>
</tr>
<tr valign="top">
<td><tt>security</tt></td>
<td>Starts a small security check programm.</td>
</tr>
</tbody>
</table>
<p>این پارامتر‌ها را باید به شکل زیر استفاده کنید:<br />
/opt/lampp/lampp restart</p>
<h3>آدرس‌ها و مسیر‌های مورد نیاز</h3>
<p>در این جدول آدرس‌های مهمی همچون فایل‌های پیکره بندی و &#8230; را مشاهده می‌کنید:</p>
<table class="leftt" border="0" cellspacing="0">
<tbody>
<tr valign="top">
<td colspan="4">IMPORTANT FILES AND DIRECTORIES</td>
</tr>
<tr valign="top">
<td>File/Directory</td>
<td>Purpose</td>
</tr>
<tr valign="top">
<td><tt>/opt/lampp/bin/</tt></td>
<td>The XAMPP commands home. /opt/lampp/bin/mysql calls for example the MySQL monitor.</td>
</tr>
<tr valign="top">
<td><tt>/opt/lampp/htdocs/</tt></td>
<td>The Apache DocumentRoot directory.</td>
</tr>
<tr valign="top">
<td><tt>/opt/lampp/etc/httpd.conf</tt></td>
<td>The Apache configuration file.</td>
</tr>
<tr valign="top">
<td><tt>/opt/lampp/etc/my.cnf</tt></td>
<td>The MySQL configuration file.</td>
</tr>
<tr valign="top">
<td><tt>/opt/lampp/etc/php.ini</tt></td>
<td>The PHP configuration file.</td>
</tr>
<tr valign="top">
<td><tt>/opt/lampp/etc/proftpd.conf</tt></td>
<td>The ProFTPD configuration file. (since 0.9.5)</td>
</tr>
<tr valign="top">
<td><tt>/opt/lampp/phpmyadmin/config.inc.php</tt></td>
<td>The phpMyAdmin configuration file.</td>
</tr>
</tbody>
</table>
<h3>حذف XAMPP</h3>
<p>برای اینکار کافیست تا پوشه مربوطه را حذف کنید.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-rf</span> <span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>lampp</pre></div></div>

<h3>کمی شخصی سازی و اعمال سلیقه</h3>
<p>احتمالاْ تا حالا باید متوجه شده باشید که با این شرایط، ۲تا مشکل برامون پیش خواهد آمد.</p>
<ul>
<li> در دسترس نبودن DocumentRoot برای کاربران عادی</li>
<li> AutoStart نبودن اجرای XAMPP به هنگام بالا آمدن سیستم</li>
</ul>
<p>برای حل مشکل اول باید DocumentRoot را به پوشه‌ای در پوشه home خود انتقال دهیم. برای انجام این کار مراحل زیر را دنبال کنید.<br />
۱- ابتدا پوشه‌ای به نام public_html در پوشه home خود بسازید:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>mehdi<span style="color: #000000; font-weight: bold;">/</span>public_html</pre></div></div>

<p>۲- فایل httpd.conf را با دستور زیر در یک ادیتور متن (در اینجا kwrite) باز کرده و هر جا (۲ قسمت) که عبارت &#8220;/opt/lampp/htdocs&#8221; را مشاهده کردید با عبارت &#8220;/home/mehdi/public_html&#8221; تغییر دهید.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> kwrite <span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>lampp<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>httpd.conf</pre></div></div>

<p>و یا در صورت بروز خطا از دستور</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">kdesu kwrite <span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>lampp<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>httpd.conf</pre></div></div>

<p>۳- تمامی محتویات پوشه /opt/lamp/htdocs را به پوشه /home/mehdi/public_html کپی کنید.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #660033;">-R</span> <span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>lampp<span style="color: #000000; font-weight: bold;">/</span>htdocs<span style="color: #000000; font-weight: bold;">/*</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>mehdi<span style="color: #000000; font-weight: bold;">/</span>public_html<span style="color: #000000; font-weight: bold;">/</span></pre></div></div>

<p>مشکل اول حل شد، تنها کافیست برای اعمال تغییرات XAMPP را دوباره راه اندازی کنید.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>lammp<span style="color: #000000; font-weight: bold;">/</span>lammp restart</pre></div></div>

<p>همونطور که می‌دونید بطور پیشفرض تمامی برنامه‌هایی که در پوشه /etc/init.d قرار دارند به هنگام بالا امدن سیستم اجرا می‌شوند، پس برای حل مشکل دوم باید یک لینک از  /opt/lampp/lampp را در این پوشه قرار دهیم. برای اینکار از دستور زیر استفاده می‌کنیم:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>lampp<span style="color: #000000; font-weight: bold;">/</span>lampp <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>lampp</pre></div></div>

<p>حالا YAST را باز کرده، به قسمت system/system services (Runlevel) رفته و در ستون سرویس بروی lampp کلیک کرده و خاصیت Enabled آن را به yes تغییر می‌دهیم. با اینکار در  Runlevel3  و Runlevel5 (یعنی محیط گرافیکی و متنی، اگر اشتباه نکنم) lampp بطور خودکار به هنگام بالا آمدن سیستم اجرا و به هنگام خاموش شدن آن متوقف می شود.</p>
<p>پ‌ن: این مطلب رو با توجه به <a href="http://www.apachefriends.org/en/faq-xampp-linux.html" target="_blank">داکیومنت‌های رسمی</a> XAMPP for Linux  تهیه کردم و به کاربران محترم سایت <a title="وبسایت کاربران فرسی زیان openSUSE" href="http://opensuse.ir" target="_blank">openSUSE.ir</a> تقدیم می‌کنم.</p>
<img src="http://www.moshtaghi.ir/weblog/?ak_action=api_record_view&id=464&type=feed" alt="" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=hMy8U46H1QI:CvN5ZePVU8M:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?i=hMy8U46H1QI:CvN5ZePVU8M:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=hMy8U46H1QI:CvN5ZePVU8M:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=hMy8U46H1QI:CvN5ZePVU8M:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=hMy8U46H1QI:CvN5ZePVU8M:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?i=hMy8U46H1QI:CvN5ZePVU8M:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=hMy8U46H1QI:CvN5ZePVU8M:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=hMy8U46H1QI:CvN5ZePVU8M:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=hMy8U46H1QI:CvN5ZePVU8M:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?i=hMy8U46H1QI:CvN5ZePVU8M:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Moshtaghi/~4/hMy8U46H1QI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://weblog.moshtaghi.ir/2009/10/installing-lamp-on-opensuse-using-xampp-for-linux/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://weblog.moshtaghi.ir/2009/10/installing-lamp-on-opensuse-using-xampp-for-linux/</feedburner:origLink></item>
		<item>
		<title>تابستان خود را چگونه گذراندید</title>
		<link>http://feedproxy.google.com/~r/Moshtaghi/~3/YVZqljSSmRo/</link>
		<comments>http://weblog.moshtaghi.ir/2009/10/how-survive-your-summer/#comments</comments>
		<pubDate>Mon, 05 Oct 2009 12:26:27 +0000</pubDate>
		<dc:creator>مهدی</dc:creator>
				<category><![CDATA[عمومی]]></category>
		<category><![CDATA[Daily]]></category>

		<guid isPermaLink="false">http://weblog.moshtaghi.ir/?p=456</guid>
		<description><![CDATA[این موضوعی بود که همه حدالقل یک بار براش انشا نوشتن! برای همین هیچ عنوانی مناسب‌تر از این پیدا نکردم. بریم سر اصل مطلب.
چند وقتی است که خودم رو درگیر چند کار همزمان کردم و به همین علت فرصت نشد تا پست نون و آب داری (چه برای خودم و چه سایرین) تهیه کنم.
داستان از ]]></description>
			<content:encoded><![CDATA[<blockquote><p>این موضوعی بود که همه حدالقل یک بار براش انشا نوشتن! برای همین هیچ عنوانی مناسب‌تر از این پیدا نکردم. بریم سر اصل مطلب.</p></blockquote>
<p>چند وقتی است که خودم رو درگیر چند کار همزمان کردم و به همین علت فرصت نشد تا پست نون و آب داری (چه برای خودم و چه سایرین) تهیه کنم.<br />
داستان از این قرار است که، بعد از عید نوروز برنامه‌های زیادی برای تابستان ریخته بودم از قبیل مسلط شدن بر سیمفونی، وردپرس و توابع واقعاْ زیادش، لینوکس و مخصوصاْ  openSUSE  و البته مقداری آشنایی با QT که متاسفانه بدلیل مشغله‌هایی که برام پیش اومد تنها تونستم به ۲تا برسم که البته یکی هم دست و پا شکسته! (بگو ماشالله)<br />
خوشبختانه مشغله‌هام در رابطه با wordpress و راه اندازی چند وبسایت جزئی با این سیستم بود که به همین علت تا حد بسیار زیادی با توابع و سوراخ سمبه‌های آن آشنا شدم و سعی می‌کنم آنها را به مرور مستند کنم.</p>
<p>از طرفی دیگر همانطور که بعضی‌ها مطلع هستند، در کار راه‌اندازی <a title="وبسایت کاربران فرسی زیان openSUSE" href="http://opensuse.ir" target="_blank">وبسایت کاربران فارسی زبان OpenSUSE</a> هم شرکت کردم و به همین دلیل (خواسته یا نا‌خواسته) دانسته‌هایم را در رابطه با این <strong>توزیع بسیار  قدرتمند</strong>، <strong>ساده</strong> و <strong>دوست داشتنی</strong> افزایش دادم. (این ۳ صفت را واقعاْ جدی بگیرید)<span id="more-456"></span><br />
علاوه بر اینها ۲واحد کارآموزی هم داشتم که چند روزی است تمام شده و ماه عسل آن که در <a href="http://www.gu.ac.ir">دانشگاه جامع گلستان</a> سپری شد، یکی سیستم ثبت‌نام دانشجویان تازه وارد و دیگری کمک کردن در بهبود سیستم انتخاب واحد (رفع مشکل دروس هم نیاز و پیش نیاز) دانشگاه که بر مبنای سیستم انتخاب واحد <a href="http://www.um.ac.ir">دانشگاه فردوسی مشهد</a> پایه گذاری شده بود، می باشد.<br />
استاد راهنمام (آقای مهندس مهدی یعقوبی)، یک عدد ASP.Net کار پایبند به اصول Microsoft است که البته اینطور که از ظواهر امر بر میاد به هیچ وجه جای کار برای پیوستن ایشون به دنیای GNU-linux نیست!!! اما جای شکر باقی است که ضد php نیست و قدرت‌های php و فریم‌ورکهاش رو تا حدودی قبول داره.</p>
<blockquote><p>حالا این وسط تا یادم نرفته یک انتقاد به این مایکروسافتی‌ها بکنم و اون اینکه، اینا برای سنجیدن هر چیزی معیار رو روی محصولات مایکروسافت قرار می‌دهند که در بعضی زمینه‌ها اصلاْ کار درستی نیست! &#8211; مخصوصاْ اگر قرار باشد تا ASP.Net رو با php (نه فریم‌ورکهاش) مقایسه کرد!!!</p></blockquote>
<h3>در آخر باید از چند نفر تشکر کنم.</h3>
<p>اول از <a href="http://forum.opensuse.ir/index.php?action=profile;u=2">سینا سعیدی</a>، دوست جدید و پرکارم که مسئولیت مدیریت گروه openSUSE پارسی رو به عده گرفت و تونسته تا اینجای کار به من و خیلی‌های دیگه کمک‌های زیادی برسونه.<br />
دوم از <a title="Zoom Out" href="http://roozbehonline.com">روزبه شفیعی</a>، که طرح اولیه سایت openSUSE پارسی از ایشون بود و وسط‌های کار به من سپردن (که البته بعضی خوششون نیومد و دلیلش هم واقعاْ نفهمیدم) و علاوه بر اون راهنمایی‌های خوبی که از ابتدا تا بحال به بنده کردن.<br />
سوم هم از <a href="http://mambolearn.com">تیم مامبولرن</a> که در سطح خودشون توی پشتیبانی و تکنیک کار همتا ندارن و با <a href="http://mamboserver.biz">سرویس‌های بسیار خوب و با کیفیتشون</a> اسپانسر تیم شدن.</p>
<p>و البته گله (GELE) از کسایی (سایت‌ها و انجمن‌ها) که می‌تونستن توی شروع کار با مطالب و &#8230; دلگرمی و امید به تیم بدن که ندادن! و حرفی هم نیست!!!</p>
<p>پ‌ن: فعالیت‌های تیم openSUSEپارسی محدود به <a href="http://forum.opensuse.ir">انجمن</a> و ویکی و اخبار نمی‌شه، مطمئن باشید که بزودی شاهد فعالیت‌های دیگر این تیم هستید.<br />
پ‌ن: دارد، اما اینجا جاش نیست!!!</p>
<img src="http://www.moshtaghi.ir/weblog/?ak_action=api_record_view&id=456&type=feed" alt="" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=YVZqljSSmRo:OzjKUK7N4CM:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?i=YVZqljSSmRo:OzjKUK7N4CM:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=YVZqljSSmRo:OzjKUK7N4CM:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=YVZqljSSmRo:OzjKUK7N4CM:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=YVZqljSSmRo:OzjKUK7N4CM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?i=YVZqljSSmRo:OzjKUK7N4CM:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=YVZqljSSmRo:OzjKUK7N4CM:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=YVZqljSSmRo:OzjKUK7N4CM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=YVZqljSSmRo:OzjKUK7N4CM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?i=YVZqljSSmRo:OzjKUK7N4CM:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Moshtaghi/~4/YVZqljSSmRo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://weblog.moshtaghi.ir/2009/10/how-survive-your-summer/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://weblog.moshtaghi.ir/2009/10/how-survive-your-summer/</feedburner:origLink></item>
		<item><title>Links for 2009-09-27 [del.icio.us]</title><link>http://feedproxy.google.com/~r/Moshtaghi/~3/QpyH4q9siZs/mehdimm</link><pubDate>Mon, 28 Sep 2009 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/mehdimm#2009-09-27</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.symfony-project.org/blog/2009/09/27/symfony-1-2-9-is-ready-to-use"&gt;Blog | symfony 1.2.9 is ready to use | symfony | Web PHP Framework&lt;/a&gt;&lt;br/&gt;
نسخه ۱.۲.۹ سیمفونی هم اماده شد. توجه به این نکته که پشتیبانی از  ۱.۲  کم‌کم داره به اخراش می‌رسه و ملت باید به فکر ارتقا به ۱.۳ باشن&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/Moshtaghi/~4/QpyH4q9siZs" height="1" width="1"/&gt;</description><feedburner:origLink>http://del.icio.us/mehdimm#2009-09-27</feedburner:origLink></item><item><title>Links for 2009-09-24 [del.icio.us]</title><link>http://feedproxy.google.com/~r/Moshtaghi/~3/fX2DPSJniSo/mehdimm</link><pubDate>Fri, 25 Sep 2009 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/mehdimm#2009-09-24</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.catswhocode.com/blog/10-extremely-useful-php-classes"&gt;10+ extremely useful PHP classes&lt;/a&gt;&lt;br/&gt;
چند کلاس به شدت پرکاربرد برای PHP&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/Moshtaghi/~4/fX2DPSJniSo" height="1" width="1"/&gt;</description><feedburner:origLink>http://del.icio.us/mehdimm#2009-09-24</feedburner:origLink></item><item><title>Links for 2009-09-21 [del.icio.us]</title><link>http://feedproxy.google.com/~r/Moshtaghi/~3/okQcjLKm89g/mehdimm</link><pubDate>Tue, 22 Sep 2009 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/mehdimm#2009-09-21</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://components.symfony-project.org/templating/"&gt;Symfony Templating - Simple yet powerful templating framework&lt;/a&gt;&lt;br/&gt;
سیستم قالب سیمفونی سیستمی‌ است که تمامی ابزارهای مورد نیاز برای ایجاد سیستم قالب را ایجاد می‌کند&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/Moshtaghi/~4/okQcjLKm89g" height="1" width="1"/&gt;</description><feedburner:origLink>http://del.icio.us/mehdimm#2009-09-21</feedburner:origLink></item><item><title>Links for 2009-09-19 [del.icio.us]</title><link>http://feedproxy.google.com/~r/Moshtaghi/~3/s93oZgNWJNg/mehdimm</link><pubDate>Sun, 20 Sep 2009 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/mehdimm#2009-09-19</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.itnotes.info/archives/91#more-91"&gt;&amp;#1570;&amp;#1605;&amp;#1608;&amp;#1586;&amp;#1588; &amp;#1606;&amp;#1605;&amp;#1575;&amp;#1740;&amp;#1588; &amp;#1578;&amp;#1589;&amp;#1575;&amp;#1608;&amp;#1740;&amp;#1585; &amp;#1605;&amp;#1587;&amp;#1578;&amp;#1602;&amp;#1604; &amp;#1575;&amp;#1586; &amp;#1601;&amp;#1575;&amp;#1740;&amp;#1604; &amp;#1578;&amp;#1589;&amp;#1608;&amp;#1740;&amp;#1585;&amp;#1740; &amp;#1583;&amp;#1585; PHP&lt;/a&gt;&lt;br/&gt;
از وبلاگ بهرام بیگی&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/Moshtaghi/~4/s93oZgNWJNg" height="1" width="1"/&gt;</description><feedburner:origLink>http://del.icio.us/mehdimm#2009-09-19</feedburner:origLink></item><item><title>Links for 2009-09-16 [del.icio.us]</title><link>http://feedproxy.google.com/~r/Moshtaghi/~3/iOfLFArXZmI/mehdimm</link><pubDate>Thu, 17 Sep 2009 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/mehdimm#2009-09-16</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.symfony-project.org/blog/2009/09/05/firesymfony-debugging-symfony-applications-inside-firebug"&gt;FireSymfony&lt;/a&gt;&lt;br/&gt;
دیباگ برنامه‌های سیمفونی در کنار فایر فاکس و Firebug.&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/Moshtaghi/~4/iOfLFArXZmI" height="1" width="1"/&gt;</description><feedburner:origLink>http://del.icio.us/mehdimm#2009-09-16</feedburner:origLink></item><item>
		<title>مودل فارسی</title>
		<link>http://feedproxy.google.com/~r/Moshtaghi/~3/mX5TwbZijyQ/</link>
		<comments>http://weblog.moshtaghi.ir/2009/08/persian-moodle/#comments</comments>
		<pubDate>Sun, 02 Aug 2009 21:40:35 +0000</pubDate>
		<dc:creator>مهدی</dc:creator>
				<category><![CDATA[ابزار طراحی وب]]></category>
		<category><![CDATA[elearning]]></category>
		<category><![CDATA[moodle]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[persian]]></category>
		<category><![CDATA[solar calendar]]></category>

		<guid isPermaLink="false">http://www.moshtaghi.ir/weblog/?p=446</guid>
		<description><![CDATA[پیش نوشته:
مودل (Moodle) برترین نرم‌افزار موجود برای آموزش از راه دور (آموزش آنلاین) است که در بیش از ۵۰٬۰۰۰ دانشگاه و مؤسسهٔ آموزشی در سراسر جهان مورد استفاده قرار گرفته.

چندی پیش (یعنی خیلی وقت پیش) به دنبال درج تقویم شمسی در مودل بودم که به کد ناقصی (بعضی از فایل‌ها جا افتاده بودند) از آقای ]]></description>
			<content:encoded><![CDATA[<p>پیش نوشته:</p>
<blockquote><p>مودل (Moodle) برترین نرم‌افزار موجود برای آموزش از راه دور (آموزش آنلاین) است که در بیش از ۵۰٬۰۰۰ دانشگاه و مؤسسهٔ آموزشی در سراسر جهان مورد استفاده قرار گرفته.</p>
</blockquote>
<p>چندی پیش (<a href="http://www.mambolearn.com/forum/index.php?topic=16294.0" target="_blank">یعنی خیلی وقت پیش</a>) به دنبال درج تقویم شمسی در مودل بودم که به کد ناقصی (بعضی از فایل‌ها جا افتاده بودند) از آقای حسین زلفی( <a href="http://sourceforge.net/projects/moodlecalendar/" target="_blank">ایشان کد رو share کرده بودند</a>)، اما به تازگی با فعالیت‌های خوبی در<a href="http://moodle.org/forums/" target="_blank">انجمن فارسی مودل</a> توسط برخی از دوستان به خصوص <a href="http://rezaie.info/" target="_blank">آقای شمیم رضایی</a> مواجه شدم. ایشان تقویمی ارایه کرده‌اند که معماری تقویم به نحوی است که  نه تنها تقویم شمسی، بلکه تقویم‌های دیگر هم به راحتی قابل اضافه شدن هست. <a href="http://tracker.moodle.org/browse/MDL-18375" target="_blank">اینجا می‌توانید مشاهده کنید</a></p>
<p><span id="more-446"></span></p>
<p>اگر به توسعه فعالیت‌های متن باز به ویژه در زبان فارسی و البته مودل علاقه‌مند هستید برای  اضافه شدن این قابلیت در بستهٔ استاندارد مودل، خواهش می‌کنم به <a href="http://tracker.moodle.org/browse/MDL-18375" target="_blank">نشانی بالا</a> بروید و به این قابلیت رأی (vote) بدهید. برای اینکه بتونید این کار رو بکنید، باید در سیستم tracker مودل عضو شده باشید.</p>
<p>همانطور که می‌دانید در حال حاضر اشخاص و شرکت‌هایی هستند که این کد یا کدهای مشابه را بر روی CD کپی کرده و در ازای دریافت ۲۵۰ هزار تومان ، CD مذبور را به رایگان! با پیک موتوری برای دیگران می‌فرستند، و یا برای نصب مودل با تقویم فارسی مطالبه ۲ میلیون تومان را می‌کنند. این افراد  وجود این قابلیت و همچنین قراردادن ترجمه زبان شیرین فارسی در خود مودل را تهدیدی برای آن آب باریکهٔ حلال‌تر از شیر مادر!!! خود می‌بینند که ترجیح می‌دهند این ویژ‌گی‌ها به صورت پیش‌فرض در مودل وجود نداشته باشد.</p>
<p>درخواست اضافه شدن ویژگی‌های جدید معمولاً بر اساس تعداد افرادی که نسبت به آن ویژگی‌ها ابراز علاقه می‌کنند مورد بررسی قرار می‌گیرد.</p>
<p><a href="http://tracker.moodle.org/browse/MDL?report=com.atlassian.jira.plugin.system.project%3Apopularissues-panel" target="_blank">در این آدرس زیر می‌تواننید قابلیت‌های محبوب را به ترتیب ببینید</a></p>
<p>در ستون سمت چپ تعداد رأی های هر کدام را می‌توانید ببینید. حالا خودتان این عددها را با ۱۴ رأیی که تاریخ شمسی تا الان آورده مقایسه کنید.</p>
<p>پ‌ن:خواهش می‌کنم این مطلب رو به گوش سایرین هم برسونید، با توئیت، فرفر و یا هر چیزی که صلاح می‌دانید.</p>
<p>بروز رسانی:تو این ۲ روزی که این پست رو دادم، رتبه تقویم شمسی از ۱۴ به ۲۳ رسید. ممنونم از همه که کمک کردند.</p>
<img src="http://www.moshtaghi.ir/weblog/?ak_action=api_record_view&id=446&type=feed" alt="" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=mX5TwbZijyQ:pbtMqv5N8I4:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?i=mX5TwbZijyQ:pbtMqv5N8I4:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=mX5TwbZijyQ:pbtMqv5N8I4:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=mX5TwbZijyQ:pbtMqv5N8I4:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=mX5TwbZijyQ:pbtMqv5N8I4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?i=mX5TwbZijyQ:pbtMqv5N8I4:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=mX5TwbZijyQ:pbtMqv5N8I4:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=mX5TwbZijyQ:pbtMqv5N8I4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=mX5TwbZijyQ:pbtMqv5N8I4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?i=mX5TwbZijyQ:pbtMqv5N8I4:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Moshtaghi/~4/mX5TwbZijyQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://weblog.moshtaghi.ir/2009/08/persian-moodle/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		<feedburner:origLink>http://weblog.moshtaghi.ir/2009/08/persian-moodle/</feedburner:origLink></item>
		<item>
		<title>کتاب مرجع برای سیمفونی</title>
		<link>http://feedproxy.google.com/~r/Moshtaghi/~3/Gw9KvOq-Q5A/</link>
		<comments>http://weblog.moshtaghi.ir/2009/07/symfony-reference-book/#comments</comments>
		<pubDate>Fri, 24 Jul 2009 22:04:55 +0000</pubDate>
		<dc:creator>مهدی</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[کتاب الکترونیکی]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://www.moshtaghi.ir/weblog/?p=430</guid>
		<description><![CDATA[اگر خواننده ثابت وبلاگ من باشید به احتمال زیاد می‌دانید که Symfony  یک فریم‌ورک قدرتمند برای توسعه وب است. فریم‌ورکی که به نظر من سختی کار را تا حدی کم می‌کند که طراحی اولیه جداول برنامه مشکل‌ترین و وقت‌گیر ترین قسمت توسعه برنامه می شود. (که آن هم به برکت Eclipse و پلاگین‌هایش و فرمت ]]></description>
			<content:encoded><![CDATA[<p>اگر خواننده ثابت وبلاگ من باشید به احتمال زیاد می‌دانید که Symfony  یک فریم‌ورک قدرتمند برای توسعه وب است. فریم‌ورکی که به نظر من سختی کار را تا حدی کم می‌کند که طراحی اولیه جداول برنامه مشکل‌ترین و وقت‌گیر ترین قسمت توسعه برنامه می شود. (که آن هم به برکت <a href="http://eclipse.org/" target="_blank">Eclipse</a> و <a href="http://sfdt.borox.ch/" target="_blank">پلاگین‌هایش</a> و فرمت YAML تا حد زیادی راحت شده است)<br />
<img class="alignleft size-full wp-image-13" title="symfony_reference_mini" src="http://moshtaghi.ir/weblog/wp-content/uploads/2009/07/symfony_reference_mini.jpg" alt="symfony_reference_mini" width="220" height="275" /><br />
برای انجام دادن توسعه با این فریم‌ورک سخت‌ترین قسمت، یادگیری آن است که باز هم به برکت <a href="http://symfony-project.org/" target="_blank">سایت رسمی پروژه</a> بسیار راحت شده زیرا راه‌های مختلفی همچون خود آموز‌ها، فیلم‌ها و کتاب‌های زیادی را آماده کرده‌اند که در <a href="http://www.symfony-project.org/doc/1_2/" target="_blank">اینجا</a> می‌توانید ببینید. بنده هم چند وقتی است که علاقمند به یادگیری این فریم‌ورک شده‌ام و تا جایی که توانسته‌ام خودآموز Jobeet را ترجمه کرده‌ام و انشالله این کار را ادامه خواهم داد.</p>
<p>نکته اصلی اینجاست که برای شروع این خودآموز‌ها بسیار خوب هستند ولی وقتی که می‌خواهیم پروژه خودمان را انجام دهیم به مشکل بر می‌خوریم. زیرا احتمالاْ سوالاتی پیش می‌آید که جواب آنها در این خود‌آموز‌ها نیست و یا حدالقل بصورت واضح وجود ندارد.</p>
<p>اینجاست که جای خالی یک کتاب مرجع برای سیمفونی و پیکره‌بندی‌های آن حس می‌شود که باز هم سایت رسمی اینکار را انجام داده است و کتابی را تحت عنوان<em> «کتاب مرجع سیمفونی» که به لاتین «</em>The symfony Reference Book» می‌شود <a href="http://www.symfony-project.org/reference/1_2/en/" target="_blank">منتشر کرده است</a>.</p>
<h3>عنوان بخش‌های این کتاب عبارتند از:</h3>
<p><span id="more-430"></span></p>
<ul class="intro" style="text-align:left; direction:ltr;">
<li><a href="http://www.symfony-project.org/reference/1_2/en/01-Introduction" target="_blank">Introduction</a></li>
<li><a href="http://www.symfony-project.org/reference/1_2/en/02-YAML" target="_blank">The YAML Format</a></li>
<li><a href="http://www.symfony-project.org/reference/1_2/en/03-Configuration-Files-Principles" target="_blank">Configuration File Principles</a></li>
<li><a href="http://www.symfony-project.org/reference/1_2/en/04-Settings" target="_blank">The settings.yml Configuration File</a></li>
<li><a href="http://www.symfony-project.org/reference/1_2/en/05-Factories" target="_blank">The factories.yml Configuration File</a></li>
<li><a href="http://www.symfony-project.org/reference/1_2/en/06-Admin-Generator" target="_blank">The generator.yml Configuration File</a></li>
<li><a href="http://www.symfony-project.org/reference/1_2/en/07-Databases" target="_blank">The databases.yml Configuration File</a></li>
<li><a href="http://www.symfony-project.org/reference/1_2/en/08-Security" target="_blank">The security.yml Configuration File</a></li>
<li><a href="http://www.symfony-project.org/reference/1_2/en/09-Cache" target="_blank">The cache.yml Configuration File</a></li>
<li><a href="http://www.symfony-project.org/reference/1_2/en/10-Routing" target="_blank">The routing.yml Configuration File</a></li>
<li><a href="http://www.symfony-project.org/reference/1_2/en/11-App" target="_blank">The app.yml Configuration File</a></li>
<li><a href="http://www.symfony-project.org/reference/1_2/en/12-Filters" target="_blank">The filters.yml Configuration File</a></li>
<li><a href="http://www.symfony-project.org/reference/1_2/en/13-View" target="_blank">The view.yml Configuration File</a></li>
<li><a href="http://www.symfony-project.org/reference/1_2/en/14-Other-Configuration-Files" target="_blank">Other Configuration Files</a></li>
<li><a href="http://www.symfony-project.org/reference/1_2/en/15-Events" target="_blank">Events</a></li>
<li><a href="http://www.symfony-project.org/reference/1_2/en/16-Tasks" target="_blank">Tasks</a></li>
<li><a href="http://www.symfony-project.org/reference/1_2/en/A-License" target="_blank">Appendix A &#8211; License</a></li>
</ul>
<p>همچنین می‌تونید نسخه PDF این کتاب رو با حجم نا قابل 1.2Mb از <a href="http://www.symfony-project.org/get/pdf/reference-1.2-en.pdf">اینجا</a> دریافت کنید.</p>
<img src="http://www.moshtaghi.ir/weblog/?ak_action=api_record_view&id=430&type=feed" alt="" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=Gw9KvOq-Q5A:T4663I267UM:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?i=Gw9KvOq-Q5A:T4663I267UM:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=Gw9KvOq-Q5A:T4663I267UM:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=Gw9KvOq-Q5A:T4663I267UM:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=Gw9KvOq-Q5A:T4663I267UM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?i=Gw9KvOq-Q5A:T4663I267UM:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=Gw9KvOq-Q5A:T4663I267UM:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=Gw9KvOq-Q5A:T4663I267UM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=Gw9KvOq-Q5A:T4663I267UM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?i=Gw9KvOq-Q5A:T4663I267UM:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Moshtaghi/~4/Gw9KvOq-Q5A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://weblog.moshtaghi.ir/2009/07/symfony-reference-book/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://weblog.moshtaghi.ir/2009/07/symfony-reference-book/</feedburner:origLink></item>
		<item>
		<title>استفاده از وردپرس به عنوان یک فریم‌ورک PHP</title>
		<link>http://feedproxy.google.com/~r/Moshtaghi/~3/sbyTqpAk7Lo/</link>
		<comments>http://weblog.moshtaghi.ir/2009/07/use-wordpress-as-a-php-framework/#comments</comments>
		<pubDate>Thu, 23 Jul 2009 20:52:41 +0000</pubDate>
		<dc:creator>مهدی</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[وردپرس]]></category>
		<category><![CDATA[Customization]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[resource]]></category>

		<guid isPermaLink="false">http://www.moshtaghi.ir/weblog/?p=422</guid>
		<description><![CDATA[وردپرس یک راه حل عالی برای راه اندازی وبلاگ است که از پس هر کاری بر می‌آید. قدرت باور نکردنی این پلتفرم امکان توسعه یک وبسایت شخصی را در کمترین زمان و کمترین زحمت ایجاد می‌کند. (نکته‌ای بسیار مهم در طراحی و توسعه وب)
در این مقاله می‌بینید که چگونه بوسیله ورد‌پرس، وبسایتی حرفه ای ایجاد ]]></description>
			<content:encoded><![CDATA[<p><a title="وب‌سایت رسمی وردپرس" href="http://wordpress.org" target="_blank">وردپرس</a> یک راه حل عالی برای راه اندازی وبلاگ است که از پس هر کاری بر می‌آید. قدرت باور نکردنی این پلتفرم امکان توسعه یک وبسایت شخصی را در کمترین زمان و کمترین زحمت ایجاد می‌کند. (نکته‌ای بسیار مهم در طراحی و توسعه وب)<br />
در این مقاله می‌بینید که چگونه بوسیله ورد‌پرس، وبسایتی حرفه ای ایجاد کنید. تنها کافی است تا کمی HTML بدانید، در این صورت به ادامه مطلب توجه کنید.</p>
<h3>تمامی پلتفرم در یک صفحه PHP</h3>
<p>برای شروع اینکار ملزوماتی نیاز است همچون وردپرس نصب شده، کمی اطلاعات راجع به HTML که خیلی بهتر می‌شود اگر راجع به PHP هم بدانید و یک ادیتور HTML تا کدها را در آن ویرایش کنید. (برای این منظور Eclipse گزینه فوق‌العاده‌ای می باشد که <a title="انتخاب یک IDE مناسب php و سازگاری آن با symfony (قسمت اول)" href="http://www.moshtaghi.ir/weblog/2009/06/best-php-ide-and-compatible-with-symfony/">قبلا مورد بحث بوده است</a>) اما یک ادیتور ساده هم نیاز ما را رفع می‌کند.<br />
وردپرس روی صفحات PHP کار می‌کند، اما شمایی که اطلاعاتی راجع به PHP ندارید نگران نباشید زیرا برای هدف ما همان HTML کافی است.<br />
<span id="more-422"></span><br />
فایلی با نام test.php ایجاد کنید و آن را در پوشه ریشه وبلاگ خود قرار دهید. (همان پوشه‌ای که فایل‌هایی از قبیل wp-config.php، wp-ligin.php و یا … در آن قرار دارند)<br />
حالا قطعه کد زیر را در خط اول فایل خود کپی کنید</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span>’wp<span style="color: #339933;">-</span>blog<span style="color: #339933;">-</span><span style="color: #990000;">header</span><span style="color: #339933;">.</span>php’<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>با همین قطعه کد ساده تمامی ویژگی‌ها، دستورات و توابع وردپرس را در این صفحه فعال می‌سازید! برای آزمایش آن می‌توانید کدهای زیر را به فایل خود اضافه کنید.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span>’wp<span style="color: #339933;">-</span>blog<span style="color: #339933;">-</span><span style="color: #990000;">header</span><span style="color: #339933;">.</span>php’<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;html&gt;
&lt;body&gt;
&lt;div class=”name”&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> bloginfo<span style="color: #009900;">&#40;</span>’name’<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/div&gt;
&lt;div class=”description”&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> bloginfo<span style="color: #009900;">&#40;</span>’description’<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</pre></div></div>

<p>سپس فایل را  ذخیره کرده و آن را در مرورگر خود مشاهده کنید. برای مثال اگر آدرس وب‌سایت شما http://moshtaghi.ir باشد، می‌توانید صفحه مذکور را در آدرس http://moshtaghi.ir/test.php مشاهده کنید.<br />
در این صفحه شما می‌توانید نام و توضیحات مربوط به وب‌سایت خود را که از پایگاه داده استخراج شده‌اند را مشاهده کنید.</p>
<h3>نوشتن یک صفحه وب کامل در ۱۰ ثانیه</h3>
<p>اینکه صفحات ایجاد شده به این روش از نظر ظاهری با قالب اصلی وب‌سایت سازگاری داشته باشند خیلی مهم است، اما پیاده سازی قالب فعلی وب‌سایت در قالب HTML کار راحتی نیست و البته قرار هم نیست تا آن را دوباره ایجاد کنیم!<br />
برای اینکار تنها کافیست تا کد زیر را در صفحه مورد نظر کپی کرده و ذخیره کنیم.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span>’wp<span style="color: #339933;">-</span>blog<span style="color: #339933;">-</span><span style="color: #990000;">header</span><span style="color: #339933;">.</span>php’<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;?php</span> get_header<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;!– Put here your personal contents in HTML or PHP –&gt;
…
&lt;!– End personal contents –&gt;
<span style="color: #000000; font-weight: bold;">&lt;?php</span> get_footer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>در این صفحه با استفاده از توابع get_header و get_footer می‌توانید هیدر و فوتر وب‌سایت (قالب فعلی) خود را بکار بگیرید، پس تنها کافیست تا محتوای اصلی صفحه را ایجاد کرده و فایل را ذخیره کنید.<br />
حتی می‌توانید ساید‌بار فعلی قالب را هم به این صورت و با استفاده از تابع get_sidebar بکار بگیرید.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span>’wp<span style="color: #339933;">-</span>blog<span style="color: #339933;">-</span><span style="color: #990000;">header</span><span style="color: #339933;">.</span>php’<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;?php</span> get_header<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;!– Put here your personal contents in HTML or PHP –&gt;
…
&lt;!– End personal contents –&gt;
<span style="color: #000000; font-weight: bold;">&lt;?php</span> get_sidebar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;?php</span> get_footer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>اگر راجع به توابع وردپرس نمی‌دونید و یا دوست دارید بیشتر بدونید به <a title="مرجع فارسی توابع وردپرس برای طراحان وب" href="http://gonahkar.com/archives/1383/10/08/wordpress-persian-reference/" target="_blank">این آدرس</a> و <a href="http://codex.wordpress.org/Main_Page" target="_self">این آدرس</a> مراجعه کنید که اولی وبلاگ گناهکار عزیز و بعدی هم داکیومنشن‌های اصلی وردپرس می‌باشند.<br />
کار خیلی راحت بود ولی سوالی شاید برای بعضی‌ها پیش آمده باشد که:</p>
<h3>چرا و چه هنگام باید برای ایجاد صفحه وب از وردپرس استفاده کنیم؟</h3>
<p>برخی موارد را می‌توان بوسیله یک تابع وردپرس و یا یک افزونه در صفحه‌ای بکار برد، بنابراین هنگامی که شما فایل wp-blog-header.php را در صفحه خود include می‌کنید، می‌توانید از وردپرس به عنوان یک فریم‌ورک عالی برای توسعه وب‌سایت خود استفاده کنید.<br />
سوالی که پیش می‌آید این است که «چرا از برگه‌های ساده وردپرس بهمراه قالبی خاص استفاده نکنیم؟»<br />
بله، می‌توان اینکار را کرد و البته در برخی موارد بهترین راه حل است. اما بزرگترین مزیت این سیستم، داشتن کنترل کامل بروی صفحه است. می‌توانید تنها افزونه‌، اسکریپتی خاص و یا هر آنچه به ذهنتان می‌رسد را نمایش دهید. می‌شود به کل سایدبار را حذف کرد و یا جای ان را تغییر داد و … . می شود اینها را با استفاده از برگه‌های وردپرس هم انجام داد اما باید سختی‌ها و پیچیدگی‌های زیادی را متحمل شد.</p>
<h3>چه کارهایی را می‌توان با این تکنیک انجام داد؟</h3>
<p>هر کاری که بخواهید را می‌توانید با این شیوه انجام دهید، اما معمول‌ترین و عقلانی‌ترین آنها عبارتند از:</p>
<ul>
<li> هنگامی که وبلاگی دارید و می‌خواهید وب‌سایتی را کنار ان داشته باشید و به آن بسط دهید.</li>
<li> هنگامی که از یک قالب وردپرسی خوشتان آمده باشد و بخواهید برای وب‌سایت خود از آن استفاده کنید.</li>
<li> هنگامی که بخواهید تبلیغی را برای نتایج جستجو روی یک صفحه خود اعمال کنید.</li>
<li> هنگامی که بخواهید یک <strong>Application</strong> کوچک را در کنار وبلاگ خود اضافه کنید.</li>
</ul>
<p>و در نهایت به شما پیشنهاد می‌کنم حتماْ از این ویژگی عالی که وردپرس برای ما به ارمغان اورده است استفاده کنید تا قدرت سرشار فریم‌ورکی همچون ورد‌پرس را شاهد باشید و اگر ایده‌ای خاص در زمینه کاربرد این شیوه دارید <strong>حتماْ با من در میان بگذارید</strong>. ممنون می‌شم.</p>
<p>منبع این مطلب <a href="http://www.problogdesign.com/wordpress/use-wordpress-as-a-php-framework-for-your-static-html-pages/">اینجاس</a></p>
<p><strong>پ‌ن: </strong>امروزه طراحی و توسعه وب بازار مناسب و تقریباْ دست نخورده‌ای دارد که هر کس می‌تواند به آن وارد شود، اما لازمه آن سرعت بالا در یادگیری و اجرا می‌باشد. با سرعت بالا در یادگیری کاری ندارم اما تنها راه رسیدن به سرعت بالا در اجرا و پیاده‌سازی استفاده از فریم‌ورک‌ها می‌باشد. حال این فریم‌ورک به سادگی WP باشد یا به عظمت <a href="http://symfony-project.org/">Symfony</a>، چه فریم‌ورکی برای PHP باشد، یا <a href="http://jquery.com" target="_blank">فریم‌ورکی برای JS</a> و یا حتی CSS.</p>
<img src="http://www.moshtaghi.ir/weblog/?ak_action=api_record_view&id=422&type=feed" alt="" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=sbyTqpAk7Lo:Tkn1yHGK-pQ:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?i=sbyTqpAk7Lo:Tkn1yHGK-pQ:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=sbyTqpAk7Lo:Tkn1yHGK-pQ:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=sbyTqpAk7Lo:Tkn1yHGK-pQ:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=sbyTqpAk7Lo:Tkn1yHGK-pQ:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?i=sbyTqpAk7Lo:Tkn1yHGK-pQ:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=sbyTqpAk7Lo:Tkn1yHGK-pQ:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=sbyTqpAk7Lo:Tkn1yHGK-pQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=sbyTqpAk7Lo:Tkn1yHGK-pQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?i=sbyTqpAk7Lo:Tkn1yHGK-pQ:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Moshtaghi/~4/sbyTqpAk7Lo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://weblog.moshtaghi.ir/2009/07/use-wordpress-as-a-php-framework/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://weblog.moshtaghi.ir/2009/07/use-wordpress-as-a-php-framework/</feedburner:origLink></item>
		<item>
		<title>سیمفونی فینالیست شد</title>
		<link>http://feedproxy.google.com/~r/Moshtaghi/~3/vPakZSnef1c/</link>
		<comments>http://weblog.moshtaghi.ir/2009/06/symfony-were-finalist/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 12:47:30 +0000</pubDate>
		<dc:creator>مهدی</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[اینترنت]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Sourceforge]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://www.moshtaghi.ir/weblog/?p=417</guid>
		<description><![CDATA[چند هفته پیش در سایت Sourceforge حرکتی مبنی بر انتخاب بهترین پروژه‌های کدباز در رده‌های مختلف به راه افتاد. توسعه دهندگان و کاربران زیادی در این انتخاب (شاید هم رقابت انتخاباتی!!!) شرکت کردند، سیمفونی نیز یکی از این پروژه‌های کدباز بود که با پشتیبانی و کمک کاربرانش توانست در ۳ گروه فینالیست باشد که این ]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-570" title="cca_logo" src="http://moshtaghi.ir/weblog/wp-content/uploads/2009/06/cca_logo.png" alt="cca_logo" width="205" height="323" />چند هفته پیش در سایت Sourceforge حرکتی مبنی بر انتخاب بهترین پروژه‌های کدباز در رده‌های مختلف به راه افتاد. توسعه دهندگان و کاربران زیادی در این انتخاب (شاید هم رقابت انتخاباتی!!!) شرکت کردند، سیمفونی نیز یکی از این پروژه‌های کدباز بود که با پشتیبانی و کمک کاربرانش توانست در ۳ گروه فینالیست باشد که این گروه‌ها عبارتند از:</p>
<ul class="intro">
<li>بهترین پروژه!</li>
<li>بهترین ابزار یا برنامه برای توسعه دهندگان</li>
<li>بهترین پروژه برای کسب و کار</li>
</ul>
<p>شما هم می‌توانید برای کمک، <a href="http://sourceforge.net/community/cca09/vote/" target="_blank">در سایت Sourceforge به سیمفونی رای دهید</a> و سپس با نوشتن مطالبی مرتبط با سیمفونی در وبلاگ خود، توییتر و یا هرجایی که خودتان می‌دانید در معرفی و گسترش این فریم‌ورک قدرتمند سهیم باشید. (حدالقل <a href="http://twitter.com/fabpot/statuses/2283369961" target="_blank">این را دوباره توییت کنید</a>، تو رو خدا!!!) <img src='http://www.moshtaghi.ir/weblog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p><a href="http://www.symfony-project.org/blog/2009/06/22/sourceforge-community-choice-awards-symfony-is-a-finalist" target="_blank">این مطلب در وبلاگ سیمفونی</a></p>
<img src="http://www.moshtaghi.ir/weblog/?ak_action=api_record_view&id=417&type=feed" alt="" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=vPakZSnef1c:MLGkfTGy91Q:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?i=vPakZSnef1c:MLGkfTGy91Q:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=vPakZSnef1c:MLGkfTGy91Q:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=vPakZSnef1c:MLGkfTGy91Q:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=vPakZSnef1c:MLGkfTGy91Q:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?i=vPakZSnef1c:MLGkfTGy91Q:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=vPakZSnef1c:MLGkfTGy91Q:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=vPakZSnef1c:MLGkfTGy91Q:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=vPakZSnef1c:MLGkfTGy91Q:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?i=vPakZSnef1c:MLGkfTGy91Q:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Moshtaghi/~4/vPakZSnef1c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://weblog.moshtaghi.ir/2009/06/symfony-were-finalist/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://weblog.moshtaghi.ir/2009/06/symfony-were-finalist/</feedburner:origLink></item>
		<item>
		<title>گسترش پشتیبانی از زبان فارسی در وب</title>
		<link>http://feedproxy.google.com/~r/Moshtaghi/~3/e1iqB4KTwlg/</link>
		<comments>http://weblog.moshtaghi.ir/2009/06/english-language-development-support-on-the-web/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 21:16:58 +0000</pubDate>
		<dc:creator>مهدی</dc:creator>
				<category><![CDATA[اینترنت]]></category>
		<category><![CDATA[Daily]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[persian]]></category>
		<category><![CDATA[policy]]></category>
		<category><![CDATA[translate]]></category>

		<guid isPermaLink="false">http://www.moshtaghi.ir/weblog/?p=406</guid>
		<description><![CDATA[بخاطر شروع امتحانات پایان ترم و این حرفا، با خودم قرار گذاشته بودم که وبلاگم رو تا پایان امتحانات بروز نکنم و حتی ایمیل‌ها و گوگل ریدرم را روزی ۱ بار بیشتر چک نکنم. ولی کاش اینکار رو از فردا شروع می‌کردم.
امشب وقتی بعد از ۲۴ ساعت به گوگل ریدر سر زدم با حجم بالایی ]]></description>
			<content:encoded><![CDATA[<p>بخاطر شروع امتحانات پایان ترم و این حرفا، با خودم قرار گذاشته بودم که وبلاگم رو تا پایان امتحانات بروز نکنم و حتی ایمیل‌ها و گوگل ریدرم را روزی ۱ بار بیشتر چک نکنم. ولی کاش اینکار رو از فردا شروع می‌کردم.<br />
امشب وقتی بعد از ۲۴ ساعت به گوگل ریدر سر زدم با حجم بالایی از بروز رسانی‌ها مواجه شدم و از اونجایی که عادت دارم اول مطالب فارسی رو مطالعه کنم سراغ پست زهرا خانم در وبلاگ <a href="http://inside.raoros.com/" target="_blank">درون</a> رفتم و دیدم که <a href="http://translate.google.com/translate?sl=auto&amp;tl=en&amp;u=http%3A%2F%2Finside.raoros.com%2F%3Fp%3D47" target="_blank">انگلیسی نوشته</a>!!! چند تا مطلب دیگه هم همه به زبان انگلیسی!!! یکم که به نوشته‌ها دقت کردم دیدم همه با استفاده از<a href="http://translate.google.com" target="_blank"> سرویس ترجمه خودکار گوگل</a> به زبان انگلیسی ترجمه شدن. کلی ذوق مرگ شدم و پیش خودم گفتم که خدا رو شکر، ۱۸ قسمت باقی مونده jobeet رو ترجمه نمی‌کنم دیگه!!!</p>
<h3>اما نکته مهم</h3>
<p>نکته مهم اینجا بود که این سرویس هنوز در مرحله آزمایشی به سر می‌بره و قادر به ترجمه درستی نیست، می‌گید نه!!! مشاهده کنید:<br />
<strong>این یک قسمت از متن اصلی قسمت چهارم jobeet به زبان انگلیسی است:</strong></p>
<blockquote style="text-align:left;"><p>If you have a closer look at the mockups, you will notice that much of each page looks the same. You already know that code duplication is bad, whether we are talking about HTML or PHP code, so we need to find a way to prevent these common view elements from resulting in code duplication.</p></blockquote>
<p><span id="more-406"></span><br />
<strong>این ترجمه‌ای است که گوگل انجام داده است:</strong></p>
<blockquote><p>اگر شما یک نگاه نزدیک در mockups ، شما متوجه خواهد شد که بسیار از هر صفحه به همان رسد. شما از قبل می دانیم که تکرار کد بد است ، چه ما به صحبت در مورد نسخه متنی یا کد PHP ، بنابراین ما باید برای پیدا کردن راهی برای جلوگیری از این عناصر مشترک را از نظر منجر به تکرار کد.</p></blockquote>
<p><strong>اینم ترجمه بنده:</strong></p>
<blockquote><p>اگر به یک مدل نگاهی کنید، به شباهت اکثر این صفحات به هم پی می‌برید و همچنین می‌دانید که تکرار کد کار درستی نیست، چه کدهای HTML و چه PHP. بنابراین به راهی نیاز داریم تا از این کپی برداری‌ها جلوگیری شود.</p></blockquote>
<p>پس به این نتیجه می‌رسیم که فعلاْ امکانات این سرویس برای درک مطلب می‌تواند مفید باشد و نه برای نوشتن و &#8230; زیرا به قدری احتیاج به ویرایش و بازنویسی دارد که بهتر است از نو به ترجمه آن پرداخت. (به زبون خودمون به مسیبتش نمی‌ارزه!!!)</p>
<h3>اما نتیجه اخلاقی بسیار مهم</h3>
<p>گوگل خود به آزمایشی بودن این ترجمه‌ها اشاره کرده و از کاربران درخواست کرده تا در صورت مناسب نبودن ترجمه با کلیک بروی <strong>«بهبود ترجمه»</strong> به تکمیل شدن و بهبود کیفیت این سیستم کمک کنند.<br />
پس از این پس بنده تمام ترجمه‌هام رو با کمک گوگل انجام می‌دم و تمامی ترجمه‌های نا‌مناسبش هم بهش اعلام می‌کنم. از تمامی دوستانی هم که این مطلب رو می‌خونند درخواست می‌کنم تا به بهبود کیفیت این سرویس کمک کنند. پس باقی قسمت‌های jobeet رو به کمک گوگل زود به زود آپ می‌کنم.(البته بعد ار امتحانات)</p>
<h3>در آخر فکرهایی که عجیب نیست که به سر هر کسی بزنه!!!</h3>
<p>همین امروز <a href="http://www.facebook.com/" target="_blank">facebook</a> هم پشتیبانی از زبان فارسی رو شروع کرد، البته من درست اطلاع ندارم که اینم کار بچه‌های خودمون  هست یا نه (مثل سایت <a href="http://friendfeed.com/" target="_blank">Friendfeed</a>) اما فکر می‌کنم این قضیه پشتیبانی از زبان فارسی اونم قبل از موعود و با این عجله اونم با این شرایط پیش اومده اخیر توی ایران بی‌ربط با مسایل سیاسی نباشه!!! شایدم باشه!!! در هر صورت به قول معروف بیننده باید فکرشو کار بندازه که مصرف کننده خوبی باشه یا نه!!! (کلی حرف داشتم که چون بلد نبودم بنویسم اینجوری بیان کردم، امید‌وارم برداشت‌های عجیبی از این جمله نکنید چون واقعاْ جمله عجیبی نیست)</p>
<p>به امید روزی که مردم دنیا با استفاده از سرویس ترجمه گوگل به ترجمه متون فارسی روی بیارند&#8230; اینو اصلاْ به عنوان یک شعار نخونید</p>
<p>پ‌ن: متنی رو که در مثال بالا ذکر شد رو در گوگل تصحیح کردم، دمش گرم! ازم تشکر کرد. البته قابلش رو نداشت.</p>
<p>تو وبلاگ گوگل هم به اتفاقات اخیر ایران اشاره شده و انتشار زود هنگام این سرویس به همون دلیل بوده!!! با اینکه مطمعناْ تنها مقاصد بشر دوستانه‌ نداشتند، اما به هر حال خدا خیرشون بده. ما که می‌دونیم چطور استفاده کنیم که نه سیخ بسوزه و نه کباب!!! <img src='http://www.moshtaghi.ir/weblog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<img src="http://www.moshtaghi.ir/weblog/?ak_action=api_record_view&id=406&type=feed" alt="" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=e1iqB4KTwlg:lnibNFoOLgE:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?i=e1iqB4KTwlg:lnibNFoOLgE:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=e1iqB4KTwlg:lnibNFoOLgE:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=e1iqB4KTwlg:lnibNFoOLgE:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=e1iqB4KTwlg:lnibNFoOLgE:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?i=e1iqB4KTwlg:lnibNFoOLgE:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=e1iqB4KTwlg:lnibNFoOLgE:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=e1iqB4KTwlg:lnibNFoOLgE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=e1iqB4KTwlg:lnibNFoOLgE:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?i=e1iqB4KTwlg:lnibNFoOLgE:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Moshtaghi/~4/e1iqB4KTwlg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://weblog.moshtaghi.ir/2009/06/english-language-development-support-on-the-web/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://weblog.moshtaghi.ir/2009/06/english-language-development-support-on-the-web/</feedburner:origLink></item>
		<item>
		<title>آموزش سیمفونی روز ششم – مطالب بیشتری از لایه مدل</title>
		<link>http://feedproxy.google.com/~r/Moshtaghi/~3/RwozD7CAeh8/</link>
		<comments>http://weblog.moshtaghi.ir/2009/06/6th-symfony-jobeet/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 11:30:06 +0000</pubDate>
		<dc:creator>مهدی</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[jobeet]]></category>
		<category><![CDATA[model layer]]></category>
		<category><![CDATA[propel]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://www.moshtaghi.ir/weblog/?p=400</guid>
		<description><![CDATA[دیروز روز مهمی بود. یاد گرفتیم که چگونه URLهای زیاد بسازیم و اینکه چگونه از سیمفونی برای خودکار سازی موارد زیادی استفاده کنیم. امروز با پیچیده کردن کد‌ها، قابلیت‌های بهتری به jobeet اضافه می‌کنیم. شما در طول این فرایند، اطلاعات بیشتری راجع به تمامی ویژگی‌هایی که در روز پنجم به آن اشاره شد دریافت می‌کنید.
ضوابط ]]></description>
			<content:encoded><![CDATA[<p>دیروز روز مهمی بود. یاد گرفتیم که چگونه URLهای زیاد بسازیم و اینکه چگونه از سیمفونی برای خودکار سازی موارد زیادی استفاده کنیم. امروز با پیچیده کردن کد‌ها، قابلیت‌های بهتری به jobeet اضافه می‌کنیم. شما در طول این فرایند، اطلاعات بیشتری راجع به تمامی ویژگی‌هایی که در روز پنجم به آن اشاره شد دریافت می‌کنید.</p>
<h3>ضوابط شیء Propel</h3>
<p>با توجه به قوانین روز دوم:<br />
« هنگامی که کاربری به سایت وارد می‌شود، لیستی از مشاغل فعال را مشاهده می‌کند»<br />
اما در حال حاضر تمامی مشاغل لیست می‌شوند، چه فعال باشند و چه &#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// apps/frontend/modules/job/actions/actions.class.php</span>
<span style="color: #000000; font-weight: bold;">class</span> jobActions <span style="color: #000000; font-weight: bold;">extends</span> sfActions
<span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> executeIndex<span style="color: #009900;">&#40;</span>sfWebRequest <span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">jobeet_job_list</span> <span style="color: #339933;">=</span> JobeetJobPeer<span style="color: #339933;">::</span><span style="color: #004000;">doSelect</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Criteria<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">// ...</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>یک شغل فعال نباید بیشتر از ۳۰ روز پیش پست شده باشد. متد doSelect یک شیء Criteria را می‌گیرد که همان شرح در‌خواست پایگاه داده برای اجرا است.<span id="more-400"></span><br />
در کد بالا، متد Criteria بصورت خالی عبور داده شده، که به معنی برگشت دادن تمامی رکورد‌های موجود در جدول می‌باشد.<br />
حالا آن را طوری تغییر می‌دهیم که تنها مشاغل فعال را برگرداند:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> executeIndex<span style="color: #009900;">&#40;</span>sfWebRequest <span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$criteria</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Criteria<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span>JobeetJobPeer<span style="color: #339933;">::</span><span style="color: #004000;">CREATED_AT</span><span style="color: #339933;">,</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">86400</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">30</span><span style="color: #339933;">,</span> Criteria<span style="color: #339933;">::</span><span style="color: #004000;">GREATER_THAN</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">jobeet_job_list</span> <span style="color: #339933;">=</span> JobeetJobPeer<span style="color: #339933;">::</span><span style="color: #004000;">doSelect</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$criteria</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>متد Criteria::add یک شرط Where را به SQL ساخته شده اضافه می‌کند. در اینجا Criteria را برای تنها بازگرداندن مشاغل فعال محدود کردیم. متد add عملگر‌های مقایسه زیادی را پشتیبانی می‌کند، که پرکاربرد‌ترین آنها را مشاهده می‌کنید:</p>
<ul class="intro" style="text-align: left; direction : ltr;">
<li>Criteria::EQUAL</li>
<li>Criteria::NOT_EQUAL</li>
<li>Criteria::GREATER_THAN, Criteria::GREATER_EQUAL</li>
<li>Criteria::LESS_THAN, Criteria::LESS_EQUAL</li>
<li>Criteria::LIKE, Criteria::NOT_LIKE</li>
<li>Criteria::CUSTOM</li>
<li>Criteria::IN, Criteria::NOT_IN</li>
<li>Criteria::ISNULL, Criteria::ISNOTNULL</li>
<li>Criteria::CURRENT_DATE, Criteria::CURRENT_TIME, Criteria::CURRENT_TIMESTAMP</li>
</ul>
<h3>اشکال‌زدایی SQLهای ایجاد شده توسط propel</h3>
<p>با توجه به اینکه شما کدهای SQL را بطور دستی ایجاد نمی‌کنید، propel آنها را با توجه به موتور پایگاه داده‌ای که در روز سوم معرفی کردید ایجاد می‌کند. اما بعضی اوقات، مشاهده کدهای SQL ایجاد شده توسط propel می‌تواند بسیار سودمند باشد. برای مثال جهت اشکال‌زدایی یک query که به درستی کار نمی‌کند. در محیط dev سیمفونی این queryها را ثبت می‌کند (به همراه بسیاری از موارد دیگر). برای هر مجموعه از application و محیط یک فایل log وجود دارد. محتوای فایل frontend_dev.log را مشاهده کنید:</p>

<div class="wp_syntax"><div class="code"><pre class="io" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># log/frontend_dev.log</span>
Dec <span style="color: #cc66cc;">6</span> <span style="color: #cc66cc;">15</span>:<span style="color: #cc66cc;">47</span>:<span style="color: #cc66cc;">12</span> symfony <span style="color: #66cc66;">&#91;</span>debug<span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&#123;</span>sfPropelLogger<span style="color: #66cc66;">&#125;</span> exec: SET NAMES 'utf8'
Dec <span style="color: #cc66cc;">6</span> <span style="color: #cc66cc;">15</span>:<span style="color: #cc66cc;">47</span>:<span style="color: #cc66cc;">12</span> symfony <span style="color: #66cc66;">&#91;</span>debug<span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&#123;</span>sfPropelLogger<span style="color: #66cc66;">&#125;</span> prepare: SELECT jobeet_job.ID, jobeet_job.CATEGORY_ID, jobeet_job.<span style="color: #000000; font-weight: bold;">TYPE</span>, jobeet_job.COMPANY, jobeet_job.LOGO, jobeet_job.<span style="color: #000066;">URL</span>, jobeet_job.POSITION, jobeet_job.LOCATION, jobeet_job.DESCRIPTION, jobeet_job.HOW_TO_APPLY, jobeet_job.TOKEN, jobeet_job.IS_PUBLIC, jobeet_job.CREATED_AT, jobeet_job.UPDATED_AT FROM `jobeet_job` WHERE jobeet_job.CREATED_AT<span style="color: #66cc66;">&gt;</span>:p1
Dec <span style="color: #cc66cc;">6</span> <span style="color: #cc66cc;">15</span>:<span style="color: #cc66cc;">47</span>:<span style="color: #cc66cc;">12</span> symfony <span style="color: #66cc66;">&#91;</span>debug<span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&#123;</span>sfPropelLogger<span style="color: #66cc66;">&#125;</span> Binding '<span style="color: #cc66cc;">2008</span>-<span style="color: #cc66cc;">11</span>-06 <span style="color: #cc66cc;">15</span>:<span style="color: #cc66cc;">47</span>:<span style="color: #cc66cc;">12</span>' at position :p1 w<span style="color: #66cc66;">/</span> PDO <span style="color: #000000; font-weight: bold;">type</span> PDO::PARAM_STR</pre></div></div>

<p>اینجا می‌توانید SQL ایجاد شده خودتان توسط propel را که به همراه شرطی که بروی ستون created_at اعمال می‌شود مشاهدی کنید. (WHERE jobeet_job.CREATED_AT &gt; :p1)</p>
<blockquote><p><strong>یادداشت</strong>: رشته p1 در query نشان دهنده شرح بیان شده SQL ایجاد شده توسط propel است. مقدار واقعی p1 (در مثال بالا «2008-11-06 15:47:12» ) در هنگام اجرای query ثبت می‌شود و بطور صحیح بوسیله موتور پایگاه داده گریز داده می‌شود. استفاده از این عبارات آماده شده، قابل نمایش بودن را برای حملات SQL injection کم می‌کند.</p></blockquote>
<p>این عالیست، اما سوئیچ کردن بین مرورگرها، IDEها و فایل‌های log کمی آزار دهنده است. اینگونه باید بصورت مداوم یک تغییر را آزمایش کنید. از نوار ابزار اشکال‌زدایی symfony ممنونیم، تمام اطلاعاتی که نیاز دارید براحتی در مرورگر در دسترس می‌باشد.</p>
<p style="text-align: center;"><a href="http://moshtaghi.ir/weblog/wp-content/uploads/2009/06/web_debug_sql.png"><img class="aligncenter size-large wp-image-556" title="web_debug_sql" src="http://moshtaghi.ir/weblog/wp-content/uploads/2009/06/web_debug_sql-490x41.png" alt="web_debug_sql" width="490" height="41" /></a></p>
<h3>ترتیب شیء</h3>
<p>کد بالا به هنگام کار کردن، نتیجه بعیدی از چیزی که در روز دوم تعریف کردیم را می‌دهد:<br />
«یک کاربر می‌تواند برگردد و دوباره شغل خود را فعال کند و زمان انقضای آن را از ۳۰ روز بیشتر کند &#8230;»<br />
اما ایم کد تنها به مقدار موجود در فیلد created_at تکیه می‌کند، و چون این ستون تنها زمان ایجاد رکورد را ثبت می‌کند نمی‌توانیم این قابلیت را بر مبنای آن پیاده کنیم.<br />
اما اگر نمای پایگاه داده‌ای که در روز سوم ایجاد کردیم را بخاطر بیاورید، یک ستون به نام expires_at نیز مشخص شده بود. و مقدار پیشفرض برای آن در اطلاعات پایه در نظر گرفته نشد. این ستون می‌تواند بصورت خودکار مقدار ۳۰ روز پس از تاریخ ثبت را بگیرد.<br />
هنگامی که نیاز است تا برخی مقادیر بصورت خودکار و مرتب بر مبنای پایگاه داده، قبل از یک شیء ایجاد شوند، می‌توانید متد save از کلاس مدل را مهم‌تر کنید.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// lib/model/JobeetJob.php</span>
<span style="color: #000000; font-weight: bold;">class</span> JobeetJob <span style="color: #000000; font-weight: bold;">extends</span> BaseJobeetJob
<span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> save<span style="color: #009900;">&#40;</span>PropelPDO <span style="color: #000088;">$con</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">isNew</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getExpiresAt</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
      <span style="color: #000088;">$now</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getCreatedAt</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getCreatedAt</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'U'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setExpiresAt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$now</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">86400</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">30</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> parent<span style="color: #339933;">::</span><span style="color: #004000;">save</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$con</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">// ...</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>متد isnew هنگامی که شیء هنوز در پایگاه داده مرتب سازی نشده، مقدار true و در غیر این صورت false را بر می‌گرداند.<br />
حالا اکشن را طوری تغییر می‌دهیم تا بجای created_at از فیلد expires_at استفاده کند:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> executeIndex<span style="color: #009900;">&#40;</span>sfWebRequest <span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$criteria</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Criteria<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span>JobeetJobPeer<span style="color: #339933;">::</span><span style="color: #004000;">EXPIRES_AT</span><span style="color: #339933;">,</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> Criteria<span style="color: #339933;">::</span><span style="color: #004000;">GREATER_THAN</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">jobeet_job_list</span> <span style="color: #339933;">=</span> JobeetJobPeer<span style="color: #339933;">::</span><span style="color: #004000;">doSelect</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$criteria</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>به این صورت، query را برای انتخاب بر حسب ویژگی expires_at محدود کردیم.</p>
<h3>اطلاعات بیشتر راجع داده‌های اولیه</h3>
<p>Refresh کردن صفحه اصلی، تغییری در پی ندارد. زیرا این مشاغل همین چند روز پیش پست شده‌اند. این تغییرات را ایجاد کنید تا مشاغلی که expires شده‌اند را به جدول بیفزائید:</p>

<div class="wp_syntax"><div class="code"><pre class="io" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># data/fixtures/020_jobs.yml</span>
JobeetJob:
  <span style="color: #808080; font-style: italic;"># other jobs</span>
&nbsp;
  expired_job:
    category_id:  programming
    company:      Sensio Labs
    position:     Web Developer
    location:     Paris, France
    description:  <span style="color: #66cc66;">|</span>
      Lorem ipsum dolor sit amet, consectetur
      adipisicing elit.
    how_to_apply: Send your <span style="color: #000000; font-weight: bold;">resume</span> to lorem.ipsum <span style="color: #66cc66;">&#91;</span>at<span style="color: #66cc66;">&#93;</span> dolor.sit
    is_public:    true
    is_activated: true
    expires_at:   <span style="color: #cc66cc;">2005</span>-<span style="color: #cc66cc;">12</span>-01
    token:        job_expired
    email:        job<span style="color: #66cc66;">@</span>example.com</pre></div></div>

<blockquote><p><strong>یادداشت</strong>: کد‌ها را به دقت کپی کنید تا فرورفتگی‌ها از بین نرود. expires_job تنها دو تا Space قبل از خود دارد.</p></blockquote>
<p>همانطور که شغل اصافه شده را در فایل fixture می‌بینید، مقدار ستون created_at مشخص شده است. حتی اگر بطور خودکار توسط propel پر شود.<br />
مقدار مشخص شده بر هر مقدار پیشفرضی اولویت دارد. Fixture را دوباره بارگذاری کنید و صفحه را refresh کنید:</p>

<div class="wp_syntax"><div class="code"><pre class="io" style="font-family:monospace;">$ php symfony propel:data-load</pre></div></div>

<p>می‌توانید query زیر را برای مطمئن شدن از اینکه ستون expires_at بطور پیشفرض توسز متد save و بر مبنای ستون created_at مقدار دهی می‌شوند را اجرا کنید:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #ff0000;">`position`</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">`created_at`</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">`expires_at`</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #ff0000;">`jobeet_job`</span>;</pre></div></div>

<h3>پیکره‌بندی دستی</h3>
<p>در متد JobeetJob::save بوسیله کدهای پیچیده‌ای تعداد روزهای فعال بودن را مشخص کردیم. اما خیلی بهتر است تا این مقدار را قابل پیکره‌بندی کنیم.<br />
Symfony برای هر application یک فایل پیکره‌بندی ایجاد می‌کند تا ویژگی‌های خاص در آن تعریف شود. فایل app.yml می‌تواند شامل هر تنظیمی که شمما می‌خواهید باشد.</p>

<div class="wp_syntax"><div class="code"><pre class="io" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># apps/frontend/config/app.yml</span>
all:
  active_days: <span style="color: #cc66cc;">30</span></pre></div></div>

<p>در application، این تنظیمات بوسیله کلاس سراسری sfConfig در دسترس هستند.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">sfConfig<span style="color: #339933;">::</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'app_active_days'</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>تنظیمات بهمراه پیشوند app_ هستند، زیرا کلاس sfConfig علاوه بر این دسترسی به تنظیمات symfony را هم مهیا می‌کند، که در آینده می‌بینیم.<br />
کدها را بروز می‌کنیم تا تنظیمات جدید اعمال شود.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> save<span style="color: #009900;">&#40;</span>PropelPDO <span style="color: #000088;">$con</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">isNew</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getExpiresAt</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$now</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getCreatedAt</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getCreatedAt</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'U'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setExpiresAt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$now</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">86400</span> <span style="color: #339933;">*</span> sfConfig<span style="color: #339933;">::</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'app_active_days'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #b1b100;">return</span> parent<span style="color: #339933;">::</span><span style="color: #004000;">save</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$con</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>فایل پیکره‌بندی app.yml راه فوق‌العاده‌ای برای متمرکز کردن تنظیمات سراسری application شما می‌باشد.<br />
در آخر، اگر نیاز به تعریف تنظیمات سراسری گسترده‌تری دارید، تنها یک فایل app.yml در پوشه config ریشه ایجاد کنید و &#8230;</p>
<h3>دوباره سازی &#8211; Refactoring</h3>
<p>اگر چه این کد کار مورد نظر را انجام می‌دهد، اما راه سریعی نیست. آیا می‌توانید مشکل آن را بیابید؟<br />
کد Criteria متعلق به اکشن نیست (لایه کنترل) بلکه متعلق به لایه مدل است. در ساختار MVC، لایه مدل تمام منطق برنامه را مشخص می‌کند و لایه کنترل تنها لایه مدل را برای بازیافت داده‌ها فراخوانی می‌کند. از آنجایی که این کد مجموعه‌ای از مشاغل را بر می‌گرداند، آن را به کلاس JobeetJobPeer انتقال می‌دهیم و متدی بنام getActiveJobs ایجاد می‌کنیم:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// lib/model/JobeetJobPeer.php</span>
<span style="color: #000000; font-weight: bold;">class</span> JobeetJobPeer <span style="color: #000000; font-weight: bold;">extends</span> BaseJobeetJobPeer
<span style="color: #009900;">&#123;</span>
  static <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getActiveJobs<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$criteria</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Criteria<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">EXPIRES_AT</span><span style="color: #339933;">,</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> Criteria<span style="color: #339933;">::</span><span style="color: #004000;">GREATER_THAN</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">doSelect</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$criteria</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>حالا کد اکشن می‌تواند از این متد برای بازیافت مشاغل استفاده کند.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> executeIndex<span style="color: #009900;">&#40;</span>sfWebRequest <span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">jobeet_job_list</span> <span style="color: #339933;">=</span> JobeetJobPeer<span style="color: #339933;">::</span><span style="color: #004000;">getActiveJobs</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>این دوباره سازی چندین مزیت نسبت به کد قبل داشت:</p>
<ul>
<li>
منظق دریافت مشاغل فعال حالا در لایه مدل قرار دارد، جایی که به آن متعلق است.
</li>
<li>
کد موجود در قسمت کنترل بسیار خوانا‌تر از قبل است.
</li>
<li>
متد getActiveJobs می‌تواند دوباره مورد استفاده قرار گیرد (برای مثال در سایر اکشن‌ها)
</li>
<li>
کد لایه مدل حالا یک واحد قابل آموزش است.
</li>
</ul>
<p>حالا مرتب سازی مشاغل را بر حسب ستون expired_at صورت می‌دهیم.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">static <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getActiveJobs<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$criteria</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Criteria<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">EXPIRES_AT</span><span style="color: #339933;">,</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> Criteria<span style="color: #339933;">::</span><span style="color: #004000;">GREATER_THAN</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addDescendingOrderByColumn</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">EXPIRES_AT</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">doSelect</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$criteria</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>متد addDescendingOrderByColumn یک شرط ORDER BY به SQL ایجاد شده اضافه می‌کند. (متد addAscendingOrderByColumn هم وجود دارد)</p>
<h3>دسته‌ بندی‌های صفحه اصلی</h3>
<p>طبق قوانین روز دوم:<br />
«مشاغل بر حسب دسته‌بندی و سپس بر حسب تاریخ انتشارشان لیست می‌شود (ابتدا مشاغل جدید تر)»<br />
تا حالا، دسته‌بندی شغل را در اشتراک نمی‌گرفتیم. مطابق قوانین، صفحه اصلی باید مشاغل را بر حسب دسته‌بندی‌ نمایش دهد. ابتدا باید تمام دسته‌بندی‌ها را با کمترین شغل فعال دریافت کنیم.<br />
کلاس JobeetCategoryPeer را باز کنید و متد getWithJobs را به آن اضافه کنید:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// lib/model/JobeetCategoryPeer.php</span>
<span style="color: #000000; font-weight: bold;">class</span> JobeetCategoryPeer <span style="color: #000000; font-weight: bold;">extends</span> BaseJobeetCategoryPeer
<span style="color: #009900;">&#123;</span>
  static <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getWithJobs<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$criteria</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Criteria<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addJoin</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">ID</span><span style="color: #339933;">,</span> JobeetJobPeer<span style="color: #339933;">::</span><span style="color: #004000;">CATEGORY_ID</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span>JobeetJobPeer<span style="color: #339933;">::</span><span style="color: #004000;">EXPIRES_AT</span><span style="color: #339933;">,</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> Criteria<span style="color: #339933;">::</span><span style="color: #004000;">GREATER_THAN</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setDistinct</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">doSelect</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$criteria</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>متد Criteria::addJoin یک شرط JOIN را به SQL اضافه می‌کند. بصورت پیشفرض شرط JOIN به یک شرط WHERE اضافه می‌شود. در ضمن شما می‌توانید عملوند JOIN را با اضافه کردن ۳ آرگومنت زیر تغییر دهید.<br />
(Criteria::LEFT_JOIN ، Criteria::RIGHT_JOIN و  Criteria::INNER_JOIN)<br />
بنابراین اکشن index را تغییر می‌دهیم:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// apps/frontend/modules/job/actions/actions.class.php</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> executeIndex<span style="color: #009900;">&#40;</span>sfWebRequest <span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">categories</span> <span style="color: #339933;">=</span> JobeetCategoryPeer<span style="color: #339933;">::</span><span style="color: #004000;">getWithJobs</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>در قالب، احتیاج داریم تا حلقه‌ای برای مرور همه دسته‌بندی‌ها و حلقه‌ای برای مرور مشاغل فعال داخل آنها داشته باشیم:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">// apps/frontend/modules/job/indexSuccess.php
<span style="color: #000000; font-weight: bold;">&lt;?php</span> use_stylesheet<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'jobs.css'</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
&nbsp;
&lt;div id=&quot;jobs&quot;&gt;
  <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$categories</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$category</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
    &lt;div class=&quot;category_<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> Jobeet<span style="color: #339933;">::</span><span style="color: #004000;">slugify</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$category</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot;&gt;
      &lt;div class=&quot;category&quot;&gt;
        &lt;div class=&quot;feed&quot;&gt;
          &lt;a href=&quot;&quot;&gt;Feed&lt;/a&gt;
        &lt;/div&gt;
        &lt;h1&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$category</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/h1&gt;
      &lt;/div&gt;
&nbsp;
      &lt;table class=&quot;jobs&quot;&gt;
        <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$category</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getActiveJobs</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$job</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
          &lt;tr class=&quot;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #990000;">fmod</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span> ? <span style="color: #0000ff;">'even'</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">'odd'</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot;&gt;
            &lt;td class=&quot;location&quot;&gt;
              <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$job</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getLocation</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
            &lt;/td&gt;
            &lt;td class=&quot;position&quot;&gt;
              <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> link_to<span style="color: #009900;">&#40;</span><span style="color: #000088;">$job</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getPosition</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'job_show_user'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$job</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
            &lt;/td&gt;
            &lt;td class=&quot;company&quot;&gt;
              <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$job</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getCompany</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
            &lt;/td&gt;
          &lt;/tr&gt;
        <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">endforeach</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
      &lt;/table&gt;
    &lt;/div&gt;
  <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">endforeach</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;/div&gt;</pre></div></div>

<blockquote><p><strong>یادداشت</strong>: برای نمایش نام دسته‌بندی در قالب از echo استفاده کردیم. جالب نیست؟ $category یک شیء است و ما بطور خارق‌العاده‌ای آن را echo می‌کنیم! جواب این سوال در طول روز سوم بیان شد، هنگامی که متد __toString را برای تمامی کلاس‌های مدل تعریف کردیم.</p></blockquote>
<p>برای اینکار باید متد getActiveJobs را به کلاس JobeetCategory اضافه کنیم. تا مشاغل فعال را از شیء دسته‌بندی باز گرداند.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// lib/model/JobeetCategory.php</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getActiveJobs<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$criteria</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Criteria<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span>JobeetJobPeer<span style="color: #339933;">::</span><span style="color: #004000;">CATEGORY_ID</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getId</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #b1b100;">return</span> JobeetJobPeer<span style="color: #339933;">::</span><span style="color: #004000;">getActiveJobs</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$criteria</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>در فراخوانی add، آرگومنت سوم را از قلم انداختیم زیرا Criteria::EQUAL مقدار پیشفرض است.<br />
متد JobeetCategory::getActiveJobs برای برگرداندن مشاغل فعال از دسته بندی انتخابی از متد JobeetJobPeer::getActiveJobs استفاده می‌کند.<br />
هنگامی که شما JobeetJobPeer::getActiveJobs را فراخوانی می‌کنید، محدودیتی برای هموار کردن بوسیله یک دسته‌بندی ایجاد می‌کنیم. در عوض عبور شیء دسته بندی، قطعاْ یک شیء Criteria را عبور می‌دهیم. چون این بهترین راه برای کپسوله کردن یک شرط است.<br />
GetActiveJobs نیاز دارد تا آرگومنت Criteria را با ضوابط (criiteria) خود یکی کند. چون Criteria یک شیء است، کار کاملاْ راحتی است.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// lib/model/JobeetJobPeer.php</span>
static <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getActiveJobs<span style="color: #009900;">&#40;</span>Criteria <span style="color: #000088;">$criteria</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">is_null</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$criteria</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$criteria</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Criteria<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span>JobeetJobPeer<span style="color: #339933;">::</span><span style="color: #004000;">EXPIRES_AT</span><span style="color: #339933;">,</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> Criteria<span style="color: #339933;">::</span><span style="color: #004000;">GREATER_THAN</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addDescendingOrderByColumn</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">EXPIRES_AT</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">doSelect</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$criteria</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h3>حدود نتایج</h3>
<p>هنوز هم قوانینی برای اعمال شدن به لیست مشاغل صفحه اصلی وجود دارد:<br />
«برای هر دسته بندی، تنها ۱۰ لینک می‌توانند در لیست نمایش داده شوند و یک پیوند امکان لیست شدن تمام مشاغل در یک دسته بندی را ایجاد می‌کند»<br />
اینکار بوسیله استفاده از متد getActiveJobs راحت می‌شود.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// lib/model/JobeetCategory.php</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getActiveJobs<span style="color: #009900;">&#40;</span><span style="color: #000088;">$max</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$criteria</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Criteria<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span>JobeetJobPeer<span style="color: #339933;">::</span><span style="color: #004000;">CATEGORY_ID</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getId</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setLimit</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$max</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #b1b100;">return</span> JobeetJobPeer<span style="color: #339933;">::</span><span style="color: #004000;">getActiveJobs</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$criteria</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>اختصاص دادن شرط LIMIT در مدل کار سختی است، اما بهتر است تا این مقدار قابلیت پیکره‌بندی داشته باشد. تغییراتی را در قالب ایجاد می‌کنیم تا نهایت مقدار نمایش مشاغل را از فایل app.yml بخواند.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&lt;!-- apps/frontend/modules/job/indexSuccess.php --&gt;
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$category</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getActiveJobs</span><span style="color: #009900;">&#40;</span>sfConfig<span style="color: #339933;">::</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'app_max_jobs_on_homepage'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$job</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>و این تنظیمات را در فایل app.yml اضافه کنید:</p>

<div class="wp_syntax"><div class="code"><pre class="io" style="font-family:monospace;">all:
  active_days:          <span style="color: #cc66cc;">30</span>
  max_jobs_on_homepage: <span style="color: #cc66cc;">10</span></pre></div></div>

<p style="text-align: center;"><img class="aligncenter size-large wp-image-559" title="homepage" src="http://moshtaghi.ir/weblog/wp-content/uploads/2009/06/homepage-490x362.png" alt="homepage" width="490" height="362" /></p>
<h3>داد‌های اولیه پویا</h3>
<p>برای اینکه نتایج تغییرات را مشاهده کنید، باید گروهی از داده‌های اولیه را وارد سیستم کنیم. می‌توان اطلاعات موجود در fixture را کپی کرد که شاید وقت‌گیر و کسل کننده باشد. Symfony اینکار را هم آسان کرده است. شما می‌توانید از کد‌های php در فایل‌های yml استفاده کنید. فایل 020_jobs.yml را باز کرده و کد‌های زیر را در انتهای آن اضافه کنید:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">JobeetJob:
# Starts at the beginning of the line (no whitespace before)
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">100</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;=</span> <span style="color: #cc66cc;">130</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
  job_<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$i</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>:
    category_id:  programming
    company:      Company <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$i</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
    position:     Web Developer
    location:     Paris, France
    description:  Lorem ipsum dolor sit amet, consectetur adipisicing elit.
    how_to_apply: |
      Send your resume to lorem.ipsum [at] company_<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$i</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>.sit
    is_public:    true
    is_activated: true
    token:        job_<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$i</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
    email:        job@example.com
&nbsp;
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">endfor</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>دقت کنید که دندانه‌ها و فرورفتگی‌ها را رعایت کنید زیرا در غیر این صورت پردازش نمی‌شوند.<br />
این نکات را همیشه بخاطر بسپارید:</p>
<ul>
<li>
عبارت &lt;?php ?&gt; همیشه باید در ابتدای خط و یا درون یک مقدار جاگذاری شده باشد.
</li>
<li>
اگر یک عبارت &lt;?php ?&gt; سطر را تمام کند، باید در خروجی مقدار «\n» را ذکر کنیم.
</li>
</ul>
<p>و می‌بینیم که در صفحه اصلی تنها ۱۰ شغل آخر اضافه شده است.</p>
<p><img class="aligncenter size-large wp-image-561" title="pagination" src="http://moshtaghi.ir/weblog/wp-content/uploads/2009/06/pagination-490x381.png" alt="pagination" width="490" height="381" /></p>
<h3>ایمن کردن صفحه شغل</h3>
<p>هنگامی که شغلی به انقضاء می‌رسد، حتی اگر شما url آن را بدانید نباید به آن دسترسی پیدا کنید. سعی کنید تا URL یک شغل تاریخ گذشته را پیدا کنید. (id را با یک id واقعی در پایگاه داده عوض کنید)</p>

<div class="wp_syntax"><div class="code"><pre class="io" style="font-family:monospace;">SELECT id, token FROM jobeet_job WHERE expires_at <span style="color: #66cc66;">&lt;</span> NOW<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="io" style="font-family:monospace;"><span style="color: #66cc66;">/</span>frontend_dev.php<span style="color: #66cc66;">/</span>job<span style="color: #66cc66;">/</span>sensio-labs<span style="color: #66cc66;">/</span>paris-france<span style="color: #66cc66;">/</span>ID<span style="color: #66cc66;">/</span>web-developer-expired</pre></div></div>

<p>بجای نمایش شغل باید به صفحه ۴۰۴ منتقل شویم. اما چگونه می‌توان بصورت خودکار و بوسیله مسیر‌ها به این نتیجه رسید؟<br />
بطور پیشفرض sfPropelRoute از متد استاندارد doSelectOne برای بازگداندن اشیاء استفاده می‌کند، و ما می‌توانیم مشروط بر اینکه خصیصه method_for_criteria در پیکره‌بندی مسیر باشد آن را تغییر دهیم:</p>

<div class="wp_syntax"><div class="code"><pre class="io" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># apps/frontend/config/routing.yml</span>
job_show_user:
  <span style="color: #000066;">url</span>:     <span style="color: #66cc66;">/</span>job<span style="color: #66cc66;">/</span>:company_slug<span style="color: #66cc66;">/</span>:location_slug<span style="color: #66cc66;">/</span>:id<span style="color: #66cc66;">/</span>:position_slug
  class:   sfPropelRoute
  options:
    model: JobeetJob
    <span style="color: #000000; font-weight: bold;">type</span>:  <span style="color: #000066;">object</span>
    method_for_criteria: doSelectActive
  param:   <span style="color: #66cc66;">&#123;</span> module: job, action: show <span style="color: #66cc66;">&#125;</span>
  requirements:
    id: \d+
    sf_method: <span style="color: #66cc66;">&#91;</span>GET<span style="color: #66cc66;">&#93;</span></pre></div></div>

<p>متد doSelectActive یک شیء Criteria را که بوسیله مسیر ساخته شده را دریافت می‌کند:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// lib/model/JobeetJobPeer.php</span>
<span style="color: #000000; font-weight: bold;">class</span> JobeetJobPeer <span style="color: #000000; font-weight: bold;">extends</span> BaseJobeetJobPeer
<span style="color: #009900;">&#123;</span>
  static <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> doSelectActive<span style="color: #009900;">&#40;</span>Criteria <span style="color: #000088;">$criteria</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span>JobeetJobPeer<span style="color: #339933;">::</span><span style="color: #004000;">EXPIRES_AT</span><span style="color: #339933;">,</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> Criteria<span style="color: #339933;">::</span><span style="color: #004000;">GREATER_THAN</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">doSelectOne</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$criteria</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">// ...</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>حالا، اگر سعی کنید تا شغل تاریخ گذشته‌ای را ببینید با صفحه ۴۰۴ مواجه می‌شوید.</p>
<p><img class="aligncenter size-large wp-image-562" title="exception" src="http://moshtaghi.ir/weblog/wp-content/uploads/2009/06/exception-490x381.png" alt="exception" width="490" height="381" /></p>
<h3>پیوند به صفحه مشاغل</h3>
<p>حالا، یک پیوند برای صفحه دسته‌بندی اضافه کرده و این صفحه را ایجاد می‌کنیم. اما صبر کنید! وقت امروز تمام شده و زمان کافی برای ادامه این بحث را نداریم. البته اگر شما زمان کافی را داشته باشید، اطلاعات لازم برای اینکار را هم دارید. سعی کنید تا اینکار را انجام دهید و یا فردا بهمراه یکدیگر انجامش دهیم.</p>
<h3>فردا همدیگر را می‌بینیم</h3>
<p>روی jobeet خود کار کنید، سعی کنید نهایت استفاده از مستندات API و مستندات آزاد موجود در سایت symfony را ببرید. فردا دوباره همدیگر را می‌بینیم و به ادامه کار می‌پردازیم.<br />
موفق باشید&#8230;</p>
<img src="http://www.moshtaghi.ir/weblog/?ak_action=api_record_view&id=400&type=feed" alt="" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=RwozD7CAeh8:TAPP_M5YXhc:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?i=RwozD7CAeh8:TAPP_M5YXhc:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=RwozD7CAeh8:TAPP_M5YXhc:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=RwozD7CAeh8:TAPP_M5YXhc:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=RwozD7CAeh8:TAPP_M5YXhc:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?i=RwozD7CAeh8:TAPP_M5YXhc:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=RwozD7CAeh8:TAPP_M5YXhc:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=RwozD7CAeh8:TAPP_M5YXhc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=RwozD7CAeh8:TAPP_M5YXhc:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?i=RwozD7CAeh8:TAPP_M5YXhc:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Moshtaghi/~4/RwozD7CAeh8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://weblog.moshtaghi.ir/2009/06/6th-symfony-jobeet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://weblog.moshtaghi.ir/2009/06/6th-symfony-jobeet/</feedburner:origLink></item>
		<item>
		<title>انتخاب یک IDE مناسب php و سازگاری آن با symfony (قسمت اول)</title>
		<link>http://feedproxy.google.com/~r/Moshtaghi/~3/QghQu_Rg6xc/</link>
		<comments>http://weblog.moshtaghi.ir/2009/06/best-php-ide-and-compatible-with-symfony/#comments</comments>
		<pubDate>Mon, 08 Jun 2009 11:57:02 +0000</pubDate>
		<dc:creator>مهدی</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[ابزار طراحی وب]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://www.moshtaghi.ir/weblog/?p=389</guid>
		<description><![CDATA[اگر به پست‌های قبلی که راجع به توسعه وب توسط php و البته فریم‌ورک بسیار قدرتمند symfony بود علاقه‌ای داشته باشید و آنها رو دنبال کنید، صد در صد برای ویرایش کد‌ها از یک ادیتور همچون gedit، kedit و یا شاید notepad استفاده کرده باشید. و در اینصورت متوجه شدید که دیگر نمی‌توان کار با ]]></description>
			<content:encoded><![CDATA[<p>اگر به پست‌های قبلی که راجع به توسعه وب توسط <a href="http://php.net" target="_blank">php</a> و البته فریم‌ورک بسیار قدرتمند <a href="http://symfony-project.org/" target="_blank">symfony</a> بود علاقه‌ای داشته باشید و آنها رو دنبال کنید، صد در صد برای ویرایش کد‌ها از یک ادیتور همچون <a href="http://projects.gnome.org/gedit/" target="_blank">gedit</a>، kedit و یا شاید notepad استفاده کرده باشید. و در اینصورت متوجه شدید که دیگر نمی‌توان کار با سیمفونی رو روی این قبیل ویرایشگرها ادامه داد.<br />
اینجاست که واجب می‌شود تا برای ادامه کار از یک <a title="Integrated development environment" href="http://en.wikipedia.org/wiki/Integrated_development_environment" target="_blank">IDE</a> خوب استفاده کنید. البته انتخاب IDE مناسب کار راحتی نیست و البته در عین حال راحته!!! یعنی دامنه انتخاب زیاده و شما باید برای انتخاب بهترین IDE، این دامنه رو کوچک‌تر کنید.<br />
برای کوچک کردن این دامنه باید توقع خود را از IDE بالا ببرید. در ادامه مطلب به بررسی این توقعات می‌پردازیم.<br />
<img class="aligncenter size-full wp-image-527" src="http://moshtaghi.ir/weblog/wp-content/uploads/2009/06/ides_best.png" alt="ides_best" width="577" height="299" /><br />
<span id="more-389"></span></p>
<h3>رنگ‌بندی کدها &#8211; Syntax highlighting</h3>
<p>رنگ‌بندی درست کد‌ها خوانایی آن را تا حد بسیاری بالا می‌برد. البته این ویژگی روی تمامی IDEها و حتی editor‌ها وجود داره. (جز Notepad ویندوز که بدرد یادداشت نوشتن هم نمی‌خوره!!!)</p>
<h3>اتمام خودکار کد &#8211; Code completion</h3>
<p>این ویژگی به سرعت کد‌نویسی خیلی کمک می‌کنه، همونطور که خیلی‌ها می‌دونند مثلاْ  برای نوشتن قطعه کد مربوط به مقصد یک لینک تنها حرف h را تایپ می‌کنید و IDE مقادیر href=&#8221;" و hreflang=&#8221;" رو به شما پیشنهاد می‌کنه.<br />
البته این ویژگی روی کد‌های php هم به همین صورتی که در تصویر زیر مشاهد می‌کنید اعمال می‌شود.<br />
<img class="aligncenter size-full wp-image-534" title="code_completion" src="http://moshtaghi.ir/weblog/wp-content/uploads/2009/06/code_completion.png" alt="code_completion" width="353" height="166" /><br />
پس تا اینجا تمام ادیتور‌ها از دامنه بزرگی که مورد بحث بود حذف شدن. (قابل توجه افرادی که گیر دادن به gedit و Kedit و emEditor و Notepad++ و همین قسم ویرایشگر‌ها)</p>
<h3>ناوبری &#8211; Navigation</h3>
<p>خیلی اوقات پیش می‌آید که شما داخل کد‌ها گم می‌شوید (مخصوصاْ به هنگام توسعه برنامه‌های نوشته شده در گذشته و یا کار‌های گروهی) و نیاز دارید تا برنامه شما رو به محل مورد نظر هدایت کنه. برای اینکار می‌توانید از امکان search یا Find که توی هر ویرایشگری پیدا می‌شه استفاده کنید. اما اگر پروژه کمی بزرگ باشد، دچار مشکل می‌شوید و آن زمان است که به امکانات بیشتری برای جستجو و ناوبری احتیاج پیدا می‌کنید. امکاناتی از قبیل Goto که می‌تونه شما رو به سطر، متد و یا کلاس خاصی هدایت کند (بر حسب کلمه کلیدی و یا تعریف از قبل). و یا پنلی که فایل شما را بر حسب کلاس‌ها و توابع موجود در آن بخش بندی و لیست می‌کند و &#8230;<br />
راستش این قسمت خیلی قابل توضیح دادن نیست و به قول معروف : حلوای تن تنانی، تا نخوری ندانی!!!</p>
<h3>نمایش خطا‌ها و اخطارها</h3>
<p>اشتباهات نحوی syntax و یا حتی غلط‌های املایی برنامه‌نویسی (منظورم از این واژه اختراعی اشتباهاتی همچون جا انداختن آکولاد و امثال این است) مشکلی است که به وفور پیش می‌آید. پس یک IDE خوب باید آنها را تشخیص داده و به شما اعلام کند و گیر خود را تا زمان تصحیح پابرجا نگه دارد.</p>
<h3>دوباره سازی و سازندگی کد &#8211; Refactoring and code generation</h3>
<p>این ویژگی، از آن ویژگی‌هایی است که به هیچ شکلی نمی‌شه از آن گذشت! بعضی اوقات پیش می‌آید که مجبور به دوباره نویسی و یا تغییر مکان کلاس‌ها، توابع و یا شاید فایل‌ها هستیم و اینکار در پروژه‌های کوچک هم کار راحتی به حساب نمی‌آید. چه برسد به &#8230;<br />
سه امکان refactoring که بیشتر به کار می‌آید رو در زیر لیست کردم:</p>
<ul>
<li> Move که تمام includeها و requireها را به هنگام انتقال فایلی از جایی به جای دیگر بروز می‌کند تا مشکلی در روند اجرای پروژه پیش نیاد.</li>
<li> Rename که این اطمینان را می‌دهد که از تغییر نام هر چیزی هیچ مشکلی برای پروژه پیش نخواهد آمد.</li>
<li> Safe delete که شما را مطمئن می‌کند که حذف یک فایل پروژه آسیبی به سایر قسمت‌ها وارد نمی‌کند.</li>
</ul>
<p>علاوه بر این برخی IDEها امکان ایجاد کد‌های مربوط به ساخت توابع سازنده، گیرنده‌ها و &#8230; را نیز فراهم می‌کنند.</p>
<h3>اشکال‌زدایی &#8211; Debugging</h3>
<p>معمولاْ کد‌نویسان php برای اشکال‌زدایی کد‌ها از دستور echo و die استفاده می‌کنند. اما این شیوه هرگز جای اشکال‌زدایی خط‌به‌خط را برای برنامه‌نویس نمی‌تواند پر کند. مخصوصاْ در برنامه‌های بزرگ‌تر. یک IDE خوب این امکان را برای کدنویس مهیا می‌کند.</p>
<h3>سیستم کنترل نسخه &#8211; Versioning system</h3>
<p>این سیستم می‌تواند در هر دو شیوه توسعه فردی و گروهی مفید باشد. این ویژگی امکان مقایسه کد فعلی را با نسخه‌های پیشین بصورت تصویری ایجاد می‌کند. همچنین امکان کپی کردن تغییرات به سایر ورژن‌ها و برگشتن به وضعیت قبلی و ادغام تغییرات ایجاد شده توسط سایر اعضاء تیم را هم برای ما مهیا می‌کند.<br />
<img class="aligncenter size-full wp-image-537" title="code_diff" src="http://moshtaghi.ir/weblog/wp-content/uploads/2009/06/code_diff.png" alt="code_diff" width="546" height="214" /><br />
هنگامی که شما تغییرات را چک کرده و آنها را اعمال نمودید، یکی کردن IDE با سیستم‌های کنترل نسخه‌ای همچون CVS، SVN و &#8230; بسیار بهتر از اجرای یک برنامه جدا برای کار با آنها می‌باشد.</p>
<h3>خصوصیات سمت مشتری &#8211; Client-side features</h3>
<p>کمتر پیش می‌آید تا کد‌های  php بصورت جدا نوشته شوند و معمولاْ به همراه کد‌های HTML و همچنین CSS و java script می‌آیند. در نتیجه امکان Code complation برای این قسم کد‌ها در فایل‌های php می‌تواند بسیار سودمند و پرکاربرد باشد.</p>
<h3>کدام IDE تمام این ویژگی‌ها را شامل می‌شود؟</h3>
<p>همانطور که می‌دانید در دنیای متن‌باز برنامه‌های بسیار پر قدرت و مفیدی یافت می شوند. در زمینه IDEها هم می‌توان به جرات گفت که بهترین IDEها OpenSource هستند.<br />
با اندکی دیکتاتوری و بدون هیچ توضیحی ۲ دسته را اینجا نام می‌بریم:</p>
<h4>IDEهای مبتنی بر Eclipse</h4>
<p>فکر می‌کنم <a href="http://www.eclipse.org/" target="_blank">پلتفرم Eclipse</a> معرف حضور بیشتر دوستان باشد، افزونه‌های بسیاری نیز برای کار با php روی Eclipse وجود دارند که برخی از آنها عبارتند از: <a href="http://www.eclipse.org/pdt/" target="_blank">PDT</a>، <a href="http://www.zend.com/products/studio/" target="_blank">Zend Studio</a>، <a href="http://www.aptana.com/php" target="_blank">Aptana PHP</a> و همچنین <a href="http://aptana.com/studio#content_pro" target="_blank">Aptana Studio Pro</a> .<br />
نکته: Aptana را می‌توان بصورت مجزا از Eclipse هم نصب کرد</p>
<h4><a href="http://www.netbeans.org/" target="_blank">NetBeans</a></h4>
<p>این IDE تقریباْ نو ظهور هم، بسیار مناسب می‌باشد و البته برای کار روی Eclipse ساخته نشده است. بیشتر ویژگی‌های سایر IDEها را دارد و خوشبختانه OpenSource هم می‌باشد. با توجه به توسعه سریع، روان و جالب آن آینده بسیار روشنی را پیش روی دارد.</p>
<h3>نتیجه اخلاقی</h3>
<p>آقای الکساندر ماکارو (Alexander Makarov) در مجله <a href="http://www.smashingmagazine.com" target="_blank">Smashing</a>، بررسی جالبی بین این IDEها انجام دادند که به شما پیشنهاد می‌کنم حتماْ آن را <a href="http://spreadsheets.google.com/ccc?key=pV8XyUSUOM7ET07rn4n7NYA" target="_blank">از این آدرس</a> مطالعه کنید.<br />
بنده شخصاْ بعد از مشاهده این مقایسه و تست کردن دو افزونه Aptana و PDT به این نتیجه رسیدم که با همون PDT کار کنم. چون اگر حقیقت را بخواهید همین PDT هم کلی از سرم زیاده و خیلی امکانات دارد که هنوز نشناخته‌ام، اما فکر می‌کنم Aptana امکانات جانبی بیشتری نسبت به PDT دارد. امکانات و ویژگی‌های Zend Studio هم که غیر قابل انکار است، اما من پول ندارم. NetBeans هم مطمئناْ چیز خوبی است چون توی یکی از توییت‌های <a href="http://alvanweb.com" target="_blank">مرتضی الوانی</a> خوندم که از اون استفاده می‌کنه.<br />
در هر صورت انتخاب من، فعلاْ Eclipse و پلاگین PDT است و با آن راحتم. بهترین شیوه برای نصب آن هم استفاده از بسته <a href="http://www.eclipse.org/pdt/downloads/" target="_blank">PDT All In One</a> است. با حجم تقریبی 140mb که بعد از Extract کردن آماده استفاده است. بروی کلیه پلتفرم‌های لینوکس ۳۲ و ۶۴، مکینتاش و ویندوز هم قابل اجرا می‌باشد. (<a href="http://www.eclipse.org/pdt/downloads/" target="_blank">از این آدرس می‌توانید نسخه مناسب با سیستم خود را دریافت کنید</a>)</p>
<h3>و اما ادامه ماجرا</h3>
<p>تا کنون به نتیجه نسبتاْ خوبی برای قسمت اول عنوان این پست رسیدیم، یعنی IDE خود را برای کار با php انتخاب کردیم. اما برای کار با سیمفونی باید تا حدودی IDE را با خواسته‌های خود سازگار کنیم. اینکار را به بخش‌های مختلفی همچون symfony code completion در PDT، ایجاد رنگ‌بندی برای فایل‌های YAML و استفاده از پلاگین Subclipse برای کار با SVN تقسیم می‌کنیم که در قسمت دوم این مقاله به شرح آن خواهیم پرداخت.</p>
<p><a href="http://weblog.alvanweb.com/2008/11/26/setting-up-eclipse-to-work-with-cakephp/" target="_blank">بیشتر راجع به مقدمات Eclipse در الوان‌وب</a></p>
<p><strong>پ‌ن</strong> : این نیمچه مقاله رو با الهام و ادقام <a href="http://www.smashingmagazine.com/2009/02/11/the-big-php-ides-test-why-use-oneand-which-to-choose/" target="_blank">این نوشته از مجله Smashing</a> و مطلبی در <a href="http://trac.symfony-project.org/wiki" target="_blank">ویکی symfony</a> نوشتم.</p>
<img src="http://www.moshtaghi.ir/weblog/?ak_action=api_record_view&id=389&type=feed" alt="" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=QghQu_Rg6xc:ffk1_PSYENE:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?i=QghQu_Rg6xc:ffk1_PSYENE:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=QghQu_Rg6xc:ffk1_PSYENE:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=QghQu_Rg6xc:ffk1_PSYENE:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=QghQu_Rg6xc:ffk1_PSYENE:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?i=QghQu_Rg6xc:ffk1_PSYENE:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=QghQu_Rg6xc:ffk1_PSYENE:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=QghQu_Rg6xc:ffk1_PSYENE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Moshtaghi?a=QghQu_Rg6xc:ffk1_PSYENE:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Moshtaghi?i=QghQu_Rg6xc:ffk1_PSYENE:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Moshtaghi/~4/QghQu_Rg6xc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://weblog.moshtaghi.ir/2009/06/best-php-ide-and-compatible-with-symfony/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://weblog.moshtaghi.ir/2009/06/best-php-ide-and-compatible-with-symfony/</feedburner:origLink></item>
	</channel>
</rss>
