xref: /plugin/bez/mdl/Entity.php (revision 53df74e7ac5ae4234aac1fa716a33878a039026f)
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
91de02284cSSzymon Olewniczak        if ($this->acl_of($property) < BEZ_PERMISSION_VIEW) {
92de02284cSSzymon Olewniczak            throw new PermissionDeniedException();
93de02284cSSzymon 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    }
147*53df74e7SSzymon Olewniczak
148*53df74e7SSzymon Olewniczak    public function can_be_null($field) {
149*53df74e7SSzymon Olewniczak	    $rule = $this->validator->get_rule($field);
150*53df74e7SSzymon Olewniczak	    $null = $rule[1];
151*53df74e7SSzymon Olewniczak	    if (strtolower($null) == 'null') {
152*53df74e7SSzymon Olewniczak	        return true;
153*53df74e7SSzymon Olewniczak        }
154*53df74e7SSzymon Olewniczak
155*53df74e7SSzymon Olewniczak        return false;
156*53df74e7SSzymon 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