# زبان های اسکریپتی > PHP > Yii Framework >  آموزش مباحث شی گرایی فریم ورک Yii

## Pouyan2010

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

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

----------


## Pouyan2010

بسم الله الرحمن الرحیم
دوستان دنیای ما دنیایی هست که می تونی به نحوی این طور تعریفش کنم: این دنیا دنیای شی گرایی هست چون هر چیزی را ما داریم می بینیم بازخوردی از اشیای دور و اطراف ماست.
برای اینکه ما بتوانیم با این فریم ورک و همچنین فریم ورک های در سطح جهان آشنا شویم نیاز به آشنایی با مسائل شی گرایی داریم.
فریم ورک Yii یک فریم ورکی هست که مبتنی بر شی گرایی و همچنین  از تکنولوژی MVC بهره گرفته شده است.
چیزی که یک زبان را قدرتمند جلوه می کنه و به اون قدرت میده به نظر من یکی از عوامل اون همین فریم ورک و کتابخانه های مکمل آن هستند، شما چهار چوب دات نت را ببینید، آیا C#‎‎ به خودی خود قدرتی داره؟ مگر غیر از این هست که سی شارپ یعنی حلقه For، یا int a=0; یا... این کتابخانه های دات نت هست که به اون قدرت بخشیده است.
خوب پس یک زبان وقتی می تونه قدرت مند تر باشه که یک فریم ورک خوب پشت اون باشه مثلا حتما با Jquery کار کردید، دوستانی که عملی با اون کار کرده باشند می دونند در مقابل Dojo، Jquery واقعا حرفی برای گفتن نداره اما علت محبوبیت  Jquery  که بارها در اینترنت دیدم  و همچنین علت افت استفاده کاربران از Dojo به دلیل نبود یک Document خوب برای Dojo هست.
پس من دارم فاکتور های خوب را برای انتخاب فریم ورک نام می برم:
1-	پشتیبانی خوب
2-	داشتن یک Document خوب برای manual
3-	همراه بودم با تکنولوژی روز
4-	سادگی استفاده
5-	قدرت کتابخانه های موجود
6-	امنیت
7-	سرعت
8-	قابل استفاده برای پروژه بعدی
9-	حرفه ای
10-	ایزوله بودن
من می تونم بگم که yii تمام این مشخصات را زیاد تر هم همراه داره.
خوب بدون اینکه بخوام ترتیبی داشته باشیم شروع می کنم به نام بردن زبان ها و فریم ورک های پر قدرت هر کدام:
Java با Spring قدرت پیدا می کنه.
C#‎‎ با .Net
Ruby با Rails
PHP با Yii
همینطور که در تعریف و جواب گویی خود طراحان این فریم ورک می بینیم هم علت نام گزاری این فریم ورک همین دلایلی بود که نام بردم. مضاف بر اینکه جایی خوندم آقای Qiang Xue and Xiang Wei Zhuo گفته بودند ما سال ها روی فریم ورک Prado کارکردیم، و کاملش کردیم اما تازه یاد گرفتیم چطور باید فریم ورک بسازیم، پس این خیلی ازشمند هست.
Yii مخفف سه کلمه یا حرف Yes It Is می باشد که در پاسخ به سوالات همچون آیا این فریم ورک سریع هست؟ آیا  اون امن هست؟ ایا .....
می باشد و در جواب به همه این سولات باید بگوییم "بله اون هست".
کلیات اومد دستمون، فهمیدیم که چه علم هایی را باید برای یادگیری این فریم ورک پیش فرض  داشته باشم و اون فقط دونستن پی اچ پی خام و علم شی گرایی هست.
اگر دوستان موافق باشند من علم شی گرایی رو در چند سطر توضیح بدم و همین جامفهموم namespace در پی اچ پی را بازگو کنم تا بهتر بتونیم قبل از یادگیری این چهارچوب با اون کنار بیایم.
خودتون را در نظر بگیرید که در خارج از کشور هستید، اگر از من بپرسن که ادرس محل سکونت شما کجاست آیا من می گم خیابان مهرداد!!! یا نه من باید قبل از هر چیز معلوم کنم دقیقا در کجا زندگی  می کنم. من می گم کشور ایران- استان اصفهان-شهر اصفهان- خیابان مهرداد- کوچه ....
خوب در PHP هم اگر بخوام این حرف ها را به شی گرایی تبدیل کنم این طور مثال می زنم:
namespace Iran\Isfahan {
        class Isfahan
        {
               public function MehrdadStreet(){
                  echo 'Barnamenevis.com';
               }
        }

}
یا

