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", | ... | ... |