Skip to content

Commit 0e65bef

Browse files
authored
Merge pull request #6 from bobonov/master
Step reordering and model validation
2 parents e95b82b + 253de96 commit 0e65bef

File tree

8 files changed

+75
-53
lines changed

8 files changed

+75
-53
lines changed

src/controllers/PageGuideController.php

+10-42
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ class PageGuideController extends Controller
1616
public function behaviors()
1717
{
1818
return [
19-
'access' =>[
19+
'access' => [
2020
'class' => AccessControl::class,
2121
'rules' => [
2222
[
23-
'actions' => ['index','update','create','delete'],
23+
'actions' => ['index', 'update', 'create', 'delete'],
2424
'allow' => true,
2525
'roles' => ['@'],
2626
]
@@ -51,28 +51,8 @@ public function actionCreate()
5151
$model = new PageGuide();
5252

5353
$post = Yii::$app->request->post();
54-
if(Yii::$app->request->isPost) {
55-
56-
$origUrl = $post['PageGuide']['url'];
57-
58-
$post['PageGuide']['url'] = parse_url($post['PageGuide']['url'],PHP_URL_PATH);
59-
60-
$post['PageGuide']['rules'] = array_filter($post['PageGuide']['rules'], static function ($val) {
61-
return !empty($val['element']);
62-
});
63-
64-
if(empty($post['PageGuide']['rules'])) {
65-
$model->url = $origUrl;
66-
return $this->render('create', [
67-
'model' => $model,
68-
'rulesError' => Yii::t('pageGuide/view','Rules not set')
69-
]);
70-
}
71-
72-
$post['PageGuide']['rules'] = Json::encode($post['PageGuide']['rules']);
73-
54+
if (Yii::$app->request->isPost) {
7455
PageGuide::deleteAll(['url' => $post['PageGuide']['url']]);
75-
7656
if ($model->load($post) && $model->save()) {
7757
return $this->redirect(['index']);
7858
}
@@ -86,30 +66,18 @@ public function actionCreate()
8666
public function actionUpdate($id)
8767
{
8868
$model = $this->findModel($id);
89-
90-
if(Yii::$app->request->isPost) {
69+
$rulesError = '';
70+
if (Yii::$app->request->isPost) {
9171
$post = Yii::$app->request->post();
9272

93-
$post['PageGuide']['rules'] = array_filter($post['PageGuide']['rules'], static function ($val) {
94-
return !empty($val['element']);
95-
});
96-
97-
if(empty($post['PageGuide']['rules'])) {
98-
return $this->render('update', [
99-
'model' => $model,
100-
'rulesError' => Yii::t('pageGuide/view','Rules not set')
101-
]);
102-
}
103-
104-
$post['PageGuide']['rules'] = Json::encode($post['PageGuide']['rules']);
105-
10673
if ($model->load($post) && $model->save()) {
10774
return $this->redirect(['index']);
10875
}
76+
$rulesError = $model->getFirstError('rules');
10977
}
110-
11178
return $this->render('update', [
11279
'model' => $model,
80+
'rulesError' => $rulesError,
11381
]);
11482
}
11583

@@ -118,11 +86,11 @@ public function actionDelete($id)
11886
try {
11987
$model = $this->findModel($id);
12088
} catch (NotFoundHttpException $e) {
121-
Yii::$app->session->setFlash('warning',$e->getMessage());
89+
Yii::$app->session->setFlash('warning', $e->getMessage());
12290
return $this->redirect(['index']);
12391
}
12492

125-
if($model) {
93+
if ($model) {
12694
$model->delete();
12795
}
12896

@@ -140,6 +108,6 @@ protected function findModel($id): ?PageGuide
140108
return $model;
141109
}
142110

143-
throw new NotFoundHttpException(Yii::t('pageGuide/view','Not found'));
111+
throw new NotFoundHttpException(Yii::t('pageGuide/view', 'Not found'));
144112
}
145113
}

src/messages/en/model.php

+3-1
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,7 @@
33
return [
44
'ID' => 'Id',
55
'Url' => 'Url page for guide',
6-
'Rules' => 'Rules'
6+
'Rules' => 'Rules',
7+
'Rules not set' => 'At least one rule step must be set',
8+
'Rules not valid' => 'Rule is not valid',
79
];

src/messages/en/view.php

-1
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,4 @@
2121
'next' => 'Next',
2222
'skip' => 'Skip',
2323
'done' => 'Done',
24-
'Rules not set' => 'At least one rule step must be set'
2524
];

src/messages/it/model.php

+3-1
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,7 @@
33
return [
44
'ID' => 'Id',
55
'Url' => 'Url della pagina per la guida',
6-
'Rules' => 'Regole'
6+
'Rules' => 'Regole',
7+
'Rules not set' => 'Regola non impostata',
8+
'Rules not valid' => 'Il formato della regola non è valido',
79
];

src/messages/it/view.php

-1
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,4 @@
2121
'next' => 'Successivo',
2222
'skip' => 'Salta',
2323
'done' => 'Fine',
24-
'Rules not set' => 'Rules not set'
2524
];

src/messages/sk/model.php

+3-1
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,7 @@
33
return [
44
'ID' => 'Id',
55
'Url' => 'Stránka návodu',
6-
'Rules' => 'Pravidlá'
6+
'Rules' => 'Pravidlá',
7+
'Rules not set' => 'Musíte nastaviť aspoň jeden krok',
8+
'Rules not valid' => 'Rule is not valid',
79
];

src/messages/sk/view.php

-1
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,4 @@
2121
'next' => 'Ďalej',
2222
'skip' => 'Preskočiť',
2323
'done' => 'Ukončiť',
24-
'Rules not set' => 'Musíte nastaviť aspoň jeden krok'
2524
];

src/models/PageGuide.php

+56-5
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22

33
namespace matejch\pageGuide\models;
44

5+
use Exception;
56
use Yii;
67
use yii\db\ActiveRecord;
8+
use yii\helpers\Json;
9+
710

811
/**
912
* This is the model class for table "page_guide".
@@ -29,22 +32,70 @@ public function rules()
2932
{
3033
return [
3134
[['url'], 'required'],
32-
[['rules'], 'string'],
3335
[['url'], 'string', 'max' => 1024],
3436
[['url'], 'trim'],
35-
[['url'],'filter','filter'=>'strip_tags','skipOnArray' => true]
37+
[['url'], 'filter', 'filter' => 'strip_tags', 'skipOnArray' => true],
38+
[['rules'], 'validateRuleFormat'],
39+
[['rules'], 'filter', 'filter' => [$this, 'stepOrder']],
40+
[['url'], 'filter', 'filter' => function ($value) {
41+
return parse_url($value, PHP_URL_PATH);
42+
}],
3643
];
3744
}
3845

46+
/**
47+
* validator: validate rules data
48+
*/
49+
public function validateRuleFormat($attribute, $params, $validator): void
50+
{
51+
if (!is_array($this->rules)) {
52+
try {
53+
$this->rules = Json::decode($this->rules);
54+
} catch (Exception $e) {
55+
$this->rules = '{}';
56+
$this->addError('rules', Yii::t('pageGuide/model', 'Rules not valid'));
57+
return;
58+
}
59+
}
60+
61+
$this->rules = array_filter($this->rules, static function ($val) {
62+
return !empty($val['element']);
63+
});
64+
if (empty($this->rules)) {
65+
$this->rules = '{}';
66+
$this->addError('rules', Yii::t('pageGuide/model', 'Rules not set'));
67+
return;
68+
}
69+
70+
foreach ($this->rules as $rule) {
71+
if (!is_array($rule) || !isset($rule['step'], $rule['element'], $rule['intro'])) {
72+
$this->addError('rules', Yii::t('pageGuide/model', 'Rules not valid'));
73+
break;
74+
}
75+
}
76+
$this->rules = Json::encode($this->rules);
77+
}
78+
79+
/**
80+
* filter: order rules on step value
81+
*/
82+
public function stepOrder(string $value): string
83+
{
84+
$value = Json::decode($value);
85+
$keys = array_column($value, 'step');
86+
array_multisort($keys, SORT_ASC, $value);
87+
return Json::encode($value);
88+
}
89+
3990
/**
4091
* {@inheritdoc}
4192
*/
4293
public function attributeLabels()
4394
{
4495
return [
45-
'id' => Yii::t('pageGuide/model','ID'),
46-
'url' => Yii::t('pageGuide/model','Url'),
47-
'rules' => Yii::t('pageGuide/model','Rules'),
96+
'id' => Yii::t('pageGuide/model', 'ID'),
97+
'url' => Yii::t('pageGuide/model', 'Url'),
98+
'rules' => Yii::t('pageGuide/model', 'Rules'),
4899
];
49100
}
50101
}

0 commit comments

Comments
 (0)