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 */ 10*d6d97f60SAnna Dabrowskaclass AccessDataValidator extends ValueValidator 11*d6d97f60SAnna 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 */ 24*d6d97f60SAnna Dabrowska public function __construct(AccessTable $access, $data) 25*d6d97f60SAnna 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 */ 43*d6d97f60SAnna Dabrowska public static function validateDataForPage($data, $pageid, &$errors) 44*d6d97f60SAnna 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) { 5200bff81cSAnna Dabrowska // FIXME pass some revision ts or we get the wrong type of access! 5300bff81cSAnna Dabrowska $access = AccessTable::byTableName($table, $pageid, time()); 5493ca6f4fSAndreas Gohr $validation = $access->getValidator($data[$table]); 5593ca6f4fSAndreas Gohr if (!$validation->validate()) { 5693ca6f4fSAndreas Gohr $valid = false; 5793ca6f4fSAndreas Gohr $errors = array_merge($errors, $validation->getErrors()); 5893ca6f4fSAndreas Gohr } else { 5993ca6f4fSAndreas Gohr if ($validation->hasChanges()) { 6093ca6f4fSAndreas Gohr $tosave[] = $validation; 6193ca6f4fSAndreas Gohr } 6293ca6f4fSAndreas Gohr } 6393ca6f4fSAndreas Gohr } 6493ca6f4fSAndreas Gohr if ($valid) return $tosave; 6593ca6f4fSAndreas Gohr return false; 6693ca6f4fSAndreas Gohr } 6793ca6f4fSAndreas Gohr 6893ca6f4fSAndreas Gohr /** 6993ca6f4fSAndreas Gohr * Validate the data. This will clean the data according to type! 7093ca6f4fSAndreas Gohr * 7193ca6f4fSAndreas Gohr * @return bool 7293ca6f4fSAndreas Gohr */ 73*d6d97f60SAnna Dabrowska public function validate() 74*d6d97f60SAnna Dabrowska { 7593ca6f4fSAndreas Gohr $result = true; 7693ca6f4fSAndreas Gohr foreach ($this->access->getSchema()->getColumns() as $col) { 7793ca6f4fSAndreas Gohr $label = $col->getType()->getLabel(); 7893ca6f4fSAndreas Gohr $result = $result && $this->validateValue($col, $this->data[$label]); 7993ca6f4fSAndreas Gohr } 8093ca6f4fSAndreas Gohr return $result; 8193ca6f4fSAndreas Gohr } 8293ca6f4fSAndreas Gohr 8393ca6f4fSAndreas Gohr /** 8493ca6f4fSAndreas Gohr * Check if the data changed (selects current data) 8593ca6f4fSAndreas Gohr * 8693ca6f4fSAndreas Gohr * @return bool 8793ca6f4fSAndreas Gohr */ 88*d6d97f60SAnna Dabrowska public function hasChanges() 89*d6d97f60SAnna Dabrowska { 9093ca6f4fSAndreas Gohr $olddata = $this->access->getDataArray(); 9193ca6f4fSAndreas Gohr return ($olddata != $this->data); 9293ca6f4fSAndreas Gohr } 9393ca6f4fSAndreas Gohr 9493ca6f4fSAndreas Gohr /** 9593ca6f4fSAndreas Gohr * @return AccessTable 9693ca6f4fSAndreas Gohr */ 97*d6d97f60SAnna Dabrowska public function getAccessTable() 98*d6d97f60SAnna Dabrowska { 9993ca6f4fSAndreas Gohr return $this->access; 10093ca6f4fSAndreas Gohr } 10193ca6f4fSAndreas Gohr 10293ca6f4fSAndreas Gohr /** 10393ca6f4fSAndreas Gohr * Access the data after it has been cleand in the validation process 10493ca6f4fSAndreas Gohr * 10593ca6f4fSAndreas Gohr * @return array 10693ca6f4fSAndreas Gohr */ 107*d6d97f60SAnna Dabrowska public function getCleanData() 108*d6d97f60SAnna Dabrowska { 10993ca6f4fSAndreas Gohr return $this->data; 11093ca6f4fSAndreas Gohr } 11193ca6f4fSAndreas Gohr 11293ca6f4fSAndreas Gohr /** 11393ca6f4fSAndreas Gohr * Saves the data 11493ca6f4fSAndreas Gohr * 11593ca6f4fSAndreas Gohr * This saves no matter what. You have to chcek validation results and changes on your own! 11693ca6f4fSAndreas Gohr * 11793ca6f4fSAndreas Gohr * @param int $ts the timestamp to use when saving the data 11893ca6f4fSAndreas Gohr * @return bool 11993ca6f4fSAndreas Gohr */ 120*d6d97f60SAnna Dabrowska public function saveData($ts = 0) 121*d6d97f60SAnna Dabrowska { 12293ca6f4fSAndreas Gohr $this->access->setTimestamp($ts); 12393ca6f4fSAndreas Gohr return $this->access->saveData($this->data); 12493ca6f4fSAndreas Gohr } 12593ca6f4fSAndreas Gohr} 126