Commit 13ffaf8e467263cc493487cb02ed8000c54f26e6
1 parent
0cb8c7a5
add error handler in brands and image loading
Showing
7 changed files
with
94 additions
and
36 deletions
Show diff stats
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", | ... | ... |