PDA

View Full Version : آموزش گام به گام yii



nariman_t
جمعه 26 آبان 1391, 11:00 صبح
خیلی وقت هستش که دارن میگن برای این فریم ورک آمزش قرار بدید ولی کسی این کار رو نکرده امیدوارم بچه ها برای این بخش همکاری لازم رو بکنن تا بتونیم این فریم ورک رو به فارسی زبان ها و بچه های خودمون که php کا میکنند آموزش بدیم و یه مرجع خوب رو برای دیگران و همچنین خودمون درست کنیم
اینجا فقط آموزش این فریم ورک قرار داده میشه یه تاپیک دیگه هم بعداً بچه ها اونهایی که می خو.اهنمد با این فریم ورک کار کنند به نظرم بزنند که سوالها در اونجا مطرح بشه تا حجم پست ها الکی و بدون بار اطلاعاتی نباشه

این آموزشهایی که میزارم از کتابهای انگلیسی و فارسی مختلف در اینجا قرار میدم و تا جایی که میتونم منابع رو هم مینویسم که بتونید از کتابهای اصل هم استفاده بکنید
سعی میکنم مثالهای مناسب نیز برای آموزش ها قرار بدم.
به احتمال قوی از مطالبی که در اینجا قرار داده میشه چون منبع فارسی مناسبی برای این فریم ورک وجود نداره کپی برداری خواهد شد از کسانی که از مطالب این قسمت کپی برداری می کنند منبع رو ذکر کنند تا دیگران سردر گم در بدست آوردن اطلاعات دیگر از این فریم ورک نشن اگر هم که نام نویسنده هز مطلب رو هم بنویسید که در حق کسی که مطالب رو ترجمه میکنه لطف خواهید کرد چون برای ترجمه متون خیلی زحمت کشیده میشه

MMSHFE
جمعه 26 آبان 1391, 11:19 صبح
دوستان عزیز من درخواست راه اندازی بخش اختصاصی Yii Framework رو ثبت کردم. اگه خدا بخواد به زودی راه اندازی میشه. تا اون موقع برای جلوگیری از پراکندگی همینجا مطالب رو بگذارین تا به وقتش این تاپیک به بخش مربوطه منتقل بشه.
موفق باشید.

nariman_t
جمعه 26 آبان 1391, 11:46 صبح
yii فریم ورک چیست ؟
یکی از خواسته های و برنامه نویسان و طراحان سایت های اینترنتی انتخاب یک platform مناسب برای پیاده سازی سایت ها، برنامه های تحت وب و پرتال ها می باشد. شاید برای کاربران ویندوز عموماً برنامه نویسسان asp.net گزینه های زیادی برای انتخاب مطرح نباشد و ms dotnet freamwork به عنوان platform اصلی مورد استفاده قرار میگیرد.اما برای برنامه نویسان جامعه متن باز به خصوص برنامه نویسان php انتخاب یک platform مناسب مقداری پیچیده باشد. پیدا کردن platform مناسب برای برنامه نویسانی که سطح متوسط برنامه نویسی php را پشت سر گذاشته اند و قصد ورود به فضاهای جدید با قابلیت های پیرفته را دارند امری مهم به شمار می رود. شاید نام بسیاری از این platfotm ها را شنید باشد که البته تعداد آنها کم هم نیستند مانند :
CakePHP Prado Zend ZooP

94997

فریم ورک yii (مانند حرف e کشیده یا تلفظ yee خوانده می شود)نیز همانند سایر این برنامه ها یک platform برای استفاده برنامه نویسان php است که در سال 2008 توسط تعدادی از برنامه نویسان مجرب و حرفه ای که مدت زمان زیادی را بر روی پروژه های توسعه php freamwork (مثل پروژه prado ) صرف کرده بودند عرضه شد. این پروژه هر چند عمر طولانی ندارد ولی به قدری موثر واقع شد که در مدتی کوتاه توانسته است نظر بسیاری از توسعه دهندگان وب را به خود جلب نماید. yii بسیاری از قابلیتهای پروژه موفق prado را به ارث برده است. yii freamwork یک نرم افزار ریاگان میباشد که گواهینامه bsd license را نیز اخذ نموده است.

برخی ویژگی های yii freamwork

yii تنها از php نسخه 5 و بالاتر پشتیبانی می کند. در مقایسه با فریم ورکهایی مانند Cackephp که از php4 نیز پشتیبانی میکند این مسئله یک کمبود به نظر می رسد ولی همیشه اینطور نیست. فریم ورکهایی مانند cackephp برای ایجاد تطابق با نسخه های 4 ناچارند که خیلی از قابلیت های نسخه 5 را نادیده بگیرند یا به گونه ای آنها را تغییر دهند که باعث ایجاد تطابق گردد ولی yii freamwork با تمرکز بر روی نسخه 5 php از همه قابلیتهای آن استفاده می کند و این مسئله در سال 2011 که اکثر میزبانها از php 5 حمایت می کنند نه تنها یک کمبود نیست بلکه یه مزیت به شمار می رود.

94999

در ساخت فریم ورک yii از الگوی طرح mvc استفاده شده است. mvc مدلی است که در مهندسی نرم افزار معرفی می شود و در این مدل اجزا برنامه به سه قسمت اصلی کنترل کننده- مدل- دیدگاه تقسیم می شود و جریان داده ها در آن برقرار می شود. yii تمام قواعد mvc را رعایت کرده است ، الگوی کاری mvc در شکل زیر آمده است:

95000

یک محیط کاملاً شئ گرا:
در yii شی گرایی به عنوان یک اصل اولیه رعایت شده است و دسترسی به همه چیز حتی دسترسی به جداول بانک اطلاعاتی و روباط و ... نیز در قالب شی گرایی تعریف می شود که این مسئله در مقابل فریم ورکهایی مثل Cackephp که همچنان ارز دسترسی ها رابطه ای پشتیبانی می کنند یک مزیت عمده است.

از قابلیت برنامه نویسی generic حمایت می کند:
generic یک قابلیت برنامه نویسی است که هدف از آن پشتیبانی از انواع داده های ورودی بدون قید محدودیت نوع است و به عنوان یکی از روشهاو تکنیک های نوین برنامه نویسی استفاده می شود.

هماهنگی با jquery :
jquery همانطور که میدانید یک platform بر اساس زبان javscript است که قابلیت فوق العاده بصری را در محیط کاری کاربر ایجاد می کند. yii freamwork با این platform هماهنگی و ارتباط مستقیمی را ایجاد می کند و امکان استفاده از قابلیتهای ajax را فراهم می کند.


95002
از ORM پشتیبانی می کند:
Object relational mapping روشی برای تطابق با شی گرایی است. از آنجایی که بانک اطلاعاتی mysql یک بانک اطلاعاتی رابطه ای است لذا در روش orm یک بانک اطلاعاتی مجازی از بانک اصلی mysql ساخته می شود و عملیات بر روی آن با استفاده از روش شی گرایی انجام می شود و سپس این بانک اطلاعاتی مجازی بر روی بانک اصلی updtae می شود. برای برنامه نویسان net. این موضوع آشنا است و در ado.net مفهوم بانک اطلاعاتی مجازی در قالب dataset ارائه می شود.
استفاده از حالت caching پیشرفته:
yii از یک حالت caching بسیار پیشرفته برای کار با بانک اطلاعاتی استفاده می کند که یک مزیت عمده است و باعث سبک شدن فضای کاری و افزایش بسیار زیاد بازدهی می شود. به نمداری که معرف بازدهی yii freamwork در مقایسه با چند فریم ورک معروف است توجه کنید :

95003

مشاهده می شود میزان بازدهی آزمایش شده برای yii بسیار بیشتر از رقبای قدیمی خود است.

چند مورد از ویژگی های دیگر :



پشتیبانی از AJAX


پشتیبانی از بانک اطلاعاتی چند گانهMultipleDB


پشتیبانی از templates


پشتیبانی از modules


پشتیبانی از Authentication


پشتیبانی از validation

nariman_t
جمعه 26 آبان 1391, 12:42 عصر
پیش نیازها قبل از شروع کار را yii فریم ورک
برای شروع کار با yii کاربر باید با اصول اولیه برنامه نویسی آشنایی داشته باشد. همچنین اصولا اولیه طراحی وب و آشنایی با دستورات php ضروری است. کاربر باید با مفاهیم شئ گرایی و همچنین بانک های اطلاعاتی آشنا باشد. تعدادی از پیش نیاز ها برای کار کردن با این فریم ورک در زیر آمده است:



XHTML
CSS
JAVASCRIPT&JQUERY
PHP
Object Orented Programing
SQL Language & Php Myadmin

چه برنامه هایی را با yii می توان تولید کرد؟
فریم ورک yii مناسب برای طراحی سایت ها و برنامه های تحت وب با ترافیک بالا است. سایت های مرتبط با تجارت الکترونیک ، پورتال ها، فروم ها و سیستم های مدیریت محتوا از جمله برنامه هایی هستند که می توان توسط yii آنها را پیاده سازی نمود. سرعت و کارایی از جمله مهمترین مشخصه های برنامه های تولید شده توسط yii هستند. yii یک فریم ورک مناسب برای پیاده سازی سایت های حرفه ای و پیشرفته با میزان کارایی بالا است و قابلیت های گسترش زیادی را در اختیرا کاربران قرار می دهد.

نصب yii فریم ورک
نصب فریم ورک شامل مراحل زیر است:
اگر قصد نصب فریم ورک بر روی localhost را دارید باید host server مناسب را نصب نماییم. پیشنهاد می شود که از نرم افزار XAMP Server استفاده نمایید هر چند از برنامه های دیگر همانند Wamp Server نیز می توان استفاده کرد. نکته مهم این است که هاست مورد استفاده از php نسخه 5.1 یا بالا تر پشتیبانی نماید که اگر از آخرین نسخه های یاد شده استفاده کنید این مورد را دارا می باشند. آخرین نسخه فریم ورک را از قسمت Downloads سایت رسمی خود فریم ورک به نام www.yiiframework.com (http://www.yiiframework.com) دریافت نمایید. این فایل در قالب tar یا zip می باشد. این فایل را از حالت فشرده خارج می کنیم. و در یک پوشه با عنوان yii قرار میدهیم . پوشه yii ایجاد شده را در مسیر localhost قرار میدهیم . اگر از XamP server استفاده می کنید این مسیر چیزی مانند C:\xampp\htdocs است و اگر از Wamp Server استفاده می کنید ، مسیر حدوداً به شکل روبرو خواهد بود C:\wamp\www .
در سایر هاست ها باید پوشه مورد نظر را پیدا کنیم .

نکته:
[SIZE=2]قرار دادن پوشه فریم ورک نمی باشد و بعداً می توانید این مسیر را به هر جای دیگر تغییر دهید.

در این مرحله local host را start (راه اندازی نرم افزار مورد نظر) می کنیم و سپس در مرورگر خود آدرس زیر را باز می کنیم :
[SIZE=4][SIZE=4]

[SIZE=2]http://localhost/yii/requirements/index.php (http://localhost/yii/requirements/index.php)

[SIZE=2]در این صفحه نیازمندی های مورد نیاز برای کار با این فریم ورک نشان داده شده است . گزینه های failed شده باید بررسی و سرویس های مرتبط با آنها از حالت failed خارج شوند . دو سرویس PDO extension و PDO SQLite extension برای شروع کار با Yii ضروری هستند و باید فعال باشند



[SIZE=4][SIZE=4]

[SIZE=4][SIZE=2]در این صفحه نیاز مندی های مو رد نیاز برای کار با این فریم ورک نشان داده شده است . گزینه های Failed شده باید بررسی و سرویس های مرتبط با آنها از حالت failed خارج شوند. دو سرویسPDO extension و PDO SQLite extension برای شروع به کار با yii ضروری هستند و باید فعال باشند.

[SIZE=2]95010

در این مرحله باید مسیرهای سیستم را اصلاح نماییم برای این کار در ویندوز در صفحه MyComputer کلیک راست کرده و گزینه properties را انتخاب می کنیم و سپس در تب های بالا قسمت Advenced را انتخاب می کنیم و از گزینه های موجود روی دکمه Environment Variables کلیک می کنیم تا پنجره دیگری باز شود در قسمت System Variables گزینه Path را انتخاب کرده و مسیر قرار گیری فریم ورک و همچنین مسیر قرار گیری فایل php.exe که در local host server قرار دارد را اضافه می کنیم مانند زیر:

[SIZE=4][SIZE=4][SIZE=4][SIZE=4][SIZE=2]C:\xampp\htdocs\yii\framework;C:\xampp\php

حال سیستم را یک بار راه اندازی مجدد میکنیم.در برخی موارد بدون راه اندازی مجدد سیستم نیز مسیرهای وارد شده به درستی عمل خواهند کرد.

nariman_t
جمعه 26 آبان 1391, 15:04 عصر
تا اینجای کار تونستیم yii رو برای کار کردن آماده کنیم در اینجا یک قسمت رو برای تست کردن کارهایی که انجام دادید میزارم و بعد از این پست هر هفته یک یا دو پست از ترجمه یکی از کتابهای مربوط به این فریم ورک رو میذارم البته مطالبی که گذاشته میشه کاملاً شبیه به خود کتاب نخواهد بود و بعضی از مطالبی که به موضوع ربطی نداره و توضیحات زیادی رو از کتاب ترجمه نخواهم کرد ولی در هر صورت با مثالهای مناسب و ... مطالب رو به نحو خوب به شما خواهم رساند

خوب بریو سر ادامه آموزش
ساختن اولین پروژه با استفاده از command-line یا همون cmd
پس از نصب فریم ورک برای ساختن اولین پروژه به شکل زیر عمل میکنیم. ابتدا در ویندوز در قسمت run عبارت cmd رو تایپ میکنیم و وارد command prompt میشویم. سپس با دستور cd وارد مسیر web root می شویم . مثلاً اگر از xamp استفاده می کنید:

cd c:\xampp\htdoces

سپس از yiic برای ساخت پروژه ها استفاده می کنیم:
دستور زیر رو برای ساخت پروژه جدید در زیر شاخه فعلی استفاده می کنیم

yiic webapp demo

سپس یک سوال با عنوان زیر از شما پرسیده خواهد شد


Create a Web application demo? [Yes|No] yes

که از شما سوال شده که آیا می خواهید برنامه وب رو با نام demo در مسیر جاری بسازید که شما برای موفاقت با این سول کلمه y که مخفف yes است را نوشته و دکمه enter را فشار دهید.
این کار باعث ساخته شدن یک پوشه با نام demo در مسیر جاری webroot می شود. برای مشاهده پروژه ساخته شده مسیر زیر را در مرورگر خود وارد می کنیم:

http://localhost/demo/index.php (http://localhost/demo/index.php)


با وارد کردن لینک بالا در مرورگر صفحه ای همانند صفحه زیر باز خواهد شد.

95021

پروژه ساخته شده دارای 4 صفحه homepage, about page, contact page login page است. به این پروژه ساخته شده skeleton (اسکلت،استخوان بندی)می گویند که شامل این 4 صفحه پیش فرض ابتدایی است و بعدا صفحات و محتویات آن توسط ما ویرایش می شود.
نکته:
مسیر پوشه yii freamwork باید حتماً در path قرار داده شده باشد در غیر اینصورت برنامه yiic اجرا نخواهد شد و برای اجرای yiic باید مسیر فایل php.exe نیز در path موجود باشد. که تنظیمات این کار را برای path در پست های قبل آموزش داده این.



در فصل های بعدی بیشتر به توضح استخون بندی و اسکلت برنامه های ساخته شده با yiic و جزئیات کار و همچنین معرفی قسمتهای مختلف آن خواهیم پرداخت.

nariman_t
جمعه 26 آبان 1391, 15:51 عصر
از اونجایی که در پست قبل از yiic و command line برای ساختن پروژه جدید استفاده کردیم در این قسمت کمی در رابطه با دستورات command line موجود در yii توضیح میدیم.

شاید این مطالب خیلی خیلی کامل نباشه ولی آشنایی با اونها خالی از لطف نیست اما در فصل های آینده سعی میکنم به طور کامل yiic رو توضیح بدیم و کار کردن با دستوراتش رو با مثالهای مختلف آموزش بدیم
yiic در فریم ورک yii به عنوان یک برنامه کنسول در نظر گرفته شده .


ابزار خط فرمان
پس از نصب yii freamwork برای ایجاد یک پروژه جدید به شکل زیر عمل کردیم


Yiic webapp [path/] project-name

مثال:

Yiic webapp c:\xampp\htdocs\project1


ساختار


yiic <command-name> [parameters...]
The following commands are available:
- message
- migrate
- shell
- webapp


برای این که بتونید تمام دستورات قابل استفاده رو ببینید میتونید از دستور زیر استفاده کنید

yiic help


سوئیچ massage

yiic message <config-file>

ترجمه یک متن به آرایه قابل فهم توسط php و ذخیره آن در یک فایل config
سوییچ migrate

yiic migrate [action] [parameter]

جهت استفاده از قابلیت database migration به کار می رود.
سوییچ shell

yiic shell [entry-script | config-file]

این دستور جهت کار با یک پروژه ایجاد شده در خط فرمان به کار می رود این سرویس همچنین ابزارهایی جهت تولید خودکار کنترلر ها، مدل ها و ویوها را دارد. توصیه می شود که این دستور را از داخل دایرکتوری اصلی برنامه اجرا نمایید. پارامتر entry-script و config-file اختیاری هستند و مسیر فایل پیکر بندی برای برنامه را نشان می دهند و اگر این مسیر آورده نشود به طور پیش فرض فایل index.php موجود در همین دایرکتوری را نشان می دهد.
به وسیله سوییچ shell می توان تمامی عملکرد gii را پیاده سازی نمود.

yiic shell
- controller
- crud
- form
- help
- model
- module

در مورد gii هم بعداً توضیحات بیشتری خواهیم داد. تنها چیزی که در مورد این ابزار میتونم بگم اینه که برای تولید اتوماتیک اسکریپتها بر پایه yii هستش
فعلاً این کدها رو برای آشنایی شما قرار دادیم تا هر چند کم متوجه کاری که در بالا انجام دادیم بشید
توضیحات کاملت رو در فصل مربوط قرار خواهم داد و کامل توضی خواهم داد که این دستورات برای چه کارهایی استفاده می شوند در روند آموزش نیز یکی یکی دستورات را به طور کامل فذا خواهید گرفت

nariman_t
جمعه 26 آبان 1391, 20:38 عصر
ادامه مطالبی که در اینجا قرار میدیم بر گرفته از کتاب
Agile Web Application Development with Yii 1.1 and PHP5 میباشد شاید در بعضی جاها ترجمه متون مشکل داشته باشه کسانی که میتونند اشکالات متون رو بگیرند یا در ترجمه این کتاب به منن کمک کنند کمکشون رو از ما دریغ نکنند


برای کمک به درک این مطلب اجازه دهید مثالی زده و با مثال این مطلب را بیان کنیم و اون رو ادامه بدیم.
فک کنید که از yii برای ساخت یک وب سایت استفاده کرده ایم کاه نام سایت هم yourblog.com میباشد. این سایت شبیه به یک سایت خیلی ساده و معمولی می باشد.صفحه اصلی یا همون صفحه خانه یک لیست از جدید ترین پستهایی که به تازگی ارسال شده است رو نشون میده.عنوان هر یک از این پستها رو فک کنید که لینکی هستش برای دیدن کامل یک مقاله که به صفحه ای دیگر ما رو میبره تا اون مقاله رو به طور کامل مشاهده کنیم. دیگرام یا نموداری که در زیر مشاهده میکنید فرایند این کار رو برای ما نشون میده که چطور yii درخواست هایی که با کلیک بر روی یک لینک انجام می شود رو مدیریت می کند.

95036
عکسی که در بالا قرار داده ایم نشون میده که یک لینک به طور مثال لینک زیر چطور در فریم ورک yii ردیابی میشه و جواب رو برای ما بر میگردونه.
http://yourblog.com/post/show/id/99
ما هم در اینجا روند این کار رو تا حدودی برای شما شرح خواهیم داد:
اول، درخواست از لینکی که ما بر روی اون کلیک کردیم به روتر router فرستاده میشه و روتر نیز لینک درخواست شده رو تجزیه میکنه تا به اون جواب بده . در اینجا باید این نکته را نیز بگیم که yii از یک ساختار از پیش تعریف شده برای لینکه استفاده میکنه که در این مورد در فصل های مربوطه بیشتر توضیح خواهیم داد.ساختار url درخواستی کلیدی برای تصمیم گیری در مورد کار انجام شده خواهد بود.
ساختار کلی url های مربوط به فریم ورک yii که به صورت پیش فرض می باشد به صورت زیر خواهد بود
http://hostname/index.php?r=ControllerID/ActionID

در این لینک پیش فرضی که ما قرار داده ایم رشته درخواست r که ما اون رو به عنوان متغیر در php میشناسیم اشاره میکنه به مسیر مورد نظر که به وسیله روتر yii تجزیه و تحلیل میشه.این مسیر تجزیه میشود به مناسب ترین رویه کنترلر و اکشن تا به این درخواست به مناسب ترین شکل رسیدگی کنند.
در مورد اکشن ها و کنترلر ها و موارد دیگر در جلوتر ، فصلهای بعدی ، در فصلهای مربوطه بیشتر توضیح داده خواهد شد.
در حال حاضر ، شما ممکن است فوراً متوجه شده باشید که Url ذکر شده در مثال قبل از این قالب به طور پیش فرض پیروی نمی کند. این یک موضوع ساده است برای پیکر بندی موتور جست و جو قالب نرم افزار به صورت زیر می باشد
http://hostname/ControllerID/ActionID
ما نیز به استفاده از همین فرمت ساده برای رسیدن به اهدافمون ادامه خواهیم داد.ControlId ذکر شده در url اشاره میکنه به نام کنترلر . برای مثال نام کلاس کنترلر شما TestController باشه ، در url درخواستی شماControlId باید Test نوشته بشه.به طور مشابه ، ActionId اشاره میکنه به نام Action که مشخص شده است به وسیله Controller. اگر Action یک رویه ساده که تعریف شده در درون کنترلر باشه، این پیروی خواهد کرد از کلمه Action در نام متد.برای مثال اگر شما نام متدتون رو ActionCreate() گذاشته باشید ActionId ، Create نام خواهد داشت.
نکته:
اگر ACtionId حذف شده باشه ، کنترلر action پیش فرض خواهد شد، که این متد در کنترلر پیش فرض به نام ActionIndex() صدا زده خواهد شد.همچنین اگر ControllerID حذف بشه، برنامه کنترلر پیش فرض رو استفاده خواهد کرد. کنترلر پیش فرض yii ، SiteController صدا زده خواهد شد.
بر گردیم به مثالمون، روتر url زیر رو آنالیز خواد کرد:
http://yourblog.com/post/show/id/99
و بخش اول از مسیر آدرس درخواستی ، post به ControllerId و قسمت دوم ، show به ActionId اشاره خواهد کرد.
. این درخواست در مثال بالا مسیر رو ترجمه میکنه به متد Actionshow() در کلاس PostController . در قسمت آخر این درخواست (id/99) یک نام/مقدار از پارامتر رشته درخواست است که در طول پردازش متد در درسترس خواهد بود. در این مثال ، 99 نشان دهنده Id منحصر به فرد داخلی برای انتخاب پست مورد نظر می باشد.
متد Actionshow() درخواست‌ها رو اداره میکنه برای نوشته‌های خاص پست شده در سایت. در اینصورت با استفاده از متغیر رشته پرس و جو ، شناسه مشخص میکنه که کدام پست ویژه درخواست شده است.این درخواست با استفاده از مدل بازیابی میکنه اطلاعات رو درباره شماره شناسه ورودی 99.
کلاس مدل AR با پایگاه داده برای بازیابی داده های درخواستی تعامل دارد. بعد از بازیابیی دا ده ها از مدل ، کلاس کنترلر داده رو برای نمایش دادن آماده میکنه به وسیله view ساخته شده در دسترس. این معماری mvc اجازه میدهد تا بتونیم مدل و کنترلر رو از ارائه و نمایش یا همون ویو جدا بکنیم.
این روش باعث میشود که توسعه دهندگان وب برای تغییرات آتی در برنامه خود بدون اینکه مثلاً برنامه نویس رابط کاربری یا طراح ظاهر سایت بدون این که درگیر کدهای اصلی و مدل ها و ... شوند به راحتی کار خود را انجام دهند و بلعکس.
مسیر دهی شی رابطه ای و رکورد فعال
در اکثر مورادبرنامه های کاربردی وب اطلاعات خانه های خود را در پایگاه داده رابطه ای می سازند.وبلاگ که ما در مثال قبلی که در حال استفاده بودیم، دارای محتویاتی بود که در پایگاه داده ذخیره شده بود.با این حال، داده های برنامه وب احتیاج دارد که در پایگاه داده ذخیره سازی پایدار نگه داشته شود .
Object-relational mapping (ORM) روشی برای تطابق با شی گرایی است. از آنجایی که بانک اطلاعاتی mysql یک بانک اطلاعاتی رابطه ای است لذا در روش orm یک بانک اطلاعاتی مجازی از بانک اصلی mysql ساخته می شود و عملیات بر روی آن با استفاده از روش شی گرایی انجام می شود و سپس این بانک اطلاعاتی مجازی بر روی بانک اصلی updtae می شود. از این به بعد در هر کجا کلمه orm را گفتیم به همین شی گرایی دیتا بیس اشاره میکنیم و منظورمان همین شی گرایی دیتا بیس می باشد.
کتابخانه orm این تبدیل طرح رو از جدول های دیتا بیس به شی کلاس های دامنه ارائه میکند.بسیاری از کدهایی که با orm در حال دادو ستد هستند درباره توصیف چگونگی فیلدها در دیتابیس مطابقت میکنه با فیلدهایی که در اشیای orm وجود دارند،که برای نوشتن تکراری هستند.خوشبختانه، yii در اینجا نیز به کمک ما می آید تا ما را از این تکرار و یکنواختی به وسیله ارائه لایه ORMدر قالبالگویAR نجات دهد.
Active Record
همانطور که قبلاً اشاره شد، Ar همانند یک الگوی طراحی است که برای دسترسی به پایگاه داده خیالی در مد شی گرایی استفاده می شود . این جداول به کلاس‌ها، ردیف‌ها به اشیاء و ستون به ویژگی های شئ ترسیم می شوند. به عبارت دیگر، هر نمونه از کلاس رکورد فعال نشان دهنده یک سطر در جدول پایگاه می باشد. نتیجه نهایی یک کلاس است که تعریف میکنه همه چیز رو در مورد چگونگی نوشته شدن و خواند از دیتا بیس. با تکیه به قرارداد و تکیه به منطق پیش فرض ، کاربرد yii از AR باعث میشه که در وقت توسعه دهندگان صرفه جویی بشه و کارهای تکراری تا حدودی حذف شود.همچنین به توسعه دهنگان اجازه می دهد تا به داده های ذخیره شده در پایگاه داده به صورت کاملاً شی گرایی دسترسی داشته باشند. برای نشان دادن این گفته ها، اینجا مثالی رو نشون میدیم که از AR برای اداره کردن روی یک پست بلاگ ویژه با Id خاص استفاده میکنه ، که کلید اصلی در جدول استفاده شده 99 می باشد.این کدها اول بازیابی میکند محتویات پست رو به وسیله کلید اولیه یا همون کلید شاخص(primary) ، سپس عنوان رو تغییر میده، و سپس به روز رسانی میکنه پایگاه داده ر.و برای ذخیره تغییرات:

$post=Post::model()->findByPk(99);
$post->title='Some new title';
$post->save();

nariman_t
جمعه 26 آبان 1391, 21:53 عصر
ویو و کنترلر
ویو و کنترلر بسیار به یکدیگر نزدیک هستند می توان گفت مانند پسر عموهای هم هستند. کنترلر باعث میشه داده های در دسترس برای نمایش به ویو ارسال بشه و ویو تولیت میکنه صفحه ای رو که رویدار ها رو راه می اندازد، و داده ها رو به کنترلر ارسال میکنه.
در yii یک فایل ویو تعلق دارد به کلاس کنترلر که ترجمه میکنه اون رو .به این ترتیب، در داخل یک اسکریپت ویو، ما میتونیم به کنترلر نمونه دسترسی داشته باشیم به سادگی با اشاره به $this . این پیاده سازی ویو و کنترلر رو در ارتباط باهم میسازه.. خوشبختانه، تمام این جزیات رو Yii خودش برای ما مدیریت میکنه،بنابر این ما می تونیم تمام فکرمون رو فوکوس کنیم روی برنامه نویسی خودمون.
کنترلرهای میتوانند، مدیریت کنند پیچیده ترین خدمات رو قبل و پس از پردازشدرخواست، اجراء قوانین </SPAN>پایهکنترلدسترسی به محدود کردن دسترسی به اقدامات خاص،</SPAN>مدیریت طرح و برنامه طرح تو در تو رندر فایل، صفحه بندی از داده مدیریت، و بسیاری دیگر از خدمات پشت صحنه انجام می شود .دوباره باید از yii قدر دانی کنیم برای این که نیاز نیست خودمون رو درگیر کدهای درهم بر هم کنیم.
معرفی کنترلر :

فایل کنترلر در شاخهprotected/controllers قرار می گیرند. در ابتدای شروع برنامه یک نمونه از کنترلر توسط bootstrap یعنی فایل yiibase.php ساخته و سپس اجرا می شود. هر کنترلر دارای یک نام منحصر به فرد یا controlId می باشد. کنترلر شامل تعادای از اکشن ها می باشد که بر اساس درخواستهای کاربر کار خاصی را انجام می دهند . کنترلر از طریق اکشن ها جریان داده بین مدل ها و ویها رو مدیریت می کند . action در واقع متد موجود در کنترلر است این متد با کلمه action شروع می شود. کاربر در فراخوانی هایش کلمه action را ذکر نمی کند. مثل:

www.hostname.com/index.php?r=site/view

در این مثال کنترلر site و اکشن view فراخوانی می شود ولی نام متد در اصل ActionView است که کلمه Action آن ذکر نمی گردد و این باعث افزایش امنیت نیز می شود.زیرا که کاربر مستقیماً نام فایل را متوجه نمی شود.
معرفی ویوها:
نام یک ویو با نام فایل آن یکسان است مثلاً ویوی که در فایل Edit.php قرار دارد با نام edit شناخته می شود. به ازای هر فایل کنترلر siteControler.php دارای یک پوشه به عنوان Site در دایرکتوری view است.و می توان به ازای هر اکشن در کنترلر یم فایل ویو داشته باشیم .
برای فرا خوانی یک ویو در کنترلر از دستور CController::render() استفاده می کنیم. مثال:

$this->render('edit');


در داخل ویو ما می توانیم با کلمه کلیدی $this به کنترلری که این ویو را فراخوانی و اجرا کرده است دسترسی پیدا کنیم.

خلاصه:
در این فصل ما چارچوب برنامه php yii رو در سطح مناسبی معرفی کردیم ما همچنین تعدای از مفاهیم طراحی نرم افزار تحت پوشش yii رونیز بیان کردیم. اگر این بحث ها و مفاهیم پالیه رو زیاد نفهمیدید و سردرگم شده اید زیاد نگران نباشید این مباحث فقط بررسی Yii بودند. در فصل های بعد به طور کامل ویوها ، کنترلر ها ، مدل ها و همه این مطالبی که در بالا گفته شد به صورت کامل توضیح داده خواد شد که هر کدام شاید یک فصل کامل رو به خود اختصاص بدن پس زیاد نگران نباشید اگه چیز زیادی از بعضی از مطالب نفهمیدید اینها فقط برای آشنایی با بعضی از قسمتهای yii بودن.
در این پست فصل اول به پایان رسید در روزهای آنیده سعی میکنم فصل های عدی کتاب مورد نظر رو قرار بدم البته کمی از فصل بعدی رو در پستهای اول قرار دادم که در فصل بعد از تکرار مجدد اونها جلوگیری کرده و فقط عنوان رو می نویسم

nariman_t
دوشنبه 29 آبان 1391, 16:10 عصر
فصل 2
شروع کار با yii
لذت واقعی استفاده از yii رو می تونید در هنگام به کار بردن آن به دلیل سادگی این فریم ورک به سرعت در بیابید. در این فصل ،ما میبینیم که چطور مفاهیم معرفی شده در فصل های قبل در یک مثال کاربردی از فریم ورک yii آشکار می شود. به عبارتی دیگر مفاهیمی که در فصل قبل توضیح دادیم را در این فصل به صورت کاربردی لمس خواهیم کرد و کم کم به سمت کار با این فریم ورک سوق پیدا خواهیم کرد. در این راستا ما می خواهیم یک برنامه hello world ساده با استفاده از yii ایجاد کنیم که با استفاده از قراردادها و چارچوب این فریم ورک این کار را انجام خواهیم داد. البته بعضی از قسمتهایی که در این فصل می نویسم شاید در پست های اول به آن اشاره شده باشه.
در این فصل ما مطالب زیر رو تحت پوشش آموزشمون قرار خواهیم داد:

· نصب فریم ورک yii (این کار رو قبلاً آموزش داده ایم و در این فصل از گفتن چگونگی نصب yii خود داری میکنیم تا روند کار سریع تر باشد)
· ساخت یک برنامه جدید با استفاده از yii (این قسمت را نیز در پستهای قبل توضیح داده ایم ولی با توحه به ادمه مطالب فصل کمی به مطالب قبل نیز اشاره خواهیم کرد)
· ساخت کنترلر و ویو
· اضافه کردن محتویات پویا به فایل ویو
· درخواست مسیریابی yii و لینک کردن صفحات با یکدیگر
قبل از هر کاری ما احتیاج داریم که فریم ورک yii رو برای کار کردن نصب و پیکر بندی کنیم اما هماهنگونه که در پست های اول این آموزش چگونگی نصب yii به صورت کامل رو تشریح کردیم در اینجا از توضیح دادن این مطلب خود داری میکنم و فقط سر تیتر این آموزش رو در اینجا میگذارم .
نصب yii
«به مطالب قبلی مراجعه شود»
نصب یک پایگاه داده
در طول این کتاب ، ما یک پایگاه داده استفاده خواهیم کرد که همه مثالهای این کتاب و همچنین برنامه ای که می خواهیم بنویسیم رو پشتیبانی خواهد کرد. به منظرو این که این کتاب رو به درستی بتونید دنبال کنید،توصه می شود که یک پایگاه داده را نصب کنید. اگر چه شما می توانید از هر دیتابیسی که در php ساپورت می شود در yii نیز استفاده کنیداگر شما می خواهید استفاده کنید از برخی لایه های توکار کار با دیتابیس و ابزارهای درونی yii، شما میتونید یکی از پایگاه های داده ای که به وسیله این فرمی ورک ساپورت میشه استفاده کنید.
پایگاه های داده ای که به وسیله این فریم ورک از نسخه 1.1 به بعد پشتیبانی می شوند به شرح ذیل هستند:
· Mysql ورژن 4.1 یا و نسخه‌هی بعد از آن
· PostgresSQL 7.3 یا نسخه های بعد از آن
· Sqllite 2 و 3
· Microsoft sql server 2000 و نسخه های بعد از آن
· Oracle
خوب حالا که ما فریم ورک رونصب کردیم،اجازه بدید یک برنامه جدید با این فریم ورک برای شروع کار ایجاد کنیم.
ساخت یک برنامه جدید با اسفاده از yii
برای ساخت برنامه جدید با استفاده از yii ، از یکی از امکانات yii که در پکیجی که دانلود کردیم وجود داره استفاده خواهیم کرد که این ابزار yiic هستش که ما در پست های قبل برخی از موراد کاربرد و چگونگی کار با اون رو بهتون نشون دادیم ولی باز در این فصل نیز دوباره کار با اون رو در راستای عملیات کتاب آموزش میدیم.این ابزاری که نام بردیم ابزار کامند لاین هستش که به معنی ابزار خط فرمان است که در محیط داس یا همون command prompt ویندوز قابل اجرا است که چگونگی پیکربندیشو در پستهای اول بهتون آموزش دادیم. با استنفاده از این ابزار می تونیم به سرعت یک برنامه وب رر که هر چند ساده میتونه باشه ایجاد کنیم که این وب ایجاد شده به وسیله این ابزار میتوانه استخوان بندی و پایه وب سایت های حرفه ای ساخته شده به دست ما در آینده باشه. در استفاده از این ابزار yii هیچ اجباری در کار نیست ولی استفاده از اون همیشه باعث میشه که در زمانمون صرفه جویی بشه و تمام پوشه های مورد نیازی که باید برای مار با این فرمی ورک ساخته بشن در جای خودشون باشه.
برای این که اولین برنامه تحت وب خودمون رو بر پایه این فریم ورک بسازیم command promt ویندوز رو هومنطور که قبلاً شرح دادیم باز کنید. و به شاخه ای که می خواهید برنامه خودتون رو ایججاد کنید وارد بشید. خوب فک کنم یادتون باشه که چطور در پستهای قبل یک برنامه جدید رو با استفاده از این ابزار ایجاد کردیم و فک کنم اگه با این آموزش همراه بوده باشید اون پروژه ای که گفتم رو اگه ایجاد کرده باشید در سیستمتون موجود باشه، ادامه کار رو نمیگم چون ادامه کار همون چیزی هستش که در بالا در پستهای قبل توضیح دادیم.
بعد از اینکه با استفاده از yiic برنامه دموی خودتون رو ساختید فولدرهایی که ساخته میشه از قرار زیر خواهد بود:
Index.php : فایلی هستش که در موقعه باز کردن وب سایتتون این صفحه فراخوانی میشه
Index-test.php :اسکریپت فایل ورودی برای تست فانکشن ها یا همون توابع است
پوشه assets : حاوی فایل های منبع منتشر شده است یا می توان گفت حاوی فایلهای مرجع مورد نیاز که به طور خودکار تولید می شوند می باشد در صورت حذف محتویات این پوشه مجدداً تولید می شوند ولی خود پوشه نباید حذف شود.
پوشه css : که حاوی فایلهای css می باشد
فولد images : که حاوی فایلهای تصویر می باشد
فولد theme : که حاوی قالبهای برنامه می باشد
فولدی protected : که حاوی پوشه ها و فایلهای اصلی مورد نیاز پروژه که به آن application base directpry می گویند. کلیه محتوای این پوشه باید از دسترس کاربران محفوظ بماند.
همنوطور که قبلاً گفتیم برای ساخت پروژه جدید از دستور yiic webapp استفاده کردیم که چگونگی کار با این دستور را کاملاً قبلا فرا گرفته ایم. در جواب دستور استفاده شده میبینید که این دستور تمام فولدر ها و فایلهایی که برای استخوان بندی یک برنامه وب بر پایه yii نیاز است رو برامون به طور خودکار ایجاد میکنه.
دیدی که با اجرای یک فرمان ساده از خط فرمان با سرعت خیلی زیاد و در کمترین زمان ممکن ساختیم.همه این پوشه ها و فایلها، شامل پوشه ها و فایلهای در محتویات خود دارا می باشند، که در نگاه اول کمی میتونه دلهره آور باشه.با این حال، ما می‌تونیم از بسیاری از آنها برای شروع کار چشم پوشی کنیم. همه این فرولد ها و فایلها در حقیقت یک برنامه تحت وب هستند که باهم دیگه کار میکنند تا یک برنامه وب رو بالا بیارند.پروژه ساخته شده همونطور که قبلاً هم گفتمدارای 4 صفحه پیش فرض است که به شرح زیر می باشد:

homepage, about page, contact page login page
اگر وب سرور شما کتابخانه گرافیکی GD2 را پشتیبانی کند شما بنابر این می تونید یک ویجت CAPCHA رو در صفحه Contact Us ببینید، که برنامه می تونه اعتبار سنجی فرم رو برای این آیتم برای شما به ارمقان بیاورد.
تا زمانی که وب سرورشما در حال اجرا است، شما بیاد بتونید برنامه که ساخته اید رو از طریق مرورگر باز کنید که این کار رو نیز در پستهای قبل انجام دادیم و شکلی همانند زید در صفحه مرورگر خودمون مشاهده کردیم.

95239
همونطور که میبینید در بالا منویی وجود دارد که ما رو به صفحه هایی هدایت میکنه. بذارید این صفحه ها رو کمی مورد بررسی قرار بدیم. با کلیک بر روی لینک about به یک صفحه ساده خواهید رفت که یک صفحه ثابت ساده است. لینک contact شما رو به صفحه تام با ما هدایت میکنه که قبلاً گفته شد، که در این صفحه هموطور مه گفتیم یک فیلد Captcha نیز وجود دارد. لینک login نیز برای شما یک صفحه فرم لاگین رو باز میکنه. این صفحه در حقیقت با اعتبار سنجی فرم کار میکنه، همچنین نام کاربری و پسورد گواهی نامه اعتبار و تصدیق هویت در این صفحه است. با استفاده از demo/demo یا admin/admin به عنوان نام کاربری/پسورد میتونید وارد سایت شوید. بعد از این که وارد سایت شدید لینک login به logout تبدیل خواهد شد که با کلیک بر روی آن می تونید از نام کارری و سایت خارج شوید. شما می تونید نام کاربری های به جز این دو را برای دیدن پیام خطا استفاده کنید تا ببینید که اعتبار سنجی این فرم برای ورود چگونه است. این شاید جالب باشه که بدون به زحمت انداختن خودمون این اماکانات رو برای سایتمون بتونیم فراهم کنیم.
ساخت کنترلر
یادتون میاد که ما با استفاده از yiic که همون ابزار خط فرمان Yii برنامه پایه و اصلیمون رو ساختیم، در اینجا نیز با کمک گرفتن از این ابزار کنترلر خودمون رو خواهیم ساخت. در این مورد، ما میریم برای استفاده از پوسته فرمان yiic (yiic shell commnad) برای شروع برنامه در پوسته های تعاملی که در آن ما می توانیم دستورهای دیگر رو نیز فراخوانی کنیم. برای راه انداختن shell ، به سمت فولدر root یا همون فولدری که برنامه خودومن رو در اون ساختیم برید که اگه یادتون باشه برنامه ما در داخل پوشه demo قرار داشت البته این رو هم بگم برای این محیط dos رو باز کنید و در محیط dos به اون مکان برید و کدهای زیر رو اجرا کنید:

>>Cd wamp
Wamp>>cd www
Wamp>>www>>cd demo
Wamp>>www>>demo>>
سپس yicc رو با استفاده از دستور shell زیر اجرا کنید:

Wamp>>www>>demo>>yiic shell]
Yii Interactive Tool v1.1
Please type 'help' for help. Type 'exit' to quit.
>>
شما در حال حاضر داخل پوسته تعاملی آماده هستید.شما می توانید کلمه help را برای دیدن یک لیست از دستوراتی که در این پوسته موجود هستند تایپ کنید به صورت زیر:

