1de02284cSSzymon Olewniczak<?php 2de02284cSSzymon Olewniczak 3de02284cSSzymon Olewniczaknamespace dokuwiki\plugin\bez\mdl; 4de02284cSSzymon Olewniczak/* 5de02284cSSzymon Olewniczak * All fields are stored in object as strings. 6de02284cSSzymon Olewniczak * NULLs are converted to empty string. 7de02284cSSzymon Olewniczak * If any attribute in object === NULL -> it means that it was not initialized 8de02284cSSzymon Olewniczak * But we always inserts NULLs instead of empty strings. 9de02284cSSzymon Olewniczak * https://stackoverflow.com/questions/1267999/mysql-better-to-insert-null-or-empty-string 10de02284cSSzymon Olewniczak **/ 11de02284cSSzymon Olewniczak 12de02284cSSzymon Olewniczakuse dokuwiki\plugin\bez\meta\PermissionDeniedException; 138a638198SSzymon Olewniczakuse dokuwiki\plugin\bez\meta\ValidationException; 14de02284cSSzymon Olewniczak 15a0cd8c78SSzymon Olewniczakabstract class Entity { 16de02284cSSzymon Olewniczak 17de02284cSSzymon Olewniczak /** @var Model */ 18de02284cSSzymon Olewniczak protected $model; 19de02284cSSzymon Olewniczak 20de02284cSSzymon Olewniczak /** @var Validator */ 21de02284cSSzymon Olewniczak protected $validator; 22de02284cSSzymon Olewniczak 23a0cd8c78SSzymon Olewniczak /** @var Acl */ 24a0cd8c78SSzymon Olewniczak protected $acl; 25a0cd8c78SSzymon Olewniczak 26de02284cSSzymon Olewniczak abstract public static function get_columns(); 27de02284cSSzymon Olewniczak 287fbf4c39SSzymon Olewniczak public static function get_select_columns() { 297fbf4c39SSzymon Olewniczak $class = get_called_class(); 307fbf4c39SSzymon Olewniczak return $class::get_columns(); 317fbf4c39SSzymon Olewniczak } 327fbf4c39SSzymon Olewniczak 33b331b892SSzymon Olewniczak public static function get_acl_columns() { 34b331b892SSzymon Olewniczak $class = get_called_class(); 35b331b892SSzymon Olewniczak return $class::get_select_columns(); 36b331b892SSzymon Olewniczak } 37b331b892SSzymon Olewniczak 38de02284cSSzymon Olewniczak public function get_assoc($filter=NULL) { 39de02284cSSzymon Olewniczak $assoc = array(); 40de02284cSSzymon Olewniczak 417fbf4c39SSzymon Olewniczak $columns = $this->get_select_columns(); 42de02284cSSzymon Olewniczak if ($filter !== NULL) { 43de02284cSSzymon Olewniczak $columns = array_intersect($columns, $filter); 44de02284cSSzymon Olewniczak } 45de02284cSSzymon Olewniczak 46de02284cSSzymon Olewniczak foreach ($columns as $col) { 47de02284cSSzymon Olewniczak $assoc[$col] = $this->$col; 48de02284cSSzymon Olewniczak } 49de02284cSSzymon Olewniczak return $assoc; 50de02284cSSzymon Olewniczak } 51de02284cSSzymon Olewniczak 52de02284cSSzymon Olewniczak public function get_table_name() { 53de02284cSSzymon Olewniczak $class = (new \ReflectionClass($this))->getShortName(); 54de02284cSSzymon Olewniczak return lcfirst($class); 55de02284cSSzymon Olewniczak } 56de02284cSSzymon Olewniczak 57de02284cSSzymon Olewniczak public function __get($property) { 58de02284cSSzymon Olewniczak if (!property_exists($this, $property) || !in_array($property, $this->get_columns())) { 59de02284cSSzymon Olewniczak throw new \Exception('there is no column: "'.$property. '"" in table: "' . $this->get_table_name() . '"'); 60de02284cSSzymon Olewniczak } 61de02284cSSzymon Olewniczak 6214a1f0a4SSzymon Olewniczak if ($this->acl_of($property) < BEZ_PERMISSION_VIEW) { 6314a1f0a4SSzymon Olewniczak throw new PermissionDeniedException(); 6414a1f0a4SSzymon Olewniczak } 65de02284cSSzymon Olewniczak 66de02284cSSzymon Olewniczak return $this->$property; 67de02284cSSzymon Olewniczak 68de02284cSSzymon Olewniczak } 69de02284cSSzymon Olewniczak 70de02284cSSzymon Olewniczak protected function set_property($property, $value) { 71a0cd8c78SSzymon Olewniczak if ($this->acl_of($property) < BEZ_PERMISSION_CHANGE) { 72a0cd8c78SSzymon Olewniczak throw new PermissionDeniedException("cannot change field $property"); 73de02284cSSzymon Olewniczak } 74de02284cSSzymon Olewniczak $this->$property = $value; 75de02284cSSzymon Olewniczak } 76de02284cSSzymon Olewniczak 77de02284cSSzymon Olewniczak protected function set_property_array($array) { 78de02284cSSzymon Olewniczak foreach ($array as $k => $v) { 79de02284cSSzymon Olewniczak $this->set_property($k, $v); 80de02284cSSzymon Olewniczak } 81de02284cSSzymon Olewniczak } 82de02284cSSzymon Olewniczak 83de02284cSSzymon Olewniczak public function set_data($post) { 84de02284cSSzymon Olewniczak $val_data = $this->validator->validate($post); 85de02284cSSzymon Olewniczak if ($val_data === false) { 86de02284cSSzymon Olewniczak throw new ValidationException($this->get_table_name(), $this->validator->get_errors()); 87de02284cSSzymon Olewniczak } 88de02284cSSzymon Olewniczak 89de02284cSSzymon Olewniczak $this->set_property_array($val_data); 90de02284cSSzymon Olewniczak } 91*501f256bSSzymon Olewniczak 92*501f256bSSzymon Olewniczak 93*501f256bSSzymon Olewniczak public function purge() { 94*501f256bSSzymon Olewniczak if (property_exists($this, 'content') && property_exists($this, 'content_html')) { 95*501f256bSSzymon Olewniczak $rule = $this->validator->get_rule('content'); 96*501f256bSSzymon Olewniczak 97*501f256bSSzymon Olewniczak $html = p_render('xhtml',p_get_instructions($this->content), $ignore); 98*501f256bSSzymon Olewniczak 99*501f256bSSzymon Olewniczak //probably content contains only white spaces 100*501f256bSSzymon Olewniczak if (empty($html) && $rule[1] == 'NOT NULL') { 101*501f256bSSzymon Olewniczak $html = '<p></p>'; 102*501f256bSSzymon Olewniczak } 103*501f256bSSzymon Olewniczak $this->content_html = $html; 104*501f256bSSzymon Olewniczak } 105*501f256bSSzymon Olewniczak 106*501f256bSSzymon Olewniczak } 107de02284cSSzymon Olewniczak 1087fbf4c39SSzymon Olewniczak public function changable_fields($filter=NULL) { 109a0cd8c78SSzymon Olewniczak $fields = $this->acl->get_list(); 1107fbf4c39SSzymon Olewniczak 1117fbf4c39SSzymon Olewniczak if ($filter !== NULL) { 1127fbf4c39SSzymon Olewniczak $fields = array_filter($fields, function ($k) use ($filter) { 1137fbf4c39SSzymon Olewniczak return in_array($k, $filter); 1147fbf4c39SSzymon Olewniczak }, ARRAY_FILTER_USE_KEY); 1157fbf4c39SSzymon Olewniczak } 1167fbf4c39SSzymon Olewniczak 1177fbf4c39SSzymon Olewniczak return array_keys(array_filter($fields, function ($var) { 1187fbf4c39SSzymon Olewniczak return $var >= BEZ_PERMISSION_CHANGE; 1197fbf4c39SSzymon Olewniczak })); 1207fbf4c39SSzymon Olewniczak } 121de02284cSSzymon Olewniczak 12253df74e7SSzymon Olewniczak public function can_be_null($field) { 12353df74e7SSzymon Olewniczak $rule = $this->validator->get_rule($field); 12453df74e7SSzymon Olewniczak $null = $rule[1]; 12553df74e7SSzymon Olewniczak if (strtolower($null) == 'null') { 12653df74e7SSzymon Olewniczak return true; 12753df74e7SSzymon Olewniczak } 12853df74e7SSzymon Olewniczak 12953df74e7SSzymon Olewniczak return false; 13053df74e7SSzymon Olewniczak } 131de02284cSSzymon Olewniczak 132de02284cSSzymon Olewniczak public function __construct($model) { 133de02284cSSzymon Olewniczak $this->model = $model; 134de02284cSSzymon Olewniczak $this->validator = new Validator($this->model); 135a0cd8c78SSzymon Olewniczak 136b331b892SSzymon Olewniczak $this->acl = new Acl($this->model->get_level(), $this->get_acl_columns()); 137de02284cSSzymon Olewniczak } 138a0cd8c78SSzymon Olewniczak 139a0cd8c78SSzymon Olewniczak public function acl_of($field) { 140a0cd8c78SSzymon Olewniczak return $this->acl->acl_of($field); 141a0cd8c78SSzymon Olewniczak } 142a0cd8c78SSzymon Olewniczak 143de02284cSSzymon Olewniczak} 144