xref: /plugin/bez/mdl/Entity.php (revision 32fae04eed3dfbbb5c1dfa8fcd03866a0eb2c20f)
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;
1467fdb426SSzymon Olewniczakuse PHPMailer\PHPMailer\Exception;
1567fdb426SSzymon Olewniczakuse PHPMailer\PHPMailer\PHPMailer;
16de02284cSSzymon Olewniczak
17a0cd8c78SSzymon Olewniczakabstract class Entity {
18de02284cSSzymon Olewniczak
19de02284cSSzymon Olewniczak    /** @var  Model */
20de02284cSSzymon Olewniczak    protected $model;
21de02284cSSzymon Olewniczak
22de02284cSSzymon Olewniczak    /** @var Validator */
23de02284cSSzymon Olewniczak    protected $validator;
24de02284cSSzymon Olewniczak
25a0cd8c78SSzymon Olewniczak    /** @var Acl */
26a0cd8c78SSzymon Olewniczak    protected $acl;
27a0cd8c78SSzymon Olewniczak
28de02284cSSzymon Olewniczak	abstract public static function get_columns();
29de02284cSSzymon Olewniczak
307fbf4c39SSzymon Olewniczak	public static function get_select_columns() {
317fbf4c39SSzymon Olewniczak        $class = get_called_class();
327fbf4c39SSzymon Olewniczak	    return $class::get_columns();
337fbf4c39SSzymon Olewniczak    }
347fbf4c39SSzymon Olewniczak
35b331b892SSzymon Olewniczak    public static function get_acl_columns() {
36b331b892SSzymon Olewniczak        $class = get_called_class();
37b331b892SSzymon Olewniczak        return $class::get_select_columns();
38b331b892SSzymon Olewniczak    }
39b331b892SSzymon Olewniczak
40de02284cSSzymon Olewniczak	public function get_assoc($filter=NULL) {
41de02284cSSzymon Olewniczak		$assoc = array();
42de02284cSSzymon Olewniczak
437fbf4c39SSzymon Olewniczak        $columns = $this->get_select_columns();
44de02284cSSzymon Olewniczak        if ($filter !== NULL) {
45de02284cSSzymon Olewniczak            $columns = array_intersect($columns, $filter);
46de02284cSSzymon Olewniczak        }
47de02284cSSzymon Olewniczak
48de02284cSSzymon Olewniczak		foreach ($columns as $col) {
49de02284cSSzymon Olewniczak			$assoc[$col] = $this->$col;
50de02284cSSzymon Olewniczak		}
51de02284cSSzymon Olewniczak		return $assoc;
52de02284cSSzymon Olewniczak	}
53de02284cSSzymon Olewniczak
54de02284cSSzymon Olewniczak    public function get_table_name() {
55de02284cSSzymon Olewniczak        $class = (new \ReflectionClass($this))->getShortName();
56de02284cSSzymon Olewniczak		return lcfirst($class);
57de02284cSSzymon Olewniczak	}
58de02284cSSzymon Olewniczak
59de02284cSSzymon Olewniczak	public function __get($property) {
60de02284cSSzymon Olewniczak        if (!property_exists($this, $property) || !in_array($property, $this->get_columns())) {
61de02284cSSzymon Olewniczak            throw new \Exception('there is no column: "'.$property. '"" in table: "' . $this->get_table_name() . '"');
62de02284cSSzymon Olewniczak        }
63de02284cSSzymon Olewniczak
6414a1f0a4SSzymon Olewniczak        if ($this->acl_of($property) < BEZ_PERMISSION_VIEW) {
6514a1f0a4SSzymon Olewniczak            throw new PermissionDeniedException();
6614a1f0a4SSzymon Olewniczak        }
67de02284cSSzymon Olewniczak
68de02284cSSzymon Olewniczak        return $this->$property;
69de02284cSSzymon Olewniczak
70de02284cSSzymon Olewniczak	}
71de02284cSSzymon Olewniczak
72de02284cSSzymon Olewniczak    protected function set_property($property, $value) {
73a0cd8c78SSzymon Olewniczak        if ($this->acl_of($property) < BEZ_PERMISSION_CHANGE) {
74a0cd8c78SSzymon Olewniczak            throw new PermissionDeniedException("cannot change field $property");
75de02284cSSzymon Olewniczak        }
76de02284cSSzymon Olewniczak        $this->$property = $value;
77de02284cSSzymon Olewniczak    }
78de02284cSSzymon Olewniczak
79de02284cSSzymon Olewniczak    protected function set_property_array($array) {
80de02284cSSzymon Olewniczak        foreach ($array as $k => $v) {
81de02284cSSzymon Olewniczak            $this->set_property($k, $v);
82de02284cSSzymon Olewniczak        }
83de02284cSSzymon Olewniczak    }
84de02284cSSzymon Olewniczak
85de02284cSSzymon Olewniczak    public function set_data($post) {
86de02284cSSzymon Olewniczak        $val_data = $this->validator->validate($post);
87de02284cSSzymon Olewniczak		if ($val_data === false) {
88de02284cSSzymon Olewniczak			throw new ValidationException($this->get_table_name(), $this->validator->get_errors());
89de02284cSSzymon Olewniczak		}
90de02284cSSzymon Olewniczak
91de02284cSSzymon Olewniczak		$this->set_property_array($val_data);
92de02284cSSzymon Olewniczak    }
93501f256bSSzymon Olewniczak
94501f256bSSzymon Olewniczak
95501f256bSSzymon Olewniczak    public function purge() {
96501f256bSSzymon Olewniczak	    if (property_exists($this, 'content') && property_exists($this, 'content_html')) {
97501f256bSSzymon Olewniczak            $rule = $this->validator->get_rule('content');
98501f256bSSzymon Olewniczak
99501f256bSSzymon Olewniczak            $html = p_render('xhtml',p_get_instructions($this->content), $ignore);
100501f256bSSzymon Olewniczak
101501f256bSSzymon Olewniczak            //probably content contains only white spaces
102501f256bSSzymon Olewniczak            if (empty($html) && $rule[1] == 'NOT NULL') {
103501f256bSSzymon Olewniczak                $html = '<p></p>';
104501f256bSSzymon Olewniczak            }
105501f256bSSzymon Olewniczak            $this->content_html = $html;
106501f256bSSzymon Olewniczak        }
107501f256bSSzymon Olewniczak
108501f256bSSzymon Olewniczak    }
109de02284cSSzymon Olewniczak
1107fbf4c39SSzymon Olewniczak    public function changable_fields($filter=NULL) {
111a0cd8c78SSzymon Olewniczak       $fields = $this->acl->get_list();
1127fbf4c39SSzymon Olewniczak
1137fbf4c39SSzymon Olewniczak       if ($filter !== NULL) {
1147fbf4c39SSzymon Olewniczak           $fields = array_filter($fields, function ($k) use ($filter) {
1157fbf4c39SSzymon Olewniczak                return in_array($k, $filter);
1167fbf4c39SSzymon Olewniczak           }, ARRAY_FILTER_USE_KEY);
1177fbf4c39SSzymon Olewniczak       }
1187fbf4c39SSzymon Olewniczak
1197fbf4c39SSzymon Olewniczak       return array_keys(array_filter($fields, function ($var) {
1207fbf4c39SSzymon Olewniczak           return $var >= BEZ_PERMISSION_CHANGE;
1217fbf4c39SSzymon Olewniczak       }));
1227fbf4c39SSzymon Olewniczak    }
123de02284cSSzymon Olewniczak
12453df74e7SSzymon Olewniczak    public function can_be_null($field) {
12553df74e7SSzymon Olewniczak	    $rule = $this->validator->get_rule($field);
12653df74e7SSzymon Olewniczak	    $null = $rule[1];
12753df74e7SSzymon Olewniczak	    if (strtolower($null) == 'null') {
12853df74e7SSzymon Olewniczak	        return true;
12953df74e7SSzymon Olewniczak        }
13053df74e7SSzymon Olewniczak
13153df74e7SSzymon Olewniczak        return false;
13253df74e7SSzymon Olewniczak    }
133de02284cSSzymon Olewniczak
134de02284cSSzymon Olewniczak    public function __construct($model) {
135de02284cSSzymon Olewniczak        $this->model = $model;
136de02284cSSzymon Olewniczak        $this->validator = new Validator($this->model);
137a0cd8c78SSzymon Olewniczak
138b331b892SSzymon Olewniczak        $this->acl = new Acl($this->model->get_level(), $this->get_acl_columns());
139de02284cSSzymon Olewniczak    }
140a0cd8c78SSzymon Olewniczak
141a0cd8c78SSzymon Olewniczak    public function acl_of($field) {
142a0cd8c78SSzymon Olewniczak        return $this->acl->acl_of($field);
143a0cd8c78SSzymon Olewniczak    }
144a0cd8c78SSzymon Olewniczak
1455b88664dSSzymon Olewniczak    protected function html_link_url() {
1465b88664dSSzymon Olewniczak	    return '#';
1475b88664dSSzymon Olewniczak    }
1485b88664dSSzymon Olewniczak
1495b88664dSSzymon Olewniczak    protected function html_link_content() {
1505b88664dSSzymon Olewniczak	    echo $this->id;
1515b88664dSSzymon Olewniczak    }
1525b88664dSSzymon Olewniczak
1535b88664dSSzymon Olewniczak    public function html_link($pre='', $post='', $print=true) {
1545b88664dSSzymon Olewniczak        $ret = '<a href="'.$this->html_link_url().'">';
1555b88664dSSzymon Olewniczak        $ret .= $pre . $this->html_link_content() . $post;
1565b88664dSSzymon Olewniczak        $ret .= '</a>';
1575b88664dSSzymon Olewniczak
1585b88664dSSzymon Olewniczak        if ($print) {
1595b88664dSSzymon Olewniczak            echo $ret;
1605b88664dSSzymon Olewniczak        }
1615b88664dSSzymon Olewniczak        return $ret;
1625b88664dSSzymon Olewniczak	}
1635b88664dSSzymon Olewniczak
16467fdb426SSzymon Olewniczak	protected function getMailSubject() {
16567fdb426SSzymon Olewniczak	    global $conf;
16667fdb426SSzymon Olewniczak        return $conf['title'];
16767fdb426SSzymon Olewniczak    }
16867fdb426SSzymon Olewniczak
16967fdb426SSzymon Olewniczak    //http://data.agaric.com/capture-all-sent-mail-locally-postfix
17067fdb426SSzymon Olewniczak    //https://askubuntu.com/questions/192572/how-do-i-read-local-email-in-thunderbird
17167fdb426SSzymon Olewniczak	public function mail_notify($content, $users=false, $attachedImages=array()) {
17267fdb426SSzymon Olewniczak        global $conf;
17367fdb426SSzymon Olewniczak
17467fdb426SSzymon Olewniczak        $mailer = new PHPMailer(true);
17567fdb426SSzymon Olewniczak        $mailer->CharSet = 'utf-8';
176bc0bd078SSzymon Olewniczak        $mailer->isHTML(true);
17767fdb426SSzymon Olewniczak
17867fdb426SSzymon Olewniczak        if (!empty($conf['mailfrom'])) {
17967fdb426SSzymon Olewniczak            $mailer->setFrom($conf['mailfrom']);
18067fdb426SSzymon Olewniczak            $mailer->addReplyTo($conf['mailfrom']);
18167fdb426SSzymon Olewniczak        }
18267fdb426SSzymon Olewniczak
18367fdb426SSzymon Olewniczak        $mailer->Subject = $this->getMailSubject();
18467fdb426SSzymon Olewniczak
18567fdb426SSzymon Olewniczak        foreach ($attachedImages as $img) {
18667fdb426SSzymon Olewniczak            $mailer->AddEmbeddedImage($img['path'], $img['cid']);
18767fdb426SSzymon Olewniczak        }
18867fdb426SSzymon Olewniczak
18967fdb426SSzymon Olewniczak        if ($users == FALSE) {
19067fdb426SSzymon Olewniczak            $users = $this->get_participants('subscribent');
19167fdb426SSzymon Olewniczak
19267fdb426SSzymon Olewniczak            //don't notify myself
19367fdb426SSzymon Olewniczak            unset($users[$this->model->user_nick]);
19467fdb426SSzymon Olewniczak        }
19567fdb426SSzymon Olewniczak
196bc0bd078SSzymon Olewniczak        $muted_users = $this->model->factory('subscription')->getMutedUsers();
19767fdb426SSzymon Olewniczak        foreach ($users as $user) {
19867fdb426SSzymon Olewniczak            if (is_array($user)) {
19967fdb426SSzymon Olewniczak                $user = $user['user_id'];
20067fdb426SSzymon Olewniczak            }
201bc0bd078SSzymon Olewniczak            //omit muted users
202bc0bd078SSzymon Olewniczak            if (in_array($user, $muted_users)) continue;
203bc0bd078SSzymon Olewniczak
20467fdb426SSzymon Olewniczak            $email = $this->model->userFactory->get_user_email($user);
205*32fae04eSSzymon Olewniczak            //do we have user email address
206*32fae04eSSzymon Olewniczak            if (!$email) continue;
207*32fae04eSSzymon Olewniczak
20867fdb426SSzymon Olewniczak            $name = $this->model->userFactory->get_user_full_name($user);
209*32fae04eSSzymon Olewniczak
21067fdb426SSzymon Olewniczak            $mailer->addAddress($email, $name);
21167fdb426SSzymon Olewniczak
212bc0bd078SSzymon Olewniczak            $token = $this->model->factory('subscription')->getUserToken($user);
2135e27504eSSzymon Olewniczak            $resign_link = $this->model->action->url('unsubscribe', array('GET' => array( 't' => $token)));
214bc0bd078SSzymon Olewniczak            $mailer->Body = str_replace('%%resign_link%%', $resign_link, $content);
215bc0bd078SSzymon Olewniczak
21667fdb426SSzymon Olewniczak            $mailer->send();
21767fdb426SSzymon Olewniczak            $mailer->clearAddresses();
218bc0bd078SSzymon Olewniczak            $mailer->clearCustomHeaders();
21967fdb426SSzymon Olewniczak        }
22067fdb426SSzymon Olewniczak    }
22167fdb426SSzymon Olewniczak
222de02284cSSzymon Olewniczak}
223