>> help
At the prompt, you may enter a PHP statement or one of the following commands:
- controller
- crud
- form
- help
- model
- module
Type 'help <command-name>' for details about a command.
حال ما در اینجا دستوراتی که در دسترس هستند را میبینیم. دستور controller که اولین گزینه از بین دستورهای موجود است برای این استفاده میشود که می خواهیم یک کنترولر برای برنامه خودمان بسازیم در کل این دستور برای ساخت کنترولر میباشد. برای دیدن مشخصات بیشتر از این دستور ما میتوانیم دستور help را به صورت زیر بکار ببریم تا اطلاعات بیشتری در رابطه با این دستور پیدا کنیم:

>> help controller
USAGE
controller <controller-ID> [action-ID] ...
DESCRIPTION
This command generates a controller and views associated with
the specified actions.
PARAMETERS
* controller-ID: required, controller ID, e.g., 'post'.
If the controller should be located under a subdirectory,
please specify the controller ID as 'path/to/ControllerID',
e.g., 'admin/user'.
If the controller belongs to a module, please specify
the controller ID as 'ModuleID/ControllerID' or
'ModuleID/path/to/Controller' (assuming the controller is
under a subdirectory of that module).
* action-ID: optional, action ID. You may supply one or several
action IDs. A default 'index' action will always be generated.
EXAMPLES
* Generates the 'post' controller:
controller post
* Generates the 'post' controller with additional actions 'contact'
and 'about':
controller post contact about
* Generates the 'post' controller which should be located under
the 'admin' subdirectory of the base controller path:
controller admin/post
* Generates the 'post' controller which should belong to
the 'admin' module:
controller admin/post

توجه:
در دو مثال آخر، دستورها یکسان هستند ، اما فایل کنترلر ساخته شده در زیر پوشه های مختلفی قرار گرفته اند. Yii قادر است تشخیص بده که ایا ادمین اشاره کرده به یک ماژول یا زیر پوشه.
خوب از طریق خواندن help ، روشن است که دستور controller ، کنترلر، اکشن و ویوها رو تولید خواهد کرد مرتبط با اون عملی که بهش دستور داده میشه. همانور که وظیفه برنامه اولیه ما نمایش یک پیام است، بیاید نام کنترلر خودمون رو massage بزاریم، و اجازه دهید نام عمل متد خود را بعد از یک پیام ساده نمایش دهیم:



>> controller message helloWorld
generate MessageController.php
mkdir /Webroot/demo/protected/views/message
generate helloworld.php
generate index.php
Controller 'message' has been created in the following file:
/Webroot/demo/protected/controllers/MessageController.php
You may access it in the browser using the following URL:
http://hostname/path/to/index.php?r=message
>>

بعد از اجرای این دستور باید یک پیام با این عنوان که عملیت با موفقیت انجام شده نمایش داده شود و MessageControll مون رو در مسیر پیش فرض که در ان قرار داشتیم در شاخه protected/controllers/ ساخته می شود. خیلی ساده بود، با یک دستور ساده ما تونستیم یک فایل کنترلر php ، که messageController.php نامگذاری شد رو به سادگی ایجاد کنیم.

nariman_t
سه شنبه 30 آبان 1391, 19:03 عصر
مرسی از راهنماییتون خودم میدونم که این کتاب هست ولی این کتاب اثلاً خوب توضیح نداده من فقط بخشی از مطالبشو استفاده کردم که اون هم اون اوایل گذاشتم چیزهایی که من دارم مینویسم رو منبع کتاب رو نوشتم که ترجمه یه کتاب انگلیسی هستش که با مثال همه چیو توضیح داده نه مثل اون کتابی که شما میگید اونو خیلی ها خوندن وبه جایی نرسیدن از جمله خودم فقط قسمت نصب yii رو فهمیدم بقیه کتاب رو اثلاً نفهمیدم که چی گفته در هر صورت باشه مطالب بعدی رو کنسل میکنیم من هم حوصلشون ندارم اینجا ترجمه کتاب رو بذارم برید هر جا که راحت ترید از همونجا بخونید هر کی هم دلش خواست میتونه مطالب رو ادامه بده منبع کتاب رو هم نوشتم موفق باشید بعد هم ما گفتیم یه جا مرجع باشه نه اینکه قسمت اولش تو یه جای فروم قسمت دوم در یه جای هچل هقت دیگه ای باشه خلاصه موفق باشید

rezaonline.net
سه شنبه 30 آبان 1391, 23:16 عصر
کار نیکو کردن از پر کردن است .
جناب آقای نریمان ، از سخنان این دوستمون دلخور نشید ، ایشون فقط منظورشون این بود مطالب تکراری ایجاد نشه .
پیشنهادم اینه اگه حوصله اش رو دارید و وقتش رو دارید یک سیستم کوچک مثل یک لینک باکس رو با Yii توی یک تاپیک جداگانه پیاده کنید تا هم کار عملی باشه برای دوستان هم چیز جدید ارائه شده باشه .

موفق باشید

nariman_t
جمعه 24 آذر 1391, 02:07 صبح
برخی از دوستان گفتن منبع رو بگم که قبلاً فک کنم گفته بودم ولی دوباره هم میگم که مشکلی پیش نیاد این ترجمه هایی که می نویسم مال کتاب agile web application development with yii 1.1 and php5 هستش



MessageControll ساخته شده کلاس گسترش یافته از کلاس پایه کنترلر است که در مکان protected/components/Controller.php قرار دارد. این کلاس به نوبه خد کلاس پایه فریم ورک رو گسترش میده، بنابر این تمام رفتارها و خصوصویات کنترلر پیش فرض رو به ارث میبره. از آنجا که ما یک پارامتر actionid مشخص کردیم به نام helloworld یک Action ساده نیز در داخل MessageControll با نام actionHelloWorld()
ساخته شده است. ابزار yii همچنین فرض میکنه که این action مانند بسیاری از Action های تعریف شده توسط یک کنترلر، احتیاج به ارائه یک view برای ترجمه شدن خواهد داشت. بنابر این، این کد رو به این تابع اضافه منید تا رندر کنه یک فایل ویو رو به وسیله همان نام که helloworld.php است و مکان آن در پوشه پیش فرض برای فایل‌های ویو در ارتباط با این کنترلر ، protected/views/message/ . در اینجا کدی که برای کلاس MessageController ساخته شده قرار داده شده است:


<?php
class MessageController extends Controller
{
public function actionHelloWorld()
{
$this->render('helloWorld');
}
public function actionIndex()
{
$this->render('index');
}
}

ما میبینیم که actionindex() نیز اضافه شده که به سادگی یک فایل ویو رو به صورت ترجمه مئ میکنه برای ما در
protected/views/message/index.php . ابزار yii هوشمند به ساخت یک action برای ما بود. سعی کنید به لینک http://localhost/demo/index.php?r=message/helloWorld. بروید. به احتمال قوی تصویری هماند تصویر زیر رو خواهید دید:
96617


یکی از مراحل آخر:
در داخل یک برنامه hello world ، همه ما احتیاج داریم که برای نمایش hello wordl خودمون اون رو سفارشی کنیم. این یک کار سادست. فایل protected/views/message/helloWorld.php رو ویرایش کنید و تنها کدهی زیر رو در اون قرار بدید:


<?php
$this->breadcrumbs=array(
'Message'=>array('message/index'),
'HelloWorld',
);?>
<h1>Hello, World!</h1>


کد بالا رو نوشته و اون رو ذخیره کنید ، و صفحه رو دوباره در مرورگرتون باز کنید . حالا این صفحه یک تبریک مقدماتی رو همونطور که در تصویر زیر میبینید برای ما نشان خواهد داد .
96618


خوب ما برنامه ساده خودمون رو داریم که با کوتها ترین کد کار می کنه . همه مشاهده کردید فقط یک خط htm,l به فایل View ، hellowordl خودمون اضافه کردیم.
بررسی درخواست مسیر یابی ما
بریم ببینیم yii چگونه در خواست ما رو در چهار چوب خودش که در مثال قبل زدیم تجزیه و تحلیل می کند:
شما به صفحه hello , worlkd! هدایت میشوید به وسیله اشاره کردن مرورگرتون در آدرس زیر

http://yourhostname/demo/index.php?r=message/helloWorld (http://yourhostname/demo/index.php?r=message/helloWorld).

Yii تجزیه و تحلیل می کند url درخواستی شما را. مسیر رشته پرس و جو در لینک بالا نشان میدهد controllerid از نوع (massage) است.این درخواست مسیر به Yii می گوید کلاس massagecontroller ،پیدا کنه که در مسیر protected/controllers/MessageController.php. قرار دارد.
Yii نیز در میابد که ActionId مشخص شده helloworld است. بنابر این عمل رویه helloworld() داخل massagecontoller رو صدا میزنه.
actionHelloWorld() نیز رویه ای است که hellowworld.php رو ترجمه می کند که این فایل نیز در مکان protected/views/message/helloWorld.php قرار دارد که ما این فایل رو قبلاً اگر یادتون باشه به سادگی تغییر دادیم که این فایل به مرورگر ما برگردونده میشود.
همه این کارها بدون نیاز به تغییر در پیکر بندی ، به وسیله پیروی از قرار دادهای پیش فرض yii ساخته شد.تمام درخواست های مسیر یابی برنامه برای ما یکپارچه بودند.
اضافه کردن محتویات پویا:
ساده ترین راه برای اصافه کردن محتویات پویا به قالب خودمون این است که کدهای php رو به قالب خودش در فایلهامون جا بدیم. فایل های view رندر میشوند به وسیله برنامه ساده مان به به کدهای html. هر چند، هر محتوا کد php ما بین تگ <?php ?> تفسیر شده و قابل اجرا است. این یک راه است که بتونیم کدهای php رو در داخل کدهای html بکار ببریمو احتمالاً این روش کار کردن برای شما آشنا نیز است.
افزودن تاریخ و زمان
برای چاشنی محتویات صفحه پویای خودمان، اجازه دهید تاریخ و زمان را نمایش دهیم. دوباره heloworld رو باز کنید و خط زیر رو پایین خوش آمد گویی که قبلاً اضافه کرده بودیم اضافه کنید:
<h3><?php echo date("D M j G:i:s T Y"); ?></h3>

