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,12 +9,16 @@ | ||
| 9 | namespace backend\components\base; | 9 | namespace backend\components\base; |
| 10 | 10 | ||
| 11 | 11 | ||
| 12 | -use yii\base\ErrorException; | 12 | +use common\components\exceptions\OrdinaryActiveRecordException; |
| 13 | 13 | ||
| 14 | class BaseActiveRecord extends \yii\db\ActiveRecord { | 14 | class BaseActiveRecord extends \yii\db\ActiveRecord { |
| 15 | 15 | ||
| 16 | + /** | ||
| 17 | + * @param int $row | ||
| 18 | + * @throws OrdinaryActiveRecordException | ||
| 19 | + * выбрасывает специальное исключения, наполняя сообщение с массива ошибок модели (после попытки валидации) | ||
| 20 | + */ | ||
| 16 | public function throwStringErrorException($row = 0){ | 21 | public function throwStringErrorException($row = 0){ |
| 17 | - | ||
| 18 | $errors_str = ''; | 22 | $errors_str = ''; |
| 19 | if ($row != 0) { | 23 | if ($row != 0) { |
| 20 | $errors_str = "Ошибка в строке {$row} "; | 24 | $errors_str = "Ошибка в строке {$row} "; |
| @@ -22,7 +26,9 @@ class BaseActiveRecord extends \yii\db\ActiveRecord { | @@ -22,7 +26,9 @@ class BaseActiveRecord extends \yii\db\ActiveRecord { | ||
| 22 | foreach ($this->getErrors() as $error) { | 26 | foreach ($this->getErrors() as $error) { |
| 23 | $errors_str .= implode( array_values($error) ); | 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 | \ No newline at end of file | 35 | \ No newline at end of file |
backend/controllers/BrandsController.php
| @@ -9,6 +9,7 @@ use yii\web\Controller; | @@ -9,6 +9,7 @@ use yii\web\Controller; | ||
| 9 | use yii\web\NotFoundHttpException; | 9 | use yii\web\NotFoundHttpException; |
| 10 | use yii\filters\VerbFilter; | 10 | use yii\filters\VerbFilter; |
| 11 | use yii\filters\AccessControl; | 11 | use yii\filters\AccessControl; |
| 12 | +use yii\web\UploadedFile; | ||
| 12 | 13 | ||
| 13 | /** | 14 | /** |
| 14 | * BrandsController implements the CRUD actions for Brands model. | 15 | * BrandsController implements the CRUD actions for Brands model. |
| @@ -82,14 +83,8 @@ class BrandsController extends Controller | @@ -82,14 +83,8 @@ class BrandsController extends Controller | ||
| 82 | { | 83 | { |
| 83 | $model = new Brands(); | 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,14 +97,8 @@ class BrandsController extends Controller | ||
| 102 | { | 97 | { |
| 103 | $model = $this->findModel($id); | 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,4 +129,31 @@ class BrandsController extends Controller | ||
| 140 | throw new NotFoundHttpException('The requested page does not exist.'); | 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,6 +3,7 @@ namespace backend\controllers; | ||
| 3 | 3 | ||
| 4 | use backend\models\Details; | 4 | use backend\models\Details; |
| 5 | use common\components\exceptions\CrossParsingException; | 5 | use common\components\exceptions\CrossParsingException; |
| 6 | +use common\components\exceptions\OrdinaryActiveRecordException; | ||
| 6 | use common\components\exceptions\PriceParsingException; | 7 | use common\components\exceptions\PriceParsingException; |
| 7 | use common\components\exceptions\RgParsingException; | 8 | use common\components\exceptions\RgParsingException; |
| 8 | use common\components\ModelArrayValidator; | 9 | use common\components\ModelArrayValidator; |
| @@ -76,6 +77,10 @@ class ParserController extends BaseController | @@ -76,6 +77,10 @@ class ParserController extends BaseController | ||
| 76 | $action_name = ['results']; | 77 | $action_name = ['results']; |
| 77 | }elseif ( $exception instanceof RgParsingException ) { | 78 | }elseif ( $exception instanceof RgParsingException ) { |
| 78 | $action_name = ['rg-grup/results']; | 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 | if ( $exception !== null ) { | 86 | if ( $exception !== null ) { |
backend/views/brands/_form.php
| @@ -17,14 +17,22 @@ use yii\widgets\ActiveForm; | @@ -17,14 +17,22 @@ use yii\widgets\ActiveForm; | ||
| 17 | echo $form->field($model, 'BRAND')->textInput(['maxlength' => true])->label('Название') | 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 | <?= $form->field($model, 'if_oem')->checkbox() ?> | 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 | <div class="form-group"> | 32 | <div class="form-group"> |
| 26 | <?= Html::submitButton($model->isNewRecord ? 'Добавить' : 'Редактировать', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> | 33 | <?= Html::submitButton($model->isNewRecord ? 'Добавить' : 'Редактировать', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> |
| 27 | </div> | 34 | </div> |
| 35 | + <?= Html::a('Вернуться', ['index'], ['class' => 'btn btn-primary']) ?> | ||
| 28 | 36 | ||
| 29 | <?php ActiveForm::end(); ?> | 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 | \ No newline at end of file | 19 | \ No newline at end of file |
common/models/Brands.php
| @@ -2,6 +2,7 @@ | @@ -2,6 +2,7 @@ | ||
| 2 | 2 | ||
| 3 | namespace common\models; | 3 | namespace common\models; |
| 4 | 4 | ||
| 5 | +use backend\components\base\BaseActiveRecord; | ||
| 5 | use Yii; | 6 | use Yii; |
| 6 | 7 | ||
| 7 | /** | 8 | /** |
| @@ -17,8 +18,10 @@ use Yii; | @@ -17,8 +18,10 @@ use Yii; | ||
| 17 | * @property string $IMG | 18 | * @property string $IMG |
| 18 | * @property string $timestamp | 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 | * @inheritdoc | 26 | * @inheritdoc |
| 24 | */ | 27 | */ |
| @@ -39,7 +42,9 @@ class Brands extends \yii\db\ActiveRecord | @@ -39,7 +42,9 @@ class Brands extends \yii\db\ActiveRecord | ||
| 39 | [['timestamp'], 'safe'], | 42 | [['timestamp'], 'safe'], |
| 40 | [['BRAND'], 'string', 'max' => 100], | 43 | [['BRAND'], 'string', 'max' => 100], |
| 41 | [['tecdoc_logo'], 'string', 'max' => 50], | 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,28 +1891,28 @@ | ||
| 1891 | }, | 1891 | }, |
| 1892 | { | 1892 | { |
| 1893 | "name": "sebastian/diff", | 1893 | "name": "sebastian/diff", |
| 1894 | - "version": "1.3.0", | 1894 | + "version": "1.4.1", |
| 1895 | "source": { | 1895 | "source": { |
| 1896 | "type": "git", | 1896 | "type": "git", |
| 1897 | "url": "https://github.com/sebastianbergmann/diff.git", | 1897 | "url": "https://github.com/sebastianbergmann/diff.git", |
| 1898 | - "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3" | 1898 | + "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e" |
| 1899 | }, | 1899 | }, |
| 1900 | "dist": { | 1900 | "dist": { |
| 1901 | "type": "zip", | 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 | "shasum": "" | 1904 | "shasum": "" |
| 1905 | }, | 1905 | }, |
| 1906 | "require": { | 1906 | "require": { |
| 1907 | "php": ">=5.3.3" | 1907 | "php": ">=5.3.3" |
| 1908 | }, | 1908 | }, |
| 1909 | "require-dev": { | 1909 | "require-dev": { |
| 1910 | - "phpunit/phpunit": "~4.2" | 1910 | + "phpunit/phpunit": "~4.8" |
| 1911 | }, | 1911 | }, |
| 1912 | "type": "library", | 1912 | "type": "library", |
| 1913 | "extra": { | 1913 | "extra": { |
| 1914 | "branch-alias": { | 1914 | "branch-alias": { |
| 1915 | - "dev-master": "1.3-dev" | 1915 | + "dev-master": "1.4-dev" |
| 1916 | } | 1916 | } |
| 1917 | }, | 1917 | }, |
| 1918 | "autoload": { | 1918 | "autoload": { |
| @@ -1935,11 +1935,11 @@ | @@ -1935,11 +1935,11 @@ | ||
| 1935 | } | 1935 | } |
| 1936 | ], | 1936 | ], |
| 1937 | "description": "Diff implementation", | 1937 | "description": "Diff implementation", |
| 1938 | - "homepage": "http://www.github.com/sebastianbergmann/diff", | 1938 | + "homepage": "https://github.com/sebastianbergmann/diff", |
| 1939 | "keywords": [ | 1939 | "keywords": [ |
| 1940 | "diff" | 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 | "name": "sebastian/environment", | 1945 | "name": "sebastian/environment", |
| @@ -2110,16 +2110,16 @@ | @@ -2110,16 +2110,16 @@ | ||
| 2110 | }, | 2110 | }, |
| 2111 | { | 2111 | { |
| 2112 | "name": "sebastian/recursion-context", | 2112 | "name": "sebastian/recursion-context", |
| 2113 | - "version": "1.0.1", | 2113 | + "version": "1.0.2", |
| 2114 | "source": { | 2114 | "source": { |
| 2115 | "type": "git", | 2115 | "type": "git", |
| 2116 | "url": "https://github.com/sebastianbergmann/recursion-context.git", | 2116 | "url": "https://github.com/sebastianbergmann/recursion-context.git", |
| 2117 | - "reference": "994d4a811bafe801fb06dccbee797863ba2792ba" | 2117 | + "reference": "913401df809e99e4f47b27cdd781f4a258d58791" |
| 2118 | }, | 2118 | }, |
| 2119 | "dist": { | 2119 | "dist": { |
| 2120 | "type": "zip", | 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 | "shasum": "" | 2123 | "shasum": "" |
| 2124 | }, | 2124 | }, |
| 2125 | "require": { | 2125 | "require": { |
| @@ -2159,7 +2159,7 @@ | @@ -2159,7 +2159,7 @@ | ||
| 2159 | ], | 2159 | ], |
| 2160 | "description": "Provides functionality to recursively process PHP variables", | 2160 | "description": "Provides functionality to recursively process PHP variables", |
| 2161 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", | 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 | "name": "sebastian/version", | 2165 | "name": "sebastian/version", |