namespace Iran\Isfahan {
        class KashanCity
        {
               public function MehrdadStreet(){
                  echo 'Barnamenevis.com';
               }
        }

}


همینطور که می بینید namespace صرفا یک سری اسم و طبقه بندی کردن هست، به همین خاطر هم هست که ما می تونیم اصلا از namespace  استفاده نکنیم چون همونطور که از اسمش معلومه فقط یک فضای نامی هست.
پروژه بدون namesapce  هم اجرا میشه.!!!!!
نکته ای که هست به یاد داشته باشید دوستان اگر ما بخواهیم در یک فایلphp چند کلاس هم نام داشته باشیم که در هر کدوم متد های خاصی طراحی کنیم و هرکدوم از اون متد ها رفتار خاص خودشون را داشته باشند اما نام کلاسشون یکی باشه1!!!!! امکان نوشتنش بدون namespace امکان پذیر نیست مگر اینکه از این مکانیسم استفاده کنیم
مثال را ببینیم:
namespace Iran {

    class Tehran
    {
        public function ShirodiStreet(){
            echo 'Hello my city';
        }
    }

}
namespace Irann{
    class Tehran{
public function KeshvariStreet(){
            echo 'Hello my city';
        }
    }
}

بسیار خوب.
برای شروع کار ما نیازمند ابزارهای لازم هستیم.
1-	یک شبیه ساز که بتونه نقس سرور را براتون بازی کنه و فایل های php را ترجمه و اجرا کنه مثل wamp –lamp-xammp-easyphp
مثلا سایت:www.wampserver.com
یا در Github سرچش کنید و دانلودش کنید.
2-	نسخه php حتما باید از 5.0 به بالا باشه. برای ساپوت کردن بحث namespace  به نسخه 5.3.0  به بالاتر این زبان نیاز دارید، و همچنین برای ساپورت کردن از Trait ها باید از نسخه 5.4.0 به بالا استفاده کنید
3-	Apache , Mysql که ما ایرانی ها همه ورژن بالا را معمولا داریم
4-	خود پوشه فریم ورک که می توانید از سایت زیر دانلودش کنید
www.yiiframework.com/download/

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

----------


## Pouyan2010

برای شروع مباحث شی گرایی من مقدماتی را مطرح می کنم که امیدوارم زیاد تکراری و کلیشه ای نباشند.
ببینید دوستان همونطور که در پست  های قبلی خودم گفتم دنیای ما دنیای شی گرایی هست. در همه آموزش های مباحث شی گرایی یا ماشین رو یا انسان یا... را مثال می زنند، بذارید یک شی را تعریف کنیم:
موجودیتی که از خودش رفتار و دارای خصوصیات باشد.
مثلا یک انسان
خصوصیات: رنگ پوست، قد، جوان بودن یا پیر بودن یا....
رفتار: دویدن، حرف زدن و...
خوب همین را بیاید در قالب یک شی به PHP معرفی کینم، من همیشه رفتار ها را متد یا function  و خصوصیات را Properties در یک کلاس در نظر می گیرم.
پس شی یا موجودیت انسان در تعریف اینطور میشه:
class Human{
  private skinColor;
 public function tell(){
   echo ‘Salam’;
}
} 

