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