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