xref: /plugin/struct/meta/AccessDataValidator.php (revision 4cd5cc28e2bf004aed676e9b1f46cc188a4b2240)
193ca6f4fSAndreas Gohr<?php
293ca6f4fSAndreas Gohr
393ca6f4fSAndreas Gohrnamespace dokuwiki\plugin\struct\meta;
493ca6f4fSAndreas Gohr
593ca6f4fSAndreas Gohr/**
693ca6f4fSAndreas Gohr * Validate the data for a whole schema
793ca6f4fSAndreas Gohr *
893ca6f4fSAndreas Gohr * Should be aquired through AccessDataTable::getValidator()
993ca6f4fSAndreas Gohr */
10d6d97f60SAnna Dabrowskaclass AccessDataValidator extends ValueValidator
11d6d97f60SAnna Dabrowska{
1293ca6f4fSAndreas Gohr
1393ca6f4fSAndreas Gohr    /** @var AccessTable */
1493ca6f4fSAndreas Gohr    protected $access;
1593ca6f4fSAndreas Gohr
1693ca6f4fSAndreas Gohr    /** @var array */
1793ca6f4fSAndreas Gohr    protected $data;
1893ca6f4fSAndreas Gohr
1993ca6f4fSAndreas Gohr    /**
2093ca6f4fSAndreas Gohr     * ValidationResult constructor.
2193ca6f4fSAndreas Gohr     * @param AccessTable $access
2293ca6f4fSAndreas Gohr     * @param array $data the data to validate (and save)
2393ca6f4fSAndreas Gohr     */
24d6d97f60SAnna Dabrowska    public function __construct(AccessTable $access, $data)
25d6d97f60SAnna Dabrowska    {
2693ca6f4fSAndreas Gohr        parent::__construct();
2793ca6f4fSAndreas Gohr        $this->access = $access;
2893ca6f4fSAndreas Gohr        $this->data = $data;
2993ca6f4fSAndreas Gohr    }
3093ca6f4fSAndreas Gohr
3193ca6f4fSAndreas Gohr    /**
3293ca6f4fSAndreas Gohr     * Validate the given data
3393ca6f4fSAndreas Gohr     *
3493ca6f4fSAndreas Gohr     * checks for assignments
3593ca6f4fSAndreas Gohr     * validates
3693ca6f4fSAndreas Gohr     * returns changed data only
3793ca6f4fSAndreas Gohr     *
3893ca6f4fSAndreas Gohr     * @param array $data array('schema' => ( 'fieldlabel' => 'value', ...))
3993ca6f4fSAndreas Gohr     * @param string $pageid
4093ca6f4fSAndreas Gohr     * @param string[] $errors validation errors
4193ca6f4fSAndreas Gohr     * @return AccessDataValidator[]|bool savable data or false on validation error
4293ca6f4fSAndreas Gohr     */
43d6d97f60SAnna Dabrowska    public static function validateDataForPage($data, $pageid, &$errors)
44d6d97f60SAnna Dabrowska    {
4593ca6f4fSAndreas Gohr        $tosave = array();
4693ca6f4fSAndreas Gohr        $valid = true;
4793ca6f4fSAndreas Gohr        $errors = array();
4893ca6f4fSAndreas Gohr
49025cb9daSAndreas Gohr        $assignments = Assignments::getInstance();
5093ca6f4fSAndreas Gohr        $tables = $assignments->getPageAssignments($pageid);
5193ca6f4fSAndreas Gohr        foreach ($tables as $table) {
52*4cd5cc28SAnna Dabrowska            $access = AccessTable::getPageAccess($table, $pageid);
5393ca6f4fSAndreas Gohr            $validation = $access->getValidator($data[$table]);
5493ca6f4fSAndreas Gohr            if (!$validation->validate()) {
5593ca6f4fSAndreas Gohr                $valid = false;
5693ca6f4fSAndreas Gohr                $errors = array_merge($errors, $validation->getErrors());
5793ca6f4fSAndreas Gohr            } else {
5893ca6f4fSAndreas Gohr                if ($validation->hasChanges()) {
5993ca6f4fSAndreas Gohr                    $tosave[] = $validation;
6093ca6f4fSAndreas Gohr                }
6193ca6f4fSAndreas Gohr            }
6293ca6f4fSAndreas Gohr        }
6393ca6f4fSAndreas Gohr        if ($valid) return $tosave;
6493ca6f4fSAndreas Gohr        return false;
6593ca6f4fSAndreas Gohr    }
6693ca6f4fSAndreas Gohr
6793ca6f4fSAndreas Gohr    /**
6893ca6f4fSAndreas Gohr     * Validate the data. This will clean the data according to type!
6993ca6f4fSAndreas Gohr     *
7093ca6f4fSAndreas Gohr     * @return bool
7193ca6f4fSAndreas Gohr     */
72d6d97f60SAnna Dabrowska    public function validate()
73d6d97f60SAnna Dabrowska    {
7493ca6f4fSAndreas Gohr        $result = true;
7593ca6f4fSAndreas Gohr        foreach ($this->access->getSchema()->getColumns() as $col) {
7693ca6f4fSAndreas Gohr            $label = $col->getType()->getLabel();
7793ca6f4fSAndreas Gohr            $result = $result && $this->validateValue($col, $this->data[$label]);
7893ca6f4fSAndreas Gohr        }
7993ca6f4fSAndreas Gohr        return $result;
8093ca6f4fSAndreas Gohr    }
8193ca6f4fSAndreas Gohr
8293ca6f4fSAndreas Gohr    /**
8393ca6f4fSAndreas Gohr     * Check if the data changed (selects current data)
8493ca6f4fSAndreas Gohr     *
8593ca6f4fSAndreas Gohr     * @return bool
8693ca6f4fSAndreas Gohr     */
87d6d97f60SAnna Dabrowska    public function hasChanges()
88d6d97f60SAnna Dabrowska    {
8993ca6f4fSAndreas Gohr        $olddata = $this->access->getDataArray();
9093ca6f4fSAndreas Gohr        return ($olddata != $this->data);
9193ca6f4fSAndreas Gohr    }
9293ca6f4fSAndreas Gohr
9393ca6f4fSAndreas Gohr    /**
9493ca6f4fSAndreas Gohr     * @return AccessTable
9593ca6f4fSAndreas Gohr     */
96d6d97f60SAnna Dabrowska    public function getAccessTable()
97d6d97f60SAnna Dabrowska    {
9893ca6f4fSAndreas Gohr        return $this->access;
9993ca6f4fSAndreas Gohr    }
10093ca6f4fSAndreas Gohr
10193ca6f4fSAndreas Gohr    /**
10293ca6f4fSAndreas Gohr     * Access the data after it has been cleand in the validation process
10393ca6f4fSAndreas Gohr     *
10493ca6f4fSAndreas Gohr     * @return array
10593ca6f4fSAndreas Gohr     */
106d6d97f60SAnna Dabrowska    public function getCleanData()
107d6d97f60SAnna Dabrowska    {
10893ca6f4fSAndreas Gohr        return $this->data;
10993ca6f4fSAndreas Gohr    }
11093ca6f4fSAndreas Gohr
11193ca6f4fSAndreas Gohr    /**
11293ca6f4fSAndreas Gohr     * Saves the data
11393ca6f4fSAndreas Gohr     *
11493ca6f4fSAndreas Gohr     * This saves no matter what. You have to chcek validation results and changes on your own!
11593ca6f4fSAndreas Gohr     *
11693ca6f4fSAndreas Gohr     * @param int $ts the timestamp to use when saving the data
11793ca6f4fSAndreas Gohr     * @return bool
11893ca6f4fSAndreas Gohr     */
119d6d97f60SAnna Dabrowska    public function saveData($ts = 0)
120d6d97f60SAnna Dabrowska    {
12193ca6f4fSAndreas Gohr        $this->access->setTimestamp($ts);
12293ca6f4fSAndreas Gohr        return $this->access->saveData($this->data);
12393ca6f4fSAndreas Gohr    }
12493ca6f4fSAndreas Gohr}
125