1*93ca6f4fSAndreas Gohr<?php 2*93ca6f4fSAndreas Gohr 3*93ca6f4fSAndreas Gohrnamespace dokuwiki\plugin\struct\meta; 4*93ca6f4fSAndreas Gohr 5*93ca6f4fSAndreas Gohruse dokuwiki\plugin\struct\types\AbstractBaseType; 6*93ca6f4fSAndreas Gohr 7*93ca6f4fSAndreas Gohr/** 8*93ca6f4fSAndreas Gohr * Validator to validate a single value 9*93ca6f4fSAndreas Gohr */ 10*93ca6f4fSAndreas Gohrclass ValueValidator { 11*93ca6f4fSAndreas Gohr 12*93ca6f4fSAndreas Gohr /** @var \helper_plugin_struct_db */ 13*93ca6f4fSAndreas Gohr protected $hlp; 14*93ca6f4fSAndreas Gohr 15*93ca6f4fSAndreas Gohr /** @var array list of validation errors */ 16*93ca6f4fSAndreas Gohr protected $errors; 17*93ca6f4fSAndreas Gohr 18*93ca6f4fSAndreas Gohr /** 19*93ca6f4fSAndreas Gohr * ValueValidator constructor. 20*93ca6f4fSAndreas Gohr */ 21*93ca6f4fSAndreas Gohr public function __construct() { 22*93ca6f4fSAndreas Gohr $this->hlp = plugin_load('helper', 'struct_db'); 23*93ca6f4fSAndreas Gohr $this->errors = array(); 24*93ca6f4fSAndreas Gohr } 25*93ca6f4fSAndreas Gohr 26*93ca6f4fSAndreas Gohr /** 27*93ca6f4fSAndreas Gohr * Validate a single value 28*93ca6f4fSAndreas Gohr * 29*93ca6f4fSAndreas Gohr * @param Column $col the column of that value 30*93ca6f4fSAndreas Gohr * @param mixed &$rawvalue the value, will be fixed according to the type 31*93ca6f4fSAndreas Gohr * @return bool 32*93ca6f4fSAndreas Gohr */ 33*93ca6f4fSAndreas Gohr public function validateValue(Column $col, &$rawvalue) { 34*93ca6f4fSAndreas Gohr // fix multi value types 35*93ca6f4fSAndreas Gohr $type = $col->getType(); 36*93ca6f4fSAndreas Gohr $trans = $type->getTranslatedLabel(); 37*93ca6f4fSAndreas Gohr if($type->isMulti() && !is_array($rawvalue)) { 38*93ca6f4fSAndreas Gohr $rawvalue = $type->splitValues($rawvalue); 39*93ca6f4fSAndreas Gohr } 40*93ca6f4fSAndreas Gohr // strip empty fields from multi vals 41*93ca6f4fSAndreas Gohr if(is_array($rawvalue)) { 42*93ca6f4fSAndreas Gohr $rawvalue = array_filter($rawvalue, array($this, 'filter')); 43*93ca6f4fSAndreas Gohr $rawvalue = array_values($rawvalue); // reset the array keys 44*93ca6f4fSAndreas Gohr } 45*93ca6f4fSAndreas Gohr 46*93ca6f4fSAndreas Gohr // validate data 47*93ca6f4fSAndreas Gohr return $this->validateField($type, $trans, $rawvalue); 48*93ca6f4fSAndreas Gohr } 49*93ca6f4fSAndreas Gohr 50*93ca6f4fSAndreas Gohr /** 51*93ca6f4fSAndreas Gohr * The errors that occured during validation 52*93ca6f4fSAndreas Gohr * 53*93ca6f4fSAndreas Gohr * @return string[] already translated error messages 54*93ca6f4fSAndreas Gohr */ 55*93ca6f4fSAndreas Gohr public function getErrors() { 56*93ca6f4fSAndreas Gohr return $this->errors; 57*93ca6f4fSAndreas Gohr } 58*93ca6f4fSAndreas Gohr 59*93ca6f4fSAndreas Gohr /** 60*93ca6f4fSAndreas Gohr * Validate the given data for a single field 61*93ca6f4fSAndreas Gohr * 62*93ca6f4fSAndreas Gohr * Catches the Validation exceptions and transforms them into proper error messages. 63*93ca6f4fSAndreas Gohr * 64*93ca6f4fSAndreas Gohr * Blank values are not validated and always pass 65*93ca6f4fSAndreas Gohr * 66*93ca6f4fSAndreas Gohr * @param AbstractBaseType $type 67*93ca6f4fSAndreas Gohr * @param string $label 68*93ca6f4fSAndreas Gohr * @param array|string|int &$data may be modified by the validation function 69*93ca6f4fSAndreas Gohr * @return bool true if the data validates, otherwise false 70*93ca6f4fSAndreas Gohr */ 71*93ca6f4fSAndreas Gohr protected function validateField(AbstractBaseType $type, $label, &$data) { 72*93ca6f4fSAndreas Gohr $prefix = sprintf($this->hlp->getLang('validation_prefix'), $label); 73*93ca6f4fSAndreas Gohr 74*93ca6f4fSAndreas Gohr $ok = true; 75*93ca6f4fSAndreas Gohr if(is_array($data)) { 76*93ca6f4fSAndreas Gohr foreach($data as &$value) { 77*93ca6f4fSAndreas Gohr if(!blank($value)) { 78*93ca6f4fSAndreas Gohr try { 79*93ca6f4fSAndreas Gohr $value = $type->validate($value); 80*93ca6f4fSAndreas Gohr } catch(ValidationException $e) { 81*93ca6f4fSAndreas Gohr $this->errors[] = $prefix . $e->getMessage(); 82*93ca6f4fSAndreas Gohr $ok = false; 83*93ca6f4fSAndreas Gohr } 84*93ca6f4fSAndreas Gohr } 85*93ca6f4fSAndreas Gohr } 86*93ca6f4fSAndreas Gohr return $ok; 87*93ca6f4fSAndreas Gohr } 88*93ca6f4fSAndreas Gohr 89*93ca6f4fSAndreas Gohr if(!blank($data)) { 90*93ca6f4fSAndreas Gohr try { 91*93ca6f4fSAndreas Gohr $data = $type->validate($data); 92*93ca6f4fSAndreas Gohr } catch(ValidationException $e) { 93*93ca6f4fSAndreas Gohr $this->errors[] = $prefix . $e->getMessage(); 94*93ca6f4fSAndreas Gohr $ok = false; 95*93ca6f4fSAndreas Gohr } 96*93ca6f4fSAndreas Gohr } 97*93ca6f4fSAndreas Gohr return $ok; 98*93ca6f4fSAndreas Gohr } 99*93ca6f4fSAndreas Gohr 100*93ca6f4fSAndreas Gohr /** 101*93ca6f4fSAndreas Gohr * Simple filter to remove blank values 102*93ca6f4fSAndreas Gohr * 103*93ca6f4fSAndreas Gohr * @param string $val 104*93ca6f4fSAndreas Gohr * @return bool 105*93ca6f4fSAndreas Gohr */ 106*93ca6f4fSAndreas Gohr public function filter($val) { 107*93ca6f4fSAndreas Gohr return !blank($val); 108*93ca6f4fSAndreas Gohr } 109*93ca6f4fSAndreas Gohr} 110