From be9fc8121e4df8fd5b30e00979fe2608e07192c4 Mon Sep 17 00:00:00 2001 From: Paolo Date: Fri, 23 Jun 2017 18:54:34 +0200 Subject: [PATCH] - Added exit codes for udf validation to constants.php - Added messages for udf validation to fhc_model_lang - Added MAX_LENGTH and MIN_LENGTH to UDFWidgetTpl in WidgetLib - UDF validation second version in DB_Model --- application/config/constants.php | 8 +- application/core/DB_Model.php | 85 ++++++++++++------- application/language/de-AT/fhc_model_lang.php | 8 +- application/libraries/WidgetLib.php | 8 +- 4 files changed, 77 insertions(+), 32 deletions(-) diff --git a/application/config/constants.php b/application/config/constants.php index 9d5092b74..5fa56e91b 100755 --- a/application/config/constants.php +++ b/application/config/constants.php @@ -101,7 +101,13 @@ define('EXIT_UNKNOWN_CLASS', 5); // unknown class define('EXIT_UNKNOWN_METHOD', 6); // unknown class member define('EXIT_USER_INPUT', 7); // invalid user input define('EXIT_DATABASE', 8); // database error -define('EXIT_VALIDATION_UDF', 9); // UDF validation has been failed +define('EXIT_VALIDATION_UDF', 10); // UDF validation has been failed +define('EXIT_VALIDATION_UDF_MIN_VALUE', 11); // UDF validation has been failed -> MIN VALUE +define('EXIT_VALIDATION_UDF_MAX_VALUE', 12); // UDF validation has been failed -> MAX VALUE +define('EXIT_VALIDATION_UDF_MIN_LENGTH', 11); // UDF validation has been failed -> MIN LENGTH +define('EXIT_VALIDATION_UDF_MAX_LENGTH', 12); // UDF validation has been failed -> MAX LENGTH +define('EXIT_VALIDATION_UDF_REGEX', 13); // UDF validation has been failed -> REGEX +define('EXIT_VALIDATION_UDF_REQUIRED', 14); // UDF validation has been failed -> REQUIRED define('EXIT_AUTO_MIN', 1000); // lowest automatically-assigned error code define('EXIT_AUTO_MAX', 2000); // highest automatically-assigned error code \ No newline at end of file diff --git a/application/core/DB_Model.php b/application/core/DB_Model.php index d6c70f5dd..f37c60ad3 100644 --- a/application/core/DB_Model.php +++ b/application/core/DB_Model.php @@ -2,17 +2,36 @@ class DB_Model extends FHC_Model { + // Default schema used by the models + const DEFAULT_SCHEMA = 'public'; + + // Default model class name postfix + const MODEL_POSTFIX = '_model'; + + // Query used to get the list of columns from a table + const QUERY_LIST_FIELDS = 'SELECT * FROM %s WHERE 0 = 1'; + + // Constants used to convert postgresql arrays and booleans to the php equivalent const PGSQL_ARRAY_TYPE = '_'; const PGSQL_BOOLEAN_TYPE = 'bool'; const PGSQL_BOOLEAN_ARRAY_TYPE = '_bool'; const PGSQL_BOOLEAN_TRUE = 't'; const PGSQL_BOOLEAN_FALSE = 'f'; - const MODEL_POSTFIX = '_model'; - const DEFAULT_SCHEMA = 'public'; + + // UDF constants const UDF_FIELD_NAME = 'udf_values'; const UDF_FIELD_TYPE = 'jsonb'; const UDF_FIELD_PREFIX = 'udf_'; - const QUERY_LIST_FIELDS = 'SELECT * FROM %s WHERE 0 = 1'; + const UDF_ATTRIBUTE_NAME = 'name'; + + // UDF validation attributes + const UDF_REGEX = 'regex'; + const UDF_REGEX_LANG = 'php'; + const UDF_REQUIRED = 'required'; + const UDF_MAX_VALUE = 'max-value'; + const UDF_MIN_VALUE = 'min-value'; + const UDF_MAX_LENGTH = 'max-length'; + const UDF_MIN_LENGTH = 'min-length'; protected $dbTable; // Name of the DB-Table for CI-Insert, -Update, ... protected $pk; // Name of the PrimaryKey for DB-Update, Load, ... @@ -843,6 +862,7 @@ class DB_Model extends FHC_Model private function _validateUDFs($udfDescription, $udfValue) { $isValid = true; + $valid = success(true); $tmpUdfValues = $udfValue; if (!is_array($udfValue)) @@ -863,29 +883,43 @@ class DB_Model extends FHC_Model foreach($tmpUdfValues as $udfValIndx => $udfVal) { // - if (isset($validation->{'max-value'}) && $udfVal > $validation->{'max-value'}) + if (isset($validation->{DB_Model::UDF_MAX_VALUE}) && $udfVal > $validation->{DB_Model::UDF_MAX_VALUE}) { - $isValid = false; + $valid = error($udfDescription->{DB_Model::UDF_ATTRIBUTE_NAME}, EXIT_VALIDATION_UDF_MAX_VALUE); break; } // - if (isset($validation->{'min-value'}) && $udfVal < $validation->{'min-value'}) + if (isset($validation->{DB_Model::UDF_MIN_VALUE}) && $udfVal < $validation->{DB_Model::UDF_MIN_VALUE}) { - $isValid = false; + $valid = error($udfDescription->{DB_Model::UDF_ATTRIBUTE_NAME}, EXIT_VALIDATION_UDF_MIN_VALUE); break; } // - if (isset($validation->regex) && is_array($validation->regex)) + if (isset($validation->{DB_Model::UDF_MAX_LENGTH}) && $udfVal > $validation->{DB_Model::UDF_MAX_LENGTH}) { - foreach($validation->regex as $regexIndx => $regex) + $valid = error($udfDescription->{DB_Model::UDF_ATTRIBUTE_NAME}, EXIT_VALIDATION_UDF_MAX_LENGTH); + break; + } + + // + if (isset($validation->{DB_Model::UDF_MIN_LENGTH}) && $udfVal < $validation->{DB_Model::UDF_MIN_LENGTH}) + { + $valid = error($udfDescription->{DB_Model::UDF_ATTRIBUTE_NAME}, EXIT_VALIDATION_UDF_MIN_LENGTH); + break; + } + + // + if (isset($validation->{DB_Model::UDF_REGEX}) && is_array($validation->{DB_Model::UDF_REGEX})) + { + foreach($validation->{DB_Model::UDF_REGEX} as $regexIndx => $regex) { - if ($regex->language == 'php') + if ($regex->language == DB_Model::UDF_REGEX_LANG) { if (preg_match($regex->expression, $udfVal) != 1) { - $isValid = false; + $valid = error($udfDescription->{DB_Model::UDF_ATTRIBUTE_NAME}, EXIT_VALIDATION_UDF_REGEX); break; } } @@ -894,15 +928,7 @@ class DB_Model extends FHC_Model } } - // - if ($isValid === true) - { - return success(true); - } - else - { - return error($udfDescription->name, EXIT_VALIDATION_UDF); - } + return $valid; } /** @@ -910,7 +936,8 @@ class DB_Model extends FHC_Model */ private function _manageUDFs(&$data) { - $validate = error('manageUDFs', EXIT_DATABASE); + $validate = success(true); + $notValidUDFsArray = array(); if ($this->hasUDF()) // Checks if this table has UDFs { @@ -931,10 +958,10 @@ class DB_Model extends FHC_Model foreach($this->UDFs as $key => $val) { - if ($udfDescription->name == $key) + if ($udfDescription->{DB_Model::UDF_ATTRIBUTE_NAME} == $key) { // Validation of UDF parameter value - $validate = $this->_validateUDFs($udfDescription, $val); + // $validate = $this->_validateUDFs($udfDescription, $val); // If validation is ok copy the value if (isSuccess($validate)) @@ -943,14 +970,14 @@ class DB_Model extends FHC_Model } else // otherwise stop the elaboration { - break; + $notValidUDFsArray[] = $validate; } } } } // If validation was ok - if (isSuccess($validate)) + if (count($notValidUDFsArray) == 0) { $jsonEncodedUDFs = json_encode($jsonb); // encode to json if ($jsonEncodedUDFs !== false) @@ -958,12 +985,12 @@ class DB_Model extends FHC_Model $data[DB_Model::UDF_FIELD_NAME] = $jsonEncodedUDFs; } } + else + { + $validate = error($notValidUDFsArray, EXIT_VALIDATION_UDF); + } } } - else - { - return success(true); - } return $validate; } diff --git a/application/language/de-AT/fhc_model_lang.php b/application/language/de-AT/fhc_model_lang.php index 68932dd4a..27c444f77 100644 --- a/application/language/de-AT/fhc_model_lang.php +++ b/application/language/de-AT/fhc_model_lang.php @@ -6,4 +6,10 @@ if ( ! defined('BASEPATH')) exit('No direct script access allowed'); $lang['fhc_'.FHC_MODEL_ERROR] = 'Fehler in Model'; $lang['fhc_'.FHC_NODBTABLE] = '"dbTable" ist nicht gesetzt!'; $lang['fhc_'.FHC_NORIGHT] = 'Rechte sind nicht ausreichend!'; -$lang['fhc_'.EXIT_VALIDATION_UDF] = 'UDF validation has been failed'; \ No newline at end of file +$lang['fhc_'.EXIT_VALIDATION_UDF] = 'UDF validation has been failed'; +$lang['fhc_'.EXIT_VALIDATION_UDF_MIN_VALUE] = 'UDF validation has been failed - MIN VALUE'; +$lang['fhc_'.EXIT_VALIDATION_UDF_MAX_VALUE] = 'UDF validation has been failed - MAX VALUE'; +$lang['fhc_'.EXIT_VALIDATION_UDF_MIN_LENGTH] = 'UDF validation has been failed - MIN LENGTH'; +$lang['fhc_'.EXIT_VALIDATION_UDF_MAX_LENGTH] = 'UDF validation has been failed - MAX LENGTH'; +$lang['fhc_'.EXIT_VALIDATION_UDF_REGEX] = 'UDF validation has been failed - REGEX'; +$lang['fhc_'.EXIT_VALIDATION_UDF_REQUIRED] = 'UDF validation has been failed - REQUIRED'; \ No newline at end of file diff --git a/application/libraries/WidgetLib.php b/application/libraries/WidgetLib.php index 7e01209a7..8040b7911 100644 --- a/application/libraries/WidgetLib.php +++ b/application/libraries/WidgetLib.php @@ -1179,7 +1179,8 @@ class CheckboxWidgetUDF extends CheckboxWidget } /** - * + * Defined here because these constants can be used + * in the views also */ abstract class UDFWidgetTpl extends Widget { @@ -1189,12 +1190,17 @@ abstract class UDFWidgetTpl extends Widget const FIELD_ARG_NAME = 'field'; const UDFS_ARG_NAME = 'udfs'; + // HTML components const TITLE = 'description'; const LABEL = 'title'; const PLACEHOLDER = 'placeholder'; const DEFAULT_VALUE = 'defaultValue'; + + // Validation attributes const REGEX = 'regex'; const REQUIRED = 'required'; const MAX_VALUE = 'max-value'; const MIN_VALUE = 'min-value'; + const MAX_LENGTH = 'max-length'; + const MIN_LENGTH = 'min-length'; } \ No newline at end of file