Commit 13ffaf8e467263cc493487cb02ed8000c54f26e6

Authored by Mihail
1 parent 0cb8c7a5

add error handler in brands and image loading

backend/components/base/BaseActiveRecord.php
... ... @@ -9,12 +9,16 @@
9 9 namespace backend\components\base;
10 10  
11 11  
12   -use yii\base\ErrorException;
  12 +use common\components\exceptions\OrdinaryActiveRecordException;
13 13  
14 14 class BaseActiveRecord extends \yii\db\ActiveRecord {
15 15  
  16 + /**
  17 + * @param int $row
  18 + * @throws OrdinaryActiveRecordException
  19 + * выбрасывает специальное исключения, наполняя сообщение с массива ошибок модели (после попытки валидации)
  20 + */
16 21 public function throwStringErrorException($row = 0){
17   -
18 22 $errors_str = '';
19 23 if ($row != 0) {
20 24 $errors_str = "Ошибка в строке {$row} ";
... ... @@ -22,7 +26,9 @@ class BaseActiveRecord extends \yii\db\ActiveRecord {
22 26 foreach ($this->getErrors() as $error) {
23 27 $errors_str .= implode( array_values($error) );
24 28 }
25   - throw new ErrorException( $errors_str );
  29 + $ex = new OrdinaryActiveRecordException( $errors_str );
  30 + $ex->active_record_name = static::formName();
  31 + throw $ex;
26 32 }
27 33  
28 34 }
29 35 \ No newline at end of file
... ...
backend/controllers/BrandsController.php
... ... @@ -9,6 +9,7 @@ use yii\web\Controller;
9 9 use yii\web\NotFoundHttpException;
10 10 use yii\filters\VerbFilter;
11 11 use yii\filters\AccessControl;
  12 +use yii\web\UploadedFile;
12 13  
13 14 /**
14 15 * BrandsController implements the CRUD actions for Brands model.
... ... @@ -82,14 +83,8 @@ class BrandsController extends Controller
82 83 {
83 84 $model = new Brands();
84 85  
85   - if ($model->load(Yii::$app->request->post()) && $model->save()) {
86   - //return $this->redirect(['view', 'id' => $model->BRAND]);
87   - return $this->redirect(['index']);
88   - } else {
89   - return $this->render('create', [
90   - 'model' => $model,
91   - ]);
92   - }
  86 + return $this->saveIMG( $model, 'create' );
  87 +
93 88 }
94 89  
95 90 /**
... ... @@ -102,14 +97,8 @@ class BrandsController extends Controller
102 97 {
103 98 $model = $this->findModel($id);
104 99  
105   - if ($model->load(Yii::$app->request->post()) && $model->save()) {
106   - //return $this->redirect(['view', 'id' => $model->BRAND]);
107   - return $this->redirect(['index']);
108   - } else {
109   - return $this->render('update', [
110   - 'model' => $model,
111   - ]);
112   - }
  100 + return $this->saveIMG( $model, 'update' );
  101 +
113 102 }
114 103  
115 104 /**
... ... @@ -140,4 +129,31 @@ class BrandsController extends Controller
140 129 throw new NotFoundHttpException('The requested page does not exist.');
141 130 }
142 131 }
  132 +
  133 + /**
  134 + * @param $model
  135 + * @return string|\yii\web\Response
  136 + * сохраняет картинку и валидирует модель
  137 + * выбрасывает исключение в случае ошибки
  138 + */
  139 + protected function saveIMG( $model, $action ){
  140 + if( $model->load(Yii::$app->request->post()) ) {
  141 + $model->file = UploadedFile::getInstance($model, 'file');
  142 + $model->IMG = $model->file->name;
  143 + // первый проход - валидируем, сохраняем файл,
  144 + if ( $model->validate() ) {
  145 + // сохраним файл
  146 + $model->file->saveAs( Yii::getAlias('@storage') . '/files/brands/' . $model->IMG );
  147 + if ( $model->save() ) {
  148 + return $this->redirect(['index']);
  149 + }
  150 + }
  151 + $model->throwStringErrorException();
  152 + } else {
  153 + return $this->render($action, [
  154 + 'model' => $model,
  155 + ]);
  156 + }
  157 +
  158 + }
143 159 }
... ...
backend/controllers/ParserController.php
... ... @@ -3,6 +3,7 @@ namespace backend\controllers;
3 3  
4 4 use backend\models\Details;
5 5 use common\components\exceptions\CrossParsingException;
  6 +use common\components\exceptions\OrdinaryActiveRecordException;
6 7 use common\components\exceptions\PriceParsingException;
7 8 use common\components\exceptions\RgParsingException;
8 9 use common\components\ModelArrayValidator;
... ... @@ -76,6 +77,10 @@ class ParserController extends BaseController
76 77 $action_name = ['results'];
77 78 }elseif ( $exception instanceof RgParsingException ) {
78 79 $action_name = ['rg-grup/results'];
  80 + }elseif ( $exception instanceof OrdinaryActiveRecordException ) {
  81 + // для обычной модели возвращаемся в index в качестве контроллера используем имя модели
  82 + $action_name = strtolower($exception->active_record_name);
  83 + $action_name = ["$action_name/index"];
79 84 }
80 85  
81 86 if ( $exception !== null ) {
... ...
backend/views/brands/_form.php
... ... @@ -17,14 +17,22 @@ use yii\widgets\ActiveForm;
17 17 echo $form->field($model, 'BRAND')->textInput(['maxlength' => true])->label('Название')
18 18 ?>
19 19  
20   - <?= $form->field($model, 'CONTENT')->textarea(['rows' => 6]) ?>
  20 + <?= $form->field($model, 'CONTENT')->widget(\mihaildev\ckeditor\CKEditor::className(),[
  21 + 'editorOptions' => \mihaildev\elfinder\ElFinder::ckeditorOptions('elfinder',[
  22 + 'preset' => 'full', //разработанны стандартные настройки basic, standard, full данную возможность не обязательно использовать
  23 + 'inline' => false, //по умолчанию false]),
  24 + // 'filebrowserUploadUrl'=>Yii::$app->getUrlManager()->createUrl('news/images-upload')
  25 + ]
  26 + )
  27 + ]); ?>
21 28 <?= $form->field($model, 'if_oem')->checkbox() ?>
22   - <?= $form->field($model, 'IMG')->fileInput() ?>
  29 + <?= $form->field($model, 'file')->fileInput()->label(false)->hint('имя файла должно иметь только латинские символы и цифры',['tag'=>'span'])?>
23 30  
24 31  
25 32 <div class="form-group">
26 33 <?= Html::submitButton($model->isNewRecord ? 'Добавить' : 'Редактировать', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
27 34 </div>
  35 + <?= Html::a('Вернуться', ['index'], ['class' => 'btn btn-primary']) ?>
28 36  
29 37 <?php ActiveForm::end(); ?>
30 38  
... ...
common/components/exceptions/OrdinaryActiveRecordException.php 0 → 100644
  1 +<?php
  2 +/**
  3 + * Created by PhpStorm.
  4 + * User: Tsurkanov
  5 + * Date: 30.11.2015
  6 + * Time: 17:36
  7 + */
  8 +
  9 +namespace common\components\exceptions;
  10 +
  11 +
  12 +use yii\base\UserException;
  13 +
  14 +class OrdinaryActiveRecordException extends UserException {
  15 + // для хранения имени AR где произошла ошибка
  16 + // используется для обработки ошибок
  17 + public $active_record_name = '';
  18 +}
0 19 \ No newline at end of file
... ...
common/models/Brands.php
... ... @@ -2,6 +2,7 @@
2 2  
3 3 namespace common\models;
4 4  
  5 +use backend\components\base\BaseActiveRecord;
5 6 use Yii;
6 7  
7 8 /**
... ... @@ -17,8 +18,10 @@ use Yii;
17 18 * @property string $IMG
18 19 * @property string $timestamp
19 20 */
20   -class Brands extends \yii\db\ActiveRecord
  21 +class Brands extends BaseActiveRecord
21 22 {
  23 + // для валидации выбранного пользователем файла
  24 + public $file;
22 25 /**
23 26 * @inheritdoc
24 27 */
... ... @@ -39,7 +42,9 @@ class Brands extends \yii\db\ActiveRecord
39 42 [['timestamp'], 'safe'],
40 43 [['BRAND'], 'string', 'max' => 100],
41 44 [['tecdoc_logo'], 'string', 'max' => 50],
42   - [['IMG'], 'string', 'max' => 255]
  45 + ['IMG', 'string', 'max' => 255],
  46 + ['IMG', 'match', 'pattern' => '/[a-zA-Z0-9]+\.[a-zA-Z]+/', 'message' => 'имя файла изображения должно иметь только латинские символы и цифры'],
  47 + [['file'], 'image' ]
43 48 ];
44 49 }
45 50  
... ...
composer.lock
... ... @@ -1891,28 +1891,28 @@
1891 1891 },
1892 1892 {
1893 1893 "name": "sebastian/diff",
1894   - "version": "1.3.0",
  1894 + "version": "1.4.1",
1895 1895 "source": {
1896 1896 "type": "git",
1897 1897 "url": "https://github.com/sebastianbergmann/diff.git",
1898   - "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3"
  1898 + "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e"
1899 1899 },
1900 1900 "dist": {
1901 1901 "type": "zip",
1902   - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/863df9687835c62aa423a22412d26fa2ebde3fd3",
1903   - "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3",
  1902 + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e",
  1903 + "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e",
1904 1904 "shasum": ""
1905 1905 },
1906 1906 "require": {
1907 1907 "php": ">=5.3.3"
1908 1908 },
1909 1909 "require-dev": {
1910   - "phpunit/phpunit": "~4.2"
  1910 + "phpunit/phpunit": "~4.8"
1911 1911 },
1912 1912 "type": "library",
1913 1913 "extra": {
1914 1914 "branch-alias": {
1915   - "dev-master": "1.3-dev"
  1915 + "dev-master": "1.4-dev"
1916 1916 }
1917 1917 },
1918 1918 "autoload": {
... ... @@ -1935,11 +1935,11 @@
1935 1935 }
1936 1936 ],
1937 1937 "description": "Diff implementation",
1938   - "homepage": "http://www.github.com/sebastianbergmann/diff",
  1938 + "homepage": "https://github.com/sebastianbergmann/diff",
