193ca6f4fSAndreas Gohr<?php 293ca6f4fSAndreas Gohr 393ca6f4fSAndreas Gohrnamespace dokuwiki\plugin\struct\meta; 493ca6f4fSAndreas Gohr 593ca6f4fSAndreas Gohruse dokuwiki\plugin\struct\types\AbstractBaseType; 693ca6f4fSAndreas Gohr 793ca6f4fSAndreas Gohr/** 893ca6f4fSAndreas Gohr * Validator to validate a single value 993ca6f4fSAndreas Gohr */ 10d6d97f60SAnna Dabrowskaclass ValueValidator 11d6d97f60SAnna Dabrowska{ 1293ca6f4fSAndreas Gohr 1393ca6f4fSAndreas Gohr /** @var \helper_plugin_struct_db */ 1493ca6f4fSAndreas Gohr protected $hlp; 1593ca6f4fSAndreas Gohr 1693ca6f4fSAndreas Gohr /** @var array list of validation errors */ 1793ca6f4fSAndreas Gohr protected $errors; 1893ca6f4fSAndreas Gohr 1993ca6f4fSAndreas Gohr /** 2093ca6f4fSAndreas Gohr * ValueValidator constructor. 2193ca6f4fSAndreas Gohr */ 22d6d97f60SAnna Dabrowska public function __construct() 23d6d97f60SAnna Dabrowska { 2493ca6f4fSAndreas Gohr $this->hlp = plugin_load('helper', 'struct_db'); 2593ca6f4fSAndreas Gohr $this->errors = array(); 2693ca6f4fSAndreas Gohr } 2793ca6f4fSAndreas Gohr 2893ca6f4fSAndreas Gohr /** 2993ca6f4fSAndreas Gohr * Validate a single value 3093ca6f4fSAndreas Gohr * 3193ca6f4fSAndreas Gohr * @param Column $col the column of that value 3293ca6f4fSAndreas Gohr * @param mixed &$rawvalue the value, will be fixed according to the type 3393ca6f4fSAndreas Gohr * @return bool 3493ca6f4fSAndreas Gohr */ 35d6d97f60SAnna Dabrowska public function validateValue(Column $col, &$rawvalue) 36d6d97f60SAnna Dabrowska { 3793ca6f4fSAndreas Gohr // fix multi value types 3893ca6f4fSAndreas Gohr $type = $col->getType(); 3993ca6f4fSAndreas Gohr $trans = $type->getTranslatedLabel(); 4093ca6f4fSAndreas Gohr if ($type->isMulti() && !is_array($rawvalue)) { 4193ca6f4fSAndreas Gohr $rawvalue = $type->splitValues($rawvalue); 4293ca6f4fSAndreas Gohr } 4393ca6f4fSAndreas Gohr // strip empty fields from multi vals 44*d680cb37SAnna Dabrowska // but keep at least one so we can properly delete multivalues on update 45*d680cb37SAnna Dabrowska if (is_array($rawvalue) && count($rawvalue) > 1) { 4693ca6f4fSAndreas Gohr $rawvalue = array_filter($rawvalue, array($this, 'filter')); 4793ca6f4fSAndreas Gohr $rawvalue = array_values($rawvalue); // reset the array keys 4893ca6f4fSAndreas Gohr } 4993ca6f4fSAndreas Gohr 5093ca6f4fSAndreas Gohr // validate data 5193ca6f4fSAndreas Gohr return $this->validateField($type, $trans, $rawvalue); 5293ca6f4fSAndreas Gohr } 5393ca6f4fSAndreas Gohr 5493ca6f4fSAndreas Gohr /** 5593ca6f4fSAndreas Gohr * The errors that occured during validation 5693ca6f4fSAndreas Gohr * 5793ca6f4fSAndreas Gohr * @return string[] already translated error messages 5893ca6f4fSAndreas Gohr */ 59d6d97f60SAnna Dabrowska public function getErrors() 60d6d97f60SAnna Dabrowska { 6193ca6f4fSAndreas Gohr return $this->errors; 6293ca6f4fSAndreas Gohr } 6393ca6f4fSAndreas Gohr 6493ca6f4fSAndreas Gohr /** 6593ca6f4fSAndreas Gohr * Validate the given data for a single field 6693ca6f4fSAndreas Gohr * 6793ca6f4fSAndreas Gohr * Catches the Validation exceptions and transforms them into proper error messages. 6893ca6f4fSAndreas Gohr * 6993ca6f4fSAndreas Gohr * Blank values are not validated and always pass 7093ca6f4fSAndreas Gohr * 7193ca6f4fSAndreas Gohr * @param AbstractBaseType $type 7293ca6f4fSAndreas Gohr * @param string $label 7393ca6f4fSAndreas Gohr * @param array|string|int &$data may be modified by the validation function 7493ca6f4fSAndreas Gohr * @return bool true if the data validates, otherwise false 7593ca6f4fSAndreas Gohr */ 76d6d97f60SAnna Dabrowska protected function validateField(AbstractBaseType $type, $label, &$data) 77d6d97f60SAnna Dabrowska { 7893ca6f4fSAndreas Gohr $prefix = sprintf($this->hlp->getLang('validation_prefix'), $label); 7993ca6f4fSAndreas Gohr 8093ca6f4fSAndreas Gohr $ok = true; 8193ca6f4fSAndreas Gohr if (is_array($data)) { 8293ca6f4fSAndreas Gohr foreach ($data as &$value) { 8393ca6f4fSAndreas Gohr if (!blank($value)) { 8493ca6f4fSAndreas Gohr try { 8593ca6f4fSAndreas Gohr $value = $type->validate($value); 8693ca6f4fSAndreas Gohr } catch (ValidationException $e) { 8793ca6f4fSAndreas Gohr $this->errors[] = $prefix . $e->getMessage(); 8893ca6f4fSAndreas Gohr $ok = false; 8993ca6f4fSAndreas Gohr } 9093ca6f4fSAndreas Gohr } 9193ca6f4fSAndreas Gohr } 9293ca6f4fSAndreas Gohr return $ok; 9393ca6f4fSAndreas Gohr } 9493ca6f4fSAndreas Gohr 9593ca6f4fSAndreas Gohr if (!blank($data)) { 9693ca6f4fSAndreas Gohr try { 9793ca6f4fSAndreas Gohr $data = $type->validate($data); 9893ca6f4fSAndreas Gohr } catch (ValidationException $e) { 9993ca6f4fSAndreas Gohr $this->errors[] = $prefix . $e->getMessage(); 10093ca6f4fSAndreas Gohr $ok = false; 10193ca6f4fSAndreas Gohr } 10293ca6f4fSAndreas Gohr } 10393ca6f4fSAndreas Gohr return $ok; 10493ca6f4fSAndreas Gohr } 10593ca6f4fSAndreas Gohr 10693ca6f4fSAndreas Gohr /** 10793ca6f4fSAndreas Gohr * Simple filter to remove blank values 10893ca6f4fSAndreas Gohr * 10993ca6f4fSAndreas Gohr * @param string $val 11093ca6f4fSAndreas Gohr * @return bool 11193ca6f4fSAndreas Gohr */ 112d6d97f60SAnna Dabrowska public function filter($val) 113d6d97f60SAnna Dabrowska { 11493ca6f4fSAndreas Gohr return !blank($val); 11593ca6f4fSAndreas Gohr } 11693ca6f4fSAndreas Gohr} 117