рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдкреНрд░рд╢рд╛рд╕рдирд┐рдХ рдкреГрд╖реНрда рдмрдирд╛рдиреЗ рдХреА рдмрд╣реБрдд рдХрдо рдЬрд╛рдирдХрд╛рд░реА рд╣реИ, рдФрд░ рд╢рд╛рдпрдж рд╣рд░ рдХреЛрдИ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЕрднреА, рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ Yii рдкрд░ рд╡рд┐рдХрд╛рд╕рд╢реАрд▓ рд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рдЖрдзреЗ рд╕рд╛рд▓ рддрдХ рдХреНрдпрд╛ рдкрд╣реБрдВрдЪрд╛ рд╣реВрдВ (рд▓реЗрдЦ рдХреЗрд╡рд▓ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рд░реВрдкрд░реЗрдЦрд╛ рдХреЛ рд╕рдордЭрддреЗ рд╣реИрдВ)ред
рд▓рдХреНрд╖реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рд╣рдореЗрд╢рд╛ рдпрд╣ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╕рд╛рдЗрдЯ рдХреЗ рдмреИрдХреЗрдВрдб рднрд╛рдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╣реИ:
- рдиреНрдпреВрдирддрдо рдХреЛрдб рдФрд░, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдХреБрдЫ рдбреЗрдЯрд╛ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг
- рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░ рдпреЛрдЧреНрдп
- рд╕рд╛рдЗрдЯ рдХреЗ рдлреНрд░рдВрдЯреЗрдВрдб рдФрд░ рдмреИрдХреЗрдВрдб рднрд╛рдЧреЛрдВ рдХреЗ рдмреАрдЪ рд╕реАрдзрд╛ рд╕рдВрдмрдВрдз рдХрд╛ рдЕрднрд╛рд╡
рдиреНрдпреВрдирддрдо рдХреЛрдб
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдмрд┐рд▓реНрдЯ-рдЗрди рд╡рд╛рдИрдЖрдИ рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реАрдЖрд░рдпреВрдбреА рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рд╣реИ, рд╡реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд▓рдЧрднрдЧ рдПрдХ рд╣реА рдХреЛрдб рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдУрдУрдкреА рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╖реНрдЯрдкреНрд░рдж рдФрд░ рдереЛрдбрд╝рд╛ рд╡рд┐рдкрд░реАрдд рд╣реИред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рд╣рдо рдпрд╣ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрд░рд┐рдПрдЯ рдФрд░ рдЕрдкрдбреЗрдЯ рдХреНрд░рд┐рдпрд╛ рдХреЗрд╡рд▓ рдЖрдИрдбреА рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрддреА рд╣реИ (рдирдП рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП рдЖрдИрдбреА рдЕрднреА рддрдХ рдирд╣реАрдВ рдмрдирд╛рдИ рдЧрдИ рд╣реИ), рдЗрд╕рд▓рд┐рдП рд╣рдо рдХреНрд░рд┐рдПрдЯ рдПрдХреНрд╢рди рдХреЛ рдмрд╛рд╣рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдбреЗрдЯрд╛ рдХрд╛ рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг
рдлрд┐рд▓рд╣рд╛рд▓, рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХрдорд╛рддреНрд░ рдбреЗрдЯрд╛ рд╕рдВрдХрд▓рди рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП "рдЯреЛрдХрд░реА рдореЗрдВ" рд╕реНрдерд┐рддрд┐ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд▓рдЧрднрдЧ рд╕рднреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ 0 (рд╕рд╛рдорд╛рдиреНрдп рдФрд░ 1 - рджреВрд░рд╕реНрде) рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдерд┐рддрд┐ рдлрд╝реАрд▓реНрдб (рдЫреЛрдЯреЗ, рд╕реВрдЪрдХрд╛рдВрдХ) рд╣реИред
рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░ рдпреЛрдЧреНрдп
рд╕рднреА рдирд┐рдпрдореЛрдВ рдореЗрдВ рд╕рдВрднрд╡рддрдГ рдЕрдкрд╡рд╛рдж рд╣реИрдВ, рдФрд░ рд╣рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрдирдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдмреИрдХрдПрдВрдб рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдХрд┐рд╕реА рднреА рдорд╛рдирдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрд╡рд╕рд░ рд╣реИред
рдлреНрд░рдВрдЯрдПрдВрдб рдФрд░ рдмреИрдХрдПрдВрдб рдХреЗ рдмреАрдЪ рд╕реАрдзрд╛ рд╕рдВрдмрдВрдз рдХрд╛ рдЕрднрд╛рд╡
рдмреИрдХрдПрдВрдб рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╣рдЯрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЙрд╕реА рдирд╛рдо рдХреЗ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рджрд░реНрдж рд░рд╣рд┐рдд рдирд┐рд╖реНрдХрд╛рд╕рди рд╣реИред
7 рдЪрд░рдгреЛрдВ рдореЗрдВ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ
1. рд╣рдо рдорд╛рдирдХ рдЬреАрдЖрдИрдЖрдИ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ "рдмреИрдХрдПрдВрдб" рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ (рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИ)ред
2. рд╣рдо рдореВрд▓ рдореЙрдбрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЯреЛрдХрд░реА рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдПред
abstract class TModel extends CActiveRecord { const STATUS_DEFAULT = 0; const STATUS_REMOVED = 1; public function defaultScope() { return array( 'condition' => 'status=' . self::STATUS_DEFAULT ); } public function removed() { $this->resetScope()->getDbCriteria()->mergeWith(array( 'condition' => 'status=' . self::STATUS_REMOVED )); return $this; } public function restore() { if($this->getIsNewRecord()) throw new CDbException(Yii::t('yii','The active record cannot be deleted because it is new.')); if($this->status != self::STATUS_REMOVED) return false; $this->status = self::STATUS_DEFAULT; $this->save(false, array('status')); return true; } public function beforeDelete() { if($this->status == self::STATUS_DEFAULT) { $this->status = self::STATUS_REMOVED; $this->save(false, array('status')); return false; } return parent::beforeDelete(); } }
3. рд╣рдо CRUD рдХреЗ рд▓рд┐рдП рдореВрд▓ рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рддреЗ рд╣реИрдВред
class BackendController extends CController { public $defaultAction = 'list'; public function actions() { return array( 'list' => 'backend.actions.ListAction', 'update' => 'backend.actions.UpdateAction', 'delete' => 'backend.actions.DeleteAction', 'restore' => 'backend.actions.RestoreAction', ); } }
4. рд╣рдо рдПрдХ рдореВрд▓ рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ "рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддрд╛ рд╣реИ" рдХрд┐ рдпрд╣ рдХрд┐рд╕ рдореЙрдбрд▓ рдФрд░ рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдЖрдорддреМрд░ рдкрд░ рдореИрдВ рдХреЛрдб рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдирд╣реАрдВ рдХрд░рддрд╛, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдореИрдВрдиреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдХреА рд╣реИрдВ)ред
abstract class BackendAction extends CAction { private $_modelName; private $_view; public function redirect($actionId = null) { if($actionId === null) $actionId = $this->controller->defaultAction; $this->controller->redirect(array($actionId)); } public function render($data, $return = false) { if($this->_view === null) $this->_view = $this->id; return $this->controller->render($this->_view, $data, $return); } public function getModel($scenario = 'insert') { if(($id = Yii::app()->request->getParam('id')) === null) $model = new $this->modelName($scenario); else if(($model = CActiveRecord::model($this->modelName)->resetScope()->findByPk($id)) === null) throw new CHttpException(404, Yii::t('base', 'The specified record cannot be found.')); return $model; } public function getModelName() { if($this->_modelName === null) $this->_modelName = ucfirst($this->controller->id); return $this->_modelName; } public function setView($value) { $this->_view = $value; } public function setModelName($value) { $this->_modelName = $value; } }
5. рдПрдХ рдореВрд▓ рд╕реВрдЪреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдмрдирд╛рдПрдБред
class ListAction extends BackendAction { public function run($showRemoved = null) { $model = $this->getModel('search'); if($showRemoved !== null) $model->removed(); if(isset($_GET[$this->modelName])) $model->attributes = $_GET[$this->modelName]; $this->render(array( 'model' => $model, 'showRemoved' => $showRemoved, )); } }
6. рдмреБрдирд┐рдпрд╛рджреА рдЕрджреНрдпрддрди рдХрд╛рд░реНрд░рд╡рд╛рдИ рдмрдирд╛рдПрдБред
class UpdateAction extends BackendAction { public function run() { $model = $this->getModel(); if(isset($_POST[$this->modelName])) { $model->attributes = $_POST[$this->modelName]; if($model->save()) $this->redirect(); } $this->render(array('model' => $model)); } }
6. рдореВрд▓ рдХреНрд░рд┐рдпрд╛ рд╣рдЯрд╛рдПрдБ рдмрдирд╛рдПрдБред
class DeleteAction extends BackendAction { public function run() { $this->getModel()->delete(); $this->redirect(); } }
7. рдПрдХ рдореВрд▓ рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдмрдирд╛рдПрдБред
class RestoreAction extends BackendAction { public function run() { $this->getModel()->restore(); $this->redirect(); } }
рдирд┐рд░реАрдХреНрд╖рдг
рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдореЙрдбрд▓ рдФрд░ рдЕрдиреБрдЪреНрдЫреЗрдж рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рдПрдВред
class Article extends TModel { public static function model($className=__CLASS__) { return parent::model($className); } public function tableName() { return 'article'; } public function rules() { return array( array('name, content, createTime', 'required'), ); } } class ArticleController extends BackendController {
рдкрд░рд┐рдгрд╛рдо
рд╕рдмрд╕реЗ рд╕рд░рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдПрдХ рдирдпрд╛ рд╕реАрдЖрд░рдпреВрдбреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рдЦрд╛рд▓реА рдирд┐рдпрдВрддреНрд░рдХ рдФрд░ рджреЛ рджреГрд╢реНрдп (рд╕реВрдЪреА, рдЕрджреНрдпрддрди) рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдмрд╕ рдЗрд╕реЗ рдЬреЛрдбрд╝реЗрдВ рдпрд╛ рд╡рд░реНрддрдорд╛рди рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВред
рдЯрд┐рдкреНрдкрдгреА
рдореИрдВ рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЛрдб рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕реЗ рдорд╛рдирдХ рд╕реАрдЖрд░рдпреВрдбреА рд╕реЗ рднреА рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред