mvc با یک مثال ساده(قسمت اول) yii
توی این جلسه می خوایم mvc رو با یه مثال ساده توضیح بدیم.
روال کار به این صورته که یه جدول توی دیتابیسمون می سازیم .
به کمک gii مدل و کنترلر و ویو هامونو می سازیم .
بعد از اکشن های کنترلرمون عملیات درج , ویرایش , حذف و نمایش رو انجام میدیم. همون عملیات crud خودمون.
خوب ابتدا من یه جدول توی دیتابیسم به اسم user می سازم.
ستون های این جدولم شامل id,first_name,last_name,email,password,status هست
خوب شناسمون که باید کلید اصلی باشه و اتو اینکریمنت , نام و نام خانوادگیه کاربر , یه ایمیل ورمز عبور و در نهایت وضعیت کاربر برای فعال سازی کاربران .
اولین کار قبل از هر کاری ما پروژمونو به دیتابیسمون وصل میکنیم.
توی فولدر protected به فولدر کانفیگconfig میریم . فایل database.php رو که باز کنید.
میتونین اطلاعاتتونو وارد کنین.
mvc با یک مثال ساده(قسمت اول) yii
تنظیمات اولیه به صورت کامنت هست که وقتی تنظیماتو انجام میدیم به این شکل میشه .
خوب حالا میریم جدولو ایجاد کنیم.
CREATE TABLE IF NOT EXISTS `user` ( `id` int(11) NOT NULL, `email` varchar(250) DEFAULT NULL, `password` varchar(250) DEFAULT NULL, `first_name` varchar(250) DEFAULT NULL, `last_name` varchar(250) DEFAULT NULL, `status` int(11) DEFAULT '1' ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE `user` ADD PRIMARY KEY (`id`), ADD KEY `id` (`id`); ALTER TABLE `user` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
خوب جدولمونو ساختیم.
mvc با یک مثال ساده(قسمت اول) yii
میریم که با gii اشنا بشیم.
gii ابزاریه که فریم ورک یی فراهم کرده تا با اون بتونین به راحتی مدل ها و کنترلر هاتونو ایجاد کنین.
پس از ایجاد مدل شما میتونین به وسیله ی gii برای مدل هاتون کنترلر ایجاد کنین
که به صورت پیش فرض اکشن های حذف و ویرایش و ثبت و مدیریت داده هاتونو داره .
خوب برای فعال سازی gii باید توی فولدر config فایل main.php رو باز بکنین و اونو از حالت کامنت در بیارین . خط شماره ۲۴
نکته اینکه برای ورود به gii باید یه رمز عبور تعیین کنین.
برای ورود به gii باید توی مرور گرتون بعد از ایندکس بنویسین gii
http://localhost:1007/index.php?r=gii/default/login
در صفحه ای که باز میشه رمز عبوری که انتخاب کردینو وارد کنین تا وارد محیط gii بشین.
پس از ورود باید این صفحه رو ببینید
به gii خوش آمدید.
یه نکته ی امنیتی بگم
اینکه پس از اینکه پروژتون تکمیل شد و آپلود کردین این gii رو غیر فعال کنین که مشکلی واستون پیش نیاد.
خوب اینجا ۵ تا منو داریم که ما از ۳ تاش فعلا استفاده میکنیم.
اولینش : model generator
برای ایجاد مدل هامون
دوم: crud generator برای ایجاد کنترلر و اکشن های دیفالت یی
پس از استفاده از این منو سیستم ویو هاش رو هم ایجاد میکنه.
سوم: controller generator برای ایجاد کنترلر دلخواه.
mvc با یک مثال ساده(قسمت اول) yii
mvc
خیلی ساده: هرچی که مربوط به دیتابیس میشه : نام جدول : ریلیشن ها و .. میشه مدل M
هرچی که قراره نمایش داده بشه میشه ویو V
هر چی که مدیریت میکنه بین این دوتارو میشه کنترلر C
مثلا شما میخواین کاربرای عضو سایتو نمایش بدین : اطلاعات کجاست ؟ توی دیتابیس پس مدل میشه جدول کاربران
خوب میخوایم تعداد و اسامی را نمایش بدیم . پس یه کوئری میزنیم از
مدلمون که همون جدول کاربرانمونه اطلاعات بر میداریم میفرستیم به یه جایی که نمایش بده .
این کوئری و فرستادنه میشه کنترلر و جایی که قرار نمایش بده میشه ویو .
بریم عملی انجام بدیم تا ملتفت بشیم .
برای ساخت مدل روی منوی model generator کلیک میکنیم.
خیلی ساده table name میشه نام جدولی که میخواین ازش مدل بسازین. اینجا من user وارد کردم
وقتی نام جدولو وارد کردین به صورت اتومات مدل رو سیستم میسازه
توجه داشته باشین که مدل باید حرف اولش با حرف بزرگ نوشته بشه.
مدل ما شد User
خوب روی دکمه ی preview رو بزنین و سپس generate رو کلیک کنین.
مدلتون ایجاد شد.
mvc با یک مثال ساده(قسمت اول) yii
یه نگاه به فولدر مدلتون بکنین.
<?php /** * This is the model class for table "address". * * The followings are the available columns in table 'address': * @property integer $id * @property string $sender * @property string $receiver * @property string $phone * @property string $code * @property string $content * @property string $start_date * @property integer $is_deleted * @property integer $status */ class Address extends CActiveRecord { public $username; public $password; /** * @return string the associated database table name */ public function tableName() { return 'address'; } /** * @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('type_address,factor,user_id', 'required', 'on' => 'admincrete'), array('content,productdesc,phone,receiver,sender', 'required', 'on' => 'usercreate'), array('productdesc,morakhas', 'required', 'on' => 'usercreate2'), // array( // 'receiver,sender', // 'match', 'pattern' => '^[آابپتثجچحخدذرزژسشصضطظعغفق کگلمنوهی]+$', // 'message' => 'فرستنده وگیرنده فقط به حروف یاید وارد شوند ', // 'on' => 'usercreate' // ), // array('sender,phone,receiver,factor,content', 'required'), array('factor', 'required', 'on' => 'factor'), //array('factor', 'unique', 'on' => 'factor','message'=>' {attribute}"{value}" قبلا ثبت شده است.'), array('username,password', 'required', 'on' => 'usernamepass'), array('is_deleted,phone, status', 'numerical', 'integerOnly' => true, 'message' => ' {attribute} را به عدد وارد نمایید'), array('content, start_date ,productdesc, productqty,productweight,productfee', 'safe'), array('id, morakhas,sender, receiver, phone,user_id factor, content, submit_date, is_deleted, status', 'safe', 'on' => 'search'), ); } /** * @return array relational rules. */ public function relations() { return array( 'user' => array(self::BELONGS_TO, 'User', 'user_id'), ); } /** * @return array customized attribute labels (name=>label) */ public function attributeLabels() { return array( 'id' => 'شناسه', 'admin_id' => 'ارسال کننده', 'sender' => 'فرستنده', 'receiver' => 'گیرنده', 'user_id' => 'کاربر', 'phone' => 'تلفن جهت هماهنگی', 'factor' => 'کد', 'content' => 'آدرس حمل', 'submit_date_m' => 'تاریخ ثبت مدیر', 'submit_date' => 'تاریخ ارسال کاربر', 'is_deleted' => 'Is Deleted', 'status' => 'وضعیت', 'extra_content' => 'توضیحات', 'productdesc' => 'شرح خرید', 'productqty' => 'تعداد محصول', 'productweight' => 'وزن محصول', 'productfee' => 'فی محصول', 'username' => 'نام کاربری', 'password' => 'رمز عبور', 'morakhas' => 'مرخص شده به نام', 'type_address' => 'نوع آدرس', ); } public function search($param = array()) { // @todo Please modify the following code to remove attributes that should not be searched. $criteria = new CDbCriteria($param); $criteria->with = array('user'); $criteria->compare('t.id', $this->id); $criteria->compare('t.is_deleted', $this->is_deleted); $criteria->compare('user.last_name', $this->user_id, true); $criteria->compare('t.sender', $this->sender, true); $criteria->compare('t.receiver', $this->receiver, true); $criteria->compare('t.phone', $this->phone, true); $criteria->compare('t.factor', $this->factor); $criteria->compare('t.content', $this->content, true); $criteria->compare('t.submit_date', $this->submit_date, true); $criteria->compare('t.is_deleted', $this->is_deleted); $criteria->compare('t.productdesc', $this->productdesc); $criteria->compare('t.productqty', $this->productqty, true); $criteria->compare('t.productweight', $this->productweight); $criteria->compare('t.productfee', $this->productfee); return new CActiveDataProvider($this, array( 'criteria' => $criteria, )); } /** * Returns the static model of the specified AR class. * Please note that you should have this exact method in all your CActiveRecord descendants! * @param string $className active record class name. * @return Address the static model class */ public static function model($className = __CLASS__) { return parent::model($className); } }
حالا میریم که crud بسازیم به وسیله ی crud generator
ابتدا باید اسم مدلی که توی مرحله ی قبل ایجاد کردیم رو توی model class وارد کنیم.
بعدش اسم کنترلرمونو انتخاب کنیم اینجا user
سپس preview و در نهایت generate
پس از این کار سیستم در فولدر کنترلر , userController را ایجاد میکنه
همچنین در فولدر ویو فولدری به اسم user ایجاد میکنه که شامل ویو هایی هست که توی تصویر میبینین.
توی جلسه ی بعد این بحث رو ادامه خواهیم داد .
با تشکر . موفق باشین