EGOCMS  24.0
EGOTEC Content-Managament-System
Ego_Combo.php
gehe zur Dokumentation dieser Datei
1 <?php
11 class Ego_Combo_Exception extends Exception {
12  const INVALID_VALUE = 1;
13 }
14 
24  public $selected = false;
25 
31  private $text = '';
32 
33  public function __construct($text) {
34  $this->text = $text;
35  }
36 
40  public function getText(): string {
41  return $this->text;
42  }
43 
49  public function __toString() {
50  return $this->text;
51  }
52 }
53 
59 class Ego_Combo {
65  const EMPTY_VALUE = '{"pages":[],"users":[],"rights":[],"text":[],"data":[]}';
66 
72  private $value;
73 
79  public function __construct($value = '') {
80  if (empty($value) || $value == '[]') {
81  // Standardwert setzen
82  $this->setValue(self::EMPTY_VALUE);
83  } else {
84  $this->setValue($value);
85  }
86  }
87 
93  public function getValue() {
94  return $this->value;
95  }
96 
104  public function setValue($value) {
105  if (!empty($value)) {
106  $this->value = @json_decode($value);
107 
108  // Leere Werte setzen
109  if (!empty($this->value) && is_object($this->value)) {
110  if (empty($this->value->pages)) {
111  $this->value->pages = array();
112  }
113  if (empty($this->value->users)) {
114  $this->value->users = array();
115  }
116  if (empty($this->value->rights)) {
117  $this->value->rights = array();
118  }
119  if (empty($this->value->text)) {
120  $this->value->text = array();
121  }
122  if (empty($this->value->data)) {
123  $this->value->data = array();
124  }
125  } else {
126  throw new Ego_Combo_Exception('Invalid value.', Ego_Combo_Exception::INVALID_VALUE);
127  }
128  }
129  }
130 
136  public function getString() {
137  return json_encode($this->value);
138  }
139 
149  public function getPages($no_rights = false, $only_active = false, $lang = '', $user_id = null) {
150  $pages = array();
151  if (!empty($this->value->pages)) {
152  $sites = []; // Zwischengespeicherte Site Objekte
153 
154  foreach ($this->value->pages as $page) {
155  try {
156  if (isset($sites["{$page->site}-{$page->lang}"])) {
157  $site = $sites["{$page->site}-{$page->lang}"];
158  } else {
159  $site = new Site($page->site, $page->lang);
160  $sites["{$page->site}-{$page->lang}"] = $site;
161  }
162  if ($no_rights) {
163  $site->addParam(array(
164  'auth_or' => '1=1',
165  'inactive' => true,
166  'only_active' => false,
167  'no_cache' => 1
168  ));
169  }
170  if ($only_active) {
171  $site->addParam(array(
172  'inactive' => false,
173  'only_active' => true,
174  'no_cache' => 1
175  ));
176  }
177  if (
178  ($p = $site->getPage($page->id))
179  && ($no_rights
180  || ($user_id
181  ? $p->hasRights('view', $user_id)
182  : ($user_id === null
183  ? $p->hasRights('view') // Der aktuelle Benutzer ist berechtigt
184  : !$p->hasRightsOn('view') // Die Seite darf keine Ansichtsrechte haben
185  )
186  )
187  )
188  ) {
189  if (
190  !empty($lang)
191  && ($lang_page = $p->getLanguagePage($lang))
192  ) {
193  $p = $lang_page;
194  }
195  $p->{'selected'} = (bool) $page->selected;
196  $pages[] = $p;
197  }
198  } catch (Exception $e) {
199  // Seite kann nicht ermittelt werden
200  egotec_warning_log($e->getMessage());
201  }
202  }
203  }
204  return $pages;
205  }
206 
213  public function setPages($pages) {
214  $this->value->pages = $pages;
215  }
216 
223  public function addPage($page) {
224  if (!$this->hasPage($page)) {
225  $site = $page->getSite();
226  $p = new stdClass();
227  $p->site = $site->name;
228  $p->lang = $site->language;
229  $p->id = $page->field['id'];
230  $this->value->pages[] = $p;
231  return true;
232  }
233  return false;
234  }
235 
242  public function hasPage($page) {
243  $site = $page->getSite();
244  if (!empty($this->value->pages)) {
245  foreach ($this->value->pages as $p) {
246  if (
247  $site->name == $p->site
248  && $site->language == $p->lang
249  && $page->field['id'] == $p->id
250  ) {
251  return true;
252  }
253  }
254  }
255  return false;
256  }
257 
263  public function getUsers() {
264  $users = array();
265  if (!empty($this->value->users)) {
266  foreach ($this->value->users as $user_id) {
267  try {
268  $user = new User_SQL(ltrim($user_id, '+'));
269  } catch (Exception $e) {
270  // ignorieren
271  continue;
272  }
273 
274  $user->{'selected'} = $user_id[0] === '+';
275  $users[] = $user;
276  }
277  }
278  return $users;
279  }
280 
287  public function setUsers($users) {
288  $this->value->users = $users;
289  }
290 
297  public function addUser($user_id) {
298  if (!in_array($user_id, $this->value->users)) {
299  $this->value->users[] = $user_id;
300  return true;
301  }
302  return false;
303  }
304 
311  public function hasUser($user_id) {
312  foreach ($this->getUsers() as $user) {
313  if ($user->field['user_id'] == $user_id) {
314  return true;
315  }
316  }
317  return false;
318  }
319 
325  public function getRights() {
326  $rights = array();
327  if (!empty($this->value->rights)) {
328  foreach ($this->value->rights as $right) {
329  $r = array(
330  'group' => new Group_SQL($right->group),
331  'role' => new Role_SQL($right->role)
332  );
333  $r['selected'] = (bool) $right->selected;
334  $rights[] = $r;
335  }
336  }
337  return $rights;
338  }
339 
345  public function getRightsUsers() {
346  $users = [];
347  if (!empty($this->value->rights)) {
348  foreach ($this->value->rights as $right) {
349  $db = new_db_connection([
350  'table' => 'egotec_user_group',
351  'fields' => 'egotec_user_group.user_id',
352  'where' => "egotec_user_group.group_id = '$right->group' AND egotec_user_group.role_id = '$right->role'",
353  'join' => 'egotec_user ON egotec_user.user_id = egotec_user_group.user_id',
354  'distinct' => true,
355  'order' => 'username ASC'
356  ]);
357 
358  while ($record = $db->nextRecord()) {
359  $user = null;
360 
361  try {
362  $user = new User_SQL($record['user_id']);
363  } catch (Exception $e) {}
364 
365  if ($user !== null) {
366  $users[] = $user;
367  }
368  }
369  }
370  }
371  return $users;
372  }
373 
380  public function setRights($rights) {
381  $this->value->rights = $rights;
382  }
383 
391  public function addRight($group, $role) {
392  $right = new stdClass();
393  $right->group = $group;
394  $right->role = $role;
395  foreach ($this->value->rights as $_right) {
396  if ($_right->group == $right->group && $_right->role == $right->role) {
397  return false;
398  }
399  }
400  $this->value->rights[] = $right;
401  return true;
402  }
403 
411  public function hasRight(string $user_id): bool {
412  foreach ($this->getRights() as $right) {
413  try {
414  $user_sql = new User_SQL($user_id);
415 
416  if ($user_sql->hasGroupRoleRelation($right['group']->field['group_id'], $right['role']->field['role_id'])) {
417  return true;
418  }
419  } catch (Exception $e) {
420  // ignorieren
421  }
422  }
423 
424  return false;
425  }
426 
432  public function getText() {
433  return array_map(function($text) {
434  $obj = new Ego_Combo_Text(ltrim($text, '+'));
435  $obj->selected = $text[0] === '+';
436  return $obj;
437  }, $this->value->text);
438  }
439 
446  public function setText($text) {
447  $this->value->text = $text;
448  }
449 
456  public function addText($text) {
457  if (!in_array($text, $this->value->text)) {
458  $this->value->text[] = $text;
459  return true;
460  }
461  return false;
462  }
463 
469  public function getData() {
470  return $this->value->data;
471  }
472 
480  public function getDataBy($key, $value) {
481  $result = array();
482  foreach ($this->getData() as $data) {
483  if (isset($data->{$key}) && $data->{$key} == $value) {
484  $result[] = $data;
485  }
486  }
487  return $result;
488  }
489 
496  public function getDataByKey($key) {
497  foreach ($this->getData() as $data) {
498  if ($data->key == $key) {
499  return $data;
500  }
501  }
502  return null;
503  }
504 
511  public function setData($data) {
512  $this->value->data = $data;
513  }
514 
521  public function addData($data) {
522  $this->value->data[] = $data;
523  return true;
524  }
525 
545  public function getMailAddresses($params = array()) {
546  $addresses = array();
547 
548  // E-Mail Adressen aus den Seiten
549  if (!empty($params['pages'])) {
550  foreach ($this->getPages(true, true) as $page) {
551  if ($params['pages']['type'] == '*' || $page->field['type'] == $params['pages']['type']) {
552  $address = array(
553  'username' => '',
554  'salutation' => '',
555  'firstname' => '',
556  'lastname' => '',
557  'email' => '',
558  'email_name' => ''
559  );
560  foreach (array_keys($address) as $key) {
561  if (!empty($params['pages']['values'][$key])) {
562  [$field, $name] = explode('.', $params['pages']['values'][$key], 2);
563  $address[$key] = (string) Ego_System::getAssocValue($page->{$field}, $name);
564  }
565  }
566  if (!empty($address['email']) && Ego_System::isEmail($address['email'])) {
567  $key = md5($address['email']);
568  if (empty($address['username'])) {
569  $address['username'] = $address['email'];
570  }
571  if ($address['email_name'] == '') {
572  $address['email_name'] = $page->field['name'];
573  }
574  $address['identity'] = array(
575  'type' => 'page',
576  'value' => $page->getIdentity()
577  );
578  $address['data'] = $page->extra;
579  $addresses[$key] = $address;
580  }
581  }
582  }
583  }
584 
585  // E-Mail Adressen aus den Unterseiten der Seiten
586  if (!empty($params['children'])) {
587  foreach ($this->getPages(true) as $page) {
588  foreach ($page->getChildren(array(), array(
589  'auth_or' => '1=1',
590  'only_active' => true
591  )) as $child) {
592  if ($params['children']['type'] == '*' || $child->field['type'] == $params['children']['type']) {
593  $address = array(
594  'username' => '',
595  'salutation' => '',
596  'firstname' => '',
597  'lastname' => '',
598  'email' => '',
599  'email_name' => ''
600  );
601  foreach (array_keys($address) as $key) {
602  if (!empty($params['children']['values'][$key])) {
603  [$field, $name] = explode('.', $params['children']['values'][$key], 2);
604  $address[$key] = (string) Ego_System::getAssocValue($child->{$field}, $name);
605  }
606  }
607  if (!empty($address['email']) && Ego_System::isEmail($address['email'])) {
608  $key = md5($address['email']);
609  if (empty($address['username'])) {
610  $address['username'] = $address['email'];
611  }
612  if ($address['email_name'] == '') {
613  $address['email_name'] = $child->field['name'];
614  }
615  $address['identity'] = array(
616  'type' => 'page',
617  'value' => $child->getIdentity()
618  );
619  $address['data'] = $child->extra;
620  $addresses[$key] = $address;
621  }
622  }
623  }
624  }
625  }
626 
627  // Alle Gruppen/Rollen Benutzer
628  foreach ($this->getRightsUsers() as $user) {
629  if (
630  !empty($user->field['email'])
631  && !$user->isInactive()
632  && Ego_System::isEmail($user->field['email'])
633  && (
634  $params['users']['no_admin'] !== false
635  || !$user->field['no_admin']
636  )
637  ) {
638  $key = md5($user->field['email']);
639  $addresses[$key] = array(
640  'username' => $user->field['username'],
641  'salutation' => $user->extra['anrede'],
642  'firstname' => $user->extra['vorname'],
643  'lastname' => $user->extra['name'],
644  'email' => $user->field['email'],
645  'email_name' => $user->getFullname(false),
646  'identity' => array(
647  'type' => 'user',
648  'value' => $user->field['user_id']
649  ),
650  'data' => $user->extra
651  );
652  } elseif ($user) {
653  egotec_warning_log('Der Benutzer '.$user->getFullname().' besitzt keine E-Mail Adresse und kann nicht verwendet werden.');
654  }
655  }
656 
657  // Alle Benutzer
658  foreach ($this->getUsers() as $user) {
659  if (
660  !empty($user->field['email'])
661  && !$user->isInactive()
662  && Ego_System::isEmail($user->field['email'])
663  && (
664  $params['users']['no_admin'] !== false
665  || !$user->field['no_admin']
666  )
667  ) {
668  $key = md5($user->field['email']);
669  $addresses[$key] = array(
670  'username' => $user->field['username'],
671  'salutation' => $user->extra['anrede'],
672  'firstname' => $user->extra['vorname'],
673  'lastname' => $user->extra['name'],
674  'email' => $user->field['email'],
675  'email_name' => $user->getFullname(false),
676  'identity' => array(
677  'type' => 'user',
678  'value' => $user->field['user_id']
679  ),
680  'data' => $user->extra
681  );
682  } elseif ($user) {
683  egotec_warning_log('Der Benutzer '.$user->getFullname().' besitzt keine E-Mail Adresse und kann nicht verwendet werden.');
684  }
685  }
686 
687  // Alle Direkteingaben
688  foreach ($this->getText() as $text) {
689  $key = md5($text);
690  if (!isset($adresses[$key])) {
691  // Nur setzen wenn es hierzu keinen Eintrag mit mehr Informationen gibt
692  $email = (string) $text;
693  $email_name = '';
694 
695  // E-Mail Adresse und Anzeigenamen ermitteln aus: "Anzeigename" mail@egotec.com
696  if (preg_match('/^"(.*?)"(.*?)$/i', $email, $matches)) {
697  $email = trim($matches[2]);
698  $email_name = trim($matches[1]);
699  }
700 
701  if (Ego_System::isEmail($email)) {
702  $addresses[$key] = array(
703  'username' => $email,
704  'salutation' => '',
705  'firstname' => '',
706  'lastname' => '',
707  'email' => $email,
708  'email_name' => $email_name,
709  'identity' => array(
710  'type' => 'text',
711  'value' => $email
712  ),
713  'data' => array()
714  );
715  }
716  }
717  }
718 
719  // Alle Daten
720  if (!empty($params['data'])) {
721  foreach ($this->getData() as $data) {
722  $address = array(
723  'username' => '',
724  'salutation' => '',
725  'firstname' => '',
726  'lastname' => '',
727  'email' => '',
728  'email_name' => ''
729  );
730  foreach (array_keys($address) as $key) {
731  if (!empty($params['data'][$key])) {
732  $address[$key] = @$data[$params['data'][$key]];
733  }
734  }
735  if (!empty($address['email']) && Ego_System::isEmail($address['email'])) {
736  $key = md5($address['email']);
737  if (empty($address['username'])) {
738  $address['username'] = $address['email'];
739  }
740  $address['identity'] = array(
741  'type' => 'data',
742  'value' => $data['key']
743  );
744  $address['data'] = array();
745  $addresses[$key] = $address;
746  }
747  }
748  }
749 
750  return array_values($addresses);
751  }
752 }
753 ?>
__construct($text)
Definition: Ego_Combo.php:33
hasPage($page)
Definition: Ego_Combo.php:242
setRights($rights)
Definition: Ego_Combo.php:380
setData($data)
Definition: Ego_Combo.php:511
setPages($pages)
Definition: Ego_Combo.php:213
setUsers($users)
Definition: Ego_Combo.php:287
getPages($no_rights=false, $only_active=false, $lang='', $user_id=null)
Definition: Ego_Combo.php:149
addRight($group, $role)
Definition: Ego_Combo.php:391
getDataByKey($key)
Definition: Ego_Combo.php:496
getDataBy($key, $value)
Definition: Ego_Combo.php:480
setValue($value)
Definition: Ego_Combo.php:104
addPage($page)
Definition: Ego_Combo.php:223
addData($data)
Definition: Ego_Combo.php:521
getMailAddresses($params=array())
Definition: Ego_Combo.php:545
__construct($value='')
Definition: Ego_Combo.php:79
getRightsUsers()
Definition: Ego_Combo.php:345
hasRight(string $user_id)
Definition: Ego_Combo.php:411
addUser($user_id)
Definition: Ego_Combo.php:297
addText($text)
Definition: Ego_Combo.php:456
const EMPTY_VALUE
Definition: Ego_Combo.php:65
hasUser($user_id)
Definition: Ego_Combo.php:311
setText($text)
Definition: Ego_Combo.php:446
static getAssocValue($a, $k)
static isEmail($email)
Definition: Ego_System.php:193
Definition: Site.php:30