From e6f29543b62f34b53d52b92ef146ebd04bcdbd1e Mon Sep 17 00:00:00 2001 From: German Bisurgi Date: Thu, 1 Feb 2024 15:02:27 +0100 Subject: [PATCH] Use opis/json-schema instead of justinrainbow/json-schema for backend validation --- composer.json | 2 +- src/models/crud/WidgetContent.php | 26 ++++++++-------- src/models/crud/WidgetContentTranslation.php | 31 ++++++++------------ 3 files changed, 26 insertions(+), 33 deletions(-) diff --git a/composer.json b/composer.json index 6f8b1e7..5845397 100644 --- a/composer.json +++ b/composer.json @@ -31,7 +31,7 @@ "zhuravljov/yii2-datetime-widgets" : "^1.1.0", "dmstr/yii2-ajax-button": "^1.0", "trntv/yii2-aceeditor": "^2.1.0", - "justinrainbow/json-schema": "^5.2.0", + "opis/json-schema": "^2.0", "bower-asset/jquery-cookie": "~1.4.1" }, "autoload": { diff --git a/src/models/crud/WidgetContent.php b/src/models/crud/WidgetContent.php index 6768c04..4a424b5 100644 --- a/src/models/crud/WidgetContent.php +++ b/src/models/crud/WidgetContent.php @@ -4,13 +4,14 @@ use hrzg\widget\models\crud\base\Widget as BaseWidget; use hrzg\widget\widgets\Cell; -use JsonSchema\Validator; use yii\behaviors\TimestampBehavior; use yii\caching\TagDependency; use yii\db\Expression; use yii\helpers\ArrayHelper; use yii\helpers\Json; use yii\helpers\Url; +use Opis\JsonSchema\Validator; +use Opis\JsonSchema\Errors\ErrorFormatter; /** * Class WidgetContent @@ -187,25 +188,22 @@ public function rules() $rules['validate_properties_json'] = [ 'default_properties_json', function ($attribute) { - /** @var WidgetTemplate $tmpl */ $tmpl = $this->getTemplate()->one(); - if (!$tmpl) { - return; - } - $schema = $tmpl->json_schema; $validator = new Validator(); - $obj = Json::decode($schema, false); - $data = Json::decode($this->{$attribute}, false); - $validator->check($data, $obj); + $schema = Json::decode($tmpl->json_schema, false); + $data = Json::decode($this->{$attribute}, false); + $validator->setMaxErrors(9999); + $result = $validator->validate($data, $schema); + + if (!$result->isValid()) { + $formatter = new ErrorFormatter(); + $errors = $formatter->format($result->error(), false); - if ($validator->getErrors()) { - foreach ($validator->getErrors() as $error) { - $this->addError($error['property'], "{$error['property']}: {$error['message']}"); + foreach ($errors as $path => $message) { + $this->addError($path, $path . ': ' . $message); } } - } - ]; } diff --git a/src/models/crud/WidgetContentTranslation.php b/src/models/crud/WidgetContentTranslation.php index baf9479..67e40a4 100644 --- a/src/models/crud/WidgetContentTranslation.php +++ b/src/models/crud/WidgetContentTranslation.php @@ -9,12 +9,11 @@ namespace hrzg\widget\models\crud; -use hrzg\widget\models\crud\base\Widget; use hrzg\widget\models\crud\base\WidgetTranslation; -use JsonSchema\Validator; use yii\caching\TagDependency; use yii\helpers\Json; - +use Opis\JsonSchema\Validator; +use Opis\JsonSchema\Errors\ErrorFormatter; /** * Class WidgetContentTranslation @@ -35,30 +34,26 @@ public function rules() $rules['validate_properties_json'] = [ 'default_properties_json', function ($attribute) { - - /** @var Widget $baseWidget */ $baseWidget = $this->getWidgetContent()->one(); - /** @var WidgetTemplate $tmpl */ $tmpl = $baseWidget->getTemplate()->one(); - if (!$tmpl) { - return; - } - $schema = $tmpl->json_schema; $validator = new Validator(); - $obj = Json::decode($schema, false); - $data = Json::decode($this->{$attribute}, false); - $validator->check($data, $obj); + $schema = Json::decode($tmpl->json_schema, false); + $data = Json::decode($this->{$attribute}, false); + $validator->setMaxErrors(9999); + $result = $validator->validate($data, $schema); + + if (!$result->isValid()) { + $formatter = new ErrorFormatter(); + $errors = $formatter->format($result->error(), false); - if ($validator->getErrors()) { - foreach ($validator->getErrors() as $error) { - $this->addError($error['property'], "{$error['property']}: {$error['message']}"); + foreach ($errors as $path => $message) { + $this->addError($path, $path . ': ' . $message); } } - } - ]; } + return $rules; }