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