1939 1939 "keywords": [
1940 1940 "diff"
1941 1941 ],
1942   - "time": "2015-02-22 15:13:53"
  1942 + "time": "2015-12-08 07:14:41"
1943 1943 },
1944 1944 {
1945 1945 "name": "sebastian/environment",
... ... @@ -2110,16 +2110,16 @@
2110 2110 },
2111 2111 {
2112 2112 "name": "sebastian/recursion-context",
2113   - "version": "1.0.1",
  2113 + "version": "1.0.2",
2114 2114 "source": {
2115 2115 "type": "git",
2116 2116 "url": "https://github.com/sebastianbergmann/recursion-context.git",
2117   - "reference": "994d4a811bafe801fb06dccbee797863ba2792ba"
  2117 + "reference": "913401df809e99e4f47b27cdd781f4a258d58791"
2118 2118 },
2119 2119 "dist": {
2120 2120 "type": "zip",
2121   - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/994d4a811bafe801fb06dccbee797863ba2792ba",
2122   - "reference": "994d4a811bafe801fb06dccbee797863ba2792ba",
  2121 + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/913401df809e99e4f47b27cdd781f4a258d58791",
  2122 + "reference": "913401df809e99e4f47b27cdd781f4a258d58791",
2123 2123 "shasum": ""
2124 2124 },
2125 2125 "require": {
... ... @@ -2159,7 +2159,7 @@
2159 2159 ],
2160 2160 "description": "Provides functionality to recursively process PHP variables",
2161 2161 "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
2162   - "time": "2015-06-21 08:04:50"
  2162 + "time": "2015-11-11 19:50:13"
2163 2163 },
2164 2164 {
2165 2165 "name": "sebastian/version",
... ...