xref: /plugin/bez/mdl/Entity.php (revision 501f256ba6a959ea8056b46999e10d337dbe5c5d)
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