بعد از نشوتن کد بالا فایل مورد نظر را ذخیره کنید و از لینک زیر صفحه را دوباره باز کنید تا تغییرات انجام شده را مشاهده کنید

http://yourhostname/demo/index.php?r=message/helloWorld

ما محتوای دینامیک به صفحه وب خودمون اضافه کردیم.با هر بار به روز رسانی صفحه میبینیم که محتویات داخحل صفحه جدید میشوند(زمان و تاریخ) . مسلماً این هیجان انگیز نیست،اما این نشان میدهید که چطور بسادگی میتوانیم کدهای php رو در قالبهای خودمن بکار ببریم.
اضافه کردن تاریخ و زمان با رویکردی بهتر:
هر چند جا دادن کدهای php به این روش به صورت مستقیم در فایلهای نما (view) اجازه می دهد هر کد php را با هر میزان پیچیدگی به صفحات اضافه کنیم، این شدیداً توصیه شده است که این طرز کار انجام ویرایش مدل‌های داده صحیح نیست. این کمک خواهد کرد منطق کسب رو از ارائه کدهامون جدا نگه داریم. که این بخشی از دستور کار معماری mvc است.
انتقال داده های ایجاد شده به کنترولر:
اجازه دهید منطقی که قبلاً ایجاد کردیم رو به کنترلر انتقال بدیم و چیزی بیشتر و بهتر از اون نمایی که می خواهیم رودرست کنیم. ما می خواهیم زمان رو به داخل رویه actionhelloworld() انتقال دهیم که در داخل کنترولر هست و ست کنیم مقدارش رو در یک متغیر مثلاً$time.
1- اول بریم عمل کنترلر رو تغییر بدیم. در حال حاضر action ما در داخل massagecontoller, actionhelloworld() ، قرار دارد که به سادگی ترجمه می کنه view، helloworld مون رو به وسیله اجرای کد زیر:
$this->render('helloWorld');

قبل از اینکه ما view رو ترجمه کنیم، اجازه دهید زمان رو اضافه کنیم، و سپس اون رو در یک متغیر عمومی ذخیره کنییم و اون رو $thetime بنامیم. بعد بیایید تغییر بدیم render() رو به وسیله اضافه کردن پارامتر ثانویه که شامل این متغیر است:


$theTime = date("D M j G:i:s T Y");
$this->render('helloWorld',array('time'=>$theTime));

وقتی rendr() رو صدا میزنیم با یک پارامتر ثانویه حاوی داده آرایه ای، که آن را استخراج میکنیم به مقدارهایی از آرایه در متغیر های php و آونها رو میسازیم به متغیرهای در دسترس به View script. کلید در آرایه نام متغیرهای در دسترس خواهد بود به فایل View مان.
برای مثال، کلید آرایه مان کلیدی است که ارزش آن $thetime است.استخراج خو.اهد شد به یک متغیر که نامش $time است که درView در دسترس خواهد بود. این یک راه برای پاس کردن داده از کنترلر به View است.
2- حالا بریم view رو برای استفاده از این متغیر تغییر بدیم، به جای اینکه تابع date رو صدا بزنیم. فایل view ، helloworld رو دوباره باز کنید و کد زیر رو در جایی که تابع زمکان رو در اونجا نوشته بودیم بنویسید:
<h3><?php echo $time; ?></h3>

3- ذخیره کنید و نتیجه را دوباره در لینک روبرو ببینید:

http://yourhostname/demo/index.php?r=message/helloWorld

در عکس بعدی آخرین تغییراتی که به صفحه خودمون دادیم رو می بینید
96619
در حال حاضر ما دو روش رو برای اضافه کردن کدهای php به محتویات قالب فایلهای ویومون نشون دادیم. روش اول قرار دادن کدها به صورت مستقیم بود. روش دوم قرار دادن منطق کدمون در کلالس کنترلر ها و نمایش آنها از طریق متغیر در داخل فایل ویو خودمون بود. نتیجه نهایی هر دو کار یکی است و همان چیزی بود که در فایل ویو نمایش داده میشد.

لینک کردن صفحات با یکدیگر
به طور معمول صفحات وب بیش از یک صفحه در درون خودشون دارند، بنابر این برنامه ساده ما نیز از این قاعده مستثنی نیست و بهتره که چندین صفحه واسه خودش داشته باشه. پس بیایید چمند صفحه دیگه به برنامه خودمون اضافه کنیم . صفحه جدید که می خواهیم درست کنیم نیز برای این که در حیطه چیزهایی که یاد داده ایم باشه فقط کاری میکنیم که یک پیام رو فعلاً نشون بده مثلا پیامی مثل 'Goodbye, Yii developer! و همین صفحه ایجاد شده رو به صفحه hello world مون که قبلاً ایجاد کرده ایم لینک می کنیم و همچنین بلعکس .
به طور معمول، هر صفحه html ارائه شده در yii با یک ویو جداگانه مطابقت دارد. بنابر این ما هم یک ویو جدید میسازیم و یک action جداگانه نیز برای ترجمه و ارائه اون به کاربر نیز میسازیم. هنگام اضافه کردن یک صفحه جدید مانند این، ما همچنین نیزا داریم که یک کنترلر جداگانه نیز استفاده کنیم. همونطور که میبینید و میدونید هر دو صفحه hello و goodbye ما مشابه یکدیگر هستند، بنابر این هیچ دلیل قانع کننده ای برای تعویض و واگذاری منطق برنامه به یک کلاس کنترلر جداگانه وجود ندارد.

لینک کردن به یک صفحه جدید
url که برای صفحه جدیدمون داریم به صورت زیر خواهد بود:

http://yourhostname/demo/index.php?r=message/goodbye

1- بر اساس قراردادهای yii ، که قبلاً گفتیم در مورد لینکها، در لینک بالا همه چیز مشخص است مثل نام اکشن نام ویو و .... بنابر این MessageController رو باز کنید و متد actionGoodbye() رو درست در زیر متد actionHelloworld() قرار بدید و کدهای زیر رو نیز درون این متد بنویسید:


class MessageController extends CController
{
...
public function actionGoodbye()
{
$this->render('goodbye');
}
...
}


2- خوب کار بعدی اینه که یک فایل ویو رو در مسیر /protected/views/message/ ایجاد کنیم. نام این ویو حتماً باید goodbye.php باشه چون باید این نام با نام actionID مون که در بالا قرار دادیم برابر باشه.
توجه: لطفاً این رو همیشه در ضهن خودتون بسپارید که این فقط یک قرار داد توصیه شده است.لازم نیست که نام فایل ویو درست شبیه نام اکشنمون باشه .نام فایل ویو تنها کافیه با آرگومان اول تابع render() مطابقت داشته باشه.
یک فایل خالی در این فولدر بسازید، و خط زیر رو به داخل اون اضافه کنید:
<h1>Goodbye, Yii developer!</h1>

تغییرات رو ذخیره کرده و دوباره صفحه رو ببینید

http://yourhostname/demo/index.php?r=message/goodbye


شما باید در صفحه کنونی پیام goodbye رو ببینید.
5-خوب حالا باید لینک لینکها رو به دو تا صفحه ای که ساخته ایم اضافه کنیم. برای این که در صفحه helloworld خودمون لینک صفحه دیگر رو اضافه کنیم می تونیم به طور مستقیم از تگ <a> استفاده کنیم که به شکل زیر خواهد بود:

<a href="/demo/index.php?r=message/goodbye">Goodbye!</a>

nariman_t
جمعه 24 آذر 1391, 02:16 صبح
میبینید که کار خواهد کرد، اما این ساختار کدی که ما نوشتیم یک url خاص رو باز خواهد کرد و انعطاف زیادی نخواهد داشت و ممکن است بعضی اوقات احتیاج به تغییر داشته باشد که در کل این روش روش مناسبی برای کارهای ما نمی باشد. اثلاً شما فکر کنید که ساختار url ، رو تغییر بدید دیگر این لینکی که در اینجا قرار دادی نا متعبر خواهد بود.
نکته:
به یاد بیارید در فصل 1 ما مثالی در رابطه با یک سایت ساده زدیم به نام blog posting که در اون هر پست از لینکهای متفوتی استفاده می کرد همچنین کاری کرده بودیم که لینکها seo friendly باشند بنابر این اگه لینک بالا رو به لینک seo friendly تغییر بدیم دیگه این لینکی که ما در بالا نوشتیم کاملاً نا معتبر خواهد بود.همچنین لینکهای seo friendly ما به شکل زیر بودند:

http://yourhostname/ControllerID/ActionID


گرفتن کمی کمک از yii CHtml
خوشبختانه، yii در اینجا نیز به کمک ما میاد. Yii با یک متد در اینجا به کمک ما میاد ،این متد در کلاس کمکی در چارچوب استاتیک HTML وجود دارد،که CHtml است. در ای مورد، ما می خواهیم متد کمکی رو بکار ببریم که میگیره در یک جفت controllerID/actionID ، و میسازه لینک مناسبی رو برای شما بر اساس url هر طور که شما برنامه رو پیکر بندی کرده باشید. همانطور که همه این روشهای کمکی ثابت هستند، ما می تونیم اونها رو به طور مستقیم صدا بزنیم بدون احتیاج به ساخت با استفاده ازکلاسهای CHtml.
1-با استفاده از این لین کمکی ، ویو helloworld ما تغییر میکنه:

<h1>Hello, World!</h1>
<h3><?php echo $time; ?></h3>
<p><?php echo CHtml::link("Goodbye",array('message/goodbye')); ?></p>
2-تغییرات رو ذخیره کنید، و صفحه hellowordl رو در لینک زیر مشاهده کنید:

http://yourhostname/demo/index.php?r=message/helloWorld

در ین صفحه شما باید لینکی رو که ساخته شده رو ببینید و با کلیک بر روی اون به صفحه goodbye هدایت بشید. اولین پارامتر در فراخوانی متد link از کلاسهای CHtml متنی است که به جای لینک نمایش داده میشه.پارامتر دوم یک آرایه است که مقدار جفت controllerID/actionID رو نگه میداره. نتیجه این کدهای نوشته شده در عمکس زیر نمایشد داده شده است:
96620

3-شما میتونید همین کدهایی که در بالا برای صفحه helloworld نوشته ایم رو برای صفحه goodbye نیز بنویسید که میتونید از کدهای زیر پیروی کنید:

<h1>Goodbye, Yii developer!</h1>
<p><?php echo CHtml::link("Hello",array('message/helloWorld')); ?></p>
4-تغیرات رو ذخیره کنید و صفحه رو از لینک زیر مشاهده کنید:

http://yourhostname/demo/index.php?r=message/goodbye
عکسی شبیه به عکس زیر رو باید در صفحه مرورگرتون باید داشته باشید که در اون لینکی برای برگت به صفحه helloworld باید وجود داشته باشه که با کلیک بر روی اون میتونید به همون صفحه باز گردید.
96621
خلاصه این فصل:
در این فصل، ما موارد زیر رو فرا گرفتیم:
· چگونگی نصب فریم ورک yii
· چگونگی استفاده از خط فرمان yii برای ساخت یک برنامه جدید بدون هیچ کد نویسی و سختی کاری.
· چگونگی استفاده از خط فرمان yii برای ساخت یک کنترلر در داخل برنامه.
· چگونگی ساخت محتویات پدر داخل یک کنترلر و چگونگی دسترسی به آن از طریق فایل ویو و نمایش آن در مرورگر کاربر
· چگونگی لینک کردن داخلی صفحات برنالمه با یکدیگر.

شاید برخی از مطالب در هم بر هم باشه معذرت می خوام از بچه ها چون این متن ها رو تو ورد ترجمه کردم و از داخل ورد یه ضرب میارم اینجا اینجوری میشه واقعاً وقت درست کردن ونتها و اینجور چیزها رو ندارم
گذشته از این سولی از بچه ها داشتم و می خواستم بینم این مطالبی که دارم میزارم مناسب هست؟ و این که آیا اون کتاب فارسی که به صورت pdf در اینترنت هست بیشتر کاربردی تره یا مطالبی که دارم میذارم اگه میشه با پیام خصوصی بگید تا ببینم واقعاً این آموزش رو ادامه بدم مناسب هست یا همینجا تمومش کنم بهتره؟

nariman_t
جمعه 24 آذر 1391, 02:31 صبح
قبل از این که فصل سوم رو شروع کنم می خواستم بگم که یکی از دسوتان وسط های پستهام گفته بود که مطالب رو کاربردی تر یا با یه مثال مطالب رو ادامه بدید اگه مطالب رو فصل به فصل ادامه بدم تو فصل های آخر مطالب اینقد پیچیده و سنگین و کاربردی میشه که شاید ترجمه کردنشونم واسم سخت بشه پس نگران مطالب کاربردی و مثال نیز نباشید
فصل 3
برنامه کاربردی trakstar

معرفی trakstar
TrackStar مدیریت چرخه عمرتوسعه نرم افزار(SDLC) است که در رابطه با موضوعی می باشد . هدف اصلی آن این است که به پیگیری بسیاری از مسائل که در طول ساخت برنامه های کاربردی نرم افزار بوجود می آید کمک کند. این یک برنامه مبتنی بر کاربر است که اجازه ایجاد حساب کاربری و دسترسی به ویژگی های نرم افزار رو به کاربر میده موقعی که کاربر احراز هویت شده باشه و مجاز به این کارها باشه و اجازه صاده شده باشه. همچنین اجازه میده که یک کاربربتونه پروژه ها رو اضافه و یا مدیریت کنه.
پروژه ها می تونند کاربرانی که در ارتباط با اون پروژه و نیز مسائل مربوط به اون پروژه هستند رو داشته باشند(به طور معمول اعضای تیمی که بر روی پروژه کار می کنند). موضوعات و مسائل پروژه وظایف توسعه و اشکالات نرم افزار خواهد بود. این مسائل و موضوعات رو می توان به اعضای این پروژه اختصاص داد و وضعیت هایی مانند : هنوز شروع نشده، شروع شده و به اتمام رسیده دسته بنده کرد.به این ترتیب، ابزار پیگیری (tracking) می تواند یک تصویر دقیق از پروژه ها با توجه به آنچه که انجام شده است، آنچه که در حال حاضر در حال پیشرفت است، و آنچه هنوز آغاز نشده است داشته باشد
ایجاد مسائل مربوط به کاربران
مسائل مربوط به کاربر یک راه عالی برای شناسایی ویژگی های مورد نیاز برای برنامه شما هستند. مسائل کاربر در ساده ترین شکل خود، حالتی می باشد که آنچه یک کاربر می تواند با یک قطعه نرم افزار انجام دهد.
ما به طور خلاصه در اینجا سه موجودیت اصلی که نقش زیادی در این نرم افزار دارد اشاره می کنیم: کاربران ، پروژه ها و مسایل. این اشایء دامنه اصلی کار ما و موارد بسیار مهم در این نرم افزار هستند.
کاربران

برنامه TrackStar یک برنامه وب مبتنی بر کاربر است. در اینجا دو نوع کاربر سطح وجود خواهد داشت:
· Anonymous (بی نام، ناشناس)
· Authenticated(تصدیق شده)
یک کاربر ناشناس (Anonymous) هر کاربر از برنامه می تونه باشه که هنوز احراز هویت نشده و اعتبار کاربری آن تصدیق نشده است یا به بیان ساده تر وارد سایت نشده. کاربران ناشناس تنها اجازه دسترسی به ثبت نام برای ایجاد یک حساب جدید و یا صفحه ورود کاربر (login) می تونند باشند. تمام قابلیتهای دیگر برنامه تنها محدود به کاربرانی خواهد شد که وارد سایت شده و اعتبار آنها تصدیق و احراز هویت شده باشند. کاربرانی که وارد سایت می شوند اجازه دسترسی به ویژگی های اصلی برنامه رو خواهند داشت مانند ایجاد و مدیریت پروژه و مسائل مربوط به پروژه.
پروژه ها
مدیریت پروژه هدف اصلی برنامه trackstar است. این پروژه به طور معمول به وظایف کوچک شکسته (یا مسائل کوپک) شده است که برای رسیدن به هدف کلی باهم دیگر کار می کنند. بعد از این که کاربر تصدیق شد می تواند پروژه های جدید ایجاد کند. ایجاد کننده پروژه در اینجا دارای حساب ویژه ای بر روی پروژه خود دارد و مدیر پروژه است. صاحب پروژه توانایی ویرایش و حذف این پروژه و همچنین توانایی اضافه کردن کاربران جدید به پروژه را دارد . کاربران دیگر مرتبط با پروژه علاوه بر مالک پروژه به سادگی به عنوان اعضای پروژه نامیده می شوند.آنها توانایی اضافه کردن مسائل جدید رو دارند و همچنین میتونند اونها رو ویرایش کنند.
مسائل مربوط به پروژه
مسائل مربوط به پروژه رو می توان در سه دسته زیر تقسیم بندی کرد:
· ویژگی ها:آیتم هایی که نشان دهنده ویژگی های واقعی که به برنامه اضافه شده اند هستند مانند پیاده سازی قابلیت ورود (login)
· وظایف: آیتم هایی که نشاند دهنده کاری است که باید انجام شود. اما از ویژگی های واقعی نرم افزار نمی باشد. به عنوان مثال ساخت و یکپارچه سازی سرور.
· اشکالات: آیتم هایی که نشان دهنده رفتار مورد انتظار ما از برنامه ای که در حال اجرا است نیست. به عنوان مثال فرم ثبت نام فرمت آدرس های ورودی پست الکترونیکی اعتبار ندارد.
مسایل می تواند یکی از سه وضعیت زیر را دارا باشد:
· Not yet started (هنوز شروع نشده)
· Started(شروع شده)
· Finished(به اتمام رسیده)
اعضای پروژه می تونند مسائل جدید رو به یک پروژه اضافه کنند ، همچنین می تونند اونها رو ویرایش و حذف کنند. اونها می تونند مسائل رو اختصاص بدهند مسائل رو به خودشان یا دیگر اعضای پروژه .
در حال حاضر، این اطلاعات به اندازه کافی در این سه موجودیت اصلی است. ما می توانیم به جزئیات بسیار بیشتری در مورد آنچه که دقیقاً مستلزم ثبت نام حساب و چگونگی دقیق اضافه کردن یک کار جدید به پروژه بپردازیم.اما ما به اندازه کافی مشخصات مشخص شده برای سروع بر روی این ویژگی های اساسی رو داریم.
کنترل جریان صفحه

این همیشه برای طرح صفحه اصلی در داخل یک برنامه خوب است. این به ما کمک خواهد کرد که به سرعت برخی از امکانات مورد نیاز در yii رو بتونیم شناسایی کنیم، اکشن ها ، ویو ها ، و ...
شکل زیر نشان دهند ایده پایه از نرم افزار جریان ورود به سیستم ، از طریق لیست جزئیات پروژه می باشد :

96622

هنگامنی که کاربران برای اولین بار به برنامه می آیند،آنها باید برای تایید هویت قبل از دسترسی به هر قابلیتی وارد سیستم شوند.پس از ورود موفقیت آمیز، به آنها یک لیست از همین پروژه به همراه گزینه ای برای ایجاد پروژه جدید ارائه خواهد شد. انتخاب یک پروژه بخصوص اونها رو به صفحه جزئیات.پروژه میبره، صفحه جزئیات یک لست از مسائل را بر اسا نوع ارئه می دهد. در اینجا گزینه ای برای اضافه کردن یک مسئله جدید‌ و همچنین قابلیت ویرایش هر یک از مسائل لیست شده وجود دارد .
این ها همه قابیلت های بسیار اسای می باشند، ، اما شکل به ما اطلاعات کمی بیشتری در مورد چگونگی این که برنامه با یکدیگر ترکیب شده وبه ما اجازه شناسایی بهتر مدل ها ، ویو ها ، و کنترلرها را میدهد. همچنین اجازه می دهد چیزی تصویری را با دیگران به اشتراک بگذاریم.
تعریف یک طرح داده:
ما هنوز کمی بیشتر در مورد داده هایی که می خواهیم باهاشون کار کنیم باید فکر کنیم. اگر ما تمام اسم های اصلی را از سیستممون انتخاب کنیم، ما ممکن است در نهایت با یک لیست بسیار خوبی از اشیاء دامنه با استفاده از رکورد فعال به داده هایی که ما می خواهیم به مدل برسیم.
مسائل مشخص شده قبلی ما برای دیکته کردن به نظر می رسد به شکل زیر است:
· یک کاربر
· یک پروژه
· یک مسئله
بر اساس این و دیگر جزئیات ارائه شده در مسائل کاربر و نرم افزار نمودار گردش کار،اولین تلاش در داده های مورد نیاز در شکل زیر نشان داده شده است.
96623

