xref: /plugin/struct/meta/AccessDataValidator.php (revision 93ca6f4f4326051070b84b0a5019072b884cd2c5)
1*93ca6f4fSAndreas Gohr<?php
2*93ca6f4fSAndreas Gohr
3*93ca6f4fSAndreas Gohrnamespace dokuwiki\plugin\struct\meta;
4*93ca6f4fSAndreas Gohr
5*93ca6f4fSAndreas Gohr/**
6*93ca6f4fSAndreas Gohr * Validate the data for a whole schema
7*93ca6f4fSAndreas Gohr *
8*93ca6f4fSAndreas Gohr * Should be aquired through AccessDataTable::getValidator()
9*93ca6f4fSAndreas Gohr */
10*93ca6f4fSAndreas Gohrclass AccessDataValidator extends ValueValidator {
11*93ca6f4fSAndreas Gohr
12*93ca6f4fSAndreas Gohr    /** @var AccessTable */
13*93ca6f4fSAndreas Gohr    protected $access;
14*93ca6f4fSAndreas Gohr
15*93ca6f4fSAndreas Gohr    /** @var array */
16*93ca6f4fSAndreas Gohr    protected $data;
17*93ca6f4fSAndreas Gohr
18*93ca6f4fSAndreas Gohr    /**
19*93ca6f4fSAndreas Gohr     * ValidationResult constructor.
20*93ca6f4fSAndreas Gohr     * @param AccessTable $access
21*93ca6f4fSAndreas Gohr     * @param array $data the data to validate (and save)
22*93ca6f4fSAndreas Gohr     */
23*93ca6f4fSAndreas Gohr    public function __construct(AccessTable $access, $data) {
24*93ca6f4fSAndreas Gohr        parent::__construct();
25*93ca6f4fSAndreas Gohr        $this->access = $access;
26*93ca6f4fSAndreas Gohr        $this->data = $data;
27*93ca6f4fSAndreas Gohr    }
28*93ca6f4fSAndreas Gohr
29*93ca6f4fSAndreas Gohr    /**
30*93ca6f4fSAndreas Gohr     * Validate the given data
31*93ca6f4fSAndreas Gohr     *
32*93ca6f4fSAndreas Gohr     * checks for assignments
33*93ca6f4fSAndreas Gohr     * validates
34*93ca6f4fSAndreas Gohr     * returns changed data only
35*93ca6f4fSAndreas Gohr     *
36*93ca6f4fSAndreas Gohr     * @param array $data array('schema' => ( 'fieldlabel' => 'value', ...))
37*93ca6f4fSAndreas Gohr     * @param string $pageid
38*93ca6f4fSAndreas Gohr     * @param string[] $errors validation errors
39*93ca6f4fSAndreas Gohr     * @return AccessDataValidator[]|bool savable data or false on validation error
40*93ca6f4fSAndreas Gohr     */
41*93ca6f4fSAndreas Gohr    static public function validateDataForPage($data, $pageid, &$errors) {
42*93ca6f4fSAndreas Gohr        $tosave = array();
43*93ca6f4fSAndreas Gohr        $valid = true;
44*93ca6f4fSAndreas Gohr        $errors = array();
45*93ca6f4fSAndreas Gohr
46*93ca6f4fSAndreas Gohr        $assignments = new Assignments();
47*93ca6f4fSAndreas Gohr        $tables = $assignments->getPageAssignments($pageid);
48*93ca6f4fSAndreas Gohr        foreach($tables as $table) {
49*93ca6f4fSAndreas Gohr            $access = AccessTable::byTableName($table, $pageid);
50*93ca6f4fSAndreas Gohr            $validation = $access->getValidator($data[$table]);
51*93ca6f4fSAndreas Gohr            if(!$validation->validate()) {
52*93ca6f4fSAndreas Gohr                $valid = false;
53*93ca6f4fSAndreas Gohr                $errors = array_merge($errors, $validation->getErrors());
54*93ca6f4fSAndreas Gohr            } else {
55*93ca6f4fSAndreas Gohr                if($validation->hasChanges()) {
56*93ca6f4fSAndreas Gohr                    $tosave[] = $validation;
57*93ca6f4fSAndreas Gohr                }
58*93ca6f4fSAndreas Gohr            }
59*93ca6f4fSAndreas Gohr        }
60*93ca6f4fSAndreas Gohr        if($valid) return $tosave;
61*93ca6f4fSAndreas Gohr        return false;
62*93ca6f4fSAndreas Gohr    }
63*93ca6f4fSAndreas Gohr
64*93ca6f4fSAndreas Gohr    /**
65*93ca6f4fSAndreas Gohr     * Validate the data. This will clean the data according to type!
66*93ca6f4fSAndreas Gohr     *
67*93ca6f4fSAndreas Gohr     * @return bool
68*93ca6f4fSAndreas Gohr     */
69*93ca6f4fSAndreas Gohr    public function validate() {
70*93ca6f4fSAndreas Gohr        $result = true;
71*93ca6f4fSAndreas Gohr        foreach($this->access->getSchema()->getColumns() as $col) {
72*93ca6f4fSAndreas Gohr            $label = $col->getType()->getLabel();
73*93ca6f4fSAndreas Gohr            $result = $result && $this->validateValue($col, $this->data[$label]);
74*93ca6f4fSAndreas Gohr        }
75*93ca6f4fSAndreas Gohr        return $result;
76*93ca6f4fSAndreas Gohr    }
77*93ca6f4fSAndreas Gohr
78*93ca6f4fSAndreas Gohr    /**
79*93ca6f4fSAndreas Gohr     * Check if the data changed (selects current data)
80*93ca6f4fSAndreas Gohr     *
81*93ca6f4fSAndreas Gohr     * @return bool
82*93ca6f4fSAndreas Gohr     */
83*93ca6f4fSAndreas Gohr    public function hasChanges() {
84*93ca6f4fSAndreas Gohr        $olddata = $this->access->getDataArray();
85*93ca6f4fSAndreas Gohr        return ($olddata != $this->data);
86*93ca6f4fSAndreas Gohr    }
87*93ca6f4fSAndreas Gohr
88*93ca6f4fSAndreas Gohr    /**
89*93ca6f4fSAndreas Gohr     * @return AccessTable
90*93ca6f4fSAndreas Gohr     */
91*93ca6f4fSAndreas Gohr    public function getAccessTable() {
92*93ca6f4fSAndreas Gohr        return $this->access;
93*93ca6f4fSAndreas Gohr    }
94*93ca6f4fSAndreas Gohr
95*93ca6f4fSAndreas Gohr    /**
96*93ca6f4fSAndreas Gohr     * Access the data after it has been cleand in the validation process
97*93ca6f4fSAndreas Gohr     *
98*93ca6f4fSAndreas Gohr     * @return array
99*93ca6f4fSAndreas Gohr     */
100*93ca6f4fSAndreas Gohr    public function getCleanData() {
101*93ca6f4fSAndreas Gohr        return $this->data;
102*93ca6f4fSAndreas Gohr    }
103*93ca6f4fSAndreas Gohr
104*93ca6f4fSAndreas Gohr    /**
105*93ca6f4fSAndreas Gohr     * Saves the data
106*93ca6f4fSAndreas Gohr     *
107*93ca6f4fSAndreas Gohr     * This saves no matter what. You have to chcek validation results and changes on your own!
108*93ca6f4fSAndreas Gohr     *
109*93ca6f4fSAndreas Gohr     * @param int $ts the timestamp to use when saving the data
110*93ca6f4fSAndreas Gohr     * @return bool
111*93ca6f4fSAndreas Gohr     */
112*93ca6f4fSAndreas Gohr    public function saveData($ts = 0) {
113*93ca6f4fSAndreas Gohr        $this->access->setTimestamp($ts);
114*93ca6f4fSAndreas Gohr        return $this->access->saveData($this->data);
115*93ca6f4fSAndreas Gohr    }
116*93ca6f4fSAndreas Gohr
117*93ca6f4fSAndreas Gohr}
118