Yii рдкрд░ рдЕрдиреНрдп рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░

рдкрд░рд┐рдЪрдп


рд╣рд░ рдХреЛрдИ рдЬреЛ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд╡рд╛рдИрдЖрдИрдЖрдИ рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рд░реВрдк рдореЗрдВ, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдпрд╣ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд ORM рдШрдЯрдХ ActiveRecord рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рдмрд┐рдВрджреБ рдкрд░, рдореБрдЭреЗ рдЗрд╕ рддрдереНрдп рд╕реЗ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдХрд┐ рдХрдИ рджреВрд░рд╕реНрде рд╕рд░реНрд╡рд░реЛрдВ рдкрд░ рднреМрддрд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрдерд┐рдд рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рдпрд╣ рдХрдВрдкрдиреА рдХреЗ рд╡рд┐рддрд░рд┐рдд рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдПрдлрд╝рдЯреАрдкреА рдФрд░ рд░реЗрдбрд┐рдпрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЗрдВрджреНрд░реАрдХреГрдд рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдерд╛ рдЬрд╣рд╛рдВ рдореИрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ, рдПрдХ рдХреЗрдВрджреНрд░реАрдп рдХрд╛рд░реНрдпрд╛рд▓рдп рдХреЗ рд╕рд╛рде рд╢рд╛рдЦрд╛рдУрдВ рдХрд╛ рд╕рдВрдпреЛрдЬрдиред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрдИ рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд╕рд░реНрд╡рд░ рдкрд░ рд╕реНрдерд┐рдд рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдПрдХ рдХреНрд╖рдг рдХреЗ рд╡рд┐рдЪрд╛рд░ рдиреЗ HTTP рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдФрд░ рдЙрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд REST рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рджреЛ рдХрд╛рд░рдг рдереЗ, рдкрд╣рд▓рд╛ рдФрд░ рдореБрдЦреНрдп - рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ REST рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рджреЛрдиреЛрдВ рднрд╛рдЧреЛрдВ рдХреЛ рдХреИрд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рджреВрд╕рд░рд╛ HTTP рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рд╣реИ, рдФрд░ рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдлрд╝рд╛рдпрд░рд╡реЙрд▓ рдХреЗ рд╡рд┐рд╢рд╛рд▓ рдмрд╣реБрдордд рдкрд░ рдЦреБрд▓рд╛ рд╣реИ, рдФрд░ рдкреНрд░реЙрдХреНрд╕реА рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рдПрдХ рднрд╛рдЧ рд▓реЗрдЦ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХрд╛рдлреА рд╕реНрд╡реЗрдЪреНрдЫрд╛ рд╕реЗ рдирд┐рдХрд▓рд╛ред

рдиреАрдЪреЗ рдЙрддрд░ рд░рд╣рд╛ рд╣реИ


рдЗрд╕рд▓рд┐рдП рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рд╣рдореЗрдВ рдПрдХ рдЕрдЬреАрдм рдЧреБрдЪреНрдЫрд╛ рдорд┐рд▓рддрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░, REST API рдХрд╛ рдЙрдкрдпреЛрдЧ рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд╛рдЗрдЯреЛрдВ рдкрд░ рдирд╣реАрдВред рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЗрд░реЗ рдЦрд╛рддрд╛ рдкреНрд░рдмрдВрдзрди рдкреГрд╖реНрда рдкрд░ рдПрдХ HTTP рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкреГрд╖реНрда рдХреА рд╕реЗрд╡рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдЙрд╕ HTTP рдкрд░ рдЖрдЧреЗ рдПрдХ рдФрд░ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╕рд░реНрд╡рд░ рд╕реАрдзреЗ рд╕реНрдерд┐рдд рд╣реИрдВред рдФрд░ рдЙрдирдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ REST API рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред

рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб

рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрд░рд╛рдо рд╕реЗ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рдФрд░ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдереА рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдЕрдВрджрд░ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рдмрдЪреНрдЪреЗ рдХреЗ рдХреМрддреБрдХ рдХреЗ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдореЗрдВ рд▓рдЧреЗ рд░рд╣реЗрдВрдЧреЗред

