EGOCMS  18.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 
42  public function __toString() {
43  return $this->text;
44  }
45 }
46 
52 class Ego_Combo {
58  const EMPTY_VALUE = '{"pages":[],"users":[],"rights":[],"text":[],"data":[]}';
59 
65  private $value;
66 
72  public function __construct($value = '') {
73  if (empty($value) || $value == '[]') {
74  // Standardwert setzen
75  $this->setValue(self::EMPTY_VALUE);
76  } else {
77  $this->setValue($value);
78  }
79  }
80 
86  public function getValue() {
87  return $this->value;
88  }
89 
97  public function setValue($value) {
98  if (!empty($value)) {
99  $this->value = @json_decode($value);
100 
101  // Leere Werte setzen
102  if (!empty($this->value) && is_object($this->value)) {
103  if (empty($this->value->pages)) {
104  $this->value->pages = array();
105  }
106  if (empty($this->value->users)) {
107  $this->value->users = array();
108  }
109  if (empty($this->value->rights)) {
110  $this->value->rights = array();
111  }
112  if (empty($this->value->text)) {
113  $this->value->text = array();
114  }
115  if (empty($this->value->data)) {
116  $this->value->data = array();
117  }
118  } else {
119  throw new Ego_Combo_Exception('Invalid value.', Ego_Combo_Exception::INVALID_VALUE);
120  }
121  }
122  }
123 
129  public function getString() {
130  return json_encode($this->value);
131  }
132 
142  public function getPages($no_rights = false, $only_active = false, $lang = '', $user_id = null) {
143  $pages = array();
144  if (!empty($this->value->pages)) {
145  foreach ($this->value->pages as $page) {
146  try {
147  $site = new Site($page->site, $page->lang);
148  if ($no_rights) {
149  $site->addParam(array(
150  'auth_or' => '1=1',
151  'inactive' => true,
152  'only_active' => false,
153  'no_cache' => 1
154  ));
155  }
156  if ($only_active) {
157  $site->addParam(array(
158  'inactive' => false,
159  'only_active' => true,
160  'no_cache' => 1
161  ));
162  }
163  if (
164  ($p = $site->getPage($page->id))
165  && ($no_rights
166  || ($user_id
167  ? $p->hasRights('view', $user_id)
168  : ($user_id === null
169  ? $p->hasRights('view') // Der aktuelle Benutzer ist berechtigt
170  : !$p->hasRightsOn('view') // Die Seite darf keine Ansichtsrechte haben
171  )
172  )
173  )
174  ) {
175  if (
176  !empty($lang)
177  && ($lang_page = $p->getLanguagePage($lang))
178  ) {
179  $p = $lang_page;
180  }
181  $p->{'selected'} = (bool) $page->selected;
182  $pages[] = $p;
183  }
184  } catch (Exception $e) {
185  // Seite kann nicht ermittelt werden
186  egotec_warning_log($e->getMessage());
187  }
188  }
189  }
190  return $pages;
191  }
192 
199  public function setPages($pages) {
200  $this->value->pages = $pages;
201  }
202 
209  public function addPage($page) {
210  if (!$this->hasPage($page)) {
211  $site = $page->getSite();
212  $p = new stdClass();
213  $p->site = $site->name;
214  $p->lang = $site->language;
215  $p->id = $page->field['id'];
216  $this->value->pages[] = $p;
217  return true;
218  }
219  return false;
220  }
221 
228  public function hasPage($page) {
229  $site = $page->getSite();
230  if (!empty($this->value->pages)) {
231  foreach ($this->value->pages as $p) {
232  if (
233  $site->name == $p->site
234  && $site->language == $p->lang
235  && $page->field['id'] == $p->id
236  ) {
237  return true;
238  }
239  }
240  }
241  return false;
242  }
243 
249  public function getUsers() {
250  $users = array();
251  if (!empty($this->value->users)) {
252  foreach ($this->value->users as $user_id) {
253  $user = new User_SQL(ltrim($user_id, '+'));
254  $user->{'selected'} = $user_id[0] === '+';
255  $users[] = $user;
256  }
257  }
258  return $users;
259  }
260 
267  public function setUsers($users) {
268  $this->value->users = $users;
269  }
270 
277  public function addUser($user_id) {
278  if (!in_array($user_id, $this->value->users)) {
279  $this->value->users[] = $user_id;
280  return true;
281  }
282  return false;
283  }
284 
291  public function hasUser($user_id) {
292  foreach ($this->getUsers() as $user) {
293  if ($user->field['user_id'] == $user_id) {
294  return true;
295  }
296  }
297  return false;
298  }
299 
305  public function getRights() {
306  $rights = array();
307  if (!empty($this->value->rights)) {
308  foreach ($this->value->rights as $right) {
309  $r = array(
310  'group' => new Group_SQL($right->group),
311  'role' => new Role_SQL($right->role)
312  );
313  $r['selected'] = (bool) $right->selected;
314  $rights[] = $r;
315  }
316  }
317  return $rights;
318  }
319 
325  public function getRightsUsers() {
326  $users = array();
327  if (!empty($this->value->rights)) {
328  $db = new_db_connection(array(
329  'table' => 'egotec_user',
330  'fields' => 'egotec_user.user_id'
331  ));
332  while ($db->nextRecord()) {
333  $user = new User_SQL($db->Record['user_id']);
334  foreach ($this->value->rights as $right) {
335  if ($user->hasGroupRoleRelation($right->group, $right->role)) {
336  $users[] = $user;
337  break;
338  }
339  }
340  }
341  }
342  return $users;
343  }
344 
351  public function setRights($rights) {
352  $this->value->rights = $rights;
353  }
354 
362  public function addRight($group, $role) {
363  $right = new stdClass();
364  $right->group = $group;
365  $right->role = $role;
366  foreach ($this->value->rights as $_right) {
367  if ($_right->group == $right->group && $_right->role == $right->role) {
368  return false;
369  }
370  }
371  $this->value->rights[] = $right;
372  return true;
373  }
374 
380  public function getText() {
381  return array_map(function($text) {
382  $obj = new Ego_Combo_Text(ltrim($text, '+'));
383  $obj->selected = $text[0] === '+';
384  return $obj;
385  }, $this->value->text);
386  }
387 
394  public function setText($text) {
395  $this->value->text = $text;
396  }
397 
404  public function addText($text) {
405  if (!in_array($text, $this->value->text)) {
406  $this->value->text[] = $text;
407  return true;
408  }
409  return false;
410  }
411 
417  public function getData() {
418  return $this->value->data;
419  }
420 
428  public function getDataBy($key, $value) {
429  $result = array();
430  foreach ($this->getData() as $data) {
431  if (isset($data->{$key}) && $data->{$key} == $value) {
432  $result[] = $data;
433  }
434  }
435  return $result;
436  }
437 
444  public function getDataByKey($key) {
445  foreach ($this->getData() as $data) {
446  if ($data->key == $key) {
447  return $data;
448  }
449  }
450  return null;
451  }
452 
459  public function setData($data) {
460  $this->value->data = $data;
461  }
462 
469  public function addData($data) {
470  $this->value->data[] = $data;
471  return true;
472  }
473 
491  public function getMailAddresses($params = array()) {
492  $addresses = array();
493 
494  // E-Mail Adressen aus den Seiten
495  if (!empty($params['pages'])) {
496  foreach ($this->getPages(true, true) as $page) {
497  if ($params['pages']['type'] == '*' || $page->field['type'] == $params['pages']['type']) {
498  $address = array(
499  'username' => '',
500  'salutation' => '',
501  'firstname' => '',
502  'lastname' => '',
503  'email' => '',
504  'email_name' => ''
505  );
506  foreach (array_keys($address) as $key) {
507  if (!empty($params['pages']['values'][$key])) {
508  list($field, $name) = explode('.', $params['pages']['values'][$key], 2);
509  $address[$key] = (string) Ego_System::getAssocValue($page->{$field}, $name);
510  }
511  }
512  if (!empty($address['email']) && Ego_System::isEmail($address['email'])) {
513  $key = md5($address['email']);
514  if (empty($address['username'])) {
515  $address['username'] = $address['email'];
516  }
517  if ($address['email_name'] == '') {
518  $address['email_name'] = $page->field['name'];
519  }
520  $address['identity'] = array(
521  'type' => 'page',
522  'value' => $page->getIdentity()
523  );
524  $address['data'] = $page->extra;
525  $addresses[$key] = $address;
526  }
527  }
528  }
529  }
530 
531  // E-Mail Adressen aus den Unterseiten der Seiten
532  if (!empty($params['children'])) {
533  foreach ($this->getPages(true) as $page) {
534  foreach ($page->getChildren(array(), array(
535  'auth_or' => '1=1',
536  'only_active' => true
537  )) as $child) {
538  if ($params['children']['type'] == '*' || $child->field['type'] == $params['children']['type']) {
539  $address = array(
540  'username' => '',
541  'salutation' => '',
542  'firstname' => '',
543  'lastname' => '',
544  'email' => '',
545  'email_name' => ''
546  );
547  foreach (array_keys($address) as $key) {
548  if (!empty($params['children']['values'][$key])) {
549  list($field, $name) = explode('.', $params['children']['values'][$key], 2);
550  $address[$key] = (string) Ego_System::getAssocValue($child->{$field}, $name);
551  }
552  }
553  if (!empty($address['email']) && Ego_System::isEmail($address['email'])) {
554  $key = md5($address['email']);
555  if (empty($address['username'])) {
556  $address['username'] = $address['email'];
557  }
558  if ($address['email_name'] == '') {
559  $address['email_name'] = $child->field['name'];
560  }
561  $address['identity'] = array(
562  'type' => 'page',
563  'value' => $child->getIdentity()
564  );
565  $address['data'] = $child->extra;
566  $addresses[$key] = $address;
567  }
568  }
569  }
570  }
571  }
572 
573  // Alle Gruppen/Rollen Benutzer
574  foreach ($this->getRightsUsers() as $user) {
575  if (!empty($user->field['email']) && !$user->isInactive() && Ego_System::isEmail($user->field['email'])) {
576  $key = md5($user->field['email']);
577  $addresses[$key] = array(
578  'username' => $user->field['username'],
579  'salutation' => $user->extra['anrede'],
580  'firstname' => $user->extra['vorname'],
581  'lastname' => $user->extra['name'],
582  'email' => $user->field['email'],
583  'email_name' => $user->getFullname(false),
584  'identity' => array(
585  'type' => 'user',
586  'value' => $user->field['user_id']
587  ),
588  'data' => $user->extra
589  );
590  } elseif ($user) {
591  egotec_warning_log('Der Benutzer '.$user->getFullname().' besitzt keine E-Mail Adresse und kann nicht verwendet werden.');
592  }
593  }
594 
595  // Alle Benutzer
596  foreach ($this->getUsers() as $user) {
597  if (!empty($user->field['email']) && !$user->isInactive() && Ego_System::isEmail($user->field['email'])) {
598  $key = md5($user->field['email']);
599  $addresses[$key] = array(
600  'username' => $user->field['username'],
601  'salutation' => $user->extra['anrede'],
602  'firstname' => $user->extra['vorname'],
603  'lastname' => $user->extra['name'],
604  'email' => $user->field['email'],
605  'email_name' => $user->getFullname(false),
606  'identity' => array(
607  'type' => 'user',
608  'value' => $user->field['user_id']
609  ),
610  'data' => $user->extra
611  );
612  } elseif ($user) {
613  egotec_warning_log('Der Benutzer '.$user->getFullname().' besitzt keine E-Mail Adresse und kann nicht verwendet werden.');
614  }
615  }
616 
617  // Alle Direkteingaben
618  foreach ($this->getText() as $text) {
619  $key = md5($text);
620  if (!isset($adresses[$key])) {
621  // Nur setzen wenn es hierzu keinen Eintrag mit mehr Informationen gibt
622  $email = (string) $text;
623  $email_name = '';
624 
625  // E-Mail Adresse und Anzeigenamen ermitteln aus: "Anzeigename" mail@egotec.com
626  if (preg_match('/^"(.*?)"(.*?)$/i', $email, $matches)) {
627  $email = trim($matches[2]);
628  $email_name = trim($matches[1]);
629  }
630 
631  if (Ego_System::isEmail($email)) {
632  $addresses[$key] = array(
633  'username' => $email,
634  'salutation' => '',
635  'firstname' => '',
636  'lastname' => '',
637  'email' => $email,
638  'email_name' => $email_name,
639  'identity' => array(
640  'type' => 'text',
641  'value' => $email
642  ),
643  'data' => array()
644  );
645  }
646  }
647  }
648 
649  // Alle Daten
650  if (!empty($params['data'])) {
651  foreach ($this->getData() as $data) {
652  $address = array(
653  'username' => '',
654  'salutation' => '',
655  'firstname' => '',
656  'lastname' => '',
657  'email' => '',
658  'email_name' => ''
659  );
660  foreach (array_keys($address) as $key) {
661  if (!empty($params['data'][$key])) {
662  $address[$key] = @$data[$params['data'][$key]];
663  }
664  }
665  if (!empty($address['email']) && Ego_System::isEmail($address['email'])) {
666  $key = md5($address['email']);
667  if (empty($address['username'])) {
668  $address['username'] = $address['email'];
669  }
670  $address['identity'] = array(
671  'type' => 'data',
672  'value' => $data['key']
673  );
674  $address['data'] = array();
675  $addresses[$key] = $address;
676  }
677  }
678  }
679 
680  return array_values($addresses);
681  }
682 }
683 ?>
getDataByKey($key)
Definition: Ego_Combo.php:444
__construct($value='')
Definition: Ego_Combo.php:72
addText($text)
Definition: Ego_Combo.php:404
hasUser($user_id)
Definition: Ego_Combo.php:291
getDataBy($key, $value)
Definition: Ego_Combo.php:428
setRights($rights)
Definition: Ego_Combo.php:351
setPages($pages)
Definition: Ego_Combo.php:199
addRight($group, $role)
Definition: Ego_Combo.php:362
static isEmail($email)
Definition: Ego_System.php:57
setUsers($users)
Definition: Ego_Combo.php:267
setValue($value)
Definition: Ego_Combo.php:97
hasPage($page)
Definition: Ego_Combo.php:228
__construct($text)
Definition: Ego_Combo.php:33
getPages($no_rights=false, $only_active=false, $lang='', $user_id=null)
Definition: Ego_Combo.php:142
setText($text)
Definition: Ego_Combo.php:394
static getAssocValue($a, $k)
getRightsUsers()
Definition: Ego_Combo.php:325
addData($data)
Definition: Ego_Combo.php:469
addPage($page)
Definition: Ego_Combo.php:209
getMailAddresses($params=array())
Definition: Ego_Combo.php:491
addUser($user_id)
Definition: Ego_Combo.php:277
setData($data)
Definition: Ego_Combo.php:459
Definition: Site.php:29