рдореИрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬреЛ рд╣рдордиреЗ рдкреНрд░рдмрдВрдзрди рд▓реЗрдЦрд╛рдВрдХрди рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рдерд╛ред
рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП, рдПрдХ рд▓реЗрдЦрд╛ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрдЪрдд рдХреЗ рдмрд╛рдж рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдкрд░ рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рд░рдЦрдирд╛ред рд▓рдмреНрдмреЛрд▓реБрдЖрдм рдпрд╣ рд╣реИ рдХрд┐ рд▓реЗрди-рджреЗрди рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рдмрд╛рдж, ActiveRecord рдпрд╣ рдорд╛рди рд▓реЗрдЧрд╛ рдХрд┐ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рд╕рдлрд▓ рдереЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдмрд╛рдж рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдЕрдкрд╡рд╛рдж рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдмрджрд▓реЗ рдореЗрдВ, рд▓реЗрдирджреЗрди рдХреЛ рд╡рд╛рдкрд╕ рд░реЛрд▓ рдХрд░реЗрдЧрд╛ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдзрдордХреА рджреЗрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рд░рд┐рдХреЙрд░реНрдб рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ ActiveRecord рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд░рд┐рдХреЙрд░реНрдб (рдзреНрд╡рдЬ isNewRecord == false) рдХреА рд╕реНрдерд┐рддрд┐ рд╣реЛрдЧреА рдпрд╛ рдкреНрд░рд╛рдЗрдорд░реАрдХреЗ рдкрд╣рд▓реЗ рд╣реА рдирдП рд░рд┐рдХреЙрд░реНрдб рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдЖрдк рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд░рддреЗ рд╕рдордп рдЗрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ (рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХрд┐рдпрд╛ рдерд╛), рддреЛ рдЖрдк рдПрдХ рдЧрд▓рдд рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред
public function actionCreate() { $model = new $this->modelClass('create'); $this->performAjaxValidation($model); $model->attributes = Yii::app()->request->getParam($this->modelClass, array()); if (Yii::app()->request->isPostRequest && !Yii::app()->request->isAjaxRequest) { $transaction = $model->getDbConnection()->beginTransaction(); try { $model->save(); $transaction->commit(); $url = array('update', 'id' => $model->primaryKey); $this->redirect($url); } catch (Exception $e) { $transaction->rollback(); } } $this->render('create', array('model' => $model)); }
рдпрд╣ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ Yii рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЛрдб рд╣реИред рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде - рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рдПрдХ рд▓реЗрдирджреЗрди рдореЗрдВ рд▓рд┐рдкрдЯрд╛ рд╣реИред
рдХреНрдпрд╛ рдХрд░реЗрдВ? рд░реЛрд▓рдмреИрдХ () рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ ActiveRecord рдХреА рдореВрд▓ рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореВрд▓ рдореЙрдбрд▓ рдХреЗ рдЕрдВрджрд░ рдмрджрд▓реЗ рдЧрдП рд╕рднреА ActiveRecords рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЕрднреА рднреА рдЖрд╡рд╢реНрдпрдХ рдерд╛ред
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╡реИрд╢реНрд╡рд┐рдХ рджрд┐рдорд╛рдЧ рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВ, рдЕрдЪрд╛рдирдХ, рд╣рдо рдПрдХ рд╕рд╛рдЗрдХрд┐рд▓ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред
рдЧрд┐рддреБрдм рдореЗрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдкрд░ рдкрд╣рд▓реЗ рд╣реА рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рдЪреБрдХреА рд╣реИред рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдХрд╣рд╛ рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдврд╛рдВрдЪрд╛ рд╕реНрддрд░ рдкрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдВрд╕рд╛рдзрди-рдЧрд╣рди рд╣реИред рдореЙрдбрд▓ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХрд╛рдВрд╢ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рдЧрд╛рдпрдм рд╣реИрдВ - рд╣рдо рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВред
CDbTransaction рд╡рд░реНрдЧ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ред
class DbTransaction extends CDbTransaction { private $_models = array(); public function isModelStateStoredForRollback($model) { return in_array($model, $this->_models, true); } public function storeModelStateForRollback($model) { if (!$this->isModelStateStoredForRollback($model)) { $model->storeState(false); $this->_models[] = $model; } } public function rollback() { parent::rollback(); foreach ($this->_models as $model) { $model->restoreState(); } $this->_models = array(); } }
рд╣рдо BaseActiveRecord рдХреНрд▓рд╛рд╕ (CActiveRecord рдПрдХреНрд╕рдЯреЗрдВрд╢рди, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ) рдореЗрдВ рд░рд┐рд╕реНрдЯреЛрд░рд╕реНрдЯреЗрдЯ (), hasStoredState () рдФрд░ storeState () рддрд░реАрдХреЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
abstract class BaseActiveRecord extends CActiveRecord { protected $_storedState = array(); public function hasStoredState() { return $this->_storedState !== array(); } public function storeState($force = false) { if (!$this->hasStoredState() || $force) { $this->_storedState = array( 'isNewRecord' => $this->isNewRecord, 'attributes' => $this->getAttributes(), ); } } public function restoreState() { if ($this->hasStoredState()) { $this->isNewRecord = $this->_storedState['isNewRecord']; $this->setAttributes($this->_storedState['attributes'], false); $this->_storedState = array(); } } }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХреЛрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдХреЗрд╡рд▓ isNewRecord рдзреНрд╡рдЬ рдФрд░ рд╡рд░реНрддрдорд╛рди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ (рдкреНрд░рд╛рдердорд┐рдХ рд╕рд╣рд┐рдд) рдХрд╛ рдмреИрдХрдЕрдк рд▓реЗрддреЗ рд╣реИрдВред рдЕрдм рдХреЗрд╡рд▓ рд╕рд╣реЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореЙрдбрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╣рдорд╛рд░реЗ рдкрд╣рд▓реЗ рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ рдХреЛ рд╕рд╣реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред
public function actionCreate() { $model = new $this->modelClass('create'); $this->performAjaxValidation($model); $model->attributes = Yii::app()->request->getParam($this->modelClass, array()); if (Yii::app()->request->isPostRequest && !Yii::app()->request->isAjaxRequest) { $transaction = $model->getDbConnection()->beginTransaction();
рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рд╣рдо рдереЛрдбрд╝рд╛ рдЖрдЧреЗ рдмрдврд╝реЗ - $ рд▓реЗрди-рджреЗрди рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛- BaseMctiveRecord рдХреЗ рд╕реНрд╡рдпрдВ рдХреЛ рдмрдЪрд╛рдиреЗ () рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреЛрд░рдореЙрдбрд▓рд╕реНрдЯреЗрдЯрдлрд╝реЛрд░ рд░реЛрд▓рдмреИрдХ ($ рдореЙрдбрд▓)ред
abstract class BaseActiveRecord extends CActiveRecord {
рдЗрд╕рдиреЗ рдмрд╛рдХреА рдХреЛрдб рдХреЛ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рдХрд┐ рд▓реЗрди-рджреЗрди рдХреЗ рд░реЛрд▓рдмреИрдХ рдХреЗ рдмрд╛рдж рдореЙрдбрд▓ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рд╡рд░реНрддрдорд╛рди рдореЙрдбрд▓ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рднрд╛рдЧ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдореЙрдбрд▓ рдХрд╛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдмреИрдХрдЕрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред
рдРрд╕рд╛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдФрд░ рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреНрдпрд╛рд╕ рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рдЗрд╕реЗ рддреБрд░рдВрдд рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХреАрдбрд╝реЗ рдХреЗ рдХрд╛рд░рдг рдХреА рдЦреЛрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред