1de02284cSSzymon Olewniczak<?php 2de02284cSSzymon Olewniczak 3de02284cSSzymon Olewniczak//if(!defined('DOKU_INC')) die(); 4de02284cSSzymon Olewniczak 5de02284cSSzymon Olewniczak 6de02284cSSzymon Olewniczak//~ abstract class BEZ_mdl_Dummy_Entity { 7de02284cSSzymon Olewniczak 8de02284cSSzymon Olewniczak //~ protected $model; 9de02284cSSzymon Olewniczak 10de02284cSSzymon Olewniczak //~ protected $id = NULL; 11de02284cSSzymon Olewniczak 12de02284cSSzymon Olewniczak //~ public function __get($property) { 13de02284cSSzymon Olewniczak //~ if ($property === 'id') { 14de02284cSSzymon Olewniczak //~ return $this->id; 15de02284cSSzymon Olewniczak //~ } 16de02284cSSzymon Olewniczak //~ } 17de02284cSSzymon Olewniczak 18de02284cSSzymon Olewniczak //~ public function get_table_singular() { 19de02284cSSzymon Olewniczak //~ $class = get_class($this); 20de02284cSSzymon Olewniczak //~ $exp = explode('_', $class); 21de02284cSSzymon Olewniczak //~ $singular = array_pop($exp); 22de02284cSSzymon Olewniczak //~ return lcfirst($singular); 23de02284cSSzymon Olewniczak //~ } 24de02284cSSzymon Olewniczak 25de02284cSSzymon Olewniczak //~ public function get_table_name() { 26de02284cSSzymon Olewniczak //~ $singlar = $this->get_table_singular(); 27de02284cSSzymon Olewniczak //~ return $singular.'s'; 28de02284cSSzymon Olewniczak //~ } 29de02284cSSzymon Olewniczak 30de02284cSSzymon Olewniczak //~ public function acl_of($field) { 31de02284cSSzymon Olewniczak //~ return $this->model->acl->check_field($this, $field); 32de02284cSSzymon Olewniczak //~ } 33de02284cSSzymon Olewniczak 34de02284cSSzymon Olewniczak //~ public function __construct($model) { 35de02284cSSzymon Olewniczak //~ $this->model = $model; 36de02284cSSzymon Olewniczak //~ } 37de02284cSSzymon Olewniczak//~ } 38de02284cSSzymon Olewniczak 39de02284cSSzymon Olewniczaknamespace dokuwiki\plugin\bez\mdl; 40de02284cSSzymon Olewniczak/* 41de02284cSSzymon Olewniczak * All fields are stored in object as strings. 42de02284cSSzymon Olewniczak * NULLs are converted to empty string. 43de02284cSSzymon Olewniczak * If any attribute in object === NULL -> it means that it was not initialized 44de02284cSSzymon Olewniczak * But we always inserts NULLs instead of empty strings. 45de02284cSSzymon Olewniczak * https://stackoverflow.com/questions/1267999/mysql-better-to-insert-null-or-empty-string 46de02284cSSzymon Olewniczak **/ 47de02284cSSzymon Olewniczak 48de02284cSSzymon Olewniczakuse dokuwiki\plugin\bez\meta\PermissionDeniedException; 498a638198SSzymon Olewniczakuse dokuwiki\plugin\bez\meta\ValidationException; 50de02284cSSzymon Olewniczak 51de02284cSSzymon Olewniczakabstract class Entity {// extends BEZ_mdl_Dummy_Entity { 52de02284cSSzymon Olewniczak 53de02284cSSzymon Olewniczak /** @var Model */ 54de02284cSSzymon Olewniczak protected $model; 55de02284cSSzymon Olewniczak 56de02284cSSzymon Olewniczak /** @var Validator */ 57de02284cSSzymon Olewniczak protected $validator; 58de02284cSSzymon Olewniczak 59de02284cSSzymon Olewniczak abstract public static function get_columns(); 60de02284cSSzymon Olewniczak 617fbf4c39SSzymon Olewniczak public static function get_select_columns() { 627fbf4c39SSzymon Olewniczak $class = get_called_class(); 637fbf4c39SSzymon Olewniczak return $class::get_columns(); 647fbf4c39SSzymon Olewniczak } 657fbf4c39SSzymon Olewniczak 66de02284cSSzymon Olewniczak public function get_assoc($filter=NULL) { 67de02284cSSzymon Olewniczak $assoc = array(); 68de02284cSSzymon Olewniczak 697fbf4c39SSzymon Olewniczak $columns = $this->get_select_columns(); 70de02284cSSzymon Olewniczak if ($filter !== NULL) { 71de02284cSSzymon Olewniczak $columns = array_intersect($columns, $filter); 72de02284cSSzymon Olewniczak } 73de02284cSSzymon Olewniczak 74de02284cSSzymon Olewniczak foreach ($columns as $col) { 75de02284cSSzymon Olewniczak $assoc[$col] = $this->$col; 76de02284cSSzymon Olewniczak } 77de02284cSSzymon Olewniczak return $assoc; 78de02284cSSzymon Olewniczak } 79de02284cSSzymon Olewniczak 80de02284cSSzymon Olewniczak public function get_table_name() { 81de02284cSSzymon Olewniczak $class = (new \ReflectionClass($this))->getShortName(); 82de02284cSSzymon Olewniczak return lcfirst($class); 83de02284cSSzymon Olewniczak } 84de02284cSSzymon Olewniczak 85de02284cSSzymon Olewniczak public function __get($property) { 86de02284cSSzymon Olewniczak if (!property_exists($this, $property) || !in_array($property, $this->get_columns())) { 87de02284cSSzymon Olewniczak throw new \Exception('there is no column: "'.$property. '"" in table: "' . $this->get_table_name() . '"'); 88de02284cSSzymon Olewniczak } 89de02284cSSzymon Olewniczak 90de02284cSSzymon Olewniczak //now only normal db columns has ACL, it should be fixed 91*20e189b9SSzymon Olewniczak// if ($this->acl_of($property) < BEZ_PERMISSION_VIEW) { 92*20e189b9SSzymon Olewniczak// throw new PermissionDeniedException(); 93*20e189b9SSzymon Olewniczak// } 94de02284cSSzymon Olewniczak 95de02284cSSzymon Olewniczak return $this->$property; 96de02284cSSzymon Olewniczak 97de02284cSSzymon Olewniczak } 98de02284cSSzymon Olewniczak 99de02284cSSzymon Olewniczak protected function set_property($property, $value) { 100de02284cSSzymon Olewniczak 101de02284cSSzymon Olewniczak if (!in_array($property, $this->get_columns())) { 102de02284cSSzymon Olewniczak throw new \Exception('trying to set not existing column'); 103de02284cSSzymon Olewniczak } 104de02284cSSzymon Olewniczak 105de02284cSSzymon Olewniczak //throws ValidationException 106de02284cSSzymon Olewniczak $this->validator->validate_field($property, $value); 107de02284cSSzymon Olewniczak 108de02284cSSzymon Olewniczak //throws PermissionDeniedException 1098a638198SSzymon Olewniczak $this->model->acl->can($this, $property, BEZ_PERMISSION_CHANGE); 110de02284cSSzymon Olewniczak 111de02284cSSzymon Olewniczak $this->$property = $value; 112de02284cSSzymon Olewniczak } 113de02284cSSzymon Olewniczak 114de02284cSSzymon Olewniczak protected function set_property_array($array) { 115de02284cSSzymon Olewniczak foreach ($array as $k => $v) { 116de02284cSSzymon Olewniczak $this->set_property($k, $v); 117de02284cSSzymon Olewniczak } 118de02284cSSzymon Olewniczak } 119de02284cSSzymon Olewniczak 120de02284cSSzymon Olewniczak public function set_data($post) { 121de02284cSSzymon Olewniczak $val_data = $this->validator->validate($post); 122de02284cSSzymon Olewniczak if ($val_data === false) { 123de02284cSSzymon Olewniczak throw new ValidationException($this->get_table_name(), $this->validator->get_errors()); 124de02284cSSzymon Olewniczak } 125de02284cSSzymon Olewniczak 126de02284cSSzymon Olewniczak $this->set_property_array($val_data); 127de02284cSSzymon Olewniczak 128de02284cSSzymon Olewniczak } 129de02284cSSzymon Olewniczak 1307fbf4c39SSzymon Olewniczak public function changable_fields($filter=NULL) { 1317fbf4c39SSzymon Olewniczak $fields = $this->model->acl->check($this); 1327fbf4c39SSzymon Olewniczak 1337fbf4c39SSzymon Olewniczak if ($filter !== NULL) { 1347fbf4c39SSzymon Olewniczak $fields = array_filter($fields, function ($k) use ($filter) { 1357fbf4c39SSzymon Olewniczak return in_array($k, $filter); 1367fbf4c39SSzymon Olewniczak }, ARRAY_FILTER_USE_KEY); 1377fbf4c39SSzymon Olewniczak } 1387fbf4c39SSzymon Olewniczak 1397fbf4c39SSzymon Olewniczak return array_keys(array_filter($fields, function ($var) { 1407fbf4c39SSzymon Olewniczak return $var >= BEZ_PERMISSION_CHANGE; 1417fbf4c39SSzymon Olewniczak })); 1427fbf4c39SSzymon Olewniczak } 143de02284cSSzymon Olewniczak 144de02284cSSzymon Olewniczak public function acl_of($field) { 145de02284cSSzymon Olewniczak return $this->model->acl->check_field($this, $field); 146de02284cSSzymon Olewniczak } 14753df74e7SSzymon Olewniczak 14853df74e7SSzymon Olewniczak public function can_be_null($field) { 14953df74e7SSzymon Olewniczak $rule = $this->validator->get_rule($field); 15053df74e7SSzymon Olewniczak $null = $rule[1]; 15153df74e7SSzymon Olewniczak if (strtolower($null) == 'null') { 15253df74e7SSzymon Olewniczak return true; 15353df74e7SSzymon Olewniczak } 15453df74e7SSzymon Olewniczak 15553df74e7SSzymon Olewniczak return false; 15653df74e7SSzymon Olewniczak } 157de02284cSSzymon Olewniczak 158de02284cSSzymon Olewniczak public function __construct($model) { 159de02284cSSzymon Olewniczak $this->model = $model; 160de02284cSSzymon Olewniczak $this->validator = new Validator($this->model); 161de02284cSSzymon Olewniczak } 162de02284cSSzymon Olewniczak} 163