Yii рдХреЛ рдлрд╛рдЗрд▓реЗрдВ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ

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

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

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

рдкрд╣рд▓рд╛ рдкреБрдирд░рд╛рд╡реГрддрд┐ рд╣рдо рдорд╛рдирдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдкреВрд░рдХ рд╣реИрдВред


Yii рдХреНрдпрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ? рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, CUploadedFile рд╡рд░реНрдЧ, рдЬреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕рд░реНрд╡рд░ рдкрд░ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рджреВрд╕рд░реЗ, CFileValidator рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛, рдЬреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ:

 //  class MyModel extends CActiveRecord { public $image; public function rules(){ return array( array('image', 'file', 'types'=>'jpg, gif, png'), ); } } //  class MyModelController extends CController { public function actionCreate(){ $modMyModel=new MyModel; if(isset($_POST['MyModel'])){ $modMyModel->attributes=$_POST['MyModel']; $modMyModel->id_image=CUploadedFile::getInstance($modMyModel,'image'); if($modMyModel->save()){ $modMyModel->id_image->saveAs('path/to/localFile'); //   ,     //   } } $this->render('create', array('model'=>$modMyModel)); } } //  <?php echo CHtml::form('','post',array('enctype'=>'multipart/form-data')); ?> ... <?php echo CHtml::activeFileField($modMyModel, 'image'); ?> ... <?php echo CHtml::endForm(); ?> 


рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдХрдИ рдиреБрдХрд╕рд╛рди рд╣реИрдВ:

  1. рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдПрдХ рд╕рдорд░реНрдкрд┐рдд рдлрд╝реЛрд▓реНрдбрд░ рдирд╣реАрдВ рд╣реИ
  2. рдлрд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХреЛ рд╣рд░ рдмрд╛рд░ рдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ рдмрддрд╛рдирд╛ рд╣реЛрдЧрд╛
  3. рдЗрдВрдЧрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ actionUpdate() рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рд▓реЛрдб рдХреА рдЬрд╛рдПред рдФрд░ рд╕рд╛рдзрд╛рд░рдг рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ - рдореЙрдбрд▓ рдмрдирд╛рддреЗ рд╕рдордп рд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЗрд╕реЗ рдмрджрд▓рддреЗ рд╕рдордп рдкреБрдирд░рд╛рд░рдВрдн рдХрд░реЗрдВред
  4. рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╛рдж рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╕рд┐рдлрд╛рд░рд┐рд╢ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореЙрдбрд▓ рдкреНрд░реЙрдкрд░реНрдЯреА рдореЗрдВ path/to/localFile рдХреЛ рд╕реНрдЯреЛрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдмреЗрд╢рдХ, рдореИрдВ рдХреЗрд╡рд▓ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрди рдХрдорд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдФрд░ рдпрд╣рд╛рдБ рдореИрдВ рдкреЗрд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрдЧрд╣ рддрдп рдХрд░рддреЗ рд╣реИрдВред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ .../protected/data/files рднрдВрдбрд╛рд░рдг .../protected/data/files рд▓рд┐рдП рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реИред рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдХрд╛рдо рдХреЗ рджреМрд░рд╛рди рдмрдирд╛рдИ рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рд╣реИ .../protected/runtime , рд▓реЗрдХрд┐рди рдЕрд░реНрде рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ data рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реИред рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ ( uniqid() ) рдФрд░ рдореЙрдбрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд $modMyModel->id_image , рдЕрдЧрд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗред рд╕рдЪ рд╣реИ, рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдПрдХ рдиреБрдХрд╕рд╛рди рд╣реИ - data рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП рдмрдВрдж рд╣реИред рдЗрд╕рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯреЗрдВ - рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рджред рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ readfile() рдорд╛рдзреНрдпрдо рд╕реЗ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ, рдФрд░ assets рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЪрд┐рддреНрд░ (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ, рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рдердВрдмрдиреЗрд▓) рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдВред

рд╣рдордиреЗ рдлрд╝реЛрд▓реНрдбрд░ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдордХрд░рдг рд╣рд▓ рдХрд┐рдпрд╛ред рдЕрдм рд╣рдо рд╕рддреНрдпрд╛рдкрди рдФрд░ рд▓реЛрдбрд┐рдВрдЧ рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗред рд╢реБрд░реБрдЖрдд рдХрд░рддреЗ рд╣реИрдВ рдлреЙрд░реНрдо рд╕реЗред рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ:

 <?php echo $modMyModel->id_image ?> <?php echo CHtml::activeFileField($modMyModel, 'id_image_file'); ?> 


