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'; 176*bc0bd078SSzymon 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 196*bc0bd078SSzymon 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 } 201*bc0bd078SSzymon Olewniczak //omit muted users 202*bc0bd078SSzymon Olewniczak if (in_array($user, $muted_users)) continue; 203*bc0bd078SSzymon Olewniczak 20467fdb426SSzymon Olewniczak $email = $this->model->userFactory->get_user_email($user); 20567fdb426SSzymon Olewniczak $name = $this->model->userFactory->get_user_full_name($user); 20667fdb426SSzymon Olewniczak $mailer->addAddress($email, $name); 20767fdb426SSzymon Olewniczak 208*bc0bd078SSzymon Olewniczak $token = $this->model->factory('subscription')->getUserToken($user); 209*bc0bd078SSzymon Olewniczak $resign_link = $this->model->action->url('unsubscribe', array( 't' => $token)); 210*bc0bd078SSzymon Olewniczak $oneClickUnsubscribe = $this->model->action->url('unsubscribe', array( 't' => $token, 'oneclick' => '1')); 211*bc0bd078SSzymon Olewniczak $mailer->AddCustomHeader("List-Unsubscribe: <$oneClickUnsubscribe>"); 212*bc0bd078SSzymon Olewniczak $mailer->Body = str_replace('%%resign_link%%', $resign_link, $content); 213*bc0bd078SSzymon Olewniczak 21467fdb426SSzymon Olewniczak $mailer->send(); 21567fdb426SSzymon Olewniczak $mailer->clearAddresses(); 216*bc0bd078SSzymon Olewniczak $mailer->clearCustomHeaders(); 21767fdb426SSzymon Olewniczak } 21867fdb426SSzymon Olewniczak } 21967fdb426SSzymon Olewniczak 220de02284cSSzymon Olewniczak} 221