xref: /plugin/struct/meta/ValueValidator.php (revision d6d97f6064c3b0f90310be8341edc9585520ee54)
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 */
10*d6d97f60SAnna Dabrowskaclass ValueValidator
11*d6d97f60SAnna 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     */
22*d6d97f60SAnna Dabrowska    public function __construct()
23*d6d97f60SAnna 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     */
35*d6d97f60SAnna Dabrowska    public function validateValue(Column $col, &$rawvalue)
36*d6d97f60SAnna 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
4493ca6f4fSAndreas Gohr        if (is_array($rawvalue)) {
4593ca6f4fSAndreas Gohr            $rawvalue = array_filter($rawvalue, array($this, 'filter'));
4693ca6f4fSAndreas Gohr            $rawvalue = array_values($rawvalue); // reset the array keys
4793ca6f4fSAndreas Gohr        }
4893ca6f4fSAndreas Gohr
4993ca6f4fSAndreas Gohr        // validate data
5093ca6f4fSAndreas Gohr        return $this->validateField($type, $trans, $rawvalue);
5193ca6f4fSAndreas Gohr    }
5293ca6f4fSAndreas Gohr
5393ca6f4fSAndreas Gohr    /**
5493ca6f4fSAndreas Gohr     * The errors that occured during validation
5593ca6f4fSAndreas Gohr     *
5693ca6f4fSAndreas Gohr     * @return string[] already translated error messages
5793ca6f4fSAndreas Gohr     */
58*d6d97f60SAnna Dabrowska    public function getErrors()
59*d6d97f60SAnna Dabrowska    {
6093ca6f4fSAndreas Gohr        return $this->errors;
6193ca6f4fSAndreas Gohr    }
6293ca6f4fSAndreas Gohr
6393ca6f4fSAndreas Gohr    /**
6493ca6f4fSAndreas Gohr     * Validate the given data for a single field
6593ca6f4fSAndreas Gohr     *
6693ca6f4fSAndreas Gohr     * Catches the Validation exceptions and transforms them into proper error messages.
6793ca6f4fSAndreas Gohr     *
6893ca6f4fSAndreas Gohr     * Blank values are not validated and always pass
6993ca6f4fSAndreas Gohr     *
7093ca6f4fSAndreas Gohr     * @param AbstractBaseType $type
7193ca6f4fSAndreas Gohr     * @param string $label
7293ca6f4fSAndreas Gohr     * @param array|string|int &$data may be modified by the validation function
7393ca6f4fSAndreas Gohr     * @return bool true if the data validates, otherwise false
7493ca6f4fSAndreas Gohr     */
75*d6d97f60SAnna Dabrowska    protected function validateField(AbstractBaseType $type, $label, &$data)
76*d6d97f60SAnna Dabrowska    {
7793ca6f4fSAndreas Gohr        $prefix = sprintf($this->hlp->getLang('validation_prefix'), $label);
7893ca6f4fSAndreas Gohr
7993ca6f4fSAndreas Gohr        $ok = true;
8093ca6f4fSAndreas Gohr        if (is_array($data)) {
8193ca6f4fSAndreas Gohr            foreach ($data as &$value) {
8293ca6f4fSAndreas Gohr                if (!blank($value)) {
8393ca6f4fSAndreas Gohr                    try {
8493ca6f4fSAndreas Gohr                        $value = $type->validate($value);
8593ca6f4fSAndreas Gohr                    } catch (ValidationException $e) {
8693ca6f4fSAndreas Gohr                        $this->errors[] = $prefix . $e->getMessage();
8793ca6f4fSAndreas Gohr                        $ok = false;
8893ca6f4fSAndreas Gohr                    }
8993ca6f4fSAndreas Gohr                }
9093ca6f4fSAndreas Gohr            }
9193ca6f4fSAndreas Gohr            return $ok;
9293ca6f4fSAndreas Gohr        }
9393ca6f4fSAndreas Gohr
9493ca6f4fSAndreas Gohr        if (!blank($data)) {
9593ca6f4fSAndreas Gohr            try {
9693ca6f4fSAndreas Gohr                $data = $type->validate($data);
9793ca6f4fSAndreas Gohr            } catch (ValidationException $e) {
9893ca6f4fSAndreas Gohr                $this->errors[] = $prefix . $e->getMessage();
9993ca6f4fSAndreas Gohr                $ok = false;
10093ca6f4fSAndreas Gohr            }
10193ca6f4fSAndreas Gohr        }
10293ca6f4fSAndreas Gohr        return $ok;
10393ca6f4fSAndreas Gohr    }
10493ca6f4fSAndreas Gohr
10593ca6f4fSAndreas Gohr    /**
10693ca6f4fSAndreas Gohr     * Simple filter to remove blank values
10793ca6f4fSAndreas Gohr     *
10893ca6f4fSAndreas Gohr     * @param string $val
10993ca6f4fSAndreas Gohr     * @return bool
11093ca6f4fSAndreas Gohr     */
111*d6d97f60SAnna Dabrowska    public function filter($val)
112*d6d97f60SAnna Dabrowska    {
11393ca6f4fSAndreas Gohr        return !blank($val);
11493ca6f4fSAndreas Gohr    }
11593ca6f4fSAndreas Gohr}
116