خوب  همینطور که می بینیم این کلاس به عنوان یک شی یا موجودیت در php تعریف گردید. کلمه class   به عنوان یک تفکیک کننده  یا دسته بندی استفاده میشود.
حالا اگر روزی انسانی به دنیا بیاد که رنگ پوستش آبی باشه آیا می تونیم این انسان را جزو گروه انسان ها قرار دهیم یا نه؟ مطمئنا جواب بله هست.
اما اگر روزی انسانی به دنیا بیاد که مثلا بال داشته باشه حالا چی؟ بذاریم تو گروه انسان ها یا خیر؟ جواب خیر هست، ما میایم یک گروه ایجاد می کینم  به اسم گروه  انسان های بال دار و این انسان را در این گروه قرار  می دهیم تا یک هم گروهی براش پیدا کنیم.
پس فاکتور ما برای گروه بندی کمیت هست نه کیفیت!!!!!!!
خوب ما عمل دسته بندی را انجام دادیم، همینطور که می دونیم ما انسان های متفاوت در مکان های متفاوت داریم، که میشه همون مبحث namespace که قبلا توضیحش دادم.
نوبت به این میرسه که دسترسی ها و انواع کلاس ها را بررسی کنیم، در این مثال می تونم بگم 80% علم شی گرایی وجود داره.
namespace PHP {
    abstract class Programmer
    {
        final public static function work()
        {

        }
    }
}
چطور من دارم میگم که 80% علم شی گرایی همین الان در همین 2 خط برنامه نویسی هست؟
به این دلیل که مفهموم namespace  را داریم کلاس معمولی یا abstract را داریم، انواع حالات و دسترسی های یک function را هم داریم.
آیا نیازی به توضیح کلمات بالا هست؟
مطمئنا همه با این مفاهیم آشنا هستیم.
قوانین دیگری که شما  باید در yii رعایت کنید یادگرفتم capitial یا camel case  نوشتن اسامی متد ها و متغیر ها و ... می باشد.
یادتون باشه دوستان در yii به دلیل اینکه php 5.0 از مفهموم namespace پشتیبانی نمی کند  برای اینکه کلاس ها با همدیگر کانفلیکت نامی نداشته باشند از حرف C برای شروع نام گزاری تمامی کلاس های خود استفاده می کند.
پس یادتون باشه شما ترجیحا این کار را نکنید.
برای نام گزاری کلاس ها از استاندارد captial استفاده کنید و نام های کلاس ها را با حرف بزرگ شروع کنید مثلا:
class Barnamenevis{
    
}

class BarnamenevisPhp{
    
}

برای نام گزاری متد ها و متغیر ها از استاندارد  camelcase استفاده کنید مثلا:
$helloWorld=10;
function getStudentName(){
    
}
Properties های private کلاس را با Underline شروع کنید مثلا:
class BarnamenevisPhp{
  private $_name;
}
البته دوستان رعایت کردین این موارد اجباری نیست اما اگر کسی از این استاندارد ها در کد نویسی استفاده کنه کد اون شخص خوانا تر و حرفه ای تر می باشد.
البته بسیاری قوانین دیگر هم و جود دارند که انشا الله دوستمون در ترجمه برای شما بازگو خواهند کرد.

سوالی که من از دوستان دارم و می خوام که به اون فکر کنند اینه که آیا در جهان واقعی ما کلاس انسان را ایجاد کردیم یا کلاسی وجود داشته و ما خواه یا ناخواه وارد اون کلاس شدیم؟

----------


## Pouyan2010

سلام خدمت همه دوستان
در بخش دوم من شروع می کنم به یک توضیح اجمالی و بعد از اون هم شروع به کار با Yii.
در بخش قبل ما با کلیات آشنا شدیم در قسمت  پایانی من عناصر مورد نیاز را نام بردم از جمله دانلود فریم ورک.
بعد از دانلود فریم ورک شما باید پوشه ی yii را به داخل پوشه www در wamp ویا  htdoc درxampp انتقال دهید که قابل جابجایی به هر جای دیگری می باشد اما فعال در این فولدر قرار می دهیم تا در مراحل بعد یاد بگیریم چطور باید مسیر را برای آن تغییر دهیم.
یادتان باشد که نام پوشه را به yii بدون هیچ حرف اضافی در نام تغییر نام دهید.
همینطور که در عکس مشاهده می کنیم.

در مرحله بعد شما باید فایل php.exe را به مسیر اجرایی سیستم عامل ویندوز خود اضافه کنید تا بتوانید از CMD برای ساخت پروژه جدید استفاده کنیم که در عکس مراحل کاملا واضح هستند.








در مسیر path این خط را اضافه کنید البته اگر wamp شما در درایو c  و همچنین yii را در درایو C قرار داده باشید
C:\wamp\www\yii\framework;C:\wamp\bin\php\php5.3.8  ;

حالا قبل از هر کاری شما در url مروگر خود تایپ کنید
Localhost/yii/requirements/
و اینتر را بزنید
این صفحه برای شما ظاهر می گردد