.. *1 در دو طرف خط بین پروژه و اشیاء کاربر نشان دهنده یک ارتباط چند به چند بین آنها است.یک کاربر می تواند با یک یا چند پروژه مرتبط، و یک پروژه یک یا چند کاربر را دارد. به همین ترتیب یک پروژه می تواند هیچ و یا چندین مسئله را مرتبط با آن را داشته باشد. همچنین کاربر می تواند مالک (یا در خواست کننده) بسیاری از مسائل اما مسئله فقط یک مالک دارد.
تست کردن در yii
از نسخه 1.1 به بعد فریم ورک yii این فریم ورک با phpunit(http://www.phpunit.de/) و سلنیوم کنترلر (http://seleniumhq.org/projects/remote-control/) برای تست فریم ورک یکپارچه شده است. شما مطمئناً می توانید کدهای pohp که در yii نوشته می شوند رو با ههر یک از چارچوب هایی که دوست دارید تست کنید. با این حال ، ادغام بسیار محکم و خوب yii با دو چارچوب که قبلاً ذکر شد باعث می شود همه چیز برای ما خیلی ساده تر شود.و ساده کردن کارها یکی از اهداف اصلی ما در اینجا می باشد.
ما وقتی ازفرمان کنسول yiic webapp استفاده کردیم برای ساخت helloworld جدید در فصل 2 ما متوجه شدیم که خیلی فیالها و فولدرهای به طور خودکار ساخته شدند. آنهایی که در میان اینها مربوط بهآزمایش ما می شوند به شرح زیر هستند:




Name of folder
Use/contents


demo/


protected
This contains protected application files
tests/
This contains tests for the application
fixtures/
This contains database fixtures
functional/
This contains functional tests
unit/
This contains unit tests
report/
This contains coverage reports
bootstrap.php
The script executed at the very beginning of the tests
phpunit.xml
The PHPUnit configuration file
WebTestCase.php
The base class for Web-based functional tests






ما تست های خودمون رو در سه فولدر اصلی قرار خواهیم داد:fixtures, functional, and unit.
پوشه Report برای ذخیره مجدد پوشش تولید کد استفاده می شود.
نکته:
اکستنشن php ، به نام xDebug باید برای تولید گزارش نصب بشود.توصیه می شود برای نصب xDebug از PECL استفاده کنید. برای اطلاعات بیشتر در باره نصب می توانید سایت مقابل را مشاهده کنید http://xdebug.org/docs/install.

تست واحد
تست واحد در yii به عنوان یک کلاس از کلاس چارچوب توسعه داده نوشته شده است،که CTestCase نامیده میشه. قراردادها تجویز کردن که اون رو AbcTest بنامیم که در آن abc با نام کلاس در حال آزمایش جایگزین شده است.برای مثال، اگر ما برای آزامیش کلاس massage رو در برنامه demo خودمون در فصل 2 آزمایش کنسم، ما باید نام کلاس تست رو MassageTest بذاریم.این کلاس ذخیره شده است در یک فایل با نام MessageTest.php در زیر شاخحه های پوشه protected/tests/unit / .
کلاس تست در درجه اول مجموعه ای از توابع تست با نام testXyz که در آن Xyz اغلب همان نام روش آزمون در کلاس در حال آزمایش شده است.
با MessageController مثال رو ادامه میدیم، اگر ما در حال تست ActionHelloworld() خودمون هستمی، ما باید نام تابع کلاس مربوط به MessageTest ، ()testActionHelloworld بذاریم.
نصب php unit

برای ادامه کار phpunit رو نصب خواهیم کرد. این کار با استفاده از Pear Installer باید انجام بشه(برای اطلاعات بیشتر درباره pear، می توانید سایت http://pear.php.net/ ).
با این حال ممکن است تنظیمات شما کمی متفاوت باشد. برای کسب اطلاعات بیشتر در مورد فرایند نصب می تونید سایت http://www.phpunit.de/manual/3.0/en/installation.html (http://www.phpunit.de/manual/3.0/en/installation.html) رو ببینید.
نکته:
قطعاً پوشش دادن ویژگی‌های phpunit فراتر از محدوده این کتاب خواهد بود،توصیه می شود که کمی از وقتتان را برای خواندن سایت (http://www.phpunit.de/wiki/Documentation) بگذارید تا بیشتر در مورد phpunit فرا گیرید.
Functional tests

بسیار شبیه Unit test ، functional test نیز به عنوان کلاس های php نوسته شده است.با این حال، آنها از CWebTestCase به جای CTestCase گسترش یافته است.قراردادها نیز مانند قبل یکسان هستند که در کلاس های تست ما فانکشن های ما نام abctest دارد که در آن abc کلاس در حال آزمایش است و این مکلاس در یک فایل با نام abctest.php ذخیره شده است.با این حال ما در فولدر protected/tests/functional ذخیره میکنیم. برای اجرای function test هامون منا نیاز به نسب سلنیوم داریم.



نصب سلینیوم
علاوه بر phpunit، کنترل سرور را دور سلنیوم(Selenium RC) به مکنطور اجرای function test نیاز می باشد.نصب Selenium RC بسیار ساده می باشد.
1- Selenium Remote Control رو دانلود کنید از سایت روبرو http://seleniumhq.org/download/.
2- فایل دانلود شده رو در هر جایی که می خواهید از حالت فشرده خارج کنید.
محتویات پوشه استخراج شده چندین فولدر خاص مبتنی بر مشتری یا همان کلاینت می باشد و یکی نیز شامل Rc server می باشد.
چیزی شبیه به این نام خواهد شد

selenium-server-1.0.x/
که در آن X نسخه خاص دانلود شده خواهد بود. راه اندازی سرور نیسز ساده است.فقط به سمت فولدر سرور روی سیستم خودتون حرکت کنید و عمل زیر رو انجام بدید
% java -jar selenium-server.jar
این سرور در کنسول شروع خواهد شد.

اجرای یک مثال سریع
روش tdd ما در ط.ول ساخت برنامه trackstar در درجه اول بر روی نوشتن و اجرای تست واحد (unit test) تمرکز خواهد داشت.سایتی که ما ساخته بودیم برای hello world برنامه خودمون یک مثال تست تابعی داشت کخه در مکان

protected/tests/functional/SiteTest.php قرار داشت. این فایل 3 رویه تست رو در درون آن ایجاد می کند. یکی برای تست صفحه اصلی خانه می باشد، یکی برای تست صفحه تماس با ما و دیگری برای عملکرد تست ورود و خروج میباشد.
قبل از اینکه ما اجرا کنیم یان تست تابعی رو، ما باید یک زوج از تغییرات پیکر بندی رو برای برنامه خودمون بسازیم. ما اول به تغییر protected/tests/WebTestCase.php احتیاج داریم برای تست درستی url مون برای زمانی که سنیوم برای باز کردن اون تلاش میکنه وقتی تست رو اجرا میکنه. اون فایل رو باز کنید و مطمئن شوید که تعریف TEST_BASE_URL با url درخواستیمون که در فصل قبل ساخته بودیم مطابقت میکنه،که خط زیر رو define('TEST_BASE_URL','http://localhost/testdrive/index-test.php/');
به
To: define('TEST_BASE_URL','http://localhost/demo/index-test.php/');
تغییر بدید. تغییرات ممکن است فقط برای کاربران mac اعمال شود. اگرچه شما در حال استفاده از ویندوز هستید ترجیح میدهیم که برای تست هامون از ایمنترنت اکسپلورر استفاده کنیم،پس شما مککن است این تغیرات رو بخواهید انجام بدید. فایل protected/tests/phpunit.xml خانه های برخی از تنظیمات پیکر بندی سرور سلنیوم است.این فایل پیکر بندی شده است برای استفاده از IE به عنوان مرورگر اصلی.ما می تونیم حذف کنیم خط خ های لیات شده زیر رو از کد برای مطمئن شدن از این که وقتی سلنیوم اجرا میشه از فایر فاکس به عنوان مرورگر فعال استفاده کنه.


<phpunit bootstrap="bootstrap.php"
colors="false"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
stopOnFailure="false">
<selenium>
<browser name="Internet Explorer" browser="*iexplore" />
<browser name="Firefox" browser="*firefox" />
</selenium>
</phpunit>
حالا، تا زمانیکه شما phpunit رو نصب شده دارید و مطمئن هستید که سرور سلنیوم نیز در حالت اجرا است پس ما می تونیم به سمت فولدر تست خودمون از طریق command prompt بریم و تست تابعی (functional test) زیر رو اجرا کنیم:


% cd protected/tests/
% phpunit functional/SiteTest.php
چیزی که باید اتفاق بیفته اینه که مرورگر شما به صورت خودکار اجرا خواهد شد، به عنوان پلتفرم سرور سلنیوم که با استفاده از مرورگر برای دسترسی به قابلیت کاربر نهایی از سایت ما در فایل پیکربندی WebTestCase.php. همانطور که اون رو اجرا میکنه از طریق رویه های تست، این درواقع رفتار خودکار از یک کاربر واقعی از سایت ایت. اگر همه چیز کار کرده باشه، نتایج نهایی باید نمایش داده بشه در پنجره خط فرمان همونجایی که تستمون رو اجرا کردیم.. چیزی شبیه به خطوط زیر نمایش داده خواهد شد.

Time: 19 seconds, Memory: 10.25Mb
OK (3 tests, 10 assertions)
قدر بودن برای تست نهایی به صورت یک کاربر واقعی یک راه خو برای شروع تست کیفیت برنامه های خودمون به طور خودکار می تونه باشه. اگر شما یک تیم QA جداگانهبر روی این پروژه دارید، این باید خیلی براشون مفید باشه برای نشان دادن این که چطور با این ابزار می تونیم برنامه های کاربردیومن رو تست کنیم.

به ما هم هميشه سري بزنيد (http://www.pc-mobile.ir)


به ما هم هميشه سري بزنيد (http://www.pc-mobile.ir)

nariman_t
جمعه 24 آذر 1391, 02:43 صبح
Hello TDD!

بیایی به طور خلاصه دوباره hello wolrd خودذمون که در فصل های قبل ساخته بودیم رو ببینیم. به عنوان یک یادآوری، ما یک برنامه داشتیم که یک پیام سلام و یک پیام خداحافظی رو برای ما نمایش میداد.دو تا رویه Actrion درخواست هعای ما رو برای نمایش این پیامها اداره میکردند که در کلاس MessageController بود.جازه دهید برخی از رفتارهای جدید رو. به MessageController.php. اضافه کنیم. بیایید قابلیت افزایش را در هر رشته پیام ، و بازگشت ساده پیام به فراخدن رو اضافه کنیم. به نظر می رسد به اندازه کافی ساده است.ما فقط باید MessageController.php رو باز کنیم و یک رویه عمومی جدید اضافه کنیم، شاید repeat() بنامیمش. همانطور که ما در حال بدست گرفتن یک روش TDD هستیم، ما باید شروع کنیم به نوشتن یک تست برای این رفتار جدید.
هامنطور که ما در حال تست یک رفتار از یک کلاس رویه تسم، ما به احتیاج داریم به نوشتن یک unit test . پس از پیش فرض yii پیروی کنید، این unit test باید ساکن باشه در فولدرprotected/tests/unit/ و می تونیم اون رو Messagetest.php بنامیم.با برداشتن گام های کوچک، بیایید فقط یک کلاس اضافه کنیمبه وسیله این نام و و اون رو گشترش بدیم بر پایه کلاس های yii برای unit test ، ctestcase .
فایل جدید رو در مسیرprotected/tests/unit/MessageTest.php ایجاد کنید و به اون کدهای زیر رو اضافه کنید:

<?php
class MessageTest extends CTestCase
{
}


حالا می تونیم به فولدر تستمون حرکت کنیم و دستور زیر رو برای این تست اجرا کنیم:

%cd /WebRoot/demo/protected/tests
%phpunit unit/MessageTest.php
بعد از اجرای دستور بالا پیامهای زیر نمایش داده خواهد شد:

phpunit unit/MessageTest.php
PHPUnit 3.3.17 by Sebastian Bergmann.
F
Time: 0 seconds
There was 1 failure:
1) Warning(PHPUnit_Framework_Warning)
No tests found in class "MessageTest".
FAILURES!
Tests: 1, Assertions: 0, Failures: 1.
تست ما شکست خورده است.این به ما می گوید که ما یک تست مشخص در کلاس تستمون نداریم.قطعاً درست است ما هنوز یک کد نداریم. اما ما مرحله اول از tdd رو شروع کرده ایم.که به سرعت یک پیام نوشته شده که تست ما بات شکست مواجه شده.

بیایید یک رویه تست اضافه کنیم. همانطور که ما در حال نوشتن یک تست جهت تایید اعتبار Massagecontoller مون هستیم که قادر به بازگشت دادن یک رشته تغذیه به آن است .اجازه دهید اون رو testRepeat نامگذاری کنیم. کدهای زیر رو اضافه کنید :

class MessageTest extends CTestCase
{
public function testRepeat()
{
}
}
اگر ما تست مون رو دوباره اجرا کنیم نتایج زیر برای ما نمایش داده خواهد شد.

OK (1 test, 0 assertions)
این یک گام قطعاً در مسیر درست است.ما به پیروی از TDD گام دوم رو داریم که فقط نوشتن کد کافی برای تست کردن برای تصویب است.اون پاس شده زیرا هیچ جیزی برای تست شدن نداره.، پس چیزی که نوشتیم چندان مفید نیست. با این حال یک گام کوچک در جهت درست است.
در این لحظه ما می خواهیم به تستمون چیزی اضافه کنیم تا کاری برای ما انجام بده.که این چیزی که می خواهیم اضافه کنیم یک رفتار خاص تکراری از messagecontroller رو تست خواهد کرد.برای این کار ما نیاز داریم به :
1-ساخت یک نمونه از کلاس messageController مون در رویه تست.
2-فراخوانی یک رویه روی اون به وسیله تغذیه اون بوسیله یک رشته متن.
3-بررسی کردن این که رشته باز گردانده شده همان رشته ورودی است.
کد زیر رو برای انجام این کار اضافه کنید.رویه testeRepeat رو به شکل زیر تغییر بدید:


public function testRepeat()
{
$message = new MessageController('messageTest');
$yell = "Hello, Any One Out There?";
$returnedMessage = $message->repeat($yell);
$this->assertEquals($returnedMessage, $yell);
}
ما داریم یک کلاس messagecontroller ساخته شده جدید به وسیله فراهم کردن ControlerId مورد نیاز به سازنده آن.سپس ما ساختیم یک رشته به نام $yell که ما می خواهیم اون رو برگشت بده. ما فراخوانی میکنیم repeat() رو با این ورودی رشته و گرفتن خروجی در متغیر $ returnedMessage.

همانطور که انتظار داریم پیام باگشت داده شده شامل همان رشته فرستاده شده است،ما استفاده می کنیم از رویه های API phpunit ، assertEquals() برای این که ببینیم رشته اول و دوم در نتیجه درست است یا غلط در واقع اونها رو از لحاظ برابری می خواهیم مقایسه کنیم.حالا که ما یک تست نوشتاری داریم اجازه دهید سعی کنیم اون رو اجرا کنیم:


%phpunit unit/MessageTest.php
PHPUnit 3.4.12 by Sebastian Bergmann.
E
Time: 0 seconds, Memory: 10.00Mb
There was 1 error:
1) MessageTest::testRepeat
include(MessageController.php): failed to open stream: No such file or directory

FAILURES!
Tests: 1, Assertions: 0, Errors: 1.
این ممکن است مانند احساس این باشد که ما به عقب برگشت کردیم.اما این واقعاً در داخل طبیت TDD است. گام های کوچک، آزمایش تمام وقت، و کار کردن به سرعت و رسیدن سریع به اولین خطا، و سپس تصویب. خطا به ما می گوید که اون تلاش میکنه برای ایجاد یک نمونه جدید از Messagecontroller ، اما ما اون پیدا نمی کنه کلاس رو در classpath یا مسیر کلاس.ما احتیاج داریم که کلاس رو از طریق قسمتی از فایل unit test اضافه کنیم. ما می تونیم با استفاده از سینتکس Yii:inmport کلاسی رو که برای تست احتیاج داریم اضافه کنیم.
نکته:
رویه Yii::import به ما اجازه میده تا به سرعت اضافه کنیم تعریف یک کلاس رو. این متفاوت از require و include که اون کار آمد تر است.کلاس مشخص شده در واقع وارد شده است نه گنجانده، تا زمانی که اشاره میشه برای اولین بار.وارد کردن فضای نام یکسان جندین بار نیز بسیار سریعتر از include_once وrequire_once. است. همچنین، این خوب است توجه داشته باشید که در هنگام اشاره به یک کلاس تعریف شده توسط فریم ورک Yii، ما احتیاجی نداریم که اون رو include با import کنیم. تمام کلاس های هسته Yii از قبلوارد شده است.
فایل Messagetest.php رو تغییر بدید و خط زیر را به بالای آن اضافه کنید.:


<?php
Yii::import('application.controllers.MessageContro ller');
class MessageTest extends CTestCase
{
ذخیره و تست رو دوباره اجرا کنید به نظر می رسد ارور قبلی نیست، اما انگار ارور دیگری داریم. حال این خطا ناشی از این است که ما در حال فراخوانی متدی با نام repeat() در کلاس messagecontroller هستیم ، اما این کلاس همچین متدی را ندارد.این قطعاً ای احساس رو به ما میده که ما هنوز این متد رو اضافه نکرده ایم.
متد زیر رو به کلاس messageController اضافه کنید:


public function repeat($inputString)
{
return $inputString;
}
ذخیره کرده و تست رو دوباره اجرا کنید.

% phpunit unit/MessageTest.php

OK (1 test, 1 assertion)
بالاخره از تست عبور کردیم و تست ما درست جواب داد. ما میتونیم کدهای تستمون رو پاک کنیم و کدهای خودمون رو کمی جمع و جور تر کنیم:


public function testRepeat()
{
$message = new MessageController('messageTest');
$this->assertEquals($message->repeat("Any One Out There?"), "Any One Out There?");
}
شما باید برای آخرین بار تست رو یک بار دیگه اجرا کنید تا اطمینان حاصل شود که به درستی از تست عبور می کند و اون چیزی که انتظار داریم رو اجرا می کنه.
از پستهای بعدی فصل 4رو شروع خواهیم کرد این فصل رو خیلی خلاصه کردم اگر جایی لازم بود که از این فصل ترجمه بشه دوباره در همبنجا همبن پستها رو ویرایش کرده و همینجا اضافه خوام کرد

nariman_t
جمعه 24 آذر 1391, 13:27 عصر
فصل 4
بازگویی 1: ایجاد برنامه trackstar اولیه.
در فصل قبل ، ما معرفی کردیم روش توسعه خودمون رو، که پذیرای رویکرد تدرجی و تکرار شونده است. در این روش ، مفهوم تکرار وجود دارد.برای اهداف ما، تکرار را می توان به عنوان یک فرصت برای یک تیم توسعه برای ایجاد کار، ویژگی های تست شده و آماده تولید نرم افزار در داخل یک محدودیت زمانی مشخص دانست. تیم توسعه و دیگر سهامداران پروژه تصمیم می گیرند که در آینده کار خو.اهد شد روی این مقدار ثابت زمانی.
تا حالا خیلی چیزها رو فقط توضیح دادیم از این به بعد بیشتر عملی کار خو.اهیم کرد و هر کاری که می خواهیم انجام دیم توضیح کوتاهی از فصل های قبل رو نیز خواهیم آورد که با روند مار نیز آشنا بشید و اگر چیزی یادمون رفته باشه هم یادمون بیاد.
برنامه ریزی تکرار
از آنچه که ما در فصل قبل در مورد ردیابی وظیفه های نرم افزار آموختیم، ما میدانیم که برای ساخت یکم برنامه مبتنی بر وب میرویم. ما همچنین در فصل 2 آموختیم (فصل 2 با نام Getting started بود) ایجاد یک برنامه تحت وب جدید با استفاده از خط فرمان yii چقدر آسان است.
ما همچنین در فصل 3 در مورد داده ها در برنامه track star صحبت کردیم ، اما در مورد این که چگونه می خواهیم این داده ها را اداره کنیم صحبتی نکردیم.
ساخت یک برنامه جدید
چگونگی ایجاد برنامه را در فصل 2 آموزش داده ایم پس در اینجا نمی گوییم.
اتصال به دیتا بیس
حالا که ما اسکلت برناممون رو داریم و بالا آوردیمش و اجرا کردیم،اجازه دهید چگونگی اتصال اون به دیتابیس رو از اینجا به بعد توضیح بدیم.اگرجه این تنظیمات نسبت به نوشتن کد مهمتر است، ما یک روش اولیه رو برای تست نگه میداریم، به طوری که اتصال به پایگاه داده اصلی ، بخشی از مجموعه تست معمول ما می شود.
تست اتصال به دیتابیس (conection)
فصل 3، برای ما معرفی می کنه چارچوب تست ارائه شده توسط yii رو. بنابر این، ما میدانیم که unit test ما اضافه شده در زیر شاخه protected/tests/unit/ .
اجازه دهید یک فایل تست اتصال به پایگاه داده رو در زیر این فولدر بسازیم و اسمش رو هم DbTest.php بذاریم. فایل جدید رو با محتویات زیر بسازید:

<?php
class DbTest extends CTestCase
{
public function testConnection()
{
$this->assertTrue(true);
}
}
در اینجا ما کد اضافه شده ای داریم که نسبتاً بی اهمیت است.متد assertTrue() که بخشی از phpunit است، یک تاکیید است که پاس می شود در صورتی که آرگومان پاس شده به آن true باشد، و موقعی با شکست مواجه میشه که آرگومان ارسال شده به اون false باشه.بنابر این در این مورد، حتماً true پاس خواهد شد برای ما چون آرگومان ارسالیمون همونطور که می بینید true می باشد. خوب بیایید مطمئن شویم که چیزی که نوشتیم درست کار را انجام می دهد و خروجی که ما می خواهیم را برای ما تولید خواهد کرد برای این کار این فایی که جدید ساخته ایم رو تست می کنیم.به فولدر test برید و فایل جدید رو برای تست کردن اجرا کنید:

%cd /WebRoot/trackstar/protected/tests
%phpunit unit/DbTest.php
Time: 0 seconds, Memory: 10.00Mb
OK (1 test, 1 assertion)

نکته:
پیکر بندی مجموعه تست
اگر به هر دلیلی این آزمایش بر روی سیستم شما اجرا نشد، شما احتیاج به تغییر protected/tests/bootstrap.php دارید به طوری که متغیر $yiit به درستی اشاره کنه به /YiiRoot/yiit.php فایل شما.
تغییر ناچیزدستورassertEquals(true) در testConnection() متد تست به :

$this->assertNotEquals(NULL, Yii::app()->db);
و اجرای دوباره تست:

%phpunit unit/DbTest.php
There was 1 error:
1) DbTest::testConnection
CDbException: CDbConnection failed to open the DB connection: could not find driver

FAILURES!
Tests: 1, Assertions: 0, Errors: 1.
حالا ما یک خطا در تستمون داریم.تست فرض میکنه که برنامه قبلاً با یک کامپوننت دیتابیس کانکشن به نامم db تنظیم شده است. (در مورد کامپوننت ها بعداً صحبت خواهیم کرد) این تست نوشته شده ادعا میکنه که هنگامی که برنامه برای اتصال به db پرس و جویی رو ارسال میکنه، جواب نباید یک مقدار تهی باشه.
در حقیقت، اسکلت برنامه به صورت خودکار برای استافده از دیتابیس تنظیم شده بود. این برنامه خودکاری که ما با استفاده از ابزار yiic ساخته ایم این طور است که برنامهممون برای استفاده از یک SQLite database. تنظیم شده است.اگر نگاهی به فایل پیکر بندی در مسیر protected/config/main.php بندازید شما کد زیر را خواهید دید:

'db'=>array('connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/testdrive.db',
),
و شما همچنین می تونید باز بینی کنید وجود اون رو از protected/data/testdrive. که پایگاه داده Sqllite برای استفاده از آن پیکر بندی شده است. در مورد تستمون باید بگم که به احتمال قوی هیچ کدوم از php کاران ما از sqllite استفاده نمیکنم همچنین درایورش هم روی سیستممون نصب نیست به همین خاطر بود که تستن ما با خطا مواجه شده.شاید اگر درایور مورد نساز برای SqlLite رو نصب داشته باشید برای شما در تستمون هیچ خطایی اتفاق نمی افتاد. همنوطرو که می دونید ما بیشتر از mysql برای برنامه های php خودمون استفاده می کنیم خوب پس باید تنظیمات رو برای استفاده از mysql تغییر بدیم ولی قبل از این که این کار رو بکنیم بیایید کمی در مورد yii و ارتباط اون با پایگاه داده صحبت کنیم.
Yii و دیتابیس

Yii از خیلی از دیتا بیسها برای برنامه نویسان پشتیبانی میکنه.اشیاء دسترسی به داده yii(Data Access Objects (DAO) ) در بالای داده اشیاء توسعه(extention) php ساخته شده است (PHP Data Objects (PDO) ) برای اطلاعات بیشتر به این سایت سر بزنید ((http://php.net/pdo) ). این یک لایه انتزاعی پایگاه داده است که برنامه رو برای تعامل با پایگاه داده مستقل از انتخاب های خاصی از سرور و پایگاه داده رو برای کار کردن قادر میسازه. تمام پشتیبانی از سیستم های مدیریت پایگاه داده (DBMS) در پشت یک رابط یکنواخت محصور شده است.</SPAN> منظورمون اینه که از تمام پایگاه های داده ای که yii پشتیبانی میکنه به صورت یک شکل حدوداً می تونید استفاده کنید. به این ترتیب، بنابر این کد می تونه مستقل از دیتا بیس باقی بمونه، و برنامه های توسعه داده شده با استفاده از yii DAO می تونه به سادگی سویچ کنه برای استفاده از یک DBMS دیگه بدون نیاز به تغییر آنچنانی.
به منظور ایجاد ارتباط با یک DBMS به سادگی می تونید یک کلاس CDvConnection جدید ایجاد کنید که نمونه کد اون به شکل زیر می باشد:

$connection=new CDbConnection($dsn,$username,$password);

در اینجا فرمت متغیر $dsn بستگی دارد به PDO دیتابیسی که مورد استفاده قرار می گیرد.برخی از فرمت های رایج عبارتن از:

SQLite: sqlite:/path/to/dbfile
• MySQL: mysql:host=localhost;dbname=testdb
• PostgreSQL: pgsql:host=localhost;port=5432;dbname=testdb
• SQL Server: mssql:host=localhost;dbname=testdb
• Oracle: oci:dbname=//localhost:1521/testdb

CDbConnection بنابر این توسعه یافته از ApplicationComponent است که که اجازه میده تا اون به عنوان یک کامپوننت برنامه پیکربندی بشه. این به این معنی است که ما می تونیم اون رو به ویژگی های اجزای برنامه اضافه کنیم و سفارشی کنیم کلاس و مقادیر ویژگی رو که در فایل پیکر بندی وجود دارند. این رویکرد مورد نظر ما است.
اضافه کردن Db Conection به عنوان یک جزء از نرم افزار
برای رفتن سریع یک گام به عقب. وقتی ما یک برنامه ابتدایی میسازیم ، ما تعیین میکنیم نوع برناممون رو تا یک برنامه وب بشه انجام این کار درواقعمشخص میکنه که، برنامه تک کلاسه ای که ایجاد شده است بر هر درخواست باید یک نوع از CWebApplication باشد. این برنامه yii یگانه ،بستر اجرا است که در آن همه در خواست ها پردازش و اجرا می شوند.وظیفه اصلی آن این است که درخواست کاربر رو حل و فصل کنه و مسیر اون رو به یک کنترلر مناسب برای پردازش بیشتر تغییر بده . این کار رد فصل های قبل توضیح داده شده (در فصل 1)همچنین به عنوان محل مرکزی برای حفظ مقادیر در سطح پیکر بندی برنامه خدمت می کنه.
برای سفارشی کردن تنظیمات برنامه ، ما بطور معمول یک فایل پیکر بندی برای مقدار دهی اولیه مقادیر داریم وقتی که برنامه به طور نمونه داره درست میشه. فایل پیکربندی اصلی در /protected/config/main.php قرار دارد. این در حقیقت یک فایل php است که شامل آرایه ای از کلید ها و مقدار هر دو باهم می باشد.هر کلید نشاند دهنده نام از یک خاصیت از برنامه و هر مقدار خاصیت اولیه مقدار آن است. اگر شما این فایل رو باز کنید ، شما خواهید دید که تعداد کمی تنظیمات در حال حاضر پیکربندی شده است برای ما توسط ابزار yiic.
اضافه کردن کامپوننت برنامه به پیکربندی ساده است. فایل config اصلی رو باز کنید و خصوصیات کامپوننت خودتون رو قرار بدید.. این در فصل های بعدی پوشش داده خواهد شد. همچنین ما در اینجا میبینیم یک کامپوننت db نیز وجود دارد (که ما قبلاً به آن اشاره کرده ایم) که پیکرندی شده برای استفاه از دیتابیس کانکشن SQLite که در مسیر مقابل قرار دارد protected/data/testdrive.db. . بیایید کانکشن مربوطه رو برای استفاده از mysql جایگزین کنیم. برای این کار میتونید از کدهای زیر پیروی کنید:

// application components
'components'=>array(

'db'=>array(
'connectionString' => 'mysql:host=127.0.0.1;dbname=trackstar_dev',
'emulatePrepare' => true,
'username' => 'your_db_user_name',
'password' => 'your_db_password',
'charset' => 'utf8',
),
),

البته اگه کمی دقت کنید در زیر اون کانکشن sqllite یک کانکشن دیگه که به صورت توضیح در آورده شده نیز قرار داره که چگونگی اتصال به دیتابیس mysql رو برامون آموزش داده می تونید اون فایل رو برای استفاده mysql از حالت توضیح در آورده و برای استفاده از دیتابیس آماده کنید و کانکشن بالا رو به حالت توضیح در بیارید.
در کدهایی که بالا نوشته شده فرض بر این است که یک بانکگ اطلاعاتی به نامtrackstar_dev' از قبل ایجاد شده است و در دسترس است و برای اتصال به آن روی localhost از ip مقابل استفاده شده است 127.0.0.1 .
یکی از مزایای ساخت این کامپوننت برنامه این است که ، ما می توانیم از این به بعد مرجع اتصال به پایگاه داده رو به سادگی یک ویژگی از نرم افزار yii در نظر بگیریم و از اون خیلی راحت استفاده کنیم به شکل زیر:
Yii::app()->db

که این کد رو در هر جای برنامه میتونیم استفاده کنیم. به همین ترتیب، ما می توانیم این کار را برای هر یک از مولفه های تعریف شده در فایل پیکربندی انجام دهید.
حال همه مثالهای ما از پایگاه داده mysql استفاده خواهند کرد. اگرچه، ما ارائه خو.اهیم کرد عبارات DDL سطح پایین برای ساختارهای جدول، و ما سعی خواهیم کرد که چیزهای کلی از دیدگاه پیاده سازی یک پایگاه داده نگه داریم.این به طور کامل امکان پذیر است به پیروی از هر پایگاه داده سازگار با yii که شما انتخاب کرده اید. در زمان نوشتن، Yii پشتیبانی میکنه از رکورد فعال برای MySQL, PostgresSQL, SQLite, SQL Server, and Oracle. .
نکته:
ویژگی charset رو به utf8 برای اتصال به پایگاه داده ست کنید. این ویژگی تنها برای استافده mysql و PostgreSQL است.



بنابر این ما یک دیتابیس mysql خاص داریم که نامشو trackstar_dev' قرار دادیم و همچنین برای این که به این دیتابیس وصل بشیم نیاز به نام کاربری و پسورد داریم. ما در این قسمت تصور می کنیم که شما کار با پایگاه داده و کارهای دیگرو بلدید و از این که چطور دیتا بیس بسازیم و از این قبیل مسائل رو به خودتون واگذار مینکیم.
زمانی که دیتابیس رو ساختید و دیتابیس در جای خود هستش میتونیم دوباره اون رو تست کنیم با استفاده از unit test .:

%phpunit unit/DbTest.php
PHPUnit 3.3.17 by Sebastian Bergmann.
Time: 0 seconds
OK (1 test, 1 assertion)

می بینید که تستمون با موفقیت پاس شد.
خلاصه


ما تکرار اولمون رو کامل کردیم،و در حال حاضر یک برنامه کار و تست شده داریم که آماده مستقر شدن در صورت لزوم هستش. اگرچه برنامه که ما ساختیم کار خاصی رو انجام نمیده.


به ما هم هميشه سري بزنيد (http://www.pc-mobile.ir)

nariman_t
شنبه 25 آذر 1391, 21:40 عصر
فصل 5
تکرار 2: پروژهCRUD


حالا که ما یک برنامه پایه و تنظیم شده برای برقراری ارتباط با پایگاه داده داریم، ما می تونیم یواش یواش بر روی برخی از ویژگی های واقعی و اصلی نرم افزار کار کنیم. ما می دونیم که این پروژه یکی از اجزای اساسی در برنامه ما است. . یک کاربر نمیتونه انجام بده هیچ کار سودمندی با برنامه trakstar بدون انتخاب یا ساختن پروژه که هر کدام اضافه می کند وظایف و مسائل دیگر رو. به همین دلیل، ما می خواهیم برنامه قبلی که داشتیم انجام میدادیم رو ادامه بدیم و تمرکز کنیم روی گرفتن پروژه و کار با اونها.
برنامه ریزی تکرار
این تکرار ، این کاری که می خواهیم انجام بدیم نسبتاً ساده هستش. در پایان این تکرار یعنی این فصل، برنامه باید تا جایی رسیده باشه که کاربران بتونند پروژه جدید ایجاد کنند ، از لیست پروژه های موجود بتونند پروژه ای رو انتخاب کنند، همچنین قابلیت به روز رسانی ، ویریش و همچنین حذف رو نیز داشته باشند.
به منظور دستیابی به این هدف. ما احتیاج داریم که شناسای کنیم وظیفه ها رو و اونها رو به حالت خورد خورد در بیاریم و روی اونها برای کار کردن فوکوس کنیم. در زیر لیستی از فهرست وظایف رو برای به انجام رسوندن هدف این فصل آوردیم که بهشون اشاره میکنیم:
· طراحی الگو طرح دیتابی برای پشتیبانی از پروژه ه ها
· ایجاد جداول مورد نیاز و تمام اشیاء پایگاه داده های دیگر شناسایی شده در طرح
· ایجاد کلاسهای مورد نیاز مدل AR برای استفاده ساده از جداول پایگاه داده
· ایجاد کلاس کنترلر های Yii که از کارهای زیر حدوداً تشکیل شده:
1-ساخت پروژه جدید
2-واکشی یک لیست از پروژه های موجود برای نمایش
3-بروز رسانی ابر داده (metadata)بر روی پروژه های موجود
4-حذف پروژه های موجود
· ساخت فایل ویو yii منطقشان که در ساخت این پروژه خواهد بود
1-نمایش فرمی که اجازه میدهد یک پروژه جدید ایجاد کنند
2-نمایش یک لیست از همه پروژه های موجود
3-نمایش فرمی برای این که یک کاربر بتونه پروژه موجود رو ویرایش کنه
4-اضافه کردن دکمه حذف به لیست پروژه ها برای اجازه دادن برای حذف پروژه
این قطعاتی که در بالا ذکر شد به حد است که بتوان کار رو شروع کرد. ما به زودی قادر خواهیم بود این وظایف رو در داخل برنامه trackstar خودمون بگنجونیم و اونها رو مدیریت کنیم.
اجرای دنباله تستمون
قبل از این که ما به سمت توسعه برناممون پرش کنیم، ما باید مجموعه تست های موجود خودمون رو اجرا کنیم و مطمئین شوید که همه اونها به درستی پاس میشوند.ما فقط یک تست تا الان داریم.ما این تست رو در فصل 4 به برنامه خودمون اضافه کردیم که برای تست کانکشنمون بود. کامن پرومپت رو باز کنید و از طریق فولدر/protected/tests همه تست ها رو یک باره انجام بدید:
%phpunit unit/
PHPUnit 3.3.17 by Sebastian Bergmann.
Time:
::0 seconds
OK (1 test, 1 assertion)

همه تست ها به درستی پاس شد و می تونیم کار رو ادامه بدیم.
ایجاد جداول پروژه
در فصل 3، برنامه trackstar ما در مورد داده های اولیه که نشان دهنده یک پروزه بود صحبت کردیم، و همچنین در فصل 4 تصمیم گرفتیم که برای کا با دیتابیس از Mysql برای ادامه کار استفاده کنیم. ما نیاز داریم این ایده هایی که قبلاً در مورد اونها بحث کردیم رو بهع یک جدول پایگاه داده واقعی انتقال بدیم.
ما میدونیم که پروژه هایی که ایجاد میشن در برناممون احتیاج به یک نام و یکتوضیح در مورد اون پروژه دارند. همچنین ما در پایگاه دادمون باید برخی از اطلاعات پایه مربوط به پروژه ای که ایجاد میشه رو داشته باشیم مثل زمان ایجاد پروژه ، زمان ویرایش پروژه و این که چه کسی این پروژه رو ایجاد و و چه کسی به روز رسانی کرده. همین چیزهایی که گفتیم برای شروع یک جدول از پایگاه داده کافی می باشد. بر اسا این خواصی که گفتیم اون چیزی که باید درست کنیم و کدی که باید برای ایجاد این جدول بنویسیم چیزی همانند زیر خواهد بود:
CREATE TABLE tbl_project
(
id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(128),
description TEXT,
create_time DATETIME,
create_user_id INTEGER,
update_time DATETIME,
update_user_id INTEGER
);

پوشش دادن third-party که ابزار پایگاه داده است خارج از محدوده این کتاب می باشد. ما همچنین به شما می خواهیم اجازه دهیم که هر ادیتوری که برای کار با mysql راحت تر هستید رو استفاده کنید. به همین دلیل، ما می خواهیم به سادگی یک زبان تعریف داده سطح پایین (ddl) رو فراهم کنیم برای ساختارهایی که ساختیم.پس ادیتور دیتابیس مورد علاقه خودتون رو باز کنید و جدول trackstar_dev در داخل دیتابیسی که در فصل های قبل ساخته بودیم درست کنید.
نکته:
بسته به نوع پایگاه داده خاصی که شما برای استفاده انتخاب می کنید، ابزارهای زیدای وجود دارد که کمک می کنه برای نگهداری از الگوی یک دیتا بیس و کمک میکنه در مدیریت پایگاه داده . ما توصیه میکنیم که از یکی از این ابزارها برای آسانتر کردن کارهای خود با دیتا بیس استفقاده کنید. ما درواقع در این کتاب با استفاده از MySQLWorkbench(http://dev.mysql.com/downloads/workbench/5.1.html (http://dev.mysql.com/downloads/workbench/5.1.html)) برای طراحی، سند سازی، و مدیریت طرح دیتابیسمون کارهامونو انجام میدیم.ما همچنین با استفاده از (http://www.phpmyadmin.net/home_page/downloads.php (http://www.phpmyadmin.net/home_page/downloads.php)) phpmyadmin برای کمک کردن به کارهامون استفاه میکنیم. ابزارهای مشابه زیادی مانند اینها وجود دارند. اگر تا به حال با هیچکدام از این ابزارها استفاده نکرده اید اگر مدت زمان کمی را برای یاد گیری و کار کردن با این ابزارها صرف کند می توانید مدتها در زمان خود برای انجام این چنین کارها صرفه جویی کنید



نامگذاری قراردادها
شما ممکن است متوجه شده باسید که ما در نماگذاری ستونهای جدول پایگاه داده الز حروف کوچک استفاده کرده ایم. در طول ساخت برنامه نیس ما برای نام تمام جداول و نام ستونها از حروف کوچک استفاده خواهیم کرد. این یکی از اصول اولیه است زیرا DBMS های متفاوت به کار میبرند case-sensitivity ها متفاوتی رو.
شما ممکن است به این نیز دقت کرده باشید که ما یک پیشوند مثل tbl_prefix در نامگذاری جدول پروژه استفاده کرده ایم. از ورژن 1.1 به بعد yii فراهم می کنه پشتیبانی جامعی رو برای استفاده از پیوشند جداول. پیشوند جدول رشته ای است که به نام جدول اضافه شده است. این اغلب در هاست های مشترک استفاده میشه که در آن برنامه های برنامه های مختلفی به اشتراک گذاشته میشه که از یک پایگاه داده واحد استفاده میکنند پیشونند جداول مختلف باعث متمایز شدن آنها از یکدیگر می شوند.برای مثال یک برنامه میتواند از پیشوند tbl_ استفاده کند در حالی که یکی دیگر از پیشوند yii_. همچنین برخی از مدیران پایگاه داده از این به عنوان یک قرارداد برای اشیا پایگاه از پیشوند نامگذاری استفاده می کنند تا موجودیت اونها رو مشخص کنند، و یا در غیر اینصورت از این پیشوند برای کمک به سازماندهی اشیاء به گروه های مشابه استفاده میکنند.
به منظور استفاده یکپارچه از پیشوند جداول در Yii ، باید ست کنیم ویژگی مناسب CDbConnection::tablePrefix رو به پیشوند جدول مورد نظر.پس از آن در عبارت sql استفاده میشه در سراسر برنامه، می توانید استفاده کنید {{TableName}} رو برای اشاره به نام جدول ، جایی که نام جدول Tablename است، اما بدون پیشوند.به عنوان مثال اگر ما این تغییرات رو انجام میدادیم می توانستیم کد زیر رو در مورد همه پرس و جو ها استفاده کنید:
$sql='SELECT * FROM {{project}}';
$projects=Yii::app()->db->createCommand($sql)->queryAll();

این موارد رو بعدا باز بیشتر توضیح خواهیم داد
ساخت کلاس مدل AR
حالا که ما جدول tbl_project رو ساخته شده داریم، م ااحتیاج داریم که کلاس مدل yii را درست کنیم تا به ما اجازه بده تا به راحتی دادهامون رو در واون جدول مدیریت کنیم.ما قبلاً در فصل 1 در مورد رکورد فعال(Active record ) و نقشه برداری شی رابطه ای (Object -relational Mapping (ORM) ) صحبت کردیم.خوب حالا ما در اینجا یک مثال عینی از اون رو در زمینه این برنامه می خوایم ببینیم.
ما قبلاً از دستورات yii shell برای ساخت کدهای خودکار کمک گرفته بودیم. همانطور که ما در فصل 2 دیدیم وقتی ما استفاده کرده بودیم از دستورات shell برای ساخت اولین کنترلرمون، وجود داشتمد دستورات shell دیگری که میتونستید برای ایجاد کد برنامه خودکار از اونها کمک بگیرید. با این حال از نسخه 1.1.2 از Yii ، یک رابط کاربری جدید و پیچیده تری به نام GII در دسترس قرار داده است.GII یک ابزار که به صورت سفارشی و توسعه پذیر تولید خودکار کد مبتنی بر وب است.ما می خواهیم با استفاده از از این پلتفرم جدید مدل کلاس جدیدمون رو بسازیم.


به ما هم هميشه سري بزنيد (http://www.pc-mobile.ir)

nariman_t
شنبه 16 دی 1391, 01:21 صبح
پیکربندی Gii برای استفاده

برای این که ما بتونیم شروع به استفاده از Gii بکنیم، باید اون رو برای استفاده تنظیم و پیکر بندی بکنیم. باید تا همین الان هم حدس زده باشید که برای پیکربندی این کامپوننت باید فایل پیکربندی اصلی که در مکان protected/config/main.php قرار دارد رو ویرایش کنید. برای ویرایش این فایل ، فایل مورد نظر رو در ویرایشگری که می خواهید باز کنید و کدهای زیر رو در اون اضافه کنید البته اضافه کردن این کده الزامی هم نیست چون اگه کمی دقت کنید این کدهایی که در زیر قرار داده شده در داخل خود همین فایل هست ولی به صورت توضیات هستش که فقط اونها رو اگه از حالت توضیحات در بیارید کفایت میکنه:



return array(
'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
'name'=>'My Web Application',
// preloading 'log' component
'preload'=>array('log'),
// autoloading model and component classes
'import'=>array(
'application.models.*',
'application.components.*',
),
'modules'=>array(
'gii'=>array(
'class'=>'system.gii.GiiModule',
'password'=>'[add_your_password_here]',
),
),



این تظیمات Gii به عنوان یک ماژول نرم افزار است.البته ما در اينجا نمي‌خواهيم در مورد ما‍ول هاي صحبت كنيم بحث در مورد ما‍ولها رو موكول ميكنيم به فصل ديگه‌اي كه بتونيم در موردش مفصل تر صحبت كنيم.نكته مهمي كه در اينجا بايد به اون اشاره كنيم و دقت كنيد اينه كه وقتي تنظيمات Gii رو دارين انجام ميديد يادوتن باشه كه قسمتي داره براي تعريف پسورد كه در اون قسمت پسورد دلخواهتون رو بنويسيد كه بعدا براي ورود به قسمت gii از همون پسورد بايد استفاده كنيد. براي كار با اين ابزار به سمت لينك زير حركت كنيد با استفاده از مرورگر:
http://localhost/trackstar/index.php?r=gii (http://localhost/trackstar/index.php?r=gii)

تصويري همانند زير براي شما نمايش داده خواهد شد،در اين صفحه در قمست پسورد همان رمز عبوري كه در موقعه پيكر بندي gii نوشتيد را بنويسيد و وارد ابزار gii شود:

97864


استفاده از Gii براي ساخت كلاس AR (Active Record) براي پرو‍‍ژهمان

بعد از اين كه پسوردتون رو زديد و تصديق اتبار شديد به صفحه‌اي همانند عكس زير وارد مي‌شويد:

97865

همانطور كه امكان دارد به خاطر بياوريد ،موادري كه براي انتخاب در اين صفحه وجود دارند همانند گزينها هايي هستند كه در فصل در در موقعه‌اي كه ما در cmd دستور yii help رو وارد مي‌كرديم ميومد.همانطور كه ما مي‌خواهيم يك كلاس جديد براي جلود tbl_project خودون بسازيم، به نظر مياد كه گزينه Model Generator همون چيزي هتش كه ما مي‌خواهيم. با كليك كردن بر روي اين لينك ما به صفحه‌اي همانند شكل زير هدايت مي‌شويو.

97866


بعد در صفحه باز شده از گزينه هايي كه در سمت چپ قرار داند دوباره همان گزينه بالا را انتخاب مي‌كنيم. فيلد Table Prefix فيلدي است كه عمدتاً براي كمك به gii براي تعيين كردن چگونگي نام Ar در حال توليد استفاده ميشود. اگر شما يك پشوند استفاده مي‌كنيد، شما مي‌تونيد اون رو در همينجا كه گفته شد اضافه كنيد.به اين ترتيب اين پيشوند در نامگذاري جديد استفاده نخواهد شد.بنابر اين ،تعيين اين مقدار به اين معني است كه كلاس Ar ساخته شده جديد ما ،به نام project نامگذاري خواهد شد، به جاي tbl_project .

دو فيلد بعدي نام نام جدول و نام كلاس فايل را از ما براي ايجاد كردن مي‌خواهند.در فيلد Table name نام جدول خودتون رو وارد كنيد،tbl_project ، مي‌بينيد كه فيلد model class به صورت خودكار پر خواهد شد.قراردادهايي كه براي نام model class است همونطور كه ديديد نامي از جدول خواهد بود. بنابر اين فرض بر اين خواهد بود يك نام از پرو‍ژه براي ما نام model class مان خواهد شد، اما البته شما مي‌توانيد اون رو سفارشي كنيد.

فيلد بعدي براي سفارشي كردن بيشتر اجازه مي‌دهد. فيلد base class استفاده ميشه براي مشخص كردن كلاسي كه از آن ما model class رو مي‌خواهيم گسترش بديم. اين بايد CActiveRecord يا يك كلاس فرزند وابسته به اون باشه. فيلد model path به شما اجازه می دهد تا مشخص کنید ساختار پوشه نرم افزار براي خروجی فایل جدید كجا باشه. اين مسير به صورت پيش فرض protected/models/ مي‌باشد (همچنین به به عنوان application.models شناخته شده است). آخرين فيلد به ما اجازه ميده يك template رو مشخخص كنيم كه بر اساس آن كد ساخته شده در اونجا مستقر بشه.مي تونيد اين فيلد رو نيز بسته به نياز خودتون سفارشي كنيد . ولي در حال حاضر ، مقادير پيش فرض براي اين فيلد براي ما خوب است. روي دكمه preview براي ادامه كار كليك كنيد.انجام اين عمل نتايج زير رو در جدول براي ما نشان خواهد داد مانند تصوير زير:

97867



به ما هم هميشه سري بزنيد (http://www.pc-mobile.ir)

nariman_t
شنبه 16 دی 1391, 01:23 صبح
اگر بر روي لينكي كه در جدول بالا نشان داده شده كليك كنيدكدهايي كه ساخته خواهند شد رو نشون ميدهند.تصويري كه با كليك بر روي اين لينك نماشي داده خواهد شد چيزي همانند تصوير زير خواهد بود.

97869

خوب پنجره‌اي كه باز شده است رو براي ادامه كار ببنديد، بعد از بستن پنجره روي دكمه generate كليك كنيد. با فرض اين كه تمام كارها خوب پيش رفته، چيزي كه بايد شما در پايين صفحه ببينيد تصويري همانند تصوير زير بايد باشد:

97870

نكته:

مطمئين شويد كه/protected/models (يا هر فولدر ديگري كه شما در model path براي اين فيلد در نظر گرفته بوديد) قابل نوشتن باشه. در غير اينصورت امكان داره شما يك خطاي مجوز دسترسي نوشتن رو دريافت كنيد.

خوب ابزار Gii براي ما يك مدل كلاس AR . به راحتي ، در مكان پيش فقرض براي كلاس‌هاي مدل ايجاد كرد (protected/models/) . اين كلاس يك كلاس بسته بندي شده براي جدول ديتابيس tbl_project مان مي‌باشد. همه ستون ها در جدول tbl_project در دسترس هستند به عنوان خواص کلاس پروژه AR .

آشنايي با كلاس AR ايجاد شده جديد و تست كردن اين كلاس ميتونه با تست كردن راحت تر و سريع تر باشه.

تست كد ايجاد شده جديد مان

اولين كاري كه بايد بكنيم ايجاد يك فايل unit براي تست هستش. اين فايل رو در مكان protected/tests/unit/ProjectTest.php دررست كنيد و محتويات داخل اون را با كدهاي زير پر كنيد:




<?php
class ProjectTest extends CDbTestCase
{
public function testCRUD()
{
}
}




كلاسي كه ما اضافه كرديم گسترش يافته CDbTestCase است ، كه از كلاس هاي پايه فريم ورك yii براي تست واحد كلاسهاي خاص است كه براي تست قابليت‌هاي پايگاه داده مربوط در نظر گرفته شده است.اين كلاس پايه پايگاه داده مديريت ثابت رو فراهم مي‌كند، كه ما بعدا اين مطلب رو پوشش خواهيم داد.

ما از رويه testCRUD() استفاده مي‌كنيم براي همه تست هاي CRUDمون در برابر پوژه كلاس Ar .ما شروع خواهيم كرد تست رو با ساخت يك پروژه جديد.

آشنايي با كلاس AR ايجاد شده جديد و تست كردن اين كلاس ميتونه با تست كردن راحت تر و سريع تر باشه. اگه اين فايل جديد رو باز كنيد و كمي در خطوط و كدهاي اون دقت كنيد نام فيلدهايي كه براي جدولمون ساختيم رو هم ميتونيد ببينيد و متوجه شيد كه اين AR به صورت مستقيم با جدولمون در ارتباط هستش.




به ما هم هميشه سري بزنيد (http://www.pc-mobile.ir)

nariman_t
جمعه 22 دی 1391, 22:20 عصر
تست كد ايجاد شده جديد مان

اولين كاري كه بايد بكنيم ايجاد يك فايل unit براي تست هستش. اين فايل رو در مكان protected/tests/unit/ProjectTest.php دررست كنيد و محتويات داخل اون را با كدهاي زير پر كنيد:
<?php
class ProjectTest extends CDbTestCase
{
public function testCRUD()
{
}
}

كلاسي كه ما اضافه كرديم گسترش يافته CDbTestCase است ، كه از كلاس هاي پايه فريم ورك yii براي تست واحد كلاسهاي خاص است كه براي تست قابليت‌هاي پايگاه داده مربوط در نظر گرفته شده است.اين كلاس پايه پايگاه داده مديريت ثابت رو فراهم مي‌كند، كه ما بعدا اين مطلب رو پوشش خواهيم داد.

ما از رويه testCRUD() استفاده مي‌كنيم براي همه تست هاي CRUD مون در برابر پوژه كلاس Ar .ما شروع خواهيم كرد تست رو با ساخت يك پروژه جديد.

كدهاي زير رو به تابع testCRUD() اضافه كنيد،كه باعث ايجاد يك پرو‍ه جديد كلاس AR ميشود، و وي‍ژگي هاي پرو‍ه رو نيز ست كرده و اون رو ذخيره كنيد.
public function testCRUD()
{
//Create a new project
$newProject=new Project;
$newProjectName = 'Test Project 1';
$newProject->setAttributes(
array(
'name' => $newProjectName,
'description' => 'Test project number one',
'create_time' => '2010-01-01 00:00:00',
'create_user_id' => 1,
'update_time' => '2010-01-01 00:00:00',
'update_user_id' => 1,
)
);
$this->assertTrue($newProject->save(false));
}

اين كده ابتدا يك نمونه از AR project ميسازه. بعد ما از تابع setAttributes() از كلاس AR رو استفاده ميكنيم در يك بلوك بر اساس آرايه ورودي.ما ميبينيم كه خواص كلاس كليدهايي به اين آرايه ورودي هستند. و آنها تنظيم خواهند شد با مقدار خاص در اين آرايه.

در ضمن در مورد تايع setAttributes() بايد بگم كه در كتاب انگليسي كه دارم ترجمه ميكنم چيز چندان زيادي نوشته نشده فقط براي اطلاعات بيشتر مي تونيد به اينجا سري بزنيد http://www.yiiframework.com/doc/api/1.1/CModel (http://www.yiiframework.com/doc/api/1.1/CModel) . بايد بگم كه اين تابع در داخل اون مدلي كه ما ساختيم نيست و در جايي هستش كه فريم ورك وجود داره خودتون به توابع موجود در صفحه اي كه لينكش رو دادم نگاه كنيد تا حدودي متوجه خواهيد شد.

بعد از اين كه ويژگيهاي رو ست كردين، ما ذخيره ميكنيم new project رو بوسيله فراخواني رويه save() . ما پاس ميكنيم پارامتر اختياري false رو در رويه save() تا به اون بگيم از هر اعتبار سنجي داده ها در وي‍گي هايي كه تعريف كرديم بگذره.(ما در مورد اعتبار سنجي دادهاي مدل در فصل مربوطه بيشتر توضيح خواهيم داد) . سپس ما براي اين كه مطمئن بشيم مقدار بازگشتي از ذخيره ركورد جديد درست است،نشان مي دهد كه ذخيره سازي موفق است.در مورد تابع Save setattribuite دوباره بگم كه اين دو تابع از توابع پايه و اصلي CActiveRecord هستند كه در لينكي كه در بالا براتون گذاشتم كاملاً مي تونيد در اين مورد تحقيق كنيد و مثالهايي رو از اونها ببينيد.

حال براي اين كه بفهميم اين تستي كه ما نوشتيم درست عمل ميكنه به خط فرمان برويد يا منظور همون كامند لاين هستش سپس تستمون رو اجرا ميكنيم:
% cd Webroot/protected/tests
% phpunit unit/ProjectTest.php
PHPUnit 3.3.17 by Sebastian Bergmann.
.
Time:
::0 seconds
OK (1 test, 1 assertion)

خوب همه چيز عاليه ميبينيد كه همه چيز درست كار ميكنه. بنابر اين ما ميبينيم كه ما يك پروژه جديد رو با موفقيت به سادگي اضافه كرديم.خوب براي اين كه ببينيد كارهاي كه انجام داديم به درستي عمل كرده و داده هايي كه در تستمون قرار داديم به درستي در پايگاه داده ذخيره شده ميتونيد به صورت مستقيم كدي براي mysql بنويسيد و دادههاي اون رو بازيابيي كنيد و ببينيد كه آيا دادهامون اونطور كه ميخواستيم ذخيره شده يا نه: خوب شما ميتونيد با استفاده از phpmyadmin داده هايي كه ذخيره شدن رو مشاهده كنيد يا از كدهايي كه در زير قرار داديم به صورت دستي و مستقيم اين كار رو از خط فرمان mysq انجام بديد:
mysql> select * from tbl_project\G
*************************** 1. row ***************************
id: 1
name: Test Project 1
description: Test project number one
create_time: 2010-01-01 00:00:00
create_user_id: 1
update_time: 2010-01-01 00:00:00
update_user_id: 1
1 row in set (0.00 sec)

ولي من خودم ترجيح ميدم كه از phpmyadmin داده هايي كه ذخيره شدن رو نگاه كنم كه با استفاده phpmyadmin شكلي مانند زير رو خواهيم داشت:

98267

همونطور كه متوجه شديد ما در پروژه تستمون كه نوشتيم ستون ID رو اثلاً ذكر نكرديم ولي داده اي در آن هم وقتي داريم ميبينيم ذخيره شده ، بايد بگم اون موقعه اي كه ما داشتيم جدول رو. درست ميكرديم اين ستون رو از نوع auto-increment و همچنين از نوع Primary Key گذاشتيم يعني اين كه اين ستون به صورت خودكار در هر بار اضافه شدن يك ركورد جديد پر ميشود و همچنين چون اين ستون يك ستون Primary Key هستش يعني كليد اصلي ما در جدول است بايد هر مقداري كه در آن قرار دارد متمايز با ركوردهاي بعدي باشد در كل لازم نيست كه ما به صورت دستي در داخل اين فيلد مقداري وارد كنيم.گذشته از اينها شما ميتوانيد خيلي آسان

دسترسي داشته باشيد به وئي‍گي ID به صورت زير:
$newProject->id

ما از اين كدي كه در بالا نوشتيم در تست هاي بعديمون استفاده خواهيم كرد.

تست خواندن

خوب حالا كه ما تابعي رو براي ذخيره كردن داده ها داريم كه تست شده نيز هستش بياييد يك چيزي هم براي خواندن اين دادهاي وارد شده بسازيم.

خوب كدهايي هايلايت شده زير رو مانند قبل زير همان كدهايي كه نوشته بوديم اضافه كنيد ، در زير كدهايي كه عمل Svae رو انجام ميداد:

public function testCRUD()

{

//Create a new project

//READ back the newly created project

$retrievedProject=Project::model()->findByPk($newProject->id);

$this->assertTrue($retrievedProject instanceof Project);

$this->assertEquals($newProjectName,$retrievedProject->name);

}



در اينجا ما تابع Model() رو استفاده ميكنيم كه بايد تعريف بشه در هر كلاس AR.اين متد يك نمونه رو برميگردونه از كلاس project AR كه بيشتر براي فراخواني در سطح كلاس متد استفاده شده است.ما در حال صدا زدن findByPk() هستيم براي بازيابي يك نمونه خاص از پروژه.

اين متد(همانطور كه شما بايد انتظار داشته باشيد) مقدار primary key رو ميگيره و بر ميگردونه يك سطر خاص رو كه تطابق داره با همون كليد منحصر به فردي كه به اين تابع ميديم.

ما به تازگي ميدونيد كه يك ديتا به جدول داده ايم كه يك ID جديد رو. به جدول اضافه كرد يا همون سطر حديد. به اين ترتيب ما در حال تلاش براي خواندن همان سرطي كه قرار داده ايم هستيم كه ما انون در $newProject ذخيره كرديم.پس ما الان در تستمون 2 تا assertions. داريم.ما اول بازبيني ميكنيم كه موجوديت خوانده شده برگشتي ما يك نمونه از كلاس پروژه AR است.سپس بررسي ميكنيم كه نام پروژه از ركورد خوانده شده برگشتي همان است كه ما به پروژه داده ايم هنگامي كه ما در ابتدا آن را ذخيره كرديم.

توابعي كه در اينجا استفاده كرديم رو مورد بررسي قرار ميديم:

Model() : برميگردونه مدل استاتيك رو از كلاس مشخص شده AR .
model() method
public static CActiveRecord model(string $className='CActiveRecord')
$className
string
active record class name.
{return}
CActiveRecord
active record model instance.
Source Code: framework/db/ar/CActiveRecord.php#380 (https://github.com/yiisoft/yii/blob/1.1.13/framework/db/ar/CActiveRecord.php#L380) (show (http://www.yiiframework.com/doc/api/1.1/CActiveRecord))
Returns the static model of the specified AR class. The model returned is a static instance of the AR class. It is provided for invoking class-level methods (something similar to static class methods.)

EVERY derived AR class must override this method as follows,
public static function model($className=__CLASS__)
{
return parent::model($className);
}





findByPk() (http://www.yiiframework.com/doc/api/1.1/CActiveRecord#findByPk-detail) :پيدا ميكنه يك ركورد فعال رو با استفاده از يك( primary key) كليد اصلي.
findByPk() method
public CActiveRecord findByPk(mixed $pk, mixed $condition='', array $params=array ( ))
$pk
mixed
primary key value(s). Use array for multiple primary keys. For composite key, each key value must be an array (column name=>column value).
$condition
mixed
query condition or criteria.
$params
array
parameters to be bound to an SQL statement.
{return}
CActiveRecord
the record found. Null if none is found.



مثالي براي
$retrievedProject=Project::model()->findByPk($newProject->id);

اين يك ساختار است كه اكثراً به همين شكل استفاده ميشه.





دوباره تستمون رو انجام بديم ، پيامهاي زير بايد براي ما نشان داده شوند:
% phpunit unit/ProjectTest.php
...
OK (1 test, 3 assertions))) )

بسیار خوب! ما “R” رو تاييد شده دداريم كه اونطور كه انتظار داريم در CRUD در حال مار كردن است.خوب حالا بياييد به روز رساني و حذف رو نيز به تستمون اضافه كنيم.

تست حذف و بروز رساني

خوب كدهاي زير رو ، به زير كدهايي كه براي خواندن اضافه كرده بوديد اضافه كنيد:
//Create a new project
...
//READ back the newly created project
...
//UPDATE the newly created project
$updatedProjectName = 'Updated Test Project 1';
$newProject->name = $updatedProjectName;
$this->assertTrue($newProject->save(false));
//read back the record again to ensure the update worked
$updatedProject=Project::model()->findByPk($newProject->id);
$this->assertTrue($updatedProject instanceof Project);
$this->assertEquals($updatedProjectName,$updatedProject->name);
//DELETE the project
$newProjectId = $newProject->id;
$this->assertTrue($newProject->delete());
$deletedProject=Project::model()->findByPk($newProjectId);
$this->assertEquals(NULL,$deletedProject);

خوب همونطور كه ميبينيد ما اينجا كدهايي براي حذف و به روز رساني پروژمون داريم.ابتدا به نمونه كلاس $newProject يك نام اختصاص دادايم و انو ذخيره كرديم.ابتدا ما يك نمونه جديد به ($newProject داديمو نام اون رو آپديت كرديم و سپس پروژه رو دوباره ذخيره كرديم. همانطور که ما در حال برخورد با یک نمونه AR موجود هستيم،هامنطور كه ما در حال رفتار با نمونمه موجود AR هستيم الان، كلاس AR ما ميدونه كه درحال انجام يك به روز رساني،به جاي افزودن يك ركورد جديد،هر زمان كه ما فراخواني كنيم ->save() . سپس همون رديفي كه آپديت شده رو براي اطمينان از به روز رساني ميخونيم.

براي آزمايش حذف، ما project id رو داخل يك متغير عمومي به نام $newProjectId ذخيره ميكنيم. سپس ما تابع delete() رو فراخواني ميكنيم روي نمونه AR كه حذف كنه ركورد رو از ديتابيس و نمونه AR مون رو نيز از بين ببره. ما سپس متغير عمومي استفاده شده رو كه در اون project id مون ذخيره شده بود رو براي خو.ندن دوباره سطر سعي ميكنيم به وسيله همين كليد اصلي. ركورد بايد حذف شده باشه،بايد هم انتظار داشته باشيم كه اين كاري كه ما كرديم يك جواب Null به ما بده. آزمون asserts كه ما استفاده كرديم نيز ميگه كه بايد يك مقدار برگشتي null از اين آزمايش داشته باشيم.

خوب چيزهايي كه نوشتيد رو ذخيره و تست رو دوباره روي اين فايل اجرا كنيد حتماً همه چيز به درستي پاس خواتهد شد.

فعال كردن عمليات CRUD براي كاربران

تستهاي ذكر شده قبلي استفاده كلاس نمونهAR رو براي ما معرفي ميكنه.اين نشون داد كه چطور از اونها براي ايجاد ركورد جديد ،بازيابي ركوردهاي موجود،بروز رساني ركوردهاي موجود،و حذف ركورد موجود استفاده كنيم. ما زمان زیادی را صرف آزمایش این عملیات در سطح پایین تر در نمونه کلاس AR جدول پروژه كرديم، اما برنامه trackstar مون هنوز قابليت هاش نمايش داده نشده. چيزي كه ما وافعاً احتياج داريم يك راه براي كاربران براي Create, Read, Update, and Delete پرو‍ژه در داخل خود برنامه است.حالا كه ما راهكارهايي رو ميدونيم از استفاده AR هر چند كم، ما ميتونيم به برنامه نويسي اين قابليتها در برخي از كلاسهاي كنترلرمون بكنيم.خوشبختانه ما كار زيادي لازم نيست انجام بديم.

ايجاد چارچوب براي پروژه CRUD

يك بار ديگر، ابزار توليد د Gii ما رو از كد نويسي هاي خسته كننده نجات ميده. برگرديد به عقب براي نمايش صفحه اصلي منو Gii كه در مكان http://localhost/trackstar/index.php?r=gii (http://localhost/trackstar/index.php?r=gii) قرار داره، و لينك Crud Generator رو انتخاب كنيد. تصويري همانند صفحه زير رو بايد داشته باشيد.
98268

در اينجا يك فرم با دو فيلد ورودي وجود دارد.اولين فيلد خواهان مشخص كردن model class است .در مورد ما اين است project.php كلاس AR كه ما قبلاً ساختيمش. بنابر اين در اين فيلد project رو بنويسيد.همنطور كه ميبينيد فيلد دوم نيز سريع پر خواهد شد بر اسا همون قراردادهاي قبل.ما هم با همين پيش فرض فعلاً كار ميكنيم.خوب با اين دو فيلدي كه پر شده بر روي دكمه preview كليك كنيد تا صفحه مانند زير رو ببينيد.
98269


ميبينيد كه چندين فايل بهخ سرعت سادگي ايجاد ميشن،كه شامل يك ProjectContrller.php كنترلر كلاس جديد كه خواهد بود جاي همه CRUD توابع اكشن و فايلهاي ويو جداگانه.اين است يك فايل ويو براي هر يك از عمليات همچنين يكي كه توانايي جستوجو بين ركورها رو براي ما فراهم ميكنه.شما كار ديگهاي كه ميتونيد انجام بديد اينه كه بعد از اينكه دكمه preview رو زديد در پايين چيزهايي كه قراره درست بشن ليست ميشن كه ميتونيد از اون ليت اون چيزهايي رو كه نميخواهيد رو از حالت تيك در بياريد تا اونها ساخته نشن.

بعد از همه كارهايي كه كرديد و انتخابهايي كه لازم داريد روي دكمه Generate كليك كنيد شما بايد تصويري همانند تصوير زير رو در صفحتون داشته باشيد.
98270



بعد از كليك بر روي gerenrate حال شما بر روي لينك try it now كليك كنيد تا اون چيزهايي كه ساخته شدن رو ببينيد و با انوها كار كنيد.

با اين كار شما به صفحه ليست پروژهها ميرويد.اين صفحه پروژه هايي رو كه در حال حاضر در سيستم وجود دارند رو نشون ميده.مانند تصوير زير.براي اين كه اين صفحه رو به صورت دستي باز كنيد ميتونيد به اين لينك مرتجعه كنيد يا چيزي شبيه به اين: http://localhost/trackstar/index.php?r=project






به ما هم هميشه سري بزنيد (http://www.pc-mobile.ir)

nariman_t
جمعه 22 دی 1391, 22:23 عصر
98271

اين پروژهها از كجا مي‌آيند؟شما حتي ممكن است بيشتر يا كمتر از اين سه كه ليست شده هستند در تصوير قبلي با توجه به تعداد دفعاتي كه تست هاي يونيت رو اجرا كرده باشيد داشته باشيد.ما هر وقت كه تستهامون رو اجرا كنيم شايد ركوردهايي رو به ديتا بيسمون اضافه بكنه. اين چيزهايي كه به نمايش گذاشته شده همون چيزهايي هستند كه ما موقعه نوشتن يونت تستمون و اجراي هومن تست ها در ديتا بيسمون اضافه كرديم. خوب از بحث هاي ديگه بي خيال شيم و بريم ببينيم چيزي كه ساخته اين چه چيزهايي هستند و به چه دردهايي مي‌خورند.

ساخت پروژه جديد

شما در این صفحه لیست پروژه متوجه خواهيد شد(نمايش داده شده در عكس قبلي) یک ستون پیمایش کوچک در ستون سمت راست بلوک..خوب بريد و روي Create Project كليك كنيد.با كليك بر روي اين گزينه به صفحه اي هدايت مي‌شويد كه در آن فرم login هستش، به جاي يك فرم براي ايجاد يك پروژه جديد.دليل اين كار اين است كه Gii در زمان توليد كد، يك قعاده رو اعمال كرده كه تصريح مي‌كنه دسترسي رو تنها به كاربراني كه تصديق اعتبار شده‌اند و وارد سايت شده باشند مي‌تونند پروژه جديد ايجاد كنند.هر اربري كه تصديق اعتتبار نشده اگه بخواهد به اين صفحه يعني صفحه ايجاد پروژه دسترسي داشته باشد به صورت خودكار به صفحه ورود اعضا login ريدايركت مي‌شود.براي اين كه در اين صفحهع وارد سايت شويد در فيلدهاي نام كاربري و پسورد كلمه Demo را تايپ كنيد.اگر با موفقيت وارد سايت شويد بايد به لينك زير ريدايركت بشيد:

http://localhost/trackstar/index.php?r=project/create (http://localhost/trackstar/index.php?r=project/create)

خوب صفحه اي كه ما به اون ريدايركت ميشيم صفحه‌اي همانند عكس زير مي‌باشد كه فرم مناسبي براي افزوند و ايجاد پروژه جديد مي‌باشد:
98272

همانطور كه قبلاً ذكر شد، يك چيزي كه ما در مورد شكل ايجاد پروژه حديد ما مورد توجه است اين است كه هر يك از فيلدها يي كه ضروري است اينجا شامل مي‌شود.

افزودن فيلد ضروري به فرم

وقتي كار مي‌كرديم با كلاسهاي مدل AR در فرم هاي yii ، تنظيم قوانين اعتبار سنجي در حول فيلدهاي فرم يك كار مهم است.اين انجام شده بوسيله مقادير مشخصدر آرايه ست شده در تابع rules() در داخل كلاست مدل project AR .

فايل project.php در مسير /protected/models/Project.php رو باز كنيدكلاس نشان مي‌دهد كه اين متد public يا همان متد عمومي در حال حاضر تعريف شده است.و در اينجا ميبينيد كه 3 تا rule نوشته شده است: در ضمن اين نكته را بايد بگيم كه اين تابعي كه در زير آمده قوانين اعتبار سنجي را بريا attribute فرم انجام ميدهد.
/**
* @return array validation rules for model attributes.
*/
public function rules()
{// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
array('create_user_id, update_user_id', 'numerical', 'integerOnly'=>true),
array('name', 'length', 'max'=>128),
array('create_time, update_time', 'safe'),
// The following rule is used by search().
// Please remove those attributes that should not be searched.
array('id, name, description, create_time, create_user_id, update_time, update_user_id', 'safe', 'on'=>'search'),
);

متد Rule() آرايه‌اي از قوانين را بر مي‌گرداند.هر rule يا قانون اعتبار سنجي در قالب يك آرايه با ساختار زير مشخص ميشود
Array('Attribute List', 'Validator', 'on'=>'Scenario List', …additional options);

attribute list مشخص كننده attribute ها است كه بايد توسط كاما از يكديگر جدا شوند. validator name مشخص كننده نوع عمليات اعتبار سنجي است كه بايد انجام شود.مثال:
array('username, password', 'required')

در مثال فوق username و password را attribute ميگويند و required يك validator ميباشد.

.

نكته:

سناريو، يا حالات به شما اجازه ميدهند تا شما اعتبار سنجي براي شرايط خاص محدود كنيد.يك مثال براي معمول براي يك ركورد فعال درج يا بروز رساني خواهد بود.براي مثال ، اگر 'on'=>'insert' مشخص شده باشد، اين نشان ميدهد كه دستور اعتبار سنجي بايد تنها اعمال بشه وقتي مدلها وقتي مدلها ويژگيشون insert باشه.اين قضيه رو براي هر مورد ديگه اي ميتونيد استفاده كنيد مثلا براي update . شما می توانید ویژگی سناریو مدل را یا به طور مستقیم و یا از طریق انتقال آن به سازنده در هنگام ایجاد یک نمونه جدید تنظیم کنید.





اگر اين ست نشده است، rule بكاربرده شده است در تمام سناريوها وقتي Save() صدا زده ميشه.در نهايت گزينههاي اضافي جفت name/value هستند، كه براي مقدار دهي اوليه خواص اعتبار سنجي استفاده شده است.

اعتبار سنج می تواند یک روش مدل در کلاس، یا یک کلاس اعتبار سنج جداگانه باشد. اگر به عنوان يك متد مدل كلاس تعريف شده باشد، بايد امضا زير رو داشته باشه:
/**
* @param string the name of the attribute to be validated
* @param array options specified in the validation rule
*/
public function ValidatorName($attribute,$params) { ... }

اگر ما از يك كلاس جداگانه براي تعريف اعتبار سنج استفاده ميكنيم،اين كلاس بايد از CValidator. گسترش يافته باشد.در واقع سه راه براي تعيين اعتبار كه قبلاً ذكر شده به طور كلي در قالب زير وجود دارد:

1- يكي مشخص كردن نام يك متد در مدل كلاس خودش است.

2- ئوم تعيين يك كلاس جداگانه است كه از يك نوع اعتبار سنجي بايد باشه(اين كلاس يك كلاس گسترش يافته از CValidator ميباشد)

3- سومين روش اين است كه شما ميتونيد مشخص كنيد Validator رو بوسيله تعيين نام مستعار از پيش تعريف شده به كلاس Validator موجود در فريم ورك yii .

Yii فراهم ميكنه كلاساي Vlidator زيادي رو براي شما و همچجنين فراهم ميكنه نام مستعار كه به آن مراجعه ميكنيد وقتي Rule براي آنها تعريف بشه.ليست كامل ازكلاس Validetor هاي تعريف شده پيش فرض در Yii از قرار زير ميباشد:

boolean: : نام مستعار CBooleanValidator ، حصول اطمينان از دارا بودن ويژگي يك مقدار كه ميتونه يكي از اين دو باشه true يا False

captcha: : نام مستعار CCaptchaValidator ، حصول اطمينان از ويژگي برابر بودن كد تاييد يا همون capcha نمايش داده شده در يك capcha

compare: : نام مستعار CCompareValidator ، حصول اظمينان از برابر بودن يك ويژگي با ويژگي ديگر است

email: : نام مستعار CEmailValidator,، براي حصول از اطمينان و تست يك email ميباشد./

default:: نام مستعار CDefaultVAlidator, ، اختصاص دادن يك مقدار پيش فرض به ويژگيهاي مشخص شده

exist: : نام مستعار CExistValidator,، مقدار ويژگي ميتونه پيدا بشه در حصول اطمينان از اين كه ويژگ ميتواند پيدا بشه در ستون موجود جدول مشخص شده.

File : نام مستعار CFileValidator, ، حصول اطمينان از اين كه ويژگي شامل نام فايل آپلود شده است.

filter: : نام مستعار CFilterValidator, ، تبديل ويژگي با يك فيلتر

in: : نام مستعار CRangeValidator, ، حصول اطمينان دادهاي است در ميان ليستي از مقدارهاي از پيش تعريف شده

length: : نام مستعر CStringValidator, ، حصول اطمينان از طول داده ها در يك محدوده خاص

match: : نام مستعار CRegularExpressionValidator, ، حصول اطمينان از مطابقت يك داده با يك عبارت منظم

numerical: : نام مستعار CNumberValidator, ، حصول اطمينان از اين كه داده يك عدد معتبر است

required: : نام مستعار CRequiredValidator, ، حصول اطمينان از اين كه ويژگي خالي نيست

type: : نام مستعار CTypeValidator, ، حصول اطمينان از اين كه ويژگي از يك نوع داده خاص است

unique: : نام مستعار CUniqueValidator, ، حصول اطمينان از اين كه داده در يك ستون منحصر به فرد جدول پايگاه داده است

url: : نام مستعار CUrlValidator, ، حصول اطمينان از اين كه داده يك url معتبر است

همانطور كه ما ميخواهيم بسازيم موجوديت نام پروژه رو به فيلد ضروري ، به نظر ميرسد نام مستعار required نيازهاي ما را تامين كند.بياييد يك Rule يا همون قانون جديد يا تعيين نام مستعار براي اعتبار سنجي صفت نام پروژه اضافه كنيم. ما اون رو به قوانين موحود اضافه ميكنيم:
public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
array('create_user_id, update_user_id', 'numerical','integerOnly'=>true),
array('name', 'length', 'max'=>128),
array('create_time, update_time', 'safe'),
// The following rule is used by search().
// Please remove those attributes that should not be searched.
array('id, name, description, create_time, create_user_id, update_time, update_user_id', 'safe', 'on'=>'search'),
array('name', 'required'),
);
}

جايي كه به صورت بلد تر يا پررنگ تر نشون داده شده همون چيزي هستش كه اضافه كرديم. فايل رو ذخيره كنيد و دوباره پروژه اي كه درتس كرديم رو نگاه كنيد از آدرس روبرو. http://localhost/trackstar/index.php?r=project/create (http://localhost/trackstar/index.php?r=project/create) . ما يك ستاره كوچيك بعد از فيلد name ميبينيم.اين نشان ميدهد كه اين فيلد است يك فيلد ضروري است.سعي كنيد بدون اين كه اين فرم رو پر كنيد فرم رو ارسال كنيد.شما بايد پيام هاي خطايي رو ببينيد با اين مضمون كه Name field cannot be blank ، كه در تصوير پايين مي تونيد اين قضيرو ببينيد:
98273

به ما هم هميشه سري بزنيد (http://www.pc-mobile.ir)

nariman_t
جمعه 22 دی 1391, 22:25 عصر
خوب يك فيلد ديگرو هم به اين كدها اضافه ميكنيم و كاري ميكنيم كه جزو فيلدهاي ضروري باشه به صورت زير تنها كاري كه بايد انجام بديم اينه كه فيلد discreption رو به قانوني كه اضافه كرديم اضافش ميكنيم:
array('name, description', 'required'),

بنابر اين ميتونيد مشاهده كنيد كه ما ميتونيم رشته هاي متعديد را در ليست ويژگيهامون ميتونيم اضافه كنيم كگه اونها رو با كاما از هم جدا كنيم.با اين كار ميبينيم كه اگر كارهاي قبل رو دوباره تكرار كنيد يعني فرم رو بدون هيچ اطلاعاتي ارسال كنيد حال فيد دوم يعني فيلد discreption نيز ستار دار شده و يكي از فيلدهاي ديگر ضروري به حساب ميآيد.

نكته: اگه به فايل project.php نگاه كرده باشيد حتماً دقت كرديد كه بعضي اط rule ها به صورت خودكار نوشته شده است كه از قوانين ضروري هستش كه از ديتا بيس اين قوانين رو به ارث بردن و به طور خودكار ايجاد شدن و باعث جلوگيري از بروز بعضي از خطاها ميشوند مثلاً ستون name در ديتابيس از نوع Varchar 128 بود كه در ينجا قانوني گذاشته شده كه اين فيلد بيشتر از اون عدد رو نپذيره.

خواندن پروژه

مشاهده ليست جزئيات پروژه جديد ما : http://localhost/trackstar/index.php?r=project/view&id=4 (http://localhost/trackstar/index.php?r=project/view&id=4) درواقع، نشان دادن “R” در CRUD .با اين حال براي مشاهده كل ليست ميتونيد بر روي List Project كليك كنيد در ستون راست قرار دارد.

بروز رساني و حذف پروژه

براي پيمايش برگشت به صفحه جزئيات پروژه ميتونيد با كليك كردن بر روي لينك ID اين كار را انجام داد. بياييد اين رو انجام بديم براي پروژههاي سخته شده جديد، كه در اين مورد براي ما ID:4 است.كليك كنيد بر روي اين لينك تا به صفحه جزئيات بريد. در اين صفحه چند عمل در اختيار ما قرار داده شده است كه در سمت راست وجود دارد كه مانند صفحه زير است:


98274

ما هر دو گزينه update و Delete رو در اينجا ميبينيم.

پروژههاي مديريت در محيط مديريت

همونطور كه در عكس قبل ديديد آخرين لينك ما رو به صفحه مديريت پروژه ميبره. برو روي اين لينك كليك كنيد. به احتمال زياد خطاي مجوز صادر خواهد شد، مانند تصوير زير:

98275

دليل اين خطا اين است كه ما وقتي قبلاً براي ساخت پروژه جديد وارد سايت شديم، از demo/demo براي نام كاربري و پسورد استفاده كرده بوديم، ولي gii وقتي اين صفحه ها رو ميسازه اين قابليت رو فقط براي مديران در نظر ميگيرد. براي اين كه با حساب كاربري مدير وارد بشيد در هنگام لاگين كردن بايد از admin/admin بريا نام كاربري و پسورد استفاده كنيد.خوب پس با حساب كاربري Adm,in وارد شويد و بعد از اين كه وارد شديد به همين صفحه اي كه در آن ق رار داشته ايم بياييد و بايد شما صفحه اي همانند تصوير زير را مشاهده كنيد:



98276


در اين صفحه همه چيز واضح است لينكي براي جست و جوي حرفه اي تر نيز وجود دارد كه خودتان ميتوانيد آنها را نيز چك كنيد .


به ما هم هميشه سري بزنيد (http://www.pc-mobile.ir)

nariman_t
جمعه 20 بهمن 1391, 16:56 عصر
متاسفانه چند وقتي هست كه اينجا هيچ پستي ندادم
مشكلاتي دارم كه اگه حل شد دوباره آموزش رو ادامه خواهم داد امروزها درگير سايتي هستم كه ساختم به محض اين كه مشكلات سايت رو رفع كردم دوباره براي ادمه كار آموزش ها رو قرار خواهم داد

ahmadnavidi
سه شنبه 06 فروردین 1392, 13:27 عصر
سلام
چرا از قسمت cmdنمیشه yii رو فعال کرد

mahmod2000
چهارشنبه 18 اردیبهشت 1392, 15:56 عصر
آیا اون کتاب فارسی که به صورت pdf در اینترنت هست بیشتر کاربردی تره یا مطالبی که دارم میذارم اگه میشه با پیام خصوصی بگید تا ببینم واقعاً این آموزش رو ادامه بدم مناسب هست یا همینجا تمومش کنم بهتره؟

در پاسخ به شما دوست عزیز بگم من تازه با yii دارم آشنا میشم، آموزش های شما موقعی قابل فهم هست که قبلش این آموزش که در 4 فایل به صورت تصویری بیان شده که کار دوست عزیز آقای علی برجیان هستش خونده بشه...
لینک صفحه آموزش (http://www.yiiframework.com/forum/index.php/topic/34479-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%87%D8%A7%DB%8C-%D8%AA%D8%B5%D9%88%DB%8C%D8%B1%DB%8C-%D9%81%D8%B1%DB%8C%D9%85-%D9%88%D8%B1%DA%A9/)

من این آموزش رو خوندم و الان که دارم آموزش های شمارو میخونم به خوبی متوجه میشم.. و تشکر از اینکه زحمت این آموزش هارو رو میکشید

موفق باشید

fazelit
سه شنبه 21 خرداد 1392, 08:59 صبح
سلام
دوست عزیز شما که زحمت کشیدید و آموزش رو قرار دادید اگه این آموزشها رو یکجا به صورت فایل PDF قرار بدید ممنون میشم تا بتونیم مثل مرجع هروقت یک بخش یادمون رفت به صورت آفلاین سریع به اون قسمت مراجعه کنیم.

parsboy
دوشنبه 17 تیر 1392, 13:45 عصر
با سلام درابتدا از مطالب مفید دوست خوبمون nariman_t تشکرمیکنم اینم یه Pdf آموزش YII هست که تمامی این مطالب رو پوشش داده
وپیشنهاد میکنم حتما مطالعه کنید : http://uplod.ir/28138y8wa5uq/YII.zip.htm

parsboy
دوشنبه 17 تیر 1392, 14:43 عصر
سلام
چرا از قسمت cmdنمیشه yii رو فعال کرد
با سلام دوست عزیز برای اینکار باید اول مسیرهای سیستم رو تغییر بدیم:
برای این کار درویندوز روی My Computer راست کلیک کنید گزینه ی Properties را انتخاب میکنیم وسپس در
قسمت Advanced Settings در قسمت Advanced واردEnvironment Variables میشویم و در قسمت System Variables
گزینه ی path انتخاب کرده و آدرس را به این صورت تغییر میدیم:

C:\xampp\htdocs\yii\framework;C:\xampp\php
توجه داشته باشید در این آدرس YII نام پوشه ما هست با توجه به اسم پوشه مورد نظر باید تغییر بدید.
حالا وارد Run شده و با وارد کردن دستورCmd این دستود رو تایپ کنید:

Cd C:\xampp\htdocs
وسپس این دستور:

yiic webapp demo
حال از شما سوال پرسیده می شود:Create a Web application demo? [Yes|No] yes
شما با وارد کردن Y یا Yes جواب دهید حال با این کار شما در مسیر جاری یک پوشه به نام Demo دارید.
وازاین آدرس میتونید مشاهده کنید:
http://localhost/demo/index.php
و برای ایجاد پروژه جدید از این دستور استفاده کنید:
Yiic webapp c:\xampp\htdocs\project
موفق باشید.

engmmrj
دوشنبه 17 تیر 1392, 18:58 عصر
با سلام درابتدا از مطالب مفید دوست خوبمون nariman_t تشکرمیکنم اینم یه Pdf آموزش YII هست که تمامی این مطالب رو پوشش داده
وپیشنهاد میکنم حتما مطالعه کنید : http://uplod.ir/28138y8wa5uq/YII.zip.htm
فکر کنم دوست عزیز مونم از روی این pdf کپی کردن :لبخندساده:

parsboy
سه شنبه 18 تیر 1392, 11:54 صبح
فکر کنم دوست عزیز مونم از روی این pdf کپی کردن :لبخندساده:
با سلام بله دوست عریز مطالب همین PDF هست موفق باشید.

minamatin
دوشنبه 18 شهریور 1392, 23:58 عصر
چه جوری میشه یه widget روی صفحه ببینم؟

nariman_t
پنج شنبه 23 آبان 1392, 10:42 صبح
خیلی وقت هست که این آموزش رو ادامه ندادم ولی دوباره می خوام آموزش ها رو ادامه بدم لطفا باز هم میگم اگه کسی هست که میتونه در ترجمه متون کمی هم کمک بکنه من رو همراهی بکنه تا این کار سریعتر پیش بره تا یه جای مرجعی برای آموزش ها وجود داشته باشه در ضمن کسانی که از اینجا pdf یا هر چیز دیگه ای تهیه میکنند اسم کسی که ترجمه میکنه یادشون نره که حقشون ضایه نشه یا لا اقل تشکری باشه از زحمات کسی که ترجمه میکنه

nariman_t
پنج شنبه 23 آبان 1392, 11:13 صبح
اگه فکر میکنید از روی این pdf که دوستمون گذاشتند کپی کردم پس ادامه مطالبی که می خواهید رو هم از رو همون pdf بخونید

masato
جمعه 24 آبان 1392, 18:42 عصر
سلام
آره داداش برو از روی همون pdf بخون برو سنگ نداز
داداش گلم کپی نیست نیسسسسسست، اونشون اومدن خود کتاب راهنما رو ترجمه کرده
من نمیدونم بعضی از دوستان تو بخش php فقط قصد تخریب دارن آخه ......... که ایشون کپی کرده یا نه کرده شاید برای تو کپی باشه برای من یا اونای که تازه شروع کردن به یاد گیری این فریمورک کپی نباشه (در اصل نیست)
من از آقا نریمان تشکر میکنم بابت تمام زحماتشون
آقا نریمان شما ناراحت نشو اینجا ایرانه

nariman_t
یک شنبه 26 آبان 1392, 16:49 عصر
قبل این که ادامه آموزش رو قرار بدم بگم لطفا کسانی که حتی یک درصد فک می کنند این مطالب کپی هست برن پول بدن و کتاب رو تهیه کنند یا کمک کنید که این کتاب رو بصورت رایگان ترجمه کنیم و در اختیار همه قرار بدیم حالا از اینها گذشته خواستم بگم خیلی از دوستان سوال میکردن که کدوم IDE برای کار با Yii بهتره ٰ برای کاتر با این فریم ورک در حال حاضر که این پست رو میزارم بعد از کلی تحقیق باید بگم حتما از neatbeans نسخه 7.3 یا 7.4 اون استفاده کنید چون پلاگین این فریم ورک رو داره که به صورت خودکار کدها رو براتون میاره کلی از بچه ها در این مورد مشکل داشتند راستی این رو هم بگم اگر خواستید دانلود کنید از سالیت اصلی نمیشه دانلود کرد چون تحریم کرده این سایت هم ما رو انگار در سایت سافت گذر نسخه کامل ورژن 7.4 رو برای دانلود گذاشتند که من دانلود کردم و مورد تایید هستش چون نسخه فول این IDE هست روی ویندوز 7 هم قابل اجرا است اید امید وارم این مشکلتون نیز حل شده باشه

nariman_t
سه شنبه 12 آذر 1392, 10:55 صبح
خوب این ههم ادمه همین آموزش ترجمه شده کتابی که گفته بودم

تست بيشتر

قبل از اينكه قابليتهاي بيشتري رو به برنامه TrackStar خودمون اضافه كنيم،ما احتياج داريم كه دوباره تست خودمون رو پيكر بندي كنيم همونطور كه قبلا گفته شده، يونيت تست هاي اضافه شده جديد ما معمولاً اضافه ميشوند به برناممون در محيط توسعه. بنابر اين، حتي بعد از اينكه ما تستمون رو كامل انجام بديم بوسيله مثلاً Delete بازم سطر جديد اضافه خواهد شد.پايگاه داده استفاده مجدد خواهد كرد كه همان شناسه براي درج بعدي خواهد بود.پس ما به اجرا كردن تستمون ادامه خواهيم داد،.ما متوجه شكافي در ID سكانس پروژمون شديم.(كه در طي توسعه برناممون مي تونه گيج كننده باشه)

مشكل اين است كه يونيت تست ها برخلاف همان ديتابيسي كه وب فرم استفاده مي كند وقتي در حال ساخت پروژه جديد هستند اجرا مي شود. به عنوان يك نتيجه، اين يك پتانسيل رو براي برخي مسائل بوجود مي آورند.چيزي كه ما بايد انجام دهيم اين است كه تست خودمون رو براي تست جداگانه تنظيم كنيم،براي پایگاه داده های آینه، که فقط براي تست اختصاص داده شده است.چيزي كه ما احتياج داريم اين است كه يك راه مطمئن شدن از اين كه تست هاي ما هميشه اجرا بشند در شيوههاي مشابه، در برابر داده هاي مشابه.مانند قبل يك تغيير ساده در فايل پيكربندي است،كه ما اون رو به زودي ميسازيم. بعدي از طريق استفاده از fixtures. بدست مي آيد.

يك تست fixtures يك سيستم وضعيت و يا چارچوب است كه تست ها در آن حال اجرا هستند.ما مي خوهايم تست هامون رو در زمان هاي مختلفي اجرا كنيم،و هر بار كه اونها اجرا مي شوند قادر به بازگشت نتايج قابل تكرار باشند.يك fixtures از قبل در نظر ميگيره يك نيك نام و محيط ثابت براي اجراي تست هاي ما است.معمولاً fixtures كاري است تا اطمينان حاصل شود كه همه اشاياء كه در اين تست دخيل هستند همواره به يك حالت خاص مقدار دهي اوليه ميشن. يك نمونه از fixturesبارگذاری از یک جدول پایگاه داده با یک مجموعه ثابت و شناخته شده از داده ها است.

Fixtures ها در yii فايلهاي php هستند كه بر مبگردونن يك آرايه معييين از دادهاغي پيكر بندي شده اوليه رو.آنها معمولا ناميده شدن شبيه جدول ديتابيس نشان داده شدهو مكانشون هم در زير protected/tests/fixtures/ است. بنابر اين براي مشخص كردن پروژه داده fixtures ما بيد يك فايل جديد در زير اين دايركتوري بسازيم و اونو tbl_project.php بناميم.جدول قبل از هر تست در فايل اجرا /tests/unit/ProjectTest.php ميشوند. اين فايل fixture مشخص شده است در بالاي فايل تست ProjectTest.php

class ProjectTest extends CDbTestCase
{
public $fixtures=array
(
'projects'=>'Project',
);
}
پيكربندي مديريت fixtures

راه اندازی این نوعاز پایگاه داده fixturesمي تواند زمان بسياري رو صرف بخشي از فرايند تست كنه. يك بار ديگه Yii مياد، براي نجات از اين يكنواختي بوسيله ازائه كلسا CdbFixtureManager . هنگامي كه به عنوان يك مولفه برنامه پيكربندي بشه ، اون قبليت هاي زير رو براي ما ارائه ميده:

· قبل از اجراي همه تست ها ، اون بازنشاني ميكنه همه جدول هاي مربوط رو به داده ثابت شناخته شده

· قبل از اجراي يك تست ، اون مي تونه جداول مشخص شده رو براي به داده ثابت شناخته شده تنظيم مجدد

· در طي اجراء يك تست اون مي تونه فراهم بكنه دسترسي به رديف هايي از داده ها كه بخشي از يك حالت داده هاي ثابت.

براي استفاده از ميديريت fixture ، ما بايد اون رو تنظيم كنيم در فايل پيكربندي برنامه، اين در حالت عداي براي ما انجام شده هستش وقتي ككه ما يك برنامه جديد ميسازيم. اگ شما فايل پيكر بندي براي تست برنامه هاي خاص هست رو باز كنيد كه در مكان protected/config/test. Php شما ميبينيد كه كامپ.ننت زير تعريف شده است.
'fixture'=>array(
'class'=>'system.test.CDbFixtureManager', ),

بنابر اين برنامه شما براي استفاده از مديريت fixture آماده است . حالا ما احتياج دالريم كه يك fixture جديد بسازيم.

ساخت fixture جديد

يك implemented در yii اجرا شده است به وسيله فايل php كه بر مبگردونه آريه اي رو كه نشون ميده داده هايي رو براي يك جدول خاص. نام فيل شبيه نام جدول است. به زور پيش فرض ، اين فايل fixture انتظار مي رود كه در فولدر protected/tests/fixtures. قرار داشته باشد .شما مي توانيد از CDbFixtureManager::basePath استفاده كنيد پيكر بندي برنامه خودتون براي سفارشي كردن اين مكان اگر مي خواهيد. اجازه دهيد به عنوان مثال يك fixture براي جدول tbl_project بسازيم. يك فايل جديد با نام و مسير مقابل بسازيد protected/tests/fixtures/tbl_project.php با محتويات زير:

<?php
return array(
'project1'=>array(
'name' => 'Test Project 1',
'description' => 'This is test project 1',
'create_time' => '',
'create_user_id' => '',
'update_time' => '',
'update_user_id' => '',
),
'project2'=>array(
'name' => 'Test Project 2',
'description' => 'This is test project 2',
'create_time' => '',
'create_user_id' => '',
'update_time' => '',
'update_user_id' => '',
),
'project3'=>array(
'name' => 'Test Project 3',
'description' => 'This is test project 3',
'create_time' => '',
'create_user_id' => '',
'update_time' => '', 'update_user_id' => '',
),
);
همانطور كه مشاهده مي كنيد، fixture ما آرايه اي است كه نشون ميده ورودي هاي جدول ما رو.مقدار اين كليدها هستند خودشان آرايه با يك جفت key=>value براي هر ستون در جدول. ما سه سطر رو اضافه كرديم ، ام شما مي توانيد سطرهاي بيشتري رو به دلخواه وارد كنيد. براي سادگي كار ، ما فقط مقادير پر شده اي داريم كه قبلا پر شدن و نمي تونن مقدار تهي داشته باشند، كه فيلدهاي name و description هستند .اين داده به قدري هستن كه بتونن براي ما استفاده از fixtures. رو نشون بدن.

شما همچنين ممكن است متوجه شده باشيد كه ستون id در داده fixture قبلي مشخص نشده است.همونطور كه ميدونيد ما اين فيلد رو قبلاً از نوع auto-increment گذاشتيم.

پيكر بندي اين fixture براي استفاده

ما هنوز هم احتياج داريم كه به تست يونيتمون بگيم كه از اين fixture استفاده كنه كه ما اين كار رو در ينويت تست هايمون قبلاً اگر يادو.ن باشه انجام داديم .در اين مورد، ما احتياج خواهيم داشت به اضافه كردن fixture در بالاي هون يونيت تستمون يعني بايد fixture رو اعلان كنيم در اين فايل مانند زير:

<?php
class ProjectTest extends CDbTestCase
{
public $fixtures=array
(
'projects'=>'Project',
);
}
بنابر اين ، انچه كه ما انجام داديم مشخص است $fixturesعضو متغیربهیک آرایهاستکهمشخص می کندfixturesاستفاده خواهد شد به وسيله اين تست.آرايه نشان دهنده يك نقشه (mapping) از نام fixtureكه استفاده خواهد شد در تست براي نام كلاس مدل يا نام جدول fixture (براي كثال، ، از نام fixture ، fixture براي كلاس مدل Project ) . وقتي در حال استفاده يك نام مدل ، همانطور كه در اين مورد، جداول زمینه ای که مربوط به کلاس مدل در نظر گرفته خواهد شد به عنوان جداول fixture خواهد بود.همانطور كه ما قبلاً شرح داديم، اين مديريت fixture است كه خواهد بود مدير اين جداول اساسي و تنظیم مجدداطلاعاتبه برخی ازحالتشناخته شده هر زمان كه يك متد تست اجرا بشه.

اگر شما احتياج داريد به استفاده يك fixture براي يك جدول توسط كلاس AR نشان داده نمي شود، شما احتياج داريد به نام prefix جدول با يك دو نقطه( براي مثال، :tbl_project) براي متمايز كردن آن از نام دمدل كلاس.

نام Fixture به ما اجازه دسترسي به داده Fixture در متد تست در يك راه مناسب را ميدهد. بنابر اين، براي مثال،حالا كه ما Fixture مشخص شده در كلاس ProjectTest داريم ، ما مي تونيم دسترسي داشته باشيم به داده هايfixture مون با روش هاي زير:

// return all rows in the 'Project' fixture table
$projects = $this->projects;
// return the row whose alias is 'project1' in the `Project` fixture
table
$projectOne = $this->projects['project1'];
// If our fixture is associated with an active record, return the AR
instance representing
// the 'project1' fixture data row
$project = $this->projects('project1');
تعيين تست يك پايگاه داده

همانطور كه ما قبلاً ذكر كرديم ما نياز به جدا كردن پايگاه داده توسعمان از پايگاه داده تستمان داريم بطوري كه تست هاي ما ادامه پيدا نخواهد كرد بدون دخالت بادیتا بی اصلیمون. خوب برای این کار ما می تونیم یه دیتا بیس مصپثل دیتا یس اصلیمون بسازیم و اون رو trackstar_test بنامیم و در فایل پیکر بندی تستمون اون رو قرار بدیم تا از این به بعد هر موقه تستهای Fixture مون به اجرا در اومد تاثیری روی دیتا بیس اغصلیمون نداشته باشه. خوب حالا شما مي تونيد كامپوننت db رو كپي بگيريد از main.php فايل پيكربندي اصلي كه اضافه كرده بوديم در فصل 4 . براي كاربران mysql ، ما مي تونيم كد هاي هاي لايت شده رو به Config فايلمون تستمون اضافه كنيم:

return CMap::mergeArray(
require(dirname(__FILE__).'/main.php'),
array(
'components'=>array(
'fixture'=>array(
'class'=>'system.test.CDbFixtureManager',
),
'db'=>array(
'connectionString' =>
'mysql:host=localhost;dbname=trackstar_test',
'emulatePrepare' => true,
'username' => '[your db username]',
'password' => '[your db password]',
'charset' => 'utf8',
),
),
)
);
وقتي ما تستمون رو اجرا كنيم ، اين تست config بارگذاري مي شود، به جاي فايل Config اصلي. این فایل در واقع مجموعه ای از فایل پیکربندی اصلی با آرایه تعریف شده در این فایل پیکربندی آزمون ادغام شده. اگر اجزاء و یا همان مقادیر های پیکربندی در هر دو تعریف شده باشد، مقادیر در فایل تست ارجحیت دارند.

استفاده ازfixture ها

حالا كه ما محيط تستمون رو براي استفاده يك ديتابيس خاص تنظيم كرديم. اگر یادتون باش تست یونیتی که قبلا نوشته بودیم همه کارهی حذف ، آ÷دیت و ... رو باهم انجام میدادکه اون متد رو testCRUD() نامگذاری کرده بدیم که این راه تست چندان مناسب نیست. ولی استفاده از Fixture ها یک راه خوب برای کوچک کردن تستهای بزرگ است مثلا اگر تست Create مون به مشکل بر بخوره کل تستمون به مشکل بر میخوره و کارها انجام نمیشن حال اگر این تست یک تست بزرگ باشه یک فاجعه است. برای همین تست ها رو به اجزاء کوچکتر تبدیل میکنیم طوری که تست ها به صورت تک تک باشند.به طور معمول ما باید هر تسیت رو جدا کنیم تا تست ها به هم دیگه وابسته نباشند و روی همدیگر تاثیر نگذارند.

خوب حالا که ما همه چیز رو برای استفاده از دیتا بیس تعریف و مشخص کردیم میتونیم تست یونیت crud مون رو از هم دیگه جدا کرده و در متد های جدا قرار بدیم که این میتونه مثالهای خوبی برای چگونگی استفاده از fixture ها باشه.

بیایید بال Read کارمون رو شروع کنیم. یونین تست ProjectTest.php باز کنید و کدهای زیر رو در اون بنویسید

public function testRead()
{
$retrievedProject = $this->projects('project1');
$this->assertTrue($retrievedProject instanceof Project);
$this->assertEquals('Test Project 1',$retrievedProject->name);

}


ما میدانیم که این تست از ÷یش اجرا شده است، Fixture manager ریست خواهد کرد جدول tbl_project در دیتابیس trackstar_test به حالت مشخص شده به وسیله داده های Fixture . ما در اینجا به سادگی در حال خواندن سطر اول داده ها هستیم.با اشاره به نام مستعار project1 ، که بر میگردونه یک project AR رو به عنوان مثال بر اساس آن اولین ردیف از داده های تعریف شده در فایل fixtre مون که در مشسیر protected/tests/fixtures/tbl_project.php قرار دارد.همچنین کدهای Create و delete و .... رو به همین شکل پایین می تونید اضافه کنید

class ProjectTest extends CDbTestCase
{
public $fixtures=array
(
'projects'=>'Project',
);
public function testCreate()
{
//CREATE a new Project
$newProject=new Project;
$newProjectName = 'Test Project Creation';
$newProject->setAttributes(array(
'name' => $newProjectName,
'description' => 'This is a test for new project creation',
'createTime' => '2009-09-09 00:00:00',
'createUser' => '1',
'updateTime' => '2009-09-09 00:00:00',
'updateUser' => '1',
)
);

$this->assertTrue($newProject->save(false));
//READ back the newly created Project to ensure the creation
$retrievedProject=Project::model()->findByPk($newProject->id);
$this->assertTrue($retrievedProject instanceof Project);
$this->assertEquals($newProjectName,$retrievedProject->name);
}

public function testRead()
{
$retrievedProject = $this->projects('project1');
$this->assertTrue($retrievedProject instanceof Project);
$this->assertEquals('Test Project 1',$retrievedProject->name);
}

public function testUpdate()
{
$project = $this->projects('project2');
$updatedProjectName = 'Updated Test Project 2';
$project->name = $updatedProjectName;
$this->assertTrue($project->save(false));
//read back the record again to ensure the update worked
$updatedProject=Project::model()->findByPk($project->id);
$this->assertTrue($updatedProject instanceof Project);
$this->assertEquals($updatedProjectName,$updatedProject->name);
}
public function testDelete()
{
$project = $this->projects('project2');
$savedProjectId = $project->id;
$this->assertTrue($project->delete());
$deletedProject=Project::model()->findByPk($savedProjectId);
$this->assertEquals(NULL,$deletedProject);
}
}
برنامه ریزی تکرار

ما در حال حاضر توانایی ایجاد و لیست پروژه ها رو اریم ،ولی این پروژه در عین حال قادر به مهار هیچ جیزی نیست.در انتهای این فصل ما میخواهیم برناممون می خواهیم که بیشتر کارها رو انجام بده .ما همچنین می خواهیم محدود کنیم عملیات خام مسائل رو در چارچوب یک پروژه خاص .که مسائل متعلق به پروژه است.کاربر باید انتخاب بکنه از پروژه های موجود قبل از این که قادر به انجام هر گونه عملیات خام در مسائل مربوط به پروژه باشد.

به منظور دستیابی بهقبلاهدافمشخص شده،ما نیاز به شناسایی تمام موارد ریزی داریم که در این برنامه دخیل هستند.فهرست زیر به تشریح این آیتمها میپردازه:

· طراحی شمای پایگاه داده، و ساختن اشیاء برای حمایت از مسائل مربوط به پروژه

· ایجاد کلاس های مدل Yii که اجازه می دهد برنامه به راحتی با جدول پایگاه داده (بازدید کنندگان) تعامل کند.

· ایجاد کلاس کنترلر که قابلیت انجام عملیات زیر رو به ما میده:

1- ساخت مسائل جدید

2- بیرون کشیدن یک لیست از مسائل موجود در داخل یک پروژ از دیتابیس

3- آ÷دیت و ادیت کردن مسائل موجود

4- حذف مسائل موجود

· ساخت ویو برای ارائه اینترفیس مناسب برای کاربر

این اطلااعات برای شروع کار ما کافی می باشد.بعد از این که تستمون رو اجرا کردیم ، بد میریم سر تغیراتی که باید در دیتا بیسمون انجام بدیم.

آجرا کردن ادامه تست ها

برای ادامه کار بیایید همه تستهامون ر با هم انجام بدیم این کار رو مثل قبل انجام بدید از گفتن این قسمت صرف نظر میکنیم

.

طراحی طرح

اگر یادتون باشه در فصل های قبل طرحی رو دادیم که شامل نوع،مالک ، درخواست کننده، وضعیت، و توضیحاتی بود .همچنین وقتی ما جدول tbl_project رو ساختیم چند تا ستون وجود داشتند که از این قرار بودند زمان،تاریخ و این که یک نفر چه وقت این جدول رو آپدیت کرده.اگرچه types, owners, requesters, and statuses موجودیت خودشون رو دارند.ما مدل های خودمون رو قابل انعطاف و توسعه پذیر نگه میداریم،به همین دلیل برخی از مدل ها رو به طور جداگانه خواهیم داشت.

مالک(Owners) و درخواست کننده (requesters) هر دو کاربرانی از سیستم هستند و اشاره خواهند کر به سطری در یک جدول که که اونو tbl_user نامگذاری خواهیم کرد.

ما در حال حاضر معرفی میکنی ایده ای از یک کاربر که در جدول tbl_project وجود دارد که ستون های create_user_id و update_user_id در جدول tbl_project میباشد .همانطور که معلومه اسن دو ستون به ستونهای خارجی در جدولی دیگر اشاره دارند که ستونهایی از یک جلود مثل جدول کاربران می باشد.

فیلدهای owner_id و requestor_id در جدول tbl_issue نیز ارتباط خواهند داشت با جدولی دیگر در بیرون از خود به نام جدول tbl_user.

ما بطور مشابه می توانیم مدل های type و status رو به همین شیوه پیاده سازی کنیم، اگر چه تا زمانی کارهامون خیلی پیچیده نشده میتونیم اینها رو در tbl_issue به صورت اعداد نگهداری کنیم که بعدا اونها رو به نامهاب مختلف ذخیره و تبدیل کنیم.

تعریفبرخی ازروابط

خوب بریم برای ساخت جدول Tbl_user همچنبن ما به روابط بین این جدول و جدول پروژه ها نیاز داریم.قبلا وقتی ما معرفی کرده بودیم برنامه trackstar رو در فصل 3 ما مشخص کردیم که کاربران در ارتباط هستند با یک یا چندین پروژه .و همچنین بنابر این پروژه ها میتونن کاربران زیادی داشته باشند و کاربان نیز می تونند با پروژه های زیادی دی ارتباط باشندما این رو یک ارتباط many-to-many ما بین پروژه ها و کاربران مینامیم.یک راه ساده برای مدل many-to-many ارتباط در یک دیتا بیس رابطه ای است برای استفاده از ارتباط و یا انتساب جداول. پس ما احتیاج داریم که این جدول رو به مدلمون اضافه کنیم.شکل زیر روابط بین users ، projects و issues یا همون مسائل رو ترسیم میکنه.

پروژه می تواند هیچ و یا تعداد زیادی کاربر داشته باشد. یک کاربر احتیاج داره به ارتباط با حداقل یک پروژه ، اما میتونه با چندبن پروژه در ارتباط باشه issues متعلق به یک وتنها یک پروژه میتونه باشه در حالی که پروژه ها می تواند صفر تا بسیاری از مسائل را داشته باشد.

nariman_t
سه شنبه 12 آذر 1392, 10:56 صبح
ساخت پایگاه داده ها وروابط

ما احتیاج داریم که سه جدول بسازیم tbl_issue, tbl_user و جدولی برای نگه داشتن روابط بین جداول که اون رو هم tbl_project_user_assignment مینامیم.

برای راحتی کار شما ما یک زبان پایه برای تعریف داده های شما ارائه داده ایم.

CREATE TABLE IF NOT EXISTS 'tbl_issue'
(
'id' INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
'name' varchar(256) NOT NULL,
'description' varchar(2000),
'project_id' INTEGER,
'type_id' INTEGER,
'status_id' INTEGER,
'owner_id' INTEGER,
'requester_id' INTEGER,
'create_time' DATETIME,
'create_user_id' INTEGER,
'update_time' DATETIME,
'update_user_id' INTEGER
) ENGINE = InnoDB
;
CREATE TABLE IF NOT EXISTS 'tbl_user'
(
'id' INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
'email' Varchar(256) NOT NULL,
'username' Varchar(256),
'password' Varchar(256),
'last_login_time' Datetime,
'create_time' DATETIME,
'create_user_id' INTEGER,
'update_time' DATETIME,
'update_user_id' INTEGER
) ENGINE = InnoDB
;
CREATE TABLE IF NOT EXISTS 'tbl_project_user_assignment'
(
'project_id' Int(11) NOT NULL,
'user_id' Int(11) NOT NULL,
'create_time' DATETIME,
'create_user_id' INTEGER,
'update_time' DATETIME,
'update_user_id' INTEGER,
PRIMARY KEY ('project_id','user_id')
) ENGINE = InnoDB
;
-- The Relationships
ALTER TABLE 'tbl_issue' ADD CONSTRAINT 'FK_issue_project' FOREIGN KEY
('project_id') REFERENCES 'tbl_project' ('id') ON DELETE CASCADE ON
UPDATE RESTRICT;
ALTER TABLE 'tbl_issue' ADD CONSTRAINT 'FK_issue_owner' FOREIGN KEY
('owner_id') REFERENCES 'tbl_user' ('id') ON DELETE CASCADE ON UPDATE
RESTRICT;
ALTER TABLE 'tbl_issue' ADD CONSTRAINT 'FK_issue_requester' FOREIGN
KEY ('requester_id') REFERENCES 'tbl_user' ('id') ON DELETE CASCADE ON
UPDATE RESTRICT;
ALTER TABLE 'tbl_project_user_assignment' ADD CONSTRAINT 'FK_project_
user' FOREIGN KEY ('project_id') REFERENCES 'tbl_project' ('id') ON
DELETE CASCADE ON UPDATE RESTRICT;
ALTER TABLE 'tbl_project_user_assignment' ADD CONSTRAINT 'FK_user_
project' FOREIGN KEY ('user_id') REFERENCES 'tbl_user' ('id') ON
DELETE CASCADE ON UPDATE RESTRICT;
-- Insert some seed data so we can just begin using the database
INSERT INTO 'tbl_user'
('email', 'username', 'password')
VALUES
('test1@notanaddress.com','Test_User_One', MD5('test1')),
('test2@notanaddress.com','Test_User_Two', MD5('test2'))
;.

حالا که ما جداول رو ساخته شده داریم احتیاج داریم کخ مدل AR رو برای اینها درتس کنیم تا در برنامه بتونیم به راحتی ازشون استفاده کیم.ما این کار رو نیز انجام دادیم وقتی ساختیم project.php مدل کلاس رو در فصل 5 با استفاده از gii .در هر صورت ما این کارها رو دوباره برای شما انجام خواهیم داد ولی بدون تصویر.

ساختن مدل کلاس برای issue

مانند قبل به لینک روبرو مراجعه کنید و از صفحه باز شده model generate رو انتخاب کنیدhttp://localhost/trackstar/index.php?r=gii

در صفحه ظاهر شده قسمت prefix پر شده است اونجا رو بیخیال شید و فیلد table name رو با نام جدول tbl_issue پر کنید ، قسمت بعد که نام مدل کلاس است نیز به طور خودکار پر خواهد شد. بعد از پر کردن تمام فیلدها دکمه prevew رو بزنید مراحل دیگر مثل قبل است.همونطور که میبینید آدرسی نشون میده که میگه این فایل ساخته شده در کجا قرار دارد . کدهای ساخته شده در این فایل به شرح زیر می باشد:


<?php
/**
* This is the model class for table "tbl_issue".
*/
class Issue extends CActiveRecord
{
/**
* The followings are the available columns in table 'tbl_issue':
* @var integer $id
* @var string $name
* @var string $description
* @var integer $project_id
* @var integer $type_id
* @var integer $status_id
* @var integer $owner_id
* @var integer $requester_id
* @var string $create_time
* @var integer $create_user_id
* @var string $update_time
* @var integer $update_user_id
*/
/**
* Returns the static model of the specified AR class.
* @return Issue the static model class
public static function model($className=__CLASS__)
{
return parent::model($className);
}
/**
* @return string the associated database table name
*/
public function tableName()
{
return 'tbl_issue';
}
/**
* @return array validation rules for model attributes.
*/
public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
array('name', 'required'),
array('project_id, type_id, status_id, owner_id, requester_id,
create_user_id, update_user_id', 'numerical', 'integerOnly'=>true),
array('name', 'length', 'max'=>256),
array('description', 'length', 'max'=>2000),
array('create_time, update_time', 'safe'),
// The following rule is used by search().
// Please remove those attributes that should not be searched.
array('id, name, description, project_id, type_id, status_id,
owner_id, requester_id, create_time, create_user_id, update_time,
update_user_id', 'safe', 'on'=>'search'),
);
}
/**
* @return array relational rules.
*/
public function relations()
{
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
return array(
'owner' => array(self::BELONGS_TO, 'User', 'owner_id'),
'project' => array(self::BELONGS_TO, 'Project', 'project_id'),
'requester' => array(self::BELONGS_TO, 'User', 'requester_id'),
);
}
/**
* @return array customized attribute labels (name=>label)
*/
public function attributeLabels()
{
return array(
'id' => 'ID',
'name' => 'Name',
'description' => 'Description',
'project_id' => 'Project',
'type_id' => 'Type',
'status_id' => 'Status',
'owner_id' => 'Owner',
'requester_id' => 'Requester',
'create_time' => 'Create Time',
'create_user_id' => 'Create User',
'update_time' => 'Update Time',
'update_user_id' => 'Update User',
);
}
/**
* Retrieves a list of models based on the current search/filter
conditions.
* @return CActiveDataProvider the data provider that can return the
models based on the search/filter conditions.
*/
public function search()
{
// Warning: Please modify the following code to remove attributes
that
// should not be searched.
$criteria=new CDbCriteria;
$criteria->compare('id',$this->id);
$criteria->compare('name',$this->name,true);
$criteria->compare('description',$this->description,true);
$criteria->compare('project_id',$this->project_id);
$criteria->compare('type_id',$this->type_id);
$criteria->compare('status_id',$this->status_id);
$criteria->compare('owner_id',$this->owner_id);
$criteria->compare('requester_id',$this->requester_id);
$criteria->compare('create_time',$this->create_time,true);
$criteria->compare('create_user_id',$this->create_user_id);
$criteria->compare('update_time',$this->update_time,true);
$criteria->compare('update_user_id',$this->update_user_id);
return new CActiveDataProvider(get_class($this), array(
'criteria'=>$criteria,
));
}
}

nariman_t
دوشنبه 18 آذر 1392, 15:35 عصر
ساخت user model class

خوب تا حالا چند نمونه مدل کلاس رو ساختیم و فک کنم این کلاس مدل رو بتونید خودتون انجام لدید برای همین این قسمت رو به عنوان تمرین به خودتون واگذار میکنم.

نکته: در مورد Ar class برای جدول tbl_project_user_assignment چه فک میکنید و چجوریاست؟
اگر چه می تونید برای ای جدول نیز یک AR class بسازید ولی این کار ضروری نیست.مدل AR فرالهم میکنه Object Relational Mapping لایه ای برای کار کردن با اشیاء برنامه به راحتی .گر چه ProjectUserAssignmentیک شی دامنه از نرم افزار ما نیست.این یک ساختار در یک پایگاه داده رابطه ای است که به ما کمک میکنه مدیریت ارتباط چند به چند بین پروژه ها و کاربران رو .حفظ و نگهداری جداگانه یک AR برای رسیدگی به مدیریت این جدول فوق العاده پیچیده است برای همین فعلا از این قسمت اجتناب میکنیم.

ساختن عملیات issue CRUD

حالا که ما کلاس AR رو در جای خودش که باید باشه داریم ،ما می توانیم به ساخت قابلیت های مورد نیاز برای مدیریت مسائل مربوط به پروژه ما را شروع کنیم. به عنوان عملیات CRUD روی پروژه ISSues این است که دوباره تمرینی کنیم برای استفاده از Gii برای کمک به ساخت قابلیت های اصلی و پایه برنامه.ما این کار رو باجزئیات کامل در فصل 5 انجام دادیم که ما باز در اینجا به عنوان یاداوری این کارها رو انجام میدیم.

به مسیر http://localhost/trackstar/index. php?r=gii و روی لینک Crud Generator کلیک کنید .نام مد کلاس رو بنویسید که نام Issue رو میتونید بنویسید . فیلد دوم نیز به طور خودکار پر خواهد شد. فیلدهای Base Controller Class and Code Template نیز می تونند از مقادیر پیش فرض خودشون استفاده نند پس به این دو فیل دست نزنید.روی دکمه preview کلیک کنید تا لیست چیزهایی که سواخته خواهند شد رو در زیر ببینید و بعد از اون روی دکمه generate برای ساخت اونها کلیک کنید.

113708

بعد از زدن روی دکمه generate نیز بر روی لینک Try in now کلیک کنید تا چیزهایی که ساخته شده اند رو ببینید
113709

استفاده از Issue CRUD
بعد از زدن دکمه try it now به لینک http://localhost/trackstar/index.php?r=issue منتقل خواهید شد که با تصویری همانند زیر روبرو می شوید.
113710



ساخت یک Issue جدید

خوب همونطور که میبینید هنوز Issue جدیدی اضافه نشده و هیچ جیزی در این عکسی که در بالا قرار دادیم لیت نشده . خوب بیایید پس یه چییز جدید اضافه کنیم. روی لینک Create Issue کلیک کنید اگر صفحه login اومد مثل قبل از demo,demo و یا admin,admin برای وارد شدن استفاده کنید. بعد از این کار احتمالا شما صفح زیر رو باید ببینید
113711

وقتی به این فرم ورودی نگاه میکنیم حتما متوجه شده اید که یک فیلد ورودی برای هر ستون از پایگاه داده قرار داده شده است. اگر چه میدونید که وقتی ما ساختار جداولمون رو داشتیم میساختیم برخی از فیلدها در نقش فیل ورودی مستقیم نبودند و فیلدهایی بودند که نشان دهنده روباط به فیلهدای دیگر در جداول دیگر بودند . برای مثال فیل type در این فرم یک فیل ورودی text میباشد در حالی که ما بهتره و باید استفاده کنیم از یک فیل drop-down که اجازه انتخاب Issue رو برای ما بده.همچنین میتونیم این قضیه رو برا فیلد status در این فرم نیز بکار ببریم. فیلدهای owner و Requester باید همچنین طوری باشند که بشه نامی از کاربران رو انتخاب کرد که چه کسی اختصاص داده بشه برای کار روی پروژه .همچنین باید تمام موضوع های در حال وقوع مدیریت بشن در چارچوب یک پروژه خاص . بنابر این، فیلد Project نباید قسمتی از این فرم باشه.در نهایت Create Time, Create User, Update Time, and Update User همه فیلدهایی هستند که مقدارشون باید محاسبه و تعیین بشه یک باره وقتی که فرم می خواد ارسال بشه و نباید در دسترس باشه طوری که کاربر بتون به طور مستقیم مقدارهای اونارو دستکاری بکنه.

خوب پس ما تعدادی از اصلاحاتی که باید در این فرم ورودی اولیه انجام بوشد رو شناسایی کردیم.ما هنوز قطعا خیلی چیزه هست که باید یکی یکی پیداشون کنیم و مشکلاشون رو رفع کنیم .

اضافه کردن نوع drop-down menu

خوب کار رو با اضافه کردن یک منو drop-down به فرممون شروع میکنیم.

Issue تنها سه نوع زیر رو دارا خواهد بود:

· Bugs (اشکالات)

· Features (ویژگی ها)

· Tasks (وظایف)

یک فیلد به صورت منوی کشویی که نوع ورودی اون با این سه گزینه که برای دیدن در هنگام ایجاد یک موضوع جدید است. ما به وسیله داشتن Issue model class خودمون خواهیم رسید با تهیه کردن یک لیست از نوع های موجودمون.همانطور که ممکن است شما حدس زده باشید، ما اضافه خواهیم کرد قابلیتهای جدید خود را به مد AR کلاس Issue به وسیله نوشتن اولین تستمون.اگر در فصل 5 یادتون باشه ما دیتابیسی رو اضافه کردیم برای تستهامون و برناممون رو طوری تنظیم کردیم که کارهایی که انجچام میدیم تاثیری روی دیتا بیس اصلیمون نداشته باشه .÷س مطمئن شوید جدولهای جدیدی که ساختیم در همون دیتا بیس تستمون هم باشن.

گرفتن تست “red”

همانطور که میدانیم اولین قسمت در TDD فرایند نوشتن سریع یک فایل تست است .یک فایل جدید یونیت تست در مسیر و با نام protected/tests/unit/IssueTest.php بسازید و کدهای زیر رو در اون قرار بدید:

public function testGetTypes()
{
$options = Issue::model()->typeOptions;
$this->assertTrue(is_array($options));
}


خوب حالا که همه چیز نوشته شده است همین صفحه که جدیدا نوشتیم رو تست کنید :
phpunit unit/IssueTest.php
PHPUnit 3.3.17 by Sebastian Bergmann.
.E
Time: 0 seconds
There was 1 error:
1) testGetTypes(IssueTest)
CException: Property "Issue.typeOptions" is not defined.
/YiiRoot/framework/base/CComponent.php:131
/YiiRoot/yii-read-only/framework/db/ar/CActiveRecord.php:107
/Webroot/tasctrak/protected/tests/unit/IssueTest.php:6
FAILURES!
Tests: 1, Assertions: 0, Errors: 1.

همونطور که میبینید تستمون رو به سرعت نوشتیم و تست ههم کردیم ولی یک ارور وجود داره و از اینن قرار هست که میگه متد Issue::typeOptions() در مدل کلاس تعریف نشده است.ما احتیاج داریم که اونو اضافه کنیم.

انتقال از red به green

خوب حالا باز کنید مدل کلاس AR رو که در شاخه protected/models/Issue.php<font face="&quot"> قرار دارد و کلاس کدهای زیر رو به اون اضافه کنید:
public function getTypeOptions()
{
return array();
{
خوب هوئمنطور که میبینید ما یک متد ساده رو اضافه کردیم که یک آرایه بر میگردونه البته این آرایه هنوز خالی هستش.

خوب حالا دوباره تستی که انجام دادیم رو انجام بدید
phpunit unit/IssueTest.php
PHPUnit 3.3.17 by Sebastian Bergmann.
..
Time: 0 seconds
OK (1 tests, 1 assertion)


خوب تست ما به خوبی ژاس شد و ما در حالت green هستیم. این خیلی خوبه ولی هنوز هیچ مقدار واقعی از این کار برگردانده نمی شود و کار خاصی انجام نمیدهد .خوب مطمئنا با ای آرایه خالی ما نمیتونیم یک منو Dorp-down به ژروِه اضافه کنیم.برای اون ئسه نوع ژایمون که می خواستیم بکار ببریم ما می رویم به استفاده از کلاس ثابت برای ترسیم این به مقادیر صحیح،و وقتی ما می خواهیم از متد our getTypeOptions() استفاده کنیم یک توضیحات خوب و کاملی رو برای ما بر میگردونه برای استفاده در drop-down منومن.

نکته:

لازم به ذکر است که کلاس های پایه چارچوب Yii از _Getphp استفاده شده است. این به ما اجازه میده تا در کلاسهای فرزند از روش های ارسال از قبیل getTypeOptions() استفاده کنیم و در عین حال آن متد مانند خواص کلاس استفاده میشه با سینتکس >typeOptions

بگرشن به حالت قبل red

برای اضافه کردن این حالت به کلاس Issue باید دوباره تستمون به حالت خطا بره دوباره. اجازه دهید یک assertion اضافه کنیم برای این که مقدار بازگشتی رو تست کنه که محتویاتش اونطور که انتظار میره هستش یا نه.خوب این تست به این صورت است که آزمایش میکنه که آرایه بازگشتی سه عنصر است و این که ارزش این سه عنصر مثل : Bug, Feature, and Task باشه.فایل <span style="font-size:12.0pt;line-height:150%; font-family:&quot;B Nazanin&quot;" lang="AR-SA"> تست رو به کدهای زیر تغییر بدید :




public function testGetTypes()
{
$options = Issue::model()->typeOptions;
$this->assertTrue(is_array($options));
$this->assertTrue(3 == count($options));
$this->assertTrue(in_array('Bug', $options));
$this->assertTrue(in_array('Feature', $options));
$this->assertTrue(in_array('Task', $options));
}


خوب اگه php بلد باشید کدهای بالا واضح هستن.همچنین هنوز هم متد getTypeOptions() یک آرایه خالی رو بر میگردونه و مطمئنا assertions های ما با شکست مواجه خواهند شد.بنابر این ما میریم به کلاس در Issue.php و کدهای زیر رو به اون اضافه میکنیم تا تیتمون بدون شکست پاس بشه.

خوب در بالای کلاس Issue ثوابت زیر رو اضافه کنید:
const TYPE_BUG=0;
const TYPE_FEATURE=1;
const TYPE_TASK=2;

سپس متد Issue::getTypeOptions()<font face="&quot"> ویرایش کنید برای برگشت دادن یک آرایه بر اسا این ثوابت:
public function getTypeOptions()
{
return array(
self::TYPE_BUG=>'Bug',
self::TYPE_FEATURE=>'Feature',
self::TYPE_TASK=>'Task',
);
}
خوب حالا اگر تستمون رو اجرا کنیم هر 5 تا تست با موفقیت پاس خواهند شد.
phpunit unit/IssueTest.php
PHPUnit 3.3.17 by Sebastian Bergmann.
..
Time: 0 seconds
OK (1 tests, 5 assertions)

حالا ما مدل کلاسی داریم که بر میگردونه اون نوع از Type هایی رو که می خواهیم،، اما در حال حاضر در فرم ورودی یک منوی کشویی نداریم که از این داده ها استفاده بکنه بیایید این کار رو هم انجام بدیم.

nariman_t
شنبه 23 آذر 1392, 13:32 عصر
اضافه کردن منوی drop-down

فایلی رو که حاوی فرممون هست رو باز کنید این فرم در مسیر protected/views/issue/_form.php قرار دارد ، سژس خطی رو که با کدهای زیر مطابقت میکنه رو پیدا کنید:




<div class="row">
<?php echo $form->labelEx($model,'type_id'); ?>
<?php echo $form->textField($model,'type_id'); ?>
<?php echo $form->error($model,'type_id'); ?>
</div>





این خط هایی که در بالا قرار دادیم احتیاج دارن که کمی برای شما روشن بشن که چی هستند. برای این کدها رو بفهمی نیاز داریم که به بعضی از کدهایی که در بالای فایل _form.php قرار دارند مراجعه کنیم که این کدها به شرح زیر هستند:



<?php $form=$this->beginWidget('CActiveForm', array(
'id'=>'issue-form',
'enableAjaxValidation'=>false,
)); ?>



این متغیر $form که دارید میبینید متغیری است که با ویجت CActiveForm در Yii تعریف شده است.یا به عبارت دیگر تغیر $form یک نوعی از CActiveForm میباشد و از اون گسترش یافته است.البته باید بگم در مورد ویجت ها Widgets در فصل 9 به طور کامل توضیح داده خواهد شد. در حال حاضر ما میتونیم توسط درک CActiveForm. بهتر این مطالب رو درک کنیم.این رو میتونید تصور کنید که یک کلاس کمکی است که مجموعه ای از method ها "متدها" میباشد برای کمک به ما در ساخت یک فرم برای ثبت داده ها که مربوط به یک مدل کلاس داده است.در این مورد، این نشان داده شده است به وسیله مدل کلاس Issue .

برای درک کامل متغیرها در فایل View ، اجازه دهید همچنین بررسی کنیم کدهای controller رو که رندر میکنه فایلهای view رو.همانطور که شما به یاد میآورید، یک راه برای پاس کردن داده ها از کنترلر به ویو به وسیله آرایه بود، کلیدها یا همون keys که نامهایی در دسترس هستند که در فایلهای View میتونید از اونها استفاده کنید. از آنجایی که عمل create برای ساخت یک Issue جدید استٰ متد controller رندر میکنه از IssueController::actionCreate(). این متد به صورت زیر است:





public function actionCreate()
{
$model=new Issue;
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if(isset($_POST['Issue']))
{
$model->attributes=$_POST['Issue'];
if($model->save())
$this->redirect(array('view','id'=>$model->id));
}
$this->render('create',array(
'model'=>$model,
));
}


اینجا ٰ مبینیم که وقتی view در حال رندر شدن استٰ اون ژاس کرده است به طور مثال از مدل کلاس Issue ٰ که در دسترس خواهد بود در یک متغیر که اونو $model نامگذاری کردیم.خوب بیایید برگردیم به کدهایی که عهده دار رندر کردن فیلد Type برای ساختن Issue جدید اط طریق فرم ورودی بود. خط اول است:



$form->labelEx($model,'type_id');




این خط استفاده کرده از متد CActiveForm::labelEx() برای رندر یک lable html برای ویژگی typr_id مدل issue .این میگیره در یک نمونه از مدل کلاسٰ و ویژگی مدل مربوطه کخ ما میخواهیم یک برچسب باشد را تولید می کند.مدل کلاس Issue::attributeLabels() روشی خواهد بود برای استفاده lable . اگر ما نگاهی به این روش بندازیم ٰ ما میبینیم که ویژگی type_id مثل یک lable یا برچسب ترسیم شده است.که در حال حاظر همان چیزی است که ما می خواهیم.



public function attributeLabels()
{
return array(
'id' => 'ID',
'name' => 'Name',
'description' => 'Description',
'project_id' => 'Project',
'type_id' => 'Type',
'status_id' => 'Status',
'owner_id' => 'Owner',
'requester_id' => 'Requester',
'create_time' => 'Create Time',
'create_user_id' => 'Create User',
'update_time' => 'Update Time',
'update_user_id' => 'Update User',
);
}

fa.m2541367
دوشنبه 26 خرداد 1393, 23:30 عصر
مطالبتون واقعا عالی بود مرسی از زحماتتون میشه لطفا فایل pdf همین آموزشارو برامون بزارین؟

majid1986
یک شنبه 30 شهریور 1393, 21:59 عصر
میشه به فایل PDF هم قرار بدید؟؟

tameshkz23
جمعه 18 دی 1394, 21:59 عصر
دوستان چند وقتیه که آموزش فریم ورک Yii را در سایتم شروع کردم.
فعلا با نسخه یک شروع کردم.
یه سری بزنید , در صورتی که فکر میکنید مفید هست , پیام بدین که در اینجا هم قرار بدم و با همکاری هم تکمیلش کنیم.
خودتون بهتر میدونید که اکثرا آموزش های مفید و عملی فارسی وجود نداره .
با تشکر
www.goyii.ir (http://www.goyii.ir)

mahdijahanshahi
سه شنبه 01 تیر 1395, 01:09 صبح
آقا من یه کم پرتم! اگه می شه راهنمایی کنید
اینطور که فهمیدم yii رو باید روی کامپیوتر خودم (که سرور مجازی کردمش) نصب کنم و پروژه که کامل شد روی وب سایت آپ کنم. درسته؟

farazsh
شنبه 19 تیر 1395, 03:41 صبح
علت خطای مسیر زمان اجرا اپلیکیشن معتبر نیست.
با سلام دوستان علت خطای زیر چیست :
CException

مسیر زمان اجرا اپلیکیشن معتبر نیست. اطمینان حاصل کنید این دایرکتوری قابل نوشتن توسط وب سرور می باشد.

لطفا راهنمایی کنید خیلی گیرم

خدا هر چی خواستین بهتون بده؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟؟؟؟؟؟؟؟

tameshkz23
شنبه 16 مرداد 1395, 16:24 عصر
سلام
فولدر های run time و asset باید در سرور قابل نوشن باشند
یعنی permission آنها را read and write قرار دهید .

nariman_t
دوشنبه 11 بهمن 1395, 14:05 عصر
با سلام خیلی وقت بود که yii‌رو ادامه ندادم در حدی که نسخه 2 اون هم درست شده از این به عد پست هایی که قرار میدم مربوط به نسخه 2 هستش البته تفاوت های خیلی زیادی بین نسخه 2 و 1 در مورد کد نویسیش نیست اگر شد حتما ادامه کار رو خواهم نوشت