рдХреИрд╕реЗ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдЦреБрдж рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╡рд┐рдХреА рдореЗрдВ рдмрд╣реБрдд рд╡рд┐рд╕реНрддреГрдд рд╣реИ ред рдпрд╣ рдирд┐рд░реНрдгрдп рдПрдХ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рд╡рд╛рдИ- рд░реАрд╕реНрдЯ -рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдкрд╣рдЪрд╛рди рдХрд╛ рдореБрдЦреНрдп рдЬрд╛рджреВ urlManager рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рд╕рдВрд░рдХреНрд╖рд┐рдд / config / main.php рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ :

'urlManager' => array( 'urlFormat' => 'path', 'showScriptName' => false, 'rules' => array( // REST patterns array('api/list', 'pattern' => 'api/<model:\w+>', 'verb' => 'GET'), array('api/view', 'pattern' => 'api/<model:\w+>/<id:\d+>', 'verb' => 'GET'), array('api/update', 'pattern' => 'api/<model:\w+>/<id:\d+>', 'verb' => 'PUT'), array('api/delete', 'pattern' => 'api/<model:\w+>/<id:\d+>', 'verb' => 'DELETE'), array('api/create', 'pattern' => 'api/<model:\w+>', 'verb' => 'POST'), // Other rules '<controller:\w+>/<id:\d+>'=>'<controller>/view', '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>', '<controller:\w+>/<action:\w+>'=>'<controller>/<action>', ), ), 

рдпрд╣ рдпреЗ рдирд┐рдпрдо рд╣реИрдВ рдЬреЛ рдлреЙрд░реНрдо рдХрд╛ рдЕрдиреБрд░реЛрдз рдкреНрд░реЗрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

POST api.domain.ru/api/users

рдореЗрдВ

POST api.domain.ru/api/create?model=users

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЬреЛ рд╕реБрдЦрдж рдирд╣реАрдВ рдерд╛ рд╡рд╣ рд╡рд╣ рддрд░реАрдХрд╛ рд╣реИ рдЬрдм рдПрдХреНрд╢рди рдореЗрдВ рдореЙрдбрд▓ рдХреЛ рд╕реНрд╡рд┐рдЪ рдмреНрд▓реЙрдХ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рдирдпрд╛ рдореЙрдбрд▓ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛, рдореИрдВ рдПрдХ рдЕрдзрд┐рдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕рдорд╛рдзрд╛рди рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рдПрдХ рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдлреЙрд░реНрдо рдХреЗ рдПрдХ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

  if (isset($_GET['model'])) $_model = CActiveRecord::model(ucfirst($_GET['model'])); 

рдЕрдЧрд▓рд╛, рдореИрдВ рдирд┐рдпрдВрддреНрд░рдХ рдХреА рдкреВрд░реА рд╕реВрдЪреА рджреЗрддрд╛ рд╣реВрдВ, рдЬреЛ рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд┐рдХрд▓рд╛ (рдореИрдВрдиреЗ рдЬрд╛рдирдмреВрдЭрдХрд░ рдХрдХреНрд╖рд╛ рдХреЗ рд╕рд╣рд╛рдпрдХ рддрд░реАрдХреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛, рдЬреЛ рдмрд┐рдирд╛ рдмрджрд▓рд╛рд╡ рдХреЗ рдКрдкрд░ рджрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рд╕реЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдзреНрдпрд╛рдп рдХреЗ рдЕрдВрдд рдореЗрдВ рдкреВрд░реНрдг рд╕реНрд░реЛрдд Yii рдЖрд╡реЗрджрди рдХрд╛ рдПрдХ рд▓рд┐рдВрдХ рд╣реИ):

 <?php class ApiController extends Controller { Const APPLICATION_ID = 'ASCCPE'; private $format = 'json'; public function filters() { return array(); } public function actionList() { if (isset($_GET['model'])) $_model = CActiveRecord::model(ucfirst($_GET['model'])); if (isset($_model)) { $_data = $_model->summary($_GET)->findAll(); if (empty($_data)) $this->_sendResponse(200, sprintf('No items were found for model <b>%s</b>', $_GET['model'])); else { $_rows = array(); foreach ($_data as $_d) $_rows[] = $_d->attributes; $this->_sendResponse(200, CJSON::encode($_rows)); } } else { $this->_sendResponse(501, sprintf( 'Error: Mode <b>list</b> is not implemented for model <b>%s</b>', $_GET['model'])); Yii::app()->end(); } } public function actionView() { if (isset($_GET['model'])) $_model = CActiveRecord::model(ucfirst($_GET['model'])); if (isset($_model)) { $_data = $_model->findByPk($_GET['id']); if (empty($_data)) $this->_sendResponse(200, sprintf('No items were found for model <b>%s</b>', $_GET['model'])); else $this->_sendResponse(200, CJSON::encode($_data)); } else { $this->_sendResponse(501, sprintf( 'Error: Mode <b>list</b> is not implemented for model <b>%s</b>', $_GET['model'])); Yii::app()->end(); } } public function actionCreate() { $post = Yii::app()->request->rawBody; if (isset($_GET['model'])) { $_modelName = ucfirst($_GET['model']); $_model = new $_modelName; } if (isset($_model)) { if (!empty($post)) { $_data = CJSON::decode($post, true); foreach($_data as $var => $value) $_model->$var = $value; if($_model->save()) $this->_sendResponse(200, CJSON::encode($_model)); else { // Errors occurred $msg = "<h1>Error</h1>"; $msg .= sprintf("Couldn't create model <b>%s</b>", $_GET['model']); $msg .= "<ul>"; foreach($_model->errors as $attribute => $attr_errors) { $msg .= "<li>Attribute: $attribute</li>"; $msg .= "<ul>"; foreach($attr_errors as $attr_error) $msg .= "<li>$attr_error</li>"; $msg .= "</ul>"; } $msg .= "</ul>"; $this->_sendResponse(500, $msg); } } } else { $this->_sendResponse(501, sprintf( 'Error: Mode <b>create</b> is not implemented for model <b>%s</b>', $_GET['model'])); Yii::app()->end(); } } public function actionUpdate() { $post = Yii::app()->request->rawBody; if (isset($_GET['model'])) { $_model = CActiveRecord::model(ucfirst($_GET['model']))->findByPk($_GET['id']); $_model->scenario = 'update'; } if (isset($_model)) { if (!empty($post)) { $_data = CJSON::decode($post, true); foreach($_data as $var => $value) $_model->$var = $value; if($_model->save()) { Yii::log('API update -> '.$post, 'info'); $this->_sendResponse(200, CJSON::encode($_model)); } else { // Errors occurred $msg = "<h1>Error</h1>"; $msg .= sprintf("Couldn't update model <b>%s</b>", $_GET['model']); $msg .= "<ul>"; foreach($_model->errors as $attribute => $attr_errors) { $msg .= "<li>Attribute: $attribute</li>"; $msg .= "<ul>"; foreach($attr_errors as $attr_error) $msg .= "<li>$attr_error</li>"; $msg .= "</ul>"; } $msg .= "</ul>"; $this->_sendResponse(500, $msg); } } else Yii::log('POST data is empty'); } else { $this->_sendResponse(501, sprintf( 'Error: Mode <b>update</b> is not implemented for model <b>%s</b>', $_GET['model'])); Yii::app()->end(); } } public function actionDelete() { if (isset($_GET['model'])) $_model = CActiveRecord::model(ucfirst($_GET['model'])); if (isset($_model)) { $_data = $_model->findByPk($_GET['id']); if (!empty($_data)) { $num = $_data->delete(); if($num > 0) $this->_sendResponse(200, $num); //this is the only way to work with backbone else $this->_sendResponse(500, sprintf("Error: Couldn't delete model <b>%s</b> with ID <b>%s</b>.", $_GET['model'], $_GET['id']) ); } else $this->_sendResponse(400, sprintf("Error: Didn't find any model <b>%s</b> with ID <b>%s</b>.", $_GET['model'], $_GET['id'])); } else { $this->_sendResponse(501, sprintf('Error: Mode <b>delete</b> is not implemented for model <b>%s</b>', ucfirst($_GET['model']))); Yii::app()->end(); } } private function _sendResponse($status = 200, $body = '', $content_type = 'text/html') { ... } private function _getStatusCodeMessage($status) { ... } private function _checkAuth() { ... } } 

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдЙрдкрдпреБрдХреНрдд рдореЙрдбрд▓ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ActiveRecord рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рд╕рд░рдгреА рдЪрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдХреЗрд╡рд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рдИ рдЧрдИ рд╣реИрдВред рдпрджрд┐ рдЪрдпрди рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдпрд╛ рдХрдореНрдкреНрдпреВрдЯреЗрдмрд▓ рдлрд╝реАрд▓реНрдбреНрд╕ рд╕реЗ рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ getAttributes рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рдореЙрдбрд▓ рдореЗрдВ рд╣реИ ред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, getAttributes рдХрд╛ рдореЗрд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

  public function getAttributes($names = true) { $_attrs = parent::getAttributes($names); $_attrs['quota_limit'] = $this->limit['bytes_in_avail']; $_attrs['quota_used'] = $this->tally['bytes_in_used']; return $_attrs; } 

рдпрд╣ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЗрдЬрд┐рдВрдЧ рдФрд░ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдореЗрдВ рдПрдХ рдирд╛рдорд╛рдВрдХрд┐рдд рдЧреБрдВрдЬрд╛рдЗрд╢ рд╕рд╛рд░рд╛рдВрд╢ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИред "

  public function summary($_getvars = null) { $_criteria = new CDbCriteria(); if (isset($_getvars['count'])) { $_criteria->limit = $_getvars['count']; if (isset($_getvars['page'])) $_criteria->offset = ($_getvars['page']) * $_getvars['count']; } if (isset($_getvars['sort'])) $_criteria->order = str_replace('.', ' ', $_getvars['sort']); $this->getDbCriteria()->mergeWith($_criteria); return $this; } 

рдореЙрдбрд▓ рдХрд╛ рдкреВрд░рд╛ рдкрд╛рда:

 <?php /** * This is the model class for table "ftpuser". * * The followings are the available columns in table 'ftpuser': * @property string $id * @property string $userid * @property string $passwd * @property integer $uid * @property integer $gid * @property string $homedir * @property string $shell * @property integer $count * @property string $accessed * @property string $modified */ class Ftpuser extends CActiveRecord { // Additional quota parameters public $quota_limit; public $quota_used; /** * Returns the static model of the specified AR class. * @return ftpuser 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 'ftpuser'; } /** * @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('uid, gid, count', 'numerical', 'integerOnly' => true), array('userid, passwd, homedir', 'required'), array('userid, passwd', 'length', 'max' => 32), array('homedir', 'length', 'max' => 255), array('shell', 'length', 'max' => 16), array('accessed, modified, quota_limit, quota_used', 'safe'), //array('userid', 'unique'), // The following rule is used by search(). // Please remove those attributes that should not be searched. array('id, userid, passwd, uid, gid, homedir, shell, count, accessed, modified', '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( 'limit' => array(self::HAS_ONE, 'FTPQuotaLimits', 'user_id'), 'tally' => array(self::HAS_ONE, 'FTPQuotaTallies', 'user_id'), ); } /** * @return array customized attribute labels (name=>label) */ public function attributeLabels() { return array( 'id' => 'Id', 'userid' => 'Userid', 'passwd' => 'Passwd', 'uid' => 'Uid', 'gid' => 'Gid', 'homedir' => 'Homedir', 'shell' => 'Shell', 'count' => 'Count', 'accessed' => 'Accessed', 'modified' => 'Modified', ); } /** * 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('userid', $this->userid, true); $criteria->compare('homedir', $this->homedir, true); return new CActiveDataProvider('ftpuser', array( 'criteria' => $criteria, )); } public function summary($_getvars = null) { $_criteria = new CDbCriteria(); if (isset($_getvars['count'])) { $_criteria->limit = $_getvars['count']; if (isset($_getvars['page'])) $_criteria->offset = ($_getvars['page']) * $_getvars['count']; } if (isset($_getvars['sort'])) $_criteria->order = str_replace('.', ' ', $_getvars['sort']); $this->getDbCriteria()->mergeWith($_criteria); return $this; } public function getAttributes($names = true) { $_attrs = parent::getAttributes($names); $_attrs['quota_limit'] = $this->limit['bytes_in_avail']; $_attrs['quota_used'] = $this->tally['bytes_in_used']; return $_attrs; } protected function afterFind() { parent::afterFind(); $this->quota_limit = $this->limit['bytes_in_avail']; $this->quota_used = $this->tally['bytes_in_used']; } protected function afterSave() { parent::afterSave(); if ($this->isNewRecord && !empty($this->quota_limit)) { $_quota = new FTPQuotaLimits(); $_quota->user_id = $this->id; $_quota->name = $this->userid; $_quota->bytes_in_avail = $this->quota_limit; $_quota->save(); } } protected function beforeValidate() { if ($this->isNewRecord) { if (empty($this->passwd)) $this->passwd = $this->genPassword(); $this->homedir = Yii::app()->params['baseFTPDir'].$this->userid; } elseif ($this->scenario == 'update') { if (empty($this->quota_limit)) { FTPQuotaLimits::model()->deleteAllByAttributes(array('name' => $this->userid)); FTPQuotaTallies::model()->deleteAllByAttributes(array('name' => $this->userid)); } else { $_quota_limit = FTPQuotaLimits::model()->find('name = :name', array(':name' => $this->userid)); if (isset($_quota_limit)) { $_quota_limit->bytes_in_avail = $this->quota_limit; $_quota_limit->save(); } else { $_quota_limit = new FTPQuotaLimits(); $_quota_limit->name = $this->userid; $_quota_limit->user_id = $this->id; $_quota_limit->bytes_in_avail = $this->quota_limit; $_quota_limit->save(); } } } return parent::beforeValidate(); } protected function beforeDelete() { FTPQuotaLimits::model()->deleteAllByAttributes(array('name' => $this->userid)); FTPQuotaTallies::model()->deleteAllByAttributes(array('name' => $this->userid)); return parent::beforeDelete(); } private function genPassword($len = 6) { $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; $count = mb_strlen($chars); for ($i = 0, $result = ''; $i < $len; $i++) { $index = rand(0, $count - 1); $result .= mb_substr($chars, $index, 1); } return $result; } } 

рдкреВрд░реНрдг рдкреНрд░рд╕рдиреНрдирддрд╛ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЪреАрдЬ рдЧрд╛рдпрдм рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдлрд╝реЙрд░реНрдо / рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ / 156 / рд░рд┐рдХреЙрд░реНрдб рдХреЗ рдиреЗрд╕реНрдЯреЗрдб рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИ, рд╕реАрдПрдордПрд╕ рдирд╣реАрдВ, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдореЗрд░рд╛ рдорд╛рдорд▓рд╛ рд╕рд░рд▓ рд╣реИ, рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереАред

рд╕рд░реНрд╡рд░ рднрд╛рдЧ рдХреЗ рд╕рд╛рде, рдЧреНрд░рд╛рд╣рдХ рдХреЗ рдкрд╛рд╕ рдЬрд╛рдПрдВред рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдпрд╣рд╛рдВ Yii рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб рдкреЛрд╕реНрдЯ рдХрд░рддрд╛ рд╣реВрдВред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рд▓рд┐рдВрдХ рдХрдм рддрдХ рдЬреАрд╡рд┐рдд рд░рд╣реЗрдЧрд╛, рдпрджрд┐ рдЕрдзрд┐рдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕реБрдЭрд╛рд╡ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рднрд░реЛрд╕реЗрдордВрдж рд░реВрдк рд╕реЗ рд░рдЦрд╛ рдЬрд╛рдП - рдХреГрдкрдпрд╛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдзреНрдпрд╛рди рджреЗрдВред

рдЧреНрд░рд╛рд╣рдХ рднрд╛рдЧ

рдореЗрд░реА рдмрд╛рдЗрдХ рди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЫреЛрдЯреА рд╕реА рдЦреЛрдЬ рдХреА рдЧрдИ рдФрд░ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ ActiveResource рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдорд┐рд▓рд╛ред рд▓реЗрдЦрдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдкреНрд░реЗрд░рдгрд╛ рдХрд╛ рд╕реНрд░реЛрдд рд░реВрдмреА рдореЗрдВ ActiveResource рдХрд╛ рд░реЗрд▓ рдкрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдерд╛ред рдкреГрд╖реНрда рдореЗрдВ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг рд╣реИ рдХрд┐ рдХреИрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдФрд░ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рд▓рдЧрднрдЧ рддреБрд░рдВрдд рд╣реА рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрд╣ ActiveRecord рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдПрдХ рдШрдЯрдХ рд╣реИ, рд▓реЗрдХрд┐рди Yii GridView рдпрд╛ ListView рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП, ActiveDataProvider рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдШрдЯрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рддреНрд╡рд░рд┐рдд рдЦреЛрдЬ рдиреЗ рдореБрдЭреЗ рдПрдХ рдЕрд▓рдЧ рд╢рд╛рдЦрд╛ рдореЗрдВ рдХрд┐рдП рдЧрдП рд╕реБрдзрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд╛рдпрд╛, рдЬрд┐рд╕рдореЗрдВ EActiveResourceDataProvider рдФрд░ EActiveResourceQueryCriteria рд╢рд╛рдорд┐рд▓ рд╣реИрдВ , рд╕рд╛рде рд╣реА рд╕рд╛рде рдлреЛрд░рдо рдереНрд░реЗрдб рдореЗрдВ рдЙрдирдХреА рдЪрд░реНрдЪрд╛ рдЬрд╣рд╛рдВ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓реЗрдЦрдХ рдиреЗ рднрд╛рдЧ рд▓рд┐рдпрд╛ред ESort рдФрд░ EActiveResourceDataProvider рдХреЗ рд╕рдВрд╢реЛрдзрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рднреА рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдП рдЧрдП рдереЗ ред

рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рднреА рд▓рд╛рд▓рд┐рддреНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдлрд╝рд╛рдЗрд▓ рдкреВрд░реА рдирд╣реАрдВ рдереАред рд╕рдорд╕реНрдпрд╛ рдЧреНрд░рд┐рдб рдореЗрдВ рдЦрд░рд╛рдмреА рдХреЗ рдШрдЯрдХ рдерд╛ред рд╕реНрд░реЛрдд рдХреЗ рдПрдХ рддреНрд╡рд░рд┐рдд рдЕрдзреНрдпрдпрди рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдСрдлрд╕реЗрдЯ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдСрдлрд╕реЗрдЯ рдереА, рдЬрд┐рд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрдмрдХрд┐ рдЧреНрд░рд┐рдб рд╡реНрдпреВ рдореЗрдВ рдкреЗрдЬреЗрд╢рди рдкреЗрдЬ рдирдВрдмрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдкреНрд░рддрд┐ рдкреГрд╖реНрда 10 рд░рд┐рдХреЙрд░реНрдб рдмрдирд╛рддреЗ рд╕рдордп, рдЬрдм рдкреГрд╖реНрда 2 рдкрд░ рдЬрд╛ рд░рд╣реЗ рдереЗ, рддреЛ рд╣рдореЗрдВ рдкреГрд╖реНрда 20 рдкрд░ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╣рдо рдХреЛрдб рдореЗрдВ рдЪрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрд░рдХреНрд╖рд┐рдд / рдПрдХреНрд╕рдЯреЗрдВрд╢рди / EActiveResource / EActiveResourceQueryCriteria.php , рдмрд┐рд▓реНрдбрд╡рд┐рдХреИрд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ , рдпрд╣ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:

 if($this->offset>0) // array_push($parameters, $this->offsetKey.'='.$this->offset); array_push($parameters, $this->offsetKey.'='.$this->offset / $this->limit); 

рдЙрд╕рдХреЗ рдмрд╛рдж, рдпрд╣ рдЕрдзрд┐рдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХреЗ рд░реВрдк рдореЗрдВ EActiveResourcePagination рд╕реЗ getOffset рд╡рд┐рдзрд┐ рдХреЗ рдЕрдзрд┐рднрд╛рд░ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдЗрд╕рд▓рд┐рдП, REST рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рд╣реЛрдВрдЧреЗ, рдмрд╛рдХреА рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ GII рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдирд╛рдП рдЬрд╛рдПрдВрдЧреЗред

рдЕрд▓рдЧ-рдЕрд▓рдЧ, рдореИрдВ рдХрдИ рд╕рд░реНрд╡рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рджреВрд░рд╕реНрде REST API рдХрд╛ рдХрдиреЗрдХреНрд╢рди рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╣рдо рдЕрдкрдиреА рд╕рд╛рдЗрдЯ рдкрд░ рдХреЗрд╡рд▓ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдбреЗрдЯрд╛рдмреЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрдиреЗ рдФрд░ ActiveResource рдШрдЯрдХ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХрдиреЗрдХреНрд╢рди рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рд╡рд╣рд╛рдВ рд╕реЗ рдЕрддрд┐рднрд╛рд░рд┐рдд getConnection рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рдВрд╢рдЬ рдмрдирд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ (рдпрд╣ рдПрдлрд╝рдЯреАрдкреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдорд╛рдорд▓рд╛ рд╣реИ, рд╕рд░реНрд╡рд░ рдбреЗрдЯрд╛ рдХреЛ FTPServers рдореЙрдбрд▓ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ):

 abstract class EActiveResourceSelect extends EActiveResource { /** * Returns the EactiveResourceConnection used to talk to the service. * @return EActiveResourceConnection The connection component as pecified in the config */ public function getConnection() { $_server_id = Yii::app()->session['ftp_server_id']; $_db_params = array(); if (isset($_server_id)) { $_srv = FTPServers::model()->findByPk($_server_id); if (isset($_srv)) $_db_params = $_srv->attributes; else Yii::log('info', "No FTP server with ID: $_server_id were found"); } else { $_srv = FTPServers::model()->find(); if (isset($_srv)) { $_db_params = $_srv->attributes; Yii::app()->session['ftp_server_id'] = $_srv->id; } else Yii::log("No FTP servers were found", CLogger::LEVEL_INFO); } self::$_connection = new EActiveResourceConnection(); self::$_connection->init(); self::$_connection->site = $_db_params['site']; self::$_connection->acceptType = $_db_params['acceptType']; self::$_connection->contentType = $_db_params['contentType']; if (isset($_db_params['username']) && isset($_db_params['password'])) { self::$_connection->auth = array( 'type' => 'basic', 'username' => $_db_params['username'], 'password' => $_db_params['password'], ); } return self::$_connection; } } 

рдЧреНрд░рд╛рд╣рдХ рднрд╛рдЧ рдХреЗ рдЖрдЧреЗ рд╡рд┐рдХрд╛рд╕ рд╕рд╛рдорд╛рдиреНрдп ActiveRecord рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдХрд╛рд╕ рд╕реЗ рдмрд╣реБрдд рднрд┐рдиреНрди рдирд╣реАрдВ рдерд╛, рдЬреЛ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, ActiveResource рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдореБрдЦреНрдп рдЖрдХрд░реНрд╖рдг рд╣реИред

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд▓реЗрдЦ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

Source: https://habr.com/ru/post/In216475/


All Articles