در این Page شما نیازمندی های این فریم ورک را می بینید که با رنگ ها و کلمات pass یا... مشخص شده است. برای اینکه پروژه هایی که با yii   می سازید قابلیت ارتباط با بانک را داشته باشد باید دو عنصر مشخص شده حتما pass شده باشند در غیر این صورت در php.ini ، Extention آن را فعال کنید.
خوب حالا بریم به اجرا CMD ویندوز و نوشتن خط فرمان های مورد نظر که در شکل به طور کامل نمایش داده شده است، به ترتیب نوشتن دستورات توجه کنید.









با اجرای این خط فرمان ها اسکلت اصلی پروژه در پوشه ی www شما با نامی که شما مشخص کردید که من اون را Barnamenevis نامیدم ساخته می شود. دستور webapp یک دستور رزرو شده است و می توانید از دستورات دیگری هم در این جا استفاده کنید که فعلا صلاح نیست توضیح داده بشند ، در مراحل بعد وقتی به اونها احساس نیاز کنیم خودشون آشکار می شند.
خوب با وارد کردن این خط در url مرورگر خود نتیجه را می بینیم.که اصل کارمون از اینجا شروع خواهد شد.
تا یادم نرفته دوستان عزیز انتخاب یک IDE خوب خودش واقعا می تونه کمکتون کنه من از  PHPStorm  استفاده می کنم که از Yii Framework پشتیبانی می کنه و در کامل کردن دستورات بسیار به شما کمک خواهد کرد که یکسری تنظیمات اولیه باید انجام بگیره که در مراحل بعد قبل از شروع کار و توضیح دستورات آن را براتون بازگو خواهم کرد.


موفق و سربلند باشید
پایان قسمت دوم

----------


## Pouyan2010

خوب در قسمت قبلی ما یک پروژه با نام barnamenevis در پوشه ی www ساختیم اما هنوز اجراش کردیم، به دلیل اینکه باید IDE خودمون را قبل از هر کاری کانفیگ کنیم، دوستان من از PHPStorm استفاده می کنم، شما می تونید نسخه 30 روزه این نرم افزار را از سایت http://www.jetbrains.com/phpstorm/ با حجم 93MB دانلود کنید، این IDE به شما این امکان رو خواهد داد که موقع کد نویسی code complemition به طور اتوماتیک انجام بگیرند و به روند کد نویسی شما سرعت ببخشه، من حدود 30 پروژه با این IDE نوشتم و واقعا از اون راضی هستم نسبت به IDE های دیگه. اما برای سهولت کار من صحبت را کم می کنم و روال کار را با عکس بیشتر بهتون نشون میدم، مشا باید یکسری تنظیمات را در PHPStorm انجام دهید تا IDE شما این فریم ورک قوی را درک کنه و بتونه کمکتون کنه، مرحله به مرحله با عکس ها پیش برید، البته من فرض می گیرم شما نرم افزار را دانلود کردید و نصب هم کردید.





با باز شدن پروژه شما یا باید alt+ctrl+s را بشارید یا روی آیکن آچار که مشخص شده کلیک کنید تا پنجره تنظیمات برای شما ظاهر شود، بعد در سمت چپ نرم افزار در بخش Project setting گزینه ی Directories را انتخاب و در بخش باز شده در قسمت 1 در لیست درختی باز شده root  را انتخاب و روی دکمه بنفش رنگ که نام آن Resource Root است کلیک کنید با انجام این کار قسمت 2 به این شکل در خواهد آمد.


در مرحله بعد با انتخاب  PHP در سمت چپ در همین بخش، با کلیک روی آیکن + این مسیر را به آن اضافه کنید که در شکل گویاست



در مرحله بعدی در سمت چپ باید در بخش IDE Setting دنبال گزینه ی File Types باشد و با انتخا آن پنجر ای به این شکل برای شما باز می شود ، این مقدار را در قسمت مشخص شده وارد کنید
;yiiilte.php




و ok را کلیک کنید، کار به اتمام رسید و حالا گزینه این به این شکل در سمت چپ IDE  شما ظاهر می گردد، و گویای این هست که IDE تمام کدهای yii را شناخته است.



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

موفق و سربلند باشد

----------


## Pouyan2010

خوب برگردیم به باقی مانده مباحث شی گرایی که خیلی در yii به اون بر خواهیم خورد.

همینطور که می دونید ما مفهومی را در مباحث شی گرایی داریم به نام ارث بری، به اینصورت که اگر یک کلاس بیس داشته باشیم  می توانیم از اون ارث بگیریم مثلا کلاسی به نام animal که کلاس حیوانات هست و ما می توانیم از این کلاس ارث بری کنیم،  به مثال با هم دیگه توجه کنیم:
class Animal{
    protected function move(){ }
}
class Cat extends Animal{
    
}


خوب ما در واقع کلاس cat که گربه هست رو از کلاس حیوانات مشتق کردیم و خصوصیات آن را به ارث بردیم، یادتون باشه دوستان برای صدا کردن متد یا properties از کلاس پدر باید از parent استفاده کنیم

class Animal{
    protected function move(){ }
}
class Cat extends Animal{
   public function see(){
       parent::move();
   }
}

خوب مفهمی در اینجا شکل میگیره به نام overide کردن، در تعریف اینطور بگم که:
اگر کلاس پدر ما متدی داشته باشد که  کلاس فرزند هم به همان نام آن را بخواهد به طور دیگر بازنویسی کند به این حالت می گوییم overide کردن، به طور ساده تر متدی هم نام در کلاس پدر و فرزند که هرکدام آنجوری که خواسته ان آن را پیاده کردند، دوستان این مفهوم را زیاد در yii خواهیم داشت ما معمولا در yii کلاس ها را extends می کنیم و توابع کلاس پدر را  overide می کنیم  و آنطوری نیاز ماست آن را پیاده می کینم.
class Father
{
    protected function see()
    {
        echo 'Father Class';
    }
}

class Child extends Father
{
    public function see()
    {
        echo 'Child Class';
    }
}
$n=new Child();
$n->see(); // Child Class

در این مثال کلاس فرزند متد see کلاس پدر را overideکرده است و موقع صدا زدن ما با چاپ Class Child مواجه هستیم، اگر بخواهیم متد see کلاس پدر را صدا کنیم از  دستور parent::see(); در کلاس فرزند استفاده می کنیم. تا با چاپ Class Father مواجه شویم. این امر در مورد خصوصیات کلاس هم مشهود است
نمونه کلاس در yii در مثال زیر وجود دارد که کلاس Controller از کلاس Ccontroller مشتق شده و  خصوصیات خصوصیاتی را مشتق کرده است.
class Controller extends CController
{
    public $defaultAction='hello';
}

البته بعد ها که با yii کار کنید می بینید که این خصوصیت جز کلاس Ccontroller که کلاس پدر است می باشد.
واقعا نمی دونم دوستان باید در مورد کلاس های چون کلاس های abstract یا غیره بحث کنم یا نه برای همین من حوصله شما را سر نمی برم ، اگر دوست داشتید بگید تا براتون توضیحش بدم، البته دوستان مطمئنا با این کلاس ها آشنا هستند و نیازی به توضیح من نیست.
چند نکته در کار با yii یادتون باشه دوستان که قبل از ورود به یادگیری به نظر من بهتره درک بشه:
1-	در yii مرتبا شما باید از کلاس های بیس مشتق بگیرید و حالا یا متد یا خصوصیتی را overide کنید، یا شاید هم اصلا لزومی نداشته باشید
2-	همونطور که گفتم کلاس های بیس با یک کاراکتر C در اون نامشان شروع می شوند
3-	Yii یک فریم ورک بر مبنای MVC می باشد، پس درک MVC واقعا مهم هستش
4-	تنظیمات در yii به وسیله ی ارسال آرایه هایی به توابع یا... انجام میگیرد مثلا در این مسیر  protected/config/main.phpشما تنظیمات اصلی و پایه ای پروژه را در غالب یک آرایه ی بزرگ ارسال می کنید، پس درک آرایه ها و اندیس ها بسیار مهم هستند.
5-	 مفهوم unit test ها را  واقعا رعایت کنید و به کار ببندید، که دوستمون مهندس نریمان زحمت ترجمه بخش کتابش رو کشیدند. مرسی ازشون
6-	 هر چیزی رو در IDE مورد نظر تایپ کردید و در لیست باز شونده براتون ظاهر نکرد اصلا دیگه ادامه ندید چون یه جای کار میلنگه.
7-	و من تضمین می کنم اگر یک تیم نرم افزاری باشیم در یک گستره جغرافیای بهترین گزینه yii می باشد به دلیل وجودmodules در این فریم ورک.
موفق و پیروز باشید. دوستان منتظر نظرات شما هستم.

