xref: /plugin/struct/meta/ValueValidator.php (revision 93ca6f4f4326051070b84b0a5019072b884cd2c5)
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