ILIAS  release_8 Revision v8.24
class.ilvCard.php
Go to the documentation of this file.
1<?php
2
19// Address values for the ADR type
20const ADR_TYPE_NONE = 0;
21const ADR_TYPE_DOM = 1;
22const ADR_TYPE_INTL = 2;
25const ADR_TYPE_HOME = 16;
26const ADR_TYPE_WORK = 32;
27const ADR_TYPE_PREF = 64;
28
29// Communication values for the TEL type
30const TEL_TYPE_NONE = 0;
31const TEL_TYPE_HOME = 1;
32const TEL_TYPE_MSG = 2;
33const TEL_TYPE_WORK = 4;
34const TEL_TYPE_PREF = 8;
35const TEL_TYPE_VOICE = 16;
36const TEL_TYPE_FAX = 32;
37const TEL_TYPE_CELL = 64;
38const TEL_TYPE_VIDEO = 128;
39const TEL_TYPE_PAGER = 256;
40const TEL_TYPE_BBS = 512;
41const TEL_TYPE_MODEM = 1024;
42const TEL_TYPE_CAR = 2048;
43const TEL_TYPE_ISDN = 4096;
44const TEL_TYPE_PCS = 8192;
45
46// Communication values for the EMAIL type
51
57{
62 public array $types;
63
64 // The filename of the vCard used when saving the vCard
65 public string $filename;
66
67 public function __construct(string $version = "3.0")
68 {
69 $this->types = array(
70 "FN" => "",
71 "N" => "",
72 "NICKNAME" => "",
73 "PHOTO" => array(),
74 "BDAY" => "",
75 "ADR" => array(),
76 "LABEL" => array(),
77 "TEL" => array(),
78 "EMAIL" => array(),
79 "MAILER" => "",
80 "TZ" => "",
81 "GEO" => "",
82 "TITLE" => "",
83 "ROLE" => "",
84 "LOGO" => array(),
85 "AGENT" => "",
86 "ORG" => "",
87 "CATEGORIES" => "",
88 "NOTE" => "",
89 "PRODID" => "",
90 "REV" => "",
91 "SORT-STRING" => "",
92 "SOUND" => array(),
93 "UID" => "",
94 "URL" => "",
95 "CLASS" => "",
96 "KEY" => array()
97 );
98 $this->types["VERSION"] = $version;
99 }
100
104 public function encode(string $string): string
105 {
106 return $this->escape(quoted_printable_encode($string));
107 }
108
112 public function fold(string $string = ""): string
113 {
114 $folded_string = "";
115 preg_match_all("/(.{1,74})/", $string, $matches);
116 for ($i = 0, $iMax = count($matches[1]); $i < $iMax; $i++) {
117 if ($i < (count($matches[1]) - 1)) {
118 $matches[1][$i] .= "\n";
119 }
120 if ($i > 0) {
121 $matches[1][$i] = " " . $matches[1][$i];
122 }
123 $folded_string .= $matches[1][$i];
124 }
125 return $folded_string;
126 }
127
131 public function escape(string $string): string
132 {
133 $string = preg_replace("/(?<!\\\\)(\\\\)([^;,n\\\\])/", "\${1}\${1}\${2}", $string);
134 $string = preg_replace("/(?<!\\\\);/", "\\;", $string);
135 $string = preg_replace("/(?<!\\\\),/", "\\,", $string);
136 $string = preg_replace("/\n/", "\\n", $string);
137 return $string;
138 }
139
144 public function explodeVar(string $variable, string $separator = ","): array
145 {
146 $exploded = explode($separator, $variable);
147 foreach ($exploded as $index => $var) {
148 $exploded[$index] = $this->escape($var);
149 }
150 return $exploded;
151 }
152
156 public function buildVCard(): string
157 {
158 $fn = $n = $nickname = $photo = $bday = $adr = $label = $tel = $email = $mailer =
159 $tz = $geo = $title = $role = $logo = $agent = $org = $categories = $note = $prodid =
160 $rev = $sortstring = $sound = $uid = $url = $class = $key = 0;
161
162 $vcard = "BEGIN:VCARD\n";
163 $vcard .= "VERSION:" . $this->types["VERSION"] . "\n";
164 foreach ($this->types as $type => $var) {
165 ilLoggerFactory::getLogger('user')->debug(print_r($this->types, true));
166
167 switch ($type) {
168 case "FN":
169 if (strcmp($this->types["FN"], "") != 0) {
170 $fn = $this->fold("FN:" . $this->types["FN"]) . "\n";
171 } else {
172 $fn = "";
173 }
174 break;
175 case "N":
176 if (strcmp($this->types["N"], "") != 0) {
177 $n = $this->fold("N:" . $this->types["N"]) . "\n";
178 } else {
179 $n = "";
180 }
181 break;
182 case "NICKNAME":
183 if (strcmp($this->types["NICKNAME"], "") != 0) {
184 $nickname = $this->fold("NICKNAME:" . $this->types["NICKNAME"]) . "\n";
185 } else {
186 $nickname = "";
187 }
188 break;
189 case "PHOTO":
190 $photo = "";
191 if (isset($this->types["PHOTO"])) {
192 if (strcmp(($this->types["PHOTO"]["VALUE"] ?? ""), "") != 0) {
193 $photo = $this->fold("PHOTO;VALUE=uri:" . $this->types["PHOTO"]["VALUE"]) . "\n";
194 } elseif (strcmp(($this->types["PHOTO"]["ENCODING"] ?? ""), "") != 0) {
195 $photo = "PHOTO;ENCODING=" . $this->types["PHOTO"]["ENCODING"];
196 if (strcmp($this->types["PHOTO"]["TYPE"], "") != 0) {
197 $photo .= ";TYPE=" . $this->types["PHOTO"]["TYPE"];
198 }
199 $photo .= ":" . $this->types["PHOTO"]["PHOTO"];
200 $photo = $this->fold($photo) . "\n";
201 }
202 }
203 break;
204 case "BDAY":
205 if (strcmp($this->types["BDAY"], "") != 0) {
206 $bday = $this->fold("BDAY:" . $this->types["BDAY"]) . "\n";
207 } else {
208 $bday = "";
209 }
210 break;
211 case "ADR":
212 if (count($this->types["ADR"])) {
213 $addresses = "";
214 foreach ($this->types["ADR"] as $key => $address) {
215 $test = implode('', $address);
216 if (strcmp($test, "") != 0) {
217 $adr = "ADR";
218 $adr_types = array();
219 if ($address["TYPE"] > 0) {
220 if (($address["TYPE"] & ADR_TYPE_DOM) > 0) {
221 $adr_types[] = "dom";
222 }
223 if (($address["TYPE"] & ADR_TYPE_INTL) > 0) {
224 $adr_types[] = "intl";
225 }
226 if (($address["TYPE"] & ADR_TYPE_POSTAL) > 0) {
227 $adr_types[] = "postal";
228 }
229 if (($address["TYPE"] & ADR_TYPE_PARCEL) > 0) {
230 $adr_types[] = "parcel";
231 }
232 if (($address["TYPE"] & ADR_TYPE_HOME) > 0) {
233 $adr_types[] = "home";
234 }
235 if (($address["TYPE"] & ADR_TYPE_WORK) > 0) {
236 $adr_types[] = "work";
237 }
238 if (($address["TYPE"] & ADR_TYPE_PREF) > 0) {
239 $adr_types[] = "pref";
240 }
241 $adr .= ";TYPE=" . implode(",", $adr_types);
242 }
243 $adr .= ":" . $address["POBOX"] . ";" . $address["EXTENDED_ADDRESS"] .
244 ";" . $address["STREET_ADDRESS"] . ";" . $address["LOCALITY"] .
245 ";" . $address["REGION"] . ";" . $address["POSTAL_CODE"] .
246 ";" . $address["COUNTRY"];
247 $adr = $this->fold($adr) . "\n";
248 $addresses .= $adr;
249 }
250 }
251 $adr = $addresses;
252 } else {
253 $adr = "";
254 }
255 break;
256 case "LABEL":
257 $label = "";
258 if (isset($this->types["LABEL"])) {
259 if (strcmp(($this->types["LABEL"]["LABEL"] ?? ""), "") != 0) {
260 $label = "LABEL";
261 $adr_types = array();
262 if ($this->types["LABEL"]["TYPE"] > 0) {
263 if (($this->types["LABEL"]["TYPE"] & ADR_TYPE_DOM) > 0) {
264 $adr_types[] = "dom";
265 }
266 if (($this->types["LABEL"]["TYPE"] & ADR_TYPE_INTL) > 0) {
267 $adr_types[] = "intl";
268 }
269 if (($this->types["LABEL"]["TYPE"] & ADR_TYPE_POSTAL) > 0) {
270 $adr_types[] = "postal";
271 }
272 if (($this->types["LABEL"]["TYPE"] & ADR_TYPE_PARCEL) > 0) {
273 $adr_types[] = "parcel";
274 }
275 if (($this->types["LABEL"]["TYPE"] & ADR_TYPE_HOME) > 0) {
276 $adr_types[] = "home";
277 }
278 if (($this->types["LABEL"]["TYPE"] & ADR_TYPE_WORK) > 0) {
279 $adr_types[] = "work";
280 }
281 if (($this->types["LABEL"]["TYPE"] & ADR_TYPE_PREF) > 0) {
282 $adr_types[] = "pref";
283 }
284 $label .= ";TYPE=" . implode(",", $adr_types);
285 }
286 $label .= ":" . $this->types["LABEL"]["LABEL"];
287 $label = $this->fold($label) . "\n";
288 }
289 }
290 break;
291 case "TEL":
292 if (count($this->types["TEL"])) {
293 $phonenumbers = "";
294 foreach ($this->types["TEL"] as $key => $phone) {
295 if (strcmp($phone["TEL"], "") != 0) {
296 $tel = "TEL";
297 $tel_types = array();
298 if ($phone["TYPE"] > 0) {
299 if (($phone["TYPE"] & TEL_TYPE_HOME) > 0) {
300 $tel_types[] = "home";
301 }
302 if (($phone["TYPE"] & TEL_TYPE_MSG) > 0) {
303 $tel_types[] = "msg";
304 }
305 if (($phone["TYPE"] & TEL_TYPE_WORK) > 0) {
306 $tel_types[] = "work";
307 }
308 if (($phone["TYPE"] & TEL_TYPE_PREF) > 0) {
309 $tel_types[] = "pref";
310 }
311 if (($phone["TYPE"] & TEL_TYPE_VOICE) > 0) {
312 $tel_types[] = "voice";
313 }
314 if (($phone["TYPE"] & TEL_TYPE_FAX) > 0) {
315 $tel_types[] = "fax";
316 }
317 if (($phone["TYPE"] & TEL_TYPE_CELL) > 0) {
318 $tel_types[] = "cell";
319 }
320 if (($phone["TYPE"] & TEL_TYPE_VIDEO) > 0) {
321 $tel_types[] = "video";
322 }
323 if (($phone["TYPE"] & TEL_TYPE_PAGER) > 0) {
324 $tel_types[] = "pager";
325 }
326 if (($phone["TYPE"] & TEL_TYPE_BBS) > 0) {
327 $tel_types[] = "bbs";
328 }
329 if (($phone["TYPE"] & TEL_TYPE_MODEM) > 0) {
330 $tel_types[] = "modem";
331 }
332 if (($phone["TYPE"] & TEL_TYPE_CAR) > 0) {
333 $tel_types[] = "car";
334 }
335 if (($phone["TYPE"] & TEL_TYPE_ISDN) > 0) {
336 $tel_types[] = "isdn";
337 }
338 if (($phone["TYPE"] & TEL_TYPE_PCS) > 0) {
339 $tel_types[] = "pcs";
340 }
341 $tel .= ";TYPE=" . implode(",", $tel_types);
342 }
343 $tel .= ":" . $phone["TEL"];
344 $tel = $this->fold($tel) . "\n";
345 $phonenumbers .= $tel;
346 }
347 }
348 $tel = $phonenumbers;
349 } else {
350 $tel = "";
351 }
352 break;
353 case "EMAIL":
354 if (count($this->types["EMAIL"])) {
355 $emails = "";
356 foreach ($this->types["EMAIL"] as $key => $mail) {
357 if (strcmp($mail["EMAIL"], "") != 0) {
358 $email = "EMAIL";
359 $adr_types = array();
360 if ($mail["TYPE"] > 0) {
361 if (($mail["TYPE"] & EMAIL_TYPE_INTERNET) > 0) {
362 $adr_types[] = "internet";
363 }
364 if (($mail["TYPE"] & EMAIL_TYPE_x400) > 0) {
365 $adr_types[] = "x400";
366 }
367 if (($mail["TYPE"] & EMAIL_TYPE_PREF) > 0) {
368 $adr_types[] = "pref";
369 }
370 $email .= ";TYPE=" . implode(",", $adr_types);
371 }
372 $email .= ":" . $mail["EMAIL"];
373 $email = $this->fold($email) . "\n";
374 $emails .= $email;
375 }
376 }
377 $email = $emails;
378 } else {
379 $email = "";
380 }
381 break;
382 case "MAILER":
383 if (strcmp(($this->types["MAILER"] ?? ""), "") != 0) {
384 $mailer = $this->fold("MAILER:" . $this->types["MAILER"]) . "\n";
385 } else {
386 $mailer = "";
387 }
388 break;
389 case "TZ":
390 if (strcmp(($this->types["TZ"] ?? ""), "") != 0) {
391 $tz = $this->fold("TZ:" . $this->types["TZ"]) . "\n";
392 } else {
393 $tz = "";
394 }
395 break;
396 case "GEO":
397 if (isset($this->types["GEO"]) and
398 (strcmp(($this->types["GEO"]["LAT"] ?? ""), "") != 0) and
399 (strcmp(($this->types["GEO"]["LON"] ?? ""), "") != 0)) {
400 $geo = $this->fold(
401 "GEO:" . $this->types["GEO"]["LAT"] . ";" . $this->types["GEO"]["LON"]
402 ) . "\n";
403 } else {
404 $geo = "";
405 }
406 break;
407 case "TITLE":
408 if (strcmp(($this->types["TITLE"] ?? ""), "") != 0) {
409 $title = $this->fold("TITLE:" . $this->types["TITLE"]) . "\n";
410 } else {
411 $title = "";
412 }
413 break;
414 case "ROLE":
415 if (strcmp(($this->types["ROLE"] ?? ""), "") != 0) {
416 $role = $this->fold("ROLE:" . $this->types["ROLE"]) . "\n";
417 } else {
418 $role = "";
419 }
420 break;
421 case "LOGO":
422 $logo = "";
423 if (isset($this->types["LOGO"])) {
424 if (strcmp(($this->types["LOGO"]["VALUE"] ?? ""), "") != 0) {
425 $logo = $this->fold("LOGO;VALUE=uri:" . $this->types["LOGO"]["VALUE"]) . "\n";
426 } elseif (strcmp(($this->types["LOGO"]["ENCODING"] ?? ""), "") != 0) {
427 $logo = "LOGO;ENCODING=" . $this->types["LOGO"]["ENCODING"];
428 if (strcmp($this->types["LOGO"]["TYPE"], "") != 0) {
429 $logo .= ";TYPE=" . $this->types["LOGO"]["TYPE"];
430 }
431 $logo .= ":" . $this->types["LOGO"]["LOGO"];
432 $logo = $this->fold($logo) . "\n";
433 }
434 }
435 break;
436 case "AGENT":
437 if (strcmp(($this->types["AGENT"] ?? ""), "") != 0) {
438 $agent = $this->fold("AGENT:" . $this->types["AGENT"]) . "\n";
439 } else {
440 $agent = "";
441 }
442 break;
443 case "ORG":
444 if (strcmp(($this->types["ORG"] ?? ""), "") != 0) {
445 $org = $this->fold("ORG:" . $this->types["ORG"]) . "\n";
446 } else {
447 $org = "";
448 }
449 break;
450 case "CATEGORIES":
451 if (strcmp(($this->types["CATEGORIES"] ?? ""), "") != 0) {
452 $categories = $this->fold("CATEGORIES:" . $this->types["CATEGORIES"]) . "\n";
453 } else {
454 $categories = "";
455 }
456 break;
457 case "NOTE":
458 if (strcmp(($this->types["NOTE"] ?? ""), "") != 0) {
459 $note = $this->fold("NOTE:" . $this->types["NOTE"]) . "\n";
460 } else {
461 $note = "";
462 }
463 break;
464 case "PRODID":
465 if (strcmp(($this->types["PRODID"] ?? ""), "") != 0) {
466 $prodid = $this->fold("PRODID:" . $this->types["PRODID"]) . "\n";
467 } else {
468 $prodid = "";
469 }
470 break;
471 case "REV":
472 if (strcmp(($this->types["REV"] ?? ""), "") != 0) {
473 $rev = $this->fold("REV:" . $this->types["REV"]) . "\n";
474 } else {
475 $rev = "";
476 }
477 break;
478 case "SORT-STRING":
479 if (strcmp(($this->types["SORT-STRING"] ?? ""), "") != 0) {
480 $sortstring = $this->fold("SORT-STRING:" . $this->types["SORT-STRING"]) . "\n";
481 } else {
482 $sortstring = "";
483 }
484 break;
485 case "SOUND":
486 $sound = "";
487 if (isset($this->types["SOUND"])) {
488 if (strcmp(($this->types["SOUND"]["VALUE"] ?? ""), "") != 0) {
489 $sound = $this->fold("SOUND;VALUE=uri:" . $this->types["SOUND"]["VALUE"]) . "\n";
490 } elseif (strcmp(($this->types["SOUND"]["ENCODING"] ?? ""), "") != 0) {
491 $sound = "SOUND;ENCODING=" . $this->types["SOUND"]["ENCODING"];
492 if (strcmp($this->types["SOUND"]["TYPE"], "") != 0) {
493 $sound .= ";TYPE=" . $this->types["SOUND"]["TYPE"];
494 }
495 $sound .= ":" . $this->types["SOUND"]["SOUND"];
496 $sound = $this->fold($sound) . "\n";
497 }
498 }
499 break;
500 case "UID":
501 $uid = "";
502 if (isset($this->types["UID"])) {
503 if (strcmp(($this->types["UID"]["UID"] ?? ""), "") != 0) {
504 $uid = "UID";
505 if (strcmp($this->types["UID"]["TYPE"], "") != 0) {
506 $uid .= ";TYPE=" . $this->types["UID"]["TYPE"];
507 }
508 $uid .= ":" . $this->types["UID"]["UID"];
509 $uid = $this->fold($uid) . "\n";
510 }
511 }
512 break;
513 case "URL":
514 if (strcmp(($this->types["URL"] ?? ""), "") != 0) {
515 $url = $this->fold("URL:" . $this->types["URL"]) . "\n";
516 } else {
517 $url = "";
518 }
519 break;
520 case "KEY":
521 $key = "";
522 if (isset($this->types["KEY"])) {
523 if (strcmp(($this->types["KEY"]["KEY"] ?? ""), "") != 0) {
524 $key = "KEY";
525 if (strcmp($this->types["KEY"]["TYPE"], "") != 0) {
526 $key .= ";TYPE=" . $this->types["KEY"]["TYPE"];
527 }
528 if (strcmp($this->types["KEY"]["ENCODING"], "") != 0) {
529 $key .= ";ENCODING=" . $this->types["KEY"]["ENCODING"];
530 }
531 $key .= ":" . $this->types["KEY"]["KEY"];
532 $key = $this->fold($key) . "\n";
533 }
534 }
535 break;
536 case "CLASS":
537 if (strcmp(($this->types["CLASS"] ?? ""), "") != 0) {
538 $class = $this->fold("CLASS:" . $this->types["CLASS"]) . "\n";
539 } else {
540 $class = "";
541 }
542 break;
543 }
544 }
545 $vcard .= $fn . $n . $nickname . $photo . $bday . $adr . $label . $tel . $email . $mailer .
546 $tz . $geo . $title . $role . $logo . $agent . $org . $categories . $note . $prodid .
547 $rev . $sortstring . $sound . $uid . $url . $class . $key;
548 $vcard .= "END:vCard\n";
549 return $vcard;
550 }
551
555 public function quoted_printable_encode(string $input, int $line_max = 76): string
556 {
557 $hex = array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F');
558 $lines = preg_split("/(\r\n|\r|\n)/", $input);
559 $eol = "\r\n";
560 $linebreak = "=0D=0A";
561 $escape = "=";
562 $output = "";
563
564 for ($j = 0, $jMax = count($lines); $j < $jMax; $j++) {
565 $line = $lines[$j];
566 $linlen = strlen($line);
567 $newline = "";
568 for ($i = 0; $i < $linlen; $i++) {
569 $c = substr($line, $i, 1);
570 $dec = ord($c);
571 if (($dec == 32) && ($i == ($linlen - 1))) { // convert space at eol only
572 $c = "=20";
573 } elseif (($dec == 61) || ($dec < 32) || ($dec > 126)) { // always encode "\t", which is *not* required
574 $h2 = floor($dec / 16);
575 $h1 = floor($dec % 16);
576 $c = $escape . $hex[(string) $h2] . $hex[(string) $h1];
577 }
578 if ((strlen($newline) + strlen($c)) >= $line_max) { // CRLF is not counted
579 $output .= $newline . $escape . $eol; // soft line break; " =\r\n" is okay
580 $newline = " ";
581 }
582 $newline .= $c;
583 } // end of for
584 $output .= $newline;
585 if ($j < count($lines) - 1) {
586 $output .= $linebreak;
587 }
588 }
589 return trim($output);
590 }
591
592 // Identification Types
593 // These types are used in the vCard profile to capture information
594 // associated with the identification and naming of the person or
595 // resource associated with the vCard.
596
605 public function setFormattedName(string $formatted_name): void
606 {
607 $this->types["FN"] = $this->escape($formatted_name);
608 }
609
632 public function setName(
633 string $family_name,
634 string $given_name = "",
635 string $additional_names = "",
636 string $honorific_prefixes = "",
637 string $honorific_suffixes = ""
638 ): void {
639 $familynames = $this->explodeVar($family_name);
640 $givennames = $this->explodeVar($given_name);
641 $addnames = $this->explodeVar($additional_names);
642 $prefixes = $this->explodeVar($honorific_prefixes);
643 $suffixes = $this->explodeVar($honorific_suffixes);
644
645 $this->types["N"] =
646 implode(",", $familynames) .
647 ";" .
648 implode(",", $givennames) .
649 ";" .
650 implode(",", $addnames) .
651 ";" .
652 implode(",", $prefixes) .
653 ";" .
654 implode(",", $suffixes);
655
656 $this->filename = $given_name . "_" . $family_name . ".vcf";
657 if (strcmp($this->types["FN"], "") === 0) {
658 $fn = trim("$honorific_prefixes $given_name $additional_names $family_name $honorific_suffixes");
659 $fn = preg_replace("/\s{2,10}/", " ", $fn);
660 $this->setFormattedName($fn);
661 }
662 }
663
677 public function setNickname(string $nickname): void
678 {
679 $nicknames = $this->explodeVar($nickname);
680 $this->types["NICKNAME"] = implode(",", $nicknames);
681 }
682
709 public function setPhoto(
710 string $photo,
711 string $type = ""
712 ): void {
713 $value = "";
714 $encoding = "";
715 if (preg_match("/^http/", $photo)) {
716 $value = $this->encode($photo);
717 } else {
718 $encoding = "b";
719 $photo = base64_encode($photo);
720 }
721 $this->types["PHOTO"] = array(
722 "VALUE" => $value,
723 "TYPE" => $type,
724 "ENCODING" => $encoding,
725 "PHOTO" => $photo
726 );
727 }
728
743 public function setBirthday(int $year, int $month, int $day): void
744 {
745 if (($year < 1) or ($day < 1) or ($month < 1)) {
746 $this->types["BDAY"] = "";
747 } else {
748 $this->types["BDAY"] = sprintf("%04d-%02d-%02d", $year, $month, $day);
749 }
750 }
751
752 // Delivery Addressing Types
753 // These types are concerned with information related to the delivery
754 // addressing or label for the vCard object.
755
803 public function setAddress(
804 string $po_box = "",
805 string $extended_address = "",
806 string $street_address = "",
807 string $locality = "",
808 string $region = "",
809 string $postal_code = "",
810 string $country = "",
811 int $type = ADR_TYPE_NONE
812 ): void {
813 if ($type == ADR_TYPE_NONE) {
815 }
816 $po_box = implode(",", $this->explodeVar($po_box));
817 $extended_address = implode(",", $this->explodeVar($extended_address));
818 $street_address = implode(",", $this->explodeVar($street_address));
819 $locality = implode(",", $this->explodeVar($locality));
820 $region = implode(",", $this->explodeVar($region));
821 $postal_code = implode(",", $this->explodeVar($postal_code));
822 $country = implode(",", $this->explodeVar($country));
823 $this->types["ADR"][] = array(
824 "POBOX" => $po_box,
825 "EXTENDED_ADDRESS" => $extended_address,
826 "STREET_ADDRESS" => $street_address,
827 "LOCALITY" => $locality,
828 "REGION" => $region,
829 "POSTAL_CODE" => $postal_code,
830 "COUNTRY" => $country,
831 "TYPE" => $type
832 );
833 }
834
865 public function setLabel(
866 string $label = "",
867 int $type = ADR_TYPE_NONE
868 ): void {
869 if ($type == ADR_TYPE_NONE) {
871 }
872 $this->types["LABEL"] = array(
873 "LABEL" => $this->escape($label),
874 "TYPE" => $type
875 );
876 }
877
878 // Telecommunications Addressing Types
879 // These types are concerned with information associated with the
880 // telecommunications addressing of the object the vCard represents.
881
917 public function setPhone(
918 string $number = "",
920 ): void {
921 $this->types["TEL"][] = array(
922 "TEL" => $this->escape($number),
923 "TYPE" => $type
924 );
925 }
926
947 public function setEmail(
948 string $address = "",
950 ): void {
951 $this->types["EMAIL"][] = array(
952 "EMAIL" => $this->escape($address),
953 "TYPE" => $type
954 );
955 }
956
971 public function setMailer(string $name = ""): void
972 {
973 $this->types["MAILER"] = $this->escape($name);
974 }
975
976 // Geographical Types
977 // These types are concerned with information associated with
978 // geographical positions or regions associated with the object the
979 // vCard represents.
980
992 public function setTimezone(string $zone = ""): void
993 {
994 $this->types["TZ"] = $this->escape($zone);
995 }
996
1023 public function setPosition(string $latitude = "", string $longitude = ""): void
1024 {
1025 $this->types["GEO"] = array(
1026 "LAT" => $latitude,
1027 "LON" => $longitude
1028 );
1029 }
1030
1031 // Organizational Types
1032 // These types are concerned with information associated with
1033 // characteristics of the organization or organizational units of the
1034 // object the vCard represents.
1035
1046 public function setTitle(string $title = ""): void
1047 {
1048 $this->types["TITLE"] = $this->escape($title);
1049 }
1050
1065 public function setRole(string $role = ""): void
1066 {
1067 $this->types["ROLE"] = $this->escape($role);
1068 }
1069
1095 public function setLogo(string $logo, string $type = ""): void
1096 {
1097 $value = "";
1098 $encoding = "";
1099 if (preg_match("/^http/", $logo)) {
1100 $value = $this->encode($logo);
1101 } else {
1102 $encoding = "b";
1103 $logo = base64_encode($logo);
1104 }
1105 $this->types["LOGO"] = array(
1106 "VALUE" => $value,
1107 "TYPE" => $type,
1108 "ENCODING" => $encoding,
1109 "LOGO" => $logo
1110 );
1111 }
1112
1133 public function setAgent(string $agent = ""): void
1134 {
1135 $this->types["AGENT"] = $this->escape($agent);
1136 }
1137
1152 public function setOrganization(string $organization = ""): void
1153 {
1154 $organization = implode(";", $this->explodeVar($organization, ";"));
1155 $this->types["ORG"] = $organization;
1156 }
1157
1158 // Explanatory Types
1159 // These types are concerned with additional explanations, such as that
1160 // related to informational notes or revisions specific to the vCard.
1161
1173 public function setCategories(string $categories): void
1174 {
1175 $categories = implode(",", $this->explodeVar($categories));
1176 $this->types["CATEGORIES"] = $categories;
1177 }
1178
1191 public function setNote(string $note = ""): void
1192 {
1193 $this->types["NOTE"] = $this->escape($note);
1194 }
1195
1208 public function setProductId(string $product_id = ""): void
1209 {
1210 $this->types["PRODID"] = $this->escape($product_id);
1211 }
1212
1227 public function setRevision(string $revision_date = ""): void
1228 {
1229 $this->types["REV"] = $this->escape($revision_date);
1230 }
1231
1264 public function setSortString(string $string = ""): void
1265 {
1266 $this->types["SORT-STRING"] = $this->escape($string);
1267 }
1268
1295 public function setSound(string $sound = "", string $type = ""): void
1296 {
1297 $value = "";
1298 $encoding = "";
1299 if (preg_match("/^http/", $sound)) {
1300 $value = $this->encode($sound);
1301 } else {
1302 $encoding = "b";
1303 $sound = base64_encode($sound);
1304 }
1305 $this->types["SOUND"] = array(
1306 "VALUE" => $value,
1307 "TYPE" => $type,
1308 "ENCODING" => $encoding,
1309 "SOUND" => $sound
1310 );
1311 }
1312
1331 public function setUID(string $uid = "", string $type = ""): void
1332 {
1333 $this->types["UID"] = array(
1334 "UID" => $this->escape($uid),
1335 "TYPE" => $type
1336 );
1337 }
1338
1349 public function setURL(string $uri = ""): void
1350 {
1351 $this->types["URL"] = $this->escape($uri);
1352 }
1353
1364 public function setVersion(string $version = "3.0"): void
1365 {
1366 $this->types["VERSION"] = $version;
1367 }
1368
1369 // Security Types
1370 // These types are concerned with the security of communication pathways
1371 // or access to the vCard.
1372
1389 public function setClassification(string $classification = ""): void
1390 {
1391 $this->types["CLASS"] = $this->escape($classification);
1392 }
1393
1430 public function setKey(string $key = "", string $type = ""): void
1431 {
1432 $encoding = "b";
1433 $key = base64_encode($key);
1434 $this->types["KEY"] = array(
1435 "KEY" => $key,
1436 "TYPE" => $type,
1437 "ENCODING" => $encoding
1438 );
1439 }
1440
1441 public function getFilename(): string
1442 {
1443 if (strcmp($this->filename, "") == 0) {
1444 return "vcard.vcf";
1445 } else {
1446 return $this->filename;
1447 }
1448 }
1449
1450 public function getMimetype(): string
1451 {
1452 return "text/x-vcard";
1453 }
1454}
$version
Definition: plugin.php:24
$filename
Definition: buildRTE.php:78
const ADR_TYPE_NONE
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
const ADR_TYPE_INTL
const TEL_TYPE_HOME
const TEL_TYPE_PCS
const TEL_TYPE_MSG
const TEL_TYPE_MODEM
const ADR_TYPE_WORK
const EMAIL_TYPE_x400
const TEL_TYPE_ISDN
const TEL_TYPE_FAX
const TEL_TYPE_VIDEO
const ADR_TYPE_PREF
const TEL_TYPE_CELL
const ADR_TYPE_HOME
const TEL_TYPE_BBS
const TEL_TYPE_NONE
const ADR_TYPE_DOM
const TEL_TYPE_CAR
const EMAIL_TYPE_NONE
const TEL_TYPE_VOICE
const ADR_TYPE_POSTAL
const EMAIL_TYPE_PREF
const ADR_TYPE_PARCEL
const TEL_TYPE_PREF
const TEL_TYPE_WORK
const TEL_TYPE_PAGER
const EMAIL_TYPE_INTERNET
static getLogger(string $a_component_id)
Get component logger.
RFC 2426 vCard MIME Directory Profile 3.0 class.
setCategories(string $categories)
Sets the value for the vCard CATEGORIES type.
setFormattedName(string $formatted_name)
Sets the value for the vCard FN type.
setAddress(string $po_box="", string $extended_address="", string $street_address="", string $locality="", string $region="", string $postal_code="", string $country="", int $type=ADR_TYPE_NONE)
Sets the value for the vCard ADR type.
quoted_printable_encode(string $input, int $line_max=76)
Creates a quoted printable encoded string according to RFC 2045.
encode(string $string)
Encode data with "b" type encoding according to RFC 2045.
buildVCard()
Builds a vCard string out of the attributes of this object.
explodeVar(string $variable, string $separator=",")
Splits a variable into an array using a separator and escapes every value.
setURL(string $uri="")
Sets the value for the vCard URL type.
setSound(string $sound="", string $type="")
Sets the value for the vCard SOUND type.
setClassification(string $classification="")
Sets the value for the vCard CLASS type.
__construct(string $version="3.0")
setAgent(string $agent="")
Sets the value for the vCard AGENT type.
fold(string $string="")
Fold a string according to RFC 2425.
setKey(string $key="", string $type="")
Sets the value for the vCard KEY type.
setMailer(string $name="")
Sets the value for the vCard MAILER type.
setTitle(string $title="")
Sets the value for the vCard TITLE type.
setProductId(string $product_id="")
Sets the value for the vCard PRODID type.
string $filename
setPosition(string $latitude="", string $longitude="")
Sets the value for the vCard GEO type.
escape(string $string)
Escapes a string according to RFC 2426.
setUID(string $uid="", string $type="")
Sets the value for the vCard UID type.
setRevision(string $revision_date="")
Sets the value for the vCard REV type.
setOrganization(string $organization="")
Sets the value for the vCard ORG type.
setName(string $family_name, string $given_name="", string $additional_names="", string $honorific_prefixes="", string $honorific_suffixes="")
Sets the value for the vCard N type.
setLogo(string $logo, string $type="")
Sets the value for the vCard LOGO type.
setVersion(string $version="3.0")
Sets the value for the vCard VERSION type.
setSortString(string $string="")
Sets the value for the vCard SORT-STRING type.
setRole(string $role="")
Sets the value for the vCard ROLE type.
setNote(string $note="")
Sets the value for the vCard NOTE type.
setNickname(string $nickname)
Sets the value for the vCard NICKNAME type.
setPhone(string $number="", int $type=TEL_TYPE_VOICE)
Sets the value for the vCard TEL type.
setPhoto(string $photo, string $type="")
Sets the value for the vCard PHOTO type.
array $types
setLabel(string $label="", int $type=ADR_TYPE_NONE)
Sets the value for the vCard LABEL type.
setTimezone(string $zone="")
Sets the value for the vCard TZ type.
setBirthday(int $year, int $month, int $day)
Sets the value for the vCard BDAY type.
setEmail(string $address="", int $type=EMAIL_TYPE_INTERNET)
Sets the value for the vCard EMAIL type.
$c
Definition: cli.php:38
if(!file_exists(getcwd() . '/ilias.ini.php'))
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Definition: confirmReg.php:20
if($format !==null) $name
Definition: metadata.php:247
$index
Definition: metadata.php:145
$i
Definition: metadata.php:41
if( $orgName !==null) if($spconfig->hasValue('contacts')) $email
Definition: metadata.php:302
string $key
Consumer key/client ID value.
Definition: System.php:193
$type
$url