----------


## Pouyan2010

با سلام خدمت همه دوستان
در مراحل قبل دیدیم که چطور یک پروژه ساده را ساخته و ویرایش گر خود را جهت Develope آماده سازیم، جناب آقای مهندس *رسول عشیری*، و جناب آقای مهندس *نریمان* توضیحات لازم رو در مورد مقدمات کاری و همچنین چینش فولدر ها و نحوه پاس دادن درخواست کاربر به Controller و... رو خدمت شما توضیح داده اند، در تکمیل صحبت های این دوستان چند نکته به ذهنم رسید براتون می نویسمش:
یادتون باشه دوستان وقتی  یک کاربر درخواستی را صادر می کند ، Route آن درخواست را به کنترل مورد نظر  ارجاع می دهد، و باز بسته به درخواست کنش مورد نظر اکشن آن کنترلر صدا زده می شود و در کنش نیز اگر قرار باشد ورودی از کاربر داشته باشم عملیات مورد نظر را انجام داده و نهایتا خروجی را در با متد render در کنترلر در صفحه چاپ می کنیم، چند نکته حائز اهمیت می باشد:
	به هیج وجه وظیفه های هر بخش را به جای دیگر منتقل نکنید، شما باید مدلMVC را رعایت کنید، شما نباید دستوراتHTML در مدل که مربوط به تراکنش های بانک داده می باشد وارد کنید
	یادتان باشد اگر شما تنظیمات اولیه پروژه را تغییر ندهید به طور اتوماتیک هر کلاسی که در پوشه protected/models و protected/components وجود دارد ، را می توانید بدون import کردن توسط توابع yiiمورد دسترسی قرار دهید .
این تنظیمات را در این خط از کانفیگ پروژه خواهید دید:
Protected/config/main.php

	// autoloading model and component classes
	'import'=>array(
		'application.models.*',
		'application.components.*',
	),
کاراکتر* به معنی این هست که تمام کلاس های داخل این دایرکتوری قابل استفاده باشند، یادتون باشه این کلاس ها تا وقتی صداشون نزنید یا شی از اون ها نسازید برای include نخواهند شد، که همان مکانیزم autoload می باشد، پس باز یک نکته داریم ،"یادتون باشه باید اسم فایل php با نام کلاس یکسان باشه".
برای نمونه بیاد به چند بخش نگاهی بیاندازیم در فایلprotected/controllers/SiteController.php همین طور که می بینیم کلاس SiteController از کلاس Controller مشتق شده دقیقه میشه این خط:
class SiteController extends Controller
{
}

اما ما میدونیم که این کلاس باید از کلاس CController مشتق میشد، پس چرا از کلاس Controller مشتق شده، اصلا کدام فایل include شده که کلاسCintroller در داخل آن بوده؟
سادست یا در کرسر را روی Controller قرار دهید و در ویرایش گر چه PHPStorm چه netb… کلیدCtrl+B را بفشارید ما به مکانی که کلاس Controller تعریف شده است انتقال پیدا می کنیم، یا کافیست به پوشه protected/components/ برویم و فایل Controller را باز کنیم ، مشاهد می کنیم ، که کلاسController از کلاس Ccontroller مشتق شده است و به دلیل import  شدن تمام فایل های داخل پوشه components در فایل کانفیگmain.php این کلاس قابل دسترس می باشد.
خیلی جالبه نه؟
به عنوان نکته بعدی باید بگم که شما در model دو نوع کلاس دارید اگر ما بخواهیم داده های ورودی از کاربر را به دیتابیس منتقل کنیم یا اصلا کار به بانک اطلاعاتی داریم، باید از کلاس CActiveRecord استفاده کنیم در غیر این صورت برای داد های استاتیکی که از کاربر می گیریم نیاز به مشتق شدن از کلاسCForm را داریم: پس این چند تا از کلاس ها را مهمند و نام کلاس پدر آنها تا الان میشند این موارد:
Controller extends CController
Form extends CformModel* برای کار با داده ای استاتیک 
extends CactiveRecord * برای کار با بانک داده ها

----------


## Pouyan2010