рдЗрд╕рд▓рд┐рдП рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдлрд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рд╣реИ рдпрд╛ рдирд╣реАрдВред рдФрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ id_image_file рдирд╛рдо рд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред echo $modMyModel->id_image рдмрдЬрд╛рдп echo $modMyModel->id_image рдЖрдк рдПрдХ рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдердВрдмрдиреЗрд▓ рдЫрд╡рд┐ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдм рдорд╛рдиреНрдпрддрд╛ рд╣реИред рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ: рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХреЛ рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ $_FILES рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬрд┐рд╕реЗ id_image_file рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдПрдХ CUploadedFile рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ $modMyModel->id_image ред рдлрд┐рд░ рдорд╛рдирдХ рддрд░реАрдХреЗ рд╕реЗ $modMyModel->id_image рдорд╛рдиреНрдп рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, DFileValidator рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ DFileValidator рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ CFileValidator ред рдФрд░ рддреБрд░рдВрдд рдПрдХ рдФрд░ - DImageValidator , DImageValidator рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдлрд╝рд╛рдЗрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВред

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдлрд╝рд╛рдЗрд▓ рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рдФрд░ рдореЙрдбрд▓ рдХреЛ рд╕рд╣реЗрдЬрдирд╛ред рд╕рддреНрдпрд╛рдкрди рдХреЗ рдмрд╛рдж, рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ $modMyModel->id_image , рдФрд░ $modMyModel->id_image рдХреЗ рд░реВрдк рдореЗрдВ CUploadedFile ред рд▓реЛрдбрд┐рдВрдЧ рдХреЛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдкреНрд░реЙрдкрд░реНрдЯреА рд╕реЗ рдмрдВрдзреЗ рд╣реЛрдиреЗ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдореЙрдбрд▓ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕рдХреА рдХреЛрдИ рднреА рдЧреБрдг CUploadedFile рдХреНрд▓рд╛рд╕ рдХреА рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рд╡реЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдПрдбреНрд░реЗрд╕ рд╕реЗрд╡ рдХрд░реЗрдВред рдЕрдм рдореЙрдбрд▓ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

 class MyModel extends DActiveRecord { public $id_image; public function rules(){ return array( array('id_image', 'DImageValidator'), ); } public function beforeSave() { foreach ($this->attributes as $key => $attribute) if ($attribute instanceof CUploadedFile) { $strSource = uniqid(); if ($attribute->saveAs(Yii::getPathOfAlias('application.data.files') . '/' . $strSource)) $this->$key = $strSource; } return parent::beforeSave(); } } 


рдЫрд╡рд┐ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЖрдЗрдбреЗрдВрдЯрд┐_ рдкреНрд░реЙрдкрд░реНрдЯреА рджреНрд╡рд╛рд░рд╛ рд╕рдЪреЗрдд рд░реВрдк рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдЧреЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпреЛрдВред

рдЙрдк-рдпреЛрдЧ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛

  1. рд╕рднреА рдлрд╛рдЗрд▓реЗрдВ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕рд╣реЗрдЬреА рдЬрд╛рддреА рд╣реИрдВ .../protected/data/files рд░реИрдВрдбрдо рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде .../protected/data/files ред
  2. рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рд╣реЗрдЬреЗ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдбрд┐рдВрдЧ рдореЙрдбрд▓ рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИред
  3. рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдП:
    1. rules() рдореЙрдбрд▓ рдореЗрдВ, рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЗ DFileValidator рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВред
    2. рдкреНрд░рдкрддреНрд░ рдореЗрдВ, '_file' рдХреЛ '_file' рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдХрд╛ рдирд╛рдо рдмрджрд▓реЗрдВред

  4. actionCreate() рдФрд░ actionUpdate() рддрд░реАрдХреЛрдВ рдХреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рджреВрд╕рд░рд╛ рдкреБрдирд░рд╛рд╡реГрддрд┐ред рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВред


рд╣рдордиреЗ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдХреИрд╕реЗ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рдЬрдмрдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрд╕рд╕реЗ рдХреИрд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПред img рдЯреИрдЧ рдХреЗ src рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдХреНрдпрд╛ рд▓рд┐рдЦрдирд╛ рд╣реИ? рдбрд╛рдЙрдирд▓реЛрдб рдХреЗ рд▓рд┐рдП рдлрд╛рдЗрд▓ рдХреИрд╕реЗ рджреЗрдВ? рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдИрдЖрдИрдЖрдИ рдореЙрдбрд▓ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ рдХреЛрдИ рдореЙрдбрд▓ рдкреНрд░рддреНрдпреЗрдХ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ, рддреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рд╕рд╣рд┐рдд рд╕рднреА рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ $modMyModel->id_image рдЗрд╕ рдореЙрдбрд▓ рдХреА рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдЕрдм рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдирд╛рдо рдХрд╛ рд╕рд╛рд░ рд╕реНрдкрд╖реНрдЯ рд╣реИ)ред рддрдм $modMyModel рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд░рд┐рд╢реНрддреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдФрд░ рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:

 //  MyModel: public function relations() { return array( 'image' => array(self::BELONGS_TO, 'DImage', 'id_image'), ); } //  : $modMyModel = new MyModel; echo $modMyModel->id_image->image($htmlOptions); //        img echo $modMyModel->file->downloadLink(); //      


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдореВрд▓ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо (рдЬреЛ рдмрдЪрдд рдХрд░рддреЗ рд╕рдордп рдЦреЛ рдЬрд╛рддрд╛ рд╣реИ) рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХрд╛ рдореБрджреНрджрд╛ рд╕реНрд╡рдпрдВ рд╣рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВред

рдлрд╝реАрд▓реНрдб id, source, name рд╕рд╛рде рдПрдХ tbl_files рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдВред рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдЬреБрдбрд╝реЗ DFile рдореЙрдбрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред рд╣рдо рдЗрд╕рдореЗрдВ рд╕реНрдереИрддрд┐рдХ upload рд╡рд┐рдзрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

 class DFile extends DActiveRecord { public $uploadPath; //     public function init() { $this->uploadPath = Yii::getPathOfAlias('application.data.files'); } public static function upload($objFile) { $modFile = new DFile; $modFile->name = $objFile->name; $modFile->source = uniqid(); if ($objFile->saveAs($modFile->uploadPath . '/' . $modFile->source)) if ($modFile->save()) return $modFile; return null; } } 


рдФрд░ рддреБрд░рдВрдд рдПрдХ рдЦрд╛рд▓реА DImage extends DFile рдмрдирд╛рдПрдБ DImage extends DFile ред рд╣рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдЕрдм рдЕрдкрдиреЗ рдореЙрдбрд▓ рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓реЗрдВред рдЪрд┐рддреНрд░ рдХреЗ рд╕рд╛рде рд╡рд╛рджрд╛ рдХрд┐рдП рдЧрдП рдХрдиреЗрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдФрд░ рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рдХреЛ beforeSave() рд╡рд┐рдзрд┐ рдХреЛ beforeSave() :

 class MyModel extends DActiveRecord { public $id_image; public function rules(){ return array( array('id_image', 'DImageValidator', 'allowEmpty' => true), ); } public function relations() { return array( 'image' => array(self::BELONGS_TO, 'DImage', 'id_image'), ); } public function beforeSave() { foreach ($this->attributes as $key => $attribute) if ($attribute instanceof CUploadedFile) { $modFile = DFile::upload($attribute); //   DFile $this->$key = $modFile->id; } return parent::beforeSave(); } } 


рдореЙрдбрд▓ рдХреЗ $modMyModel рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ, рдЖрдк $modMyModel->image рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд╝рд╛рдЗрд▓ рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рд▓рд╛рдн рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ - рдЗрд╕ рдкрд░ рдкрдврд╝реЗрдВред

рддреАрд╕рд░рд╛ рдкреБрдирд░рд╛рд╡реГрддрд┐ред рдЕрдкрд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рддрдХ рдкрд╣реБрдВрдЪред


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

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

рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ

рдореИрдВ рджреЛрд╣рд░рд╛рддрд╛ рд╣реВрдВ, рдЙрдиреНрд╣реЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╛рдЗрд▓реЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЬрд╛рддреА рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдХреНрд╕рд░ рдПрдХреНрд╕реЗрд╕ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдПрдХ рдбрд╛рдЙрдирд▓реЛрдб рд▓рд┐рдВрдХ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рд╛рдЗрд▓ рдЬрд╛рд░реА рдХрд░рдирд╛ред

рд▓рд┐рдВрдХ рдкреАрдврд╝реА DFile рдореЗрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

 class DFile extends DActiveRecord { public function downloadLink($htmlOptions = array()) { return CHtml::link($this->name, array('/files/file/download', 'id' => $this->id), $htmlOptions); } } 


рд▓рд┐рдВрдХ FileController рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:

 class FileController extends DcController { public function actionDownload($id) { $modFile = $this->loadModel($id); header("Content-Type: application/force-download"); header("Content-Type: application/octet-stream"); header("Content-Type: application/download"); header("Content-Disposition: attachment; filename=" . $modFile->name); header("Content-Transfer-Encoding: binary "); readfile($modFile->uploadPath . '/' . $modFile->source); } public function loadModel($id) { $modFile = DFile::model()->findByPk($id); if($modFile === null) throw new CHttpException(404,'The requested page does not exist.'); return $modFile; } } 


рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИред actionDownload() рд╡рд┐рдзрд┐ рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЙрдиреНрд╣реЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореЙрдбрд▓ рдореЗрдВ рдЕрдм, рдЗрд╕реА рд╕рдВрдмрдВрдз рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рдЖрдк $modMyModel->file->downloadLink() рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдмреЗрд╢рдХ, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕реАрдзреЗ рд▓рд┐рдВрдХ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдЙрддреНрдкрд╛рджрдХ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдкреНрд░рджрд░реНрд╢рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рддреЛ рдЖрдк рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд data рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдХрд┐рд╕реА рдЕрдиреНрдп (рдЦреБрд▓реА) рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ, рдФрд░ рд╕реАрдзреЗ рд▓рд┐рдВрдХ рдЬрд╛рд░реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ

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

рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ рдпрджрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЪрд┐рддреНрд░ рдбрд╛рдЙрдирд▓реЛрдб рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВ рдФрд░ рдореВрд▓ рдЪрд┐рддреНрд░ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореВрд▓ рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдЙрдЪреНрдЪ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдердВрдмрдиреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдРрд╕реА рд╕рдорд╕реНрдпрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ, рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рд╕реНрд░реЛрдд рдЫрд╡рд┐ рдХреЛ assets рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдХреЙрдкреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рд▓рд┐рдВрдХ рдмрдирд╛рдПрдВ (Yii рдореЗрдВ рдорд╛рдирдХ рдкреНрд░рдХрд╛рд╢рди рддрдВрддреНрд░ рд▓рд┐рдВрдХ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде рдкреНрд░рдХрд╛рд╢рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ)ред

рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реНрд╡рдпрдВ рд╣реА рдкреНрд░рдХрд╛рд╢рди рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рдирд╣реАрдВ ...

рддреЛ рдЪрд▓рд┐рдП рдЪрд▓рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА DFile рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА DImage рдХреНрд▓рд╛рд╕ рд╣реИред рд╣рдо рдердВрдмрдиреЗрд▓ рдФрд░ рдкреНрд░рдХрд╛рд╢рди рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ:

 class DImage extends DFile { public $assetsPath; //      public $assetsUrl; // URL    public $thumbs = array( 'min' => array('width' => 150, 'height' => 150), 'mid' => array('width' => 250), 'big' => array('width' => 600), ); //   public function init() { $this->assetsUrl = Yii::app()->assetManager->baseUrl . '/files'; $this->assetsPath = Yii::app()->assetManager->basePath . '/files'; if (!is_dir($this->assetsPath)) mkdir($this->assetsPath); } //      $this->assetsPath public function getIsPublished() { foreach ($this->thumbs as $kThumb => $vThumb) if (!is_file($this->assetsPath . '/' . $this->source . '_' . $kThumb)) return false; return true; } //   public function publish() { if (!$this->isPublished) foreach ($this->thumbs as $kThumb => $vThumb) $this->createThumb($this->uploadPath . '/' . $this->source, $this->assetsPath . '/' . $this->source . '_' . $kThumb, $kThumb); return $this->assetsUrl . '/' . $this->source; } //   function createThumb($strSrcFile, $strDstFile, $strThumb) { //    $strSrcFile,   $strDstFile } } 


рдердВрдмрдиреЗрд▓ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ assets рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ files рд╕рдмрдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ assets рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рд╕рдордп-рд╕рдордп рдкрд░ рд╕рд╛рдл рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ, рд╣рд░ рдмрд╛рд░ assets/files рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЬрд╛рдВрдЪ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдмрдирд╛рдПрдВред рдердВрдмрдиреЗрд▓ рдирд╛рдо рдЫрд╡рд┐ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдердВрдмрдиреЗрд▓ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкреВрд░рдХ рд╣реИред рдПрдХ рдЫрд╡рд┐ рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рд╕рднреА рдердВрдмрдиреЗрд▓ рдЬрдЧрд╣ рдореЗрдВ рд╣реИрдВред рд╕реНрд░реЛрдд рдФрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рддрд╛рд░реАрдЦ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред publish() рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд╢рд┐рдд рдЫрд╡рд┐ рдХрд╛ URL рджреЗрддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рдердВрдмрдиреЗрд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдмрд┐рдирд╛), рдЬреЛ рд╡рд╛рдИрдЖрдИрдЖрдИ рдореЗрдВ рдкреНрд░рдХрд╛рд╢рди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдЦрдВрдбрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЕрдкрд▓реЛрдб рдХреА рдЧрдИ рдЫрд╡рд┐ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╣рдо image() рд╕рд╛рде DImage рд╡рд░реНрдЧ рдХреЛ DImage image() рд╡рд┐рдзрд┐:

 public function image($strThumb = 'min', $htmlOptions = array()) { return CHtml::image($this->publish() . '_' . $strThumb, $this->name, $htmlOptions); } 


рдЕрдм, рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛, рдЖрдк рдореЙрдбрд▓ рдореЗрдВ $modMyModel->image->image() рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рд╡реИрд╕реЗ, рдЕрдЧрд░ рдердВрдмрдиреЗрд▓ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдЕрдЪрд╛рдирдХ рдмрджрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдпрд╛ рдПрдХ рдирдпрд╛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ (рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд░ рдХреБрдЫ рд╣реБрдЖ), рдФрд░ рд╕рднреА рдлрд╛рдЗрд▓реЗрдВ рдкрд╣рд▓реЗ рд╣реА рдбрд╛рдЙрдирд▓реЛрдб рд╣реЛ рдЪреБрдХреА рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдФрд░ рд╕рдВрдкрддреНрддрд┐ рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред

рдЫреВ рдордВрддрд░


рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЪрд┐рддреНрд░ рдЕрдкрд▓реЛрдб рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред рдлрд╝рд╛рдЗрд▓реЗрдВ рдЕрдкрд▓реЛрдб рдФрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЬрд╛рддреА рд╣реИрдВред рдпрд╣ рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рдХрдВрдШреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, MySodel рд╡рд░реНрдЧ рд╕реЗ DActiveRecord рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╕реЗрд╡ () рд╡рд┐рдзрд┐ рдХреЛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рднреА рдореЙрдбрд▓ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди DActiveForm extends CActiveForm рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ DActiveForm extends CActiveForm ред рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рднрдВрдбрд╛рд░рдг files рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

рдирд┐рд╖реНрдХрд░реНрд╖


рддреЛ рдпрд╣рд╛рдБ рд╣рдо рдЙрддреНрдкрд╛рджрди рд╣реИ:

  1. рдХреЗрдВрджреНрд░реАрдХреГрдд рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдФрд░ рднрдВрдбрд╛рд░рдг рдкреНрд░рдмрдВрдзрди
  2. рдореЙрдбрд▓ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЧреБрдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ рдЗрдВрдЯрд░рдлреЗрд╕
  3. рдлрд╝рд╛рдЗрд▓реЗрдВ рдФрд░ IMG рдЯреИрдЧ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рд▓рд┐рдВрдХ рдкреАрдврд╝реА


рд╡рд┐рдЪрд╛рд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓рдЧрднрдЧ рд╕рднреА WYCIWYG рд╕рдВрдкрд╛рджрдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдбрд╛рдЙрдирд▓реЛрдб рдкрддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдПрдХ рдбрд╛рдЙрдирд▓реЛрдб рд╣реИрдВрдбрд▓рд░ FileController рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░ рдердВрдмрдиреЗрд▓ рдХреИрд╕реЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдВ?

рдпрд╛ рдлрд┐рд░, рдЖрдк рд▓реЗрдЦреЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕реБрдЭрд╛рд╡реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд░реНрд╡рд░ рдкрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЪрд┐рддреНрд░ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рднрд╛рдЧ рдПрдХ рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рдЕрдкрд▓реЛрдбрд┐рдВрдЧ рдЫрд╡рд┐рдпрд╛рдБ рд╕рд░реНрд╡рд░ рдкрд░ред рднрд╛рдЧ рджреЛ рдЖрдк рдКрдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдЕрдкрд▓реЛрдб рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдкреВрд░рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рд╢рдмреНрдж рдореЗрдВ, рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЬрд▓реНрджрдмрд╛рдЬреА рд╣реЛрдЧреАред рд▓реЗрдХрд┐рди рдпрджрд┐ рд╡рд░реНрдгрд┐рдд рд╡рд┐рдЪрд╛рд░ рдЙрдкрдпреЛрдЧреА рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдХрд╛рдо рдкреВрд░рд╛ рдХрд░рдиреЗ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВред рдЬреЛ рднреА рдкрдврд╝реЗ рдЙрд╕рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж!

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


All Articles