سلام خدمت دوستان گرامی
دوتا نکته به ذهنم رسید، شاید به دردتون بخوره:
اگر سوال خاصی در مورد این فریم ورک دارید به این لینک یه سری بزنید، فارسی زبان ها در این فروم هستند:
http://www.yiiframework.com/forum/in...um/41-persian/
دقت کنید که برای لود ماژول های پروژه آنها را در پوشه ی protected/modulas قرار بدید و در فایل کانفیگ پروژه آنها را فقط تنطیم کنید تا لود شوند، به روش های دسترسی توسط URL  هم توجه کنید.

در ضمن اگر کسی از دوستان علاقه مند به آموزش در این بخش هستند می توانند این بخش را ادامه بدند تا ما هم از بیانات استفاده کنیم.
ممنون

----------


## tux-world

آموزش بسیار عالی بوده تا اینجا ممنون. یه سوال من فریم ورک رو بهش معرفی کردم میشناسه تو تایپ کردن ولی عکسی که گذاشتید نه . یعنی بعد اینکه Yii::app()-> میزنم چیزی نمیاد.

----------


## Pouyan2010

> آموزش بسیار عالی بوده تا اینجا ممنون. یه سوال من فریم ورک رو بهش معرفی کردم میشناسه تو تایپ کردن ولی عکسی که گذاشتید نه . یعنی بعد اینکه Yii::app()-> میزنم چیزی نمیاد.


 سلام دوست عزیز
از چه ادیتوری استفاده می کنید؟ اگر از PHP Storm استفاده می کنید مراحل رو یکبار دیگر تکرار کنید حتما یکی از مراحل رو انجام نمی دید.

----------


## tux-world

سلام. ادامه نميدين؟ پرنت روهم توضيح بديد و تفاوت ديس با سلف. ممنون

----------


## Pouyan2010

> سلام. ادامه نميدين؟ پرنت روهم توضيح بديد و تفاوت ديس با سلف. ممنون


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


class Father
{

    private $_name;
    var $age;
    static $eyeColor

    public function pubSayHello()
    {

    }

    protected function proSayHello()
    {

    }

    private function priSayHello()
    {

    }

    final public function fPubSayHello()
    {

    }

    public static function pStaticSayHello()
    {

    }

}

class Child
{

}
ما در این مثال می خواهیم بپردازیم به توضیح دادن تمامی حالات ممکنه!!!
همینطور که می بینیم ما دو کلاس به نام  Father و Child داریم، کلاس پدر دارای انواع حالات از توابعی است که ممکن است در مفایم شی گرایی معنی داشته باشد را دارا می باشد. در نوع دسترسی ها به توابع کلاس  پدر همینطور که می بینیم از private، public ، protected استفاده شده است، همینطور که دوستان در جریان هستند توابعی که  private هستند، خارج از این کلاس(کلاس پدر) قابل دسترس نیست، توابعی که دسترسی public دازند همانطور که از اسمش هم مشخصه در هر جا چه کلاس مشتق شود چه از روی آن نمونه ای ساخته شود قابل دسترس می باشد، و نوع توابعی که protected هستند این خاصیت را دارا می باشند که اگر از این کلاس مشتقی(ارث ببریم) بگیریم، فقط کلاس که از این کلاس ارث برده است قابلیت دسرسی به توابع این کلاس را دارا می باشد، حتی اگر از روی این کلاس نمونه ای ساخته شود این توابع قابل دسترسی نمی باشند و فقط کلاسی که ارثبری انجام داده قادر به این کار می باشد.
حالا برویم سراغ دو کلمه به نامfinal و static:
همانطور که می دونید دوستان اگر کلاس دارای تابعی باشد که از نوع static باشد دیگر نیازی به ساختن نمونه از روی این کلاس نیست تا به آن تابع دسترسی داشته باشم یعنی نیار نیست بنویسم:
$f=new Father();
و بعد تابع رو صدا کنیم، یعنی:
$f->pStaticSayHello();
بلکه می تواینم به این سادگی آن تابع رو صدا کنیم:
Father::pStaticSayHello();
برای توضیح مورد final  اینطور بگم که دوستان اگر تابعی در کلاس پدر داشته باشم و بخواهیم به همان نام آن تابع را در کلاس فرزند بازنویسی(override) کنیم،  به سادگی این کار امکان پذیر می باشد اگر بخوایم از این کار جلوگیری کنیم آن تابع را final  تعریف می کنیم و نمی گذرایم که کلاس فرزند تابع کلاس پدر را باز نویسی کند. که همان مفهم چند ریختی.  polymorphism
خوب میرسیم به خصوصیات این کلاس که$nameو eyeColor و $age که با ارث بری می توانید ببینیم که کدام یک در کلاس فرزند قابل دسترس می باشد.

در تاپیک بعدی می ریم سراغ اصل موضوع.

----------


## Pouyan2010

قبل از شروع مفاهیمی مثلparent و self و $this چند نکته رو متذکر بشیم:
بیاید پیش خودمون قرار داده هایی داشته باشم:
اول اینکه دوستان مد نظر داشته باشید ما حالت های متفاوتی از توابع رو در کلاس پدر باز هم می توان ساخت که کاملا مشخصه و نیازی به توضیح دان نیست
دوم اینکه بیاد قبل از اینکه از کلاس پدر مشتقی بگیریم اول از روی آن نمونه بسازیم و حرف هایی که در تاپیک قبل زدیم رو اثبات کنیم به مثل و عکس ها توجه کنید.


همینطور که میبنید وقتی از کلاس نمونه ای ساخته می شود، توابع priSayHello  و proSayHello  قابل دسترس نیست که دلیل private و protected بودن این توابع است.


در این مثال هم همینطور که می بینیم از کلاس نمونه ای نساختیم و این مشخصات و خصوصیات قابل درسترس می باشد چون این موارد خاصیت static بودن را دارند.

خوب برسیم به اصل موضوع و توضیح اولین مورد یعنی کلمه کلیدی this$ :
اینطور بگم که دوستان اگر در scope یک کلاس باشم و بخواهیم به خصوصیات و رفتار های آن کلاس در خود کلاس دسترسی داشته باشم از کلمه کلیدی  $this استفاده می کنیم. به مثال عکسی توجه کنید:

حالا اگر بخواهیم به توابع یا خصوصیات static دسترسی داشته باشم از self استفاده می کنیم، که در خود کلاس یک جورایی بی معنی می شه و در ارث بری مفهموم پیدا می کنید، که در جلو مثال رو خواهیم دید.
حالا بیاید از روی کلاس Father مشتق بگیریم به مثال توجه کنید:

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

همینطور که می بینیم برای دسترسی به توابع داخل کلاس پدر در کلاس فرزند از کلمه کلیدی parent استفاده می کنیم تا به آن ها دسترسی داشته باشیم.
حالا اگر از this$ استفاده کنیم هم به توایع و مشخصات کلاس فرزند دسترسی داریم هم کلاس پدر. خوب تفاوت در کجاست؟
در تاپیک بعد باز هم بیشتر توضیح خواهم داد.

----------


## Pouyan2010

به این تاپیک سر بزنید

----------


## Pouyan2010

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

اینم لینک دانلود با حجم 3/80 مگابایت
http://www.mediafire.com/download/2w...iFramework.rar

----------


## shadecute

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

----------


## Pouyan2010

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

----------


## anahil_66

سلام 
من مشکل دارم تو دستورات cmd همون گام اول خطا رو تو عکس زیر گذاشتم

----------


## MMSHFE

باید مسیر فایل اجرایی PHP و مسیر پوشه framework از محل کپی کردن خود Yii رو روی سیستمتون، به Path ویندوز اضافه کنید و بعد با دستور yiic webapp helloworld پروژه موردنظرتون رو ایجاد کنید.

----------


## anahil_66

ممنون از پاسخگویی سریعتون من مسیردهی ها رو درست رفتم تو عکس هم که گذاشتم اون دو تا گزینه رو که مشخص کردند برای من هم pass شده اما بازم مشکل رو دارم  :متفکر:

----------


## MMSHFE

ببینید، اون خطا داره میگه فایل php.exe رو نتونسته پیدا کنه و این یعنی توی مسیرهای ویندوز نیست و ارتباطی به Yii نداره. باید Path رو چک کنید. اگه از Wamp استفاده میکنید، ببینید توی پوشه bin مسیر فایل اجرایی php.exe چیه و دقیقاً همون رو به Path اضافه کنید.

----------


## Pouyan2010

سلام، اگر مشکل حل نشده است، *این* قسمت از همین تاپیک را مطالعه بفرمایید

----------

