1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
posting.php
См. документацию.
1<?php
8namespace Bitrix\Sender;
9
10use Bitrix\Main\Entity;
11use Bitrix\Main\Localization\Loc;
12use Bitrix\Main\ORM\Query\Query;
13use Bitrix\Main\Type as MainType;
14use Bitrix\Sender\Internals\Model;
15use Bitrix\Sender\Posting\Builder as PostingBuilder;
16
17Loc::loadMessages(__FILE__);
18
20{
21 const STATUS_NEW = 'N';
22 const STATUS_PART = 'P';
23 const STATUS_SENT = 'S';
25 const STATUS_ABORT = 'A';
26 const STATUS_WAIT = 'W';
27
31 public static function getTableName()
32 {
33 return 'b_sender_posting';
34 }
35
39 public static function getMap()
40 {
41 return array(
42 'ID' => array(
43 'data_type' => 'integer',
44 'primary' => true,
45 'autocomplete' => true,
46 ),
47 'MAILING_ID' => array(
48 'data_type' => 'integer',
49 'primary' => true,
50 'required' => true,
51 ),
52 'MAILING_CHAIN_ID' => array(
53 'data_type' => 'integer',
54 'primary' => true,
55 'required' => true,
56 ),
57 'DATE_CREATE' => array(
58 'data_type' => 'datetime',
59 'required' => true,
60 'default_value' => new MainType\DateTime(),
61 ),
62 'DATE_UPDATE' => array(
63 'data_type' => 'datetime',
64 'required' => true,
65 'default_value' => new MainType\DateTime(),
66 ),
67 'STATUS' => array(
68 'data_type' => 'string',
69 'required' => true,
70 'default_value' => static::STATUS_NEW,
71 ),
72 'DATE_SEND' => array(
73 'data_type' => 'datetime',
74 ),
75 'DATE_PAUSE' => array(
76 'data_type' => 'datetime',
77 ),
78 'DATE_SENT' => array(
79 'data_type' => 'datetime',
80 ),
81 'COUNT_READ' => array(
82 'data_type' => 'integer',
83 'default_value' => 0
84 ),
85 'COUNT_CLICK' => array(
86 'data_type' => 'integer',
87 'default_value' => 0
88 ),
89 'COUNT_UNSUB' => array(
90 'data_type' => 'integer',
91 'default_value' => 0
92 ),
93 'COUNT_SEND_ALL' => array(
94 'data_type' => 'integer',
95 'default_value' => 0
96 ),
97 'COUNT_SEND_NONE' => array(
98 'data_type' => 'integer',
99 'default_value' => 0
100 ),
101 'COUNT_SEND_ERROR' => array(
102 'data_type' => 'integer',
103 'default_value' => 0
104 ),
105 'COUNT_SEND_SUCCESS' => array(
106 'data_type' => 'integer',
107 'default_value' => 0
108 ),
109 'COUNT_SEND_DENY' => array(
110 'data_type' => 'integer',
111 'default_value' => 0
112 ),
113 'CONSENT_SUPPORT' => array(
114 'data_type' => 'boolean',
115 'values' => array('N', 'Y'),
116 'default_value' => 'N',
117 'required' => true,
118 ),
119 'LETTER' => array(
120 'data_type' => 'Bitrix\Sender\Internals\Model\LetterTable',
121 'reference' => array('=this.MAILING_CHAIN_ID' => 'ref.ID'),
122 ),
123 'MAILING' => array(
124 'data_type' => 'Bitrix\Sender\MailingTable',
125 'reference' => array('=this.MAILING_ID' => 'ref.ID'),
126 ),
127 'MAILING_CHAIN' => array(
128 'data_type' => 'Bitrix\Sender\MailingChainTable',
129 'reference' => array('=this.MAILING_CHAIN_ID' => 'ref.ID'),
130 ),
131 'POSTING_RECIPIENT' => array(
132 'data_type' => 'Bitrix\Sender\PostingRecipientTable',
133 'reference' => array('=this.ID' => 'ref.POSTING_ID'),
134 ),
135 'POSTING_READ' => array(
136 'data_type' => 'Bitrix\Sender\PostingReadTable',
137 'reference' => array('=this.ID' => 'ref.POSTING_ID'),
138 ),
139 'POSTING_CLICK' => array(
140 'data_type' => 'Bitrix\Sender\PostingClickTable',
141 'reference' => array('=this.ID' => 'ref.POSTING_ID'),
142 ),
143 'POSTING_UNSUB' => array(
144 'data_type' => 'Bitrix\Sender\PostingUnsubTable',
145 'reference' => array('=this.ID' => 'ref.POSTING_ID'),
146 ),
147 );
148 }
149
155 public static function onDelete(Entity\Event $event)
156 {
158 $data = $event->getParameters();
159
160
161 $listId = array();
162 if(array_key_exists('ID', $data['primary']))
163 {
164 $listId[] = $data['primary']['ID'];
165 }
166 else
167 {
168 $filter = array();
169 foreach($data['primary'] as $primKey => $primVal)
170 $filter[$primKey] = $primVal;
171
172 $tableDataList = static::getList(array(
173 'select' => array('ID'),
174 'filter' => $filter
175 ));
176 while($tableData = $tableDataList->fetch())
177 {
178 $listId[] = $tableData['ID'];
179 }
180
181 }
182
183 foreach($listId as $primaryId)
184 {
185 $primary = array('POSTING_ID' => $primaryId);
190 }
191
192
193 return $result;
194 }
195
200 public static function addRecipient($ar, $checkDuplicate = false)
201 {
202 if(!$checkDuplicate)
203 {
204 $needAdd = true;
205 }
206 else
207 {
209 'select' => array('ID'),
210 'filter' => array(
211 '=CONTACT_ID' => $ar['CONTACT_ID'],
212 '=POSTING_ID' => $ar['POSTING_ID']
213 )
214 ));
215 if(!$row)
216 {
217 $needAdd = true;
218 }
219 else
220 {
221 $needAdd = false;
222 }
223 }
224
225 if($needAdd)
226 {
228 }
229 }
230
238 public static function initGroupRecipients($postingId, $checkDuplicate = true)
239 {
240 return PostingBuilder::create()->run($postingId, $checkDuplicate);
241 }
242
252 public static function getRecipientCountByStatus($id, ?array $customFilter = null)
253 {
254 $statusList = [];
255 $select = ['CNT', 'STATUS'];
256 $filter = !$customFilter?['POSTING_ID' => $id] : ['LOGIC' => 'AND',['POSTING_ID' => $id],$customFilter];
257 $postingContactDb = PostingRecipientTable::getList([
258 'select' => $select,
259 'filter' => $filter,
260 'runtime' => [new Entity\ExpressionField('CNT', 'COUNT(*)')],
261 ]);
262 while($postingContact = $postingContactDb->fetch())
263 $statusList[$postingContact['STATUS']] = intval($postingContact['CNT']);
264
265 return $statusList;
266 }
267
273 public static function getRecipientCount($id, $status = '')
274 {
275 $count = 0;
276
277 $ar = static::getRecipientCountByStatus($id);
278 if ($status != '')
279 $count = (array_key_exists($status, $ar) ? $ar[$status] : 0);
280 else
281 foreach ($ar as $k => $v) $count += $v;
282
283 return $count;
284 }
285
292 public static function getSendPercent($id)
293 {
294 $ar = static::getRecipientCountByStatus($id);
295 $count = 0;
296 foreach ($ar as $k => $v)
297 {
298 $count += $v;
299 }
300
301 $countNew = 0;
303 {
305 }
306
307 if($count > 0 && $countNew > 0)
308 {
309 return round(($count - $countNew) / $count, 2) * 100;
310 }
311 else
312 {
313 return 100;
314 }
315 }
316
320 public static function getRecipientStatusToPostingFieldMap()
321 {
322 return array(
323 PostingRecipientTable::SEND_RESULT_NONE => 'COUNT_SEND_NONE',
324 PostingRecipientTable::SEND_RESULT_ERROR => 'COUNT_SEND_ERROR',
325 PostingRecipientTable::SEND_RESULT_SUCCESS => 'COUNT_SEND_SUCCESS',
326 PostingRecipientTable::SEND_RESULT_DENY => 'COUNT_SEND_DENY',
327 );
328 }
329
337 public static function deleteList(array $filter)
338 {
339 $entity = static::getEntity();
340 $connection = $entity->getConnection();
341
342 \CTimeZone::disable();
343 $sql = sprintf(
344 'DELETE FROM %s WHERE %s',
345 $connection->getSqlHelper()->quote($entity->getDbTableName()),
346 Query::buildFilterSql($entity, $filter)
347 );
348 $res = $connection->query($sql);
349 \CTimeZone::enable();
350
351 return $res;
352 }
353}
354
355
356
358{
362 public static function getTableName()
363 {
364 return 'b_sender_posting_read';
365 }
366
370 public static function getMap()
371 {
372 return array(
373 'ID' => array(
374 'data_type' => 'integer',
375 'primary' => true,
376 'autocomplete' => true,
377 ),
378 'POSTING_ID' => array(
379 'primary' => true,
380 'data_type' => 'integer',
381 ),
382 'RECIPIENT_ID' => array(
383 'primary' => true,
384 'data_type' => 'integer',
385 ),
386 'DATE_INSERT' => array(
387 'data_type' => 'datetime',
388 'default_value' => new MainType\DateTime(),
389 ),
390 );
391 }
392
399 public static function onAfterAdd(Entity\Event $event)
400 {
402 $data = $event->getParameters();
403 $data = $data['fields'];
404
405 $isRead = Model\Posting\RecipientTable::getList([
406 'filter' => [
407 '=ID' => $data['RECIPIENT_ID'],
408 '=IS_READ' => 'Y',
409 ],
410 ])->fetch();
411
412 if (!$isRead)
413 {
414 Model\Posting\RecipientTable::update($data['RECIPIENT_ID'], ['IS_READ' => 'Y']);
415
416 // update read counter of posting
417 Model\PostingTable::update($data['POSTING_ID'], array(
418 'COUNT_READ' => new \Bitrix\Main\DB\SqlExpression('?# + 1', 'COUNT_READ')
419 ));
420 }
421
422 return $result;
423 }
424
432 public static function deleteList(array $filter)
433 {
434 $entity = static::getEntity();
435 $connection = $entity->getConnection();
436
437 \CTimeZone::disable();
438 $sql = sprintf(
439 'DELETE FROM %s WHERE %s',
440 $connection->getSqlHelper()->quote($entity->getDbTableName()),
441 Query::buildFilterSql($entity, $filter)
442 );
443 $res = $connection->query($sql);
444 \CTimeZone::enable();
445
446 return $res;
447 }
448}
449
450
452{
456 public static function getTableName()
457 {
458 return 'b_sender_posting_click';
459 }
460
464 public static function getMap()
465 {
466 return array(
467 'ID' => array(
468 'data_type' => 'integer',
469 'primary' => true,
470 'autocomplete' => true,
471 ),
472 'POSTING_ID' => array(
473 'primary' => true,
474 'data_type' => 'integer',
475 ),
476 'RECIPIENT_ID' => array(
477 'primary' => true,
478 'data_type' => 'integer',
479 ),
480 'DATE_INSERT' => array(
481 'data_type' => 'datetime',
482 'default_value' => new MainType\DateTime(),
483 ),
484 'URL' => array(
485 'data_type' => 'string',
486 ),
487 'POSTING' => array(
488 'data_type' => 'Bitrix\Sender\PostingTable',
489 'reference' => array('=this.POSTING_ID' => 'ref.ID'),
490 ),
491 );
492 }
493
500 public static function onAfterAdd(Entity\Event $event)
501 {
503 $data = $event->getParameters();
504 $data = $data['fields'];
505
506 $isClicked = Model\Posting\RecipientTable::getList([
507 'filter' => [
508 '=ID' => $data['RECIPIENT_ID'],
509 '=IS_CLICK' => 'Y',
510 ],
511 ])->fetch();
512
513 if (!$isClicked)
514 {
515 Model\Posting\RecipientTable::update($data['RECIPIENT_ID'], ['IS_CLICK' => 'Y']);
516
517 // update click counter of posting
518 Model\PostingTable::update($data['POSTING_ID'], array(
519 'COUNT_CLICK' => new \Bitrix\Main\DB\SqlExpression('?# + 1', 'COUNT_CLICK')
520 ));
521 }
522
523 return $result;
524 }
525
526
534 public static function deleteList(array $filter)
535 {
536 $entity = static::getEntity();
537 $connection = $entity->getConnection();
538
539 \CTimeZone::disable();
540 $sql = sprintf(
541 'DELETE FROM %s WHERE %s',
542 $connection->getSqlHelper()->quote($entity->getDbTableName()),
543 Query::buildFilterSql($entity, $filter)
544 );
545 $res = $connection->query($sql);
546 \CTimeZone::enable();
547
548 return $res;
549 }
550}
551
553{
557 public static function getTableName()
558 {
559 return 'b_sender_posting_unsub';
560 }
561
565 public static function getMap()
566 {
567 return array(
568 'ID' => array(
569 'data_type' => 'integer',
570 'primary' => true,
571 'autocomplete' => true,
572 ),
573 'POSTING_ID' => array(
574 'primary' => true,
575 'data_type' => 'integer',
576 ),
577 'RECIPIENT_ID' => array(
578 'primary' => true,
579 'data_type' => 'integer',
580 ),
581 'DATE_INSERT' => array(
582 'data_type' => 'datetime',
583 'default_value' => new MainType\DateTime(),
584 ),
585 'POSTING' => array(
586 'data_type' => 'Bitrix\Sender\PostingTable',
587 'reference' => array('=this.POSTING_ID' => 'ref.ID'),
588 ),
589 'POSTING_RECIPIENT' => array(
590 'data_type' => 'Bitrix\Sender\PostingRecipientTable',
591 'reference' => array('=this.RECIPIENT_ID' => 'ref.ID'),
592 ),
593 );
594 }
595
602 public static function onAfterAdd(Entity\Event $event)
603 {
605 $data = $event->getParameters();
606 $data = $data['fields'];
607 $isUnsub = Model\Posting\RecipientTable::getList([
608 'filter' => [
609 '=ID' => $data['RECIPIENT_ID'],
610 '=IS_UNSUB' => 'Y',
611 ],
612 ])->fetch();
613
614 if (!$isUnsub)
615 {
616 Model\Posting\RecipientTable::update($data['RECIPIENT_ID'], ['IS_UNSUB' => 'Y']);
617
618 // update unsub counter of posting
619 Model\PostingTable::update($data['POSTING_ID'], array(
620 'COUNT_UNSUB' => new \Bitrix\Main\DB\SqlExpression('?# + 1', 'COUNT_UNSUB')
621 ));
622 }
623 return $result;
624 }
625
626
634 public static function deleteList(array $filter)
635 {
636 $entity = static::getEntity();
637 $connection = $entity->getConnection();
638
639 \CTimeZone::disable();
640 $sql = sprintf(
641 'DELETE FROM %s WHERE %s',
642 $connection->getSqlHelper()->quote($entity->getDbTableName()),
643 Query::buildFilterSql($entity, $filter)
644 );
645 $res = $connection->query($sql);
646 \CTimeZone::enable();
647
648 return $res;
649 }
650}
651
669{
670 const SEND_RESULT_NONE = 'Y';
672 const SEND_RESULT_ERROR = 'E';
673 const SEND_RESULT_WAIT = 'W';
674 const SEND_RESULT_DENY = 'D';
676
677 protected static $personalizeList = null;
681 public static function getTableName()
682 {
683 return 'b_sender_posting_recipient';
684 }
685
689 public static function getMap()
690 {
691 return array(
692 'ID' => array(
693 'data_type' => 'integer',
694 'primary' => true,
695 'autocomplete' => true,
696 ),
697 'POSTING_ID' => array(
698 'primary' => true,
699 'data_type' => 'integer',
700 ),
701 'STATUS' => array(
702 'data_type' => 'string',
703 'primary' => true,
704 'required' => true,
705 'default_value' => static::SEND_RESULT_NONE,
706 ),
707 'DATE_SENT' => array(
708 'data_type' => 'datetime',
709 ),
710 'DATE_DENY' => array(
711 'data_type' => 'datetime',
712 ),
713 'DATE_UPDATE' => array(
714 'data_type' => 'datetime',
715 'required' => true,
716 'default_value' => new MainType\DateTime(),
717 ),
718 'CONTACT_ID' => array(
719 'required' => true,
720 'data_type' => 'integer',
721 ),
722 'USER_ID' => array(
723 'data_type' => 'integer',
724 ),
725 'FIELDS' => array(
726 'data_type' => 'text',
727 'serialized' => true,
728 ),
729 'ROOT_ID' => array(
730 'data_type' => 'integer',
731 ),
732 'IS_READ' => array(
733 'data_type' => 'string',
734 ),
735 'IS_CLICK' => array(
736 'data_type' => 'string',
737 ),
738 'IS_UNSUB' => array(
739 'data_type' => 'string',
740 ),
741 'CONTACT' => array(
742 'data_type' => 'Bitrix\Sender\ContactTable',
743 'reference' => array('=this.CONTACT_ID' => 'ref.ID'),
744 ),
745 'POSTING' => array(
746 'data_type' => 'Bitrix\Sender\PostingTable',
747 'reference' => array('=this.POSTING_ID' => 'ref.ID'),
748 ),
749 'POSTING_READ' => array(
750 'data_type' => 'Bitrix\Sender\PostingReadTable',
751 'reference' => array('=this.ID' => 'ref.RECIPIENT_ID'),
752 ),
753 'POSTING_CLICK' => array(
754 'data_type' => 'Bitrix\Sender\PostingClickTable',
755 'reference' => array('=this.ID' => 'ref.RECIPIENT_ID'),
756 ),
757 'POSTING_UNSUB' => array(
758 'data_type' => 'Bitrix\Sender\PostingUnsubTable',
759 'reference' => array('=this.ID' => 'ref.RECIPIENT_ID'),
760 ),
761
762 );
763 }
764
765 public static function setPersonalizeList(array $personalizeList = null)
766 {
767 static::$personalizeList = $personalizeList;
768 }
769
773 public static function getPersonalizeList()
774 {
775 $list = array(
776 array(
777 'CODE' => 'NAME',
778 'NAME' => Loc::getMessage("SENDER_POSTING_PERSONALIZE_FIELD_NAME"),
779 'DESC' => Loc::getMessage("SENDER_POSTING_PERSONALIZE_FIELD_NAME_DESC"),
780 ),
781 array(
782 'CODE' => 'EMAIL_TO',
783 'NAME' => Loc::getMessage("SENDER_POSTING_PERSONALIZE_FIELD_EMAIL"),
784 'DESC' => Loc::getMessage("SENDER_POSTING_PERSONALIZE_FIELD_EMAIL_DESC"),
785 ),
786 );
787 if (!Integration\Bitrix24\Service::isCloud())
788 {
789 $list[] = array(
790 'CODE' => 'USER_ID',
791 'NAME' => Loc::getMessage("SENDER_POSTING_PERSONALIZE_FIELD_USER_ID"),
792 'DESC' => Loc::getMessage("SENDER_POSTING_PERSONALIZE_FIELD_USER_ID_DESC"),
793 );
794 $list[] = array(
795 'CODE' => 'SITE_NAME',
796 'NAME' => Loc::getMessage("SENDER_POSTING_PERSONALIZE_FIELD_SITE_NAME"),
797 'DESC' => Loc::getMessage("SENDER_POSTING_PERSONALIZE_FIELD_SITE_NAME_DESC"),
798 );
799 $list[] = array(
800 'CODE' => 'SENDER_CHAIN_CODE',
801 'NAME' => Loc::getMessage("SENDER_POSTING_PERSONALIZE_FIELD_SENDER_CHAIN_ID"),
802 'DESC' => Loc::getMessage("SENDER_POSTING_PERSONALIZE_FIELD_SENDER_CHAIN_ID_DESC"),
803 );
804 }
805
806 return array_merge(
807 $list,
808 (static::$personalizeList ? static::$personalizeList : array())
809 );
810 }
811
815 public static function getStatusList()
816 {
817 return array(
818 self::SEND_RESULT_NONE => Loc::getMessage('SENDER_POSTING_RECIPIENT_STATUS_N'),
819 self::SEND_RESULT_SUCCESS => Loc::getMessage('SENDER_POSTING_RECIPIENT_STATUS_S'),
820 self::SEND_RESULT_ERROR => Loc::getMessage('SENDER_POSTING_RECIPIENT_STATUS_E'),
821 self::SEND_RESULT_DENY => Loc::getMessage('SENDER_POSTING_RECIPIENT_STATUS_D'),
822 self::SEND_RESULT_WAIT_ACCEPT => Loc::getMessage('SENDER_POSTING_RECIPIENT_STATUS_A')
823 );
824 }
825
826 public static function hasUnprocessed($postingId, $threadId = null)
827 {
828 return (static::getCount(['=POSTING_ID' => $postingId, '=STATUS' => self::SEND_RESULT_NONE]) > 0);
829 }
830
831
839 public static function deleteList(array $filter)
840 {
841 $entity = static::getEntity();
842 $connection = $entity->getConnection();
843
844 \CTimeZone::disable();
845 $sql = sprintf(
846 'DELETE FROM %s WHERE %s',
847 $connection->getSqlHelper()->quote($entity->getDbTableName()),
848 Query::buildFilterSql($entity, $filter)
849 );
850 $res = $connection->query($sql);
851 \CTimeZone::enable();
852
853 return $res;
854 }
855
861 public static function getConflictFields(): array
862 {
863 return [
864 'POSTING_ID',
865 'CONTACT_ID',
866 ];
867 }
868}
$connection
Определения actionsdefinitions.php:38
$count
Определения admin_tab.php:4
Определения event.php:5
static getRow(array $parameters)
Определения datamanager.php:398
static getList(array $parameters=array())
Определения datamanager.php:431
static add(array $data)
Определения datamanager.php:877
static getMap()
Определения posting.php:464
static deleteList(array $filter)
Определения posting.php:534
static onAfterAdd(Entity\Event $event)
Определения posting.php:500
static getTableName()
Определения posting.php:456
static getMap()
Определения posting.php:370
static deleteList(array $filter)
Определения posting.php:432
static onAfterAdd(Entity\Event $event)
Определения posting.php:399
static getTableName()
Определения posting.php:362
static getMap()
Определения posting.php:689
static getConflictFields()
Определения posting.php:861
static getStatusList()
Определения posting.php:815
static deleteList(array $filter)
Определения posting.php:839
const SEND_RESULT_DENY
Определения posting.php:674
const SEND_RESULT_WAIT_ACCEPT
Определения posting.php:675
const SEND_RESULT_SUCCESS
Определения posting.php:671
const SEND_RESULT_NONE
Определения posting.php:670
const SEND_RESULT_WAIT
Определения posting.php:673
static getPersonalizeList()
Определения posting.php:773
static setPersonalizeList(array $personalizeList=null)
Определения posting.php:765
static $personalizeList
Определения posting.php:677
static hasUnprocessed($postingId, $threadId=null)
Определения posting.php:826
static getTableName()
Определения posting.php:681
const SEND_RESULT_ERROR
Определения posting.php:672
static onDelete(Entity\Event $event)
Определения posting.php:155
static getMap()
Определения posting.php:39
static deleteList(array $filter)
Определения posting.php:337
static getRecipientCountByStatus($id, ?array $customFilter=null)
Определения posting.php:252
static getSendPercent($id)
Определения posting.php:292
const STATUS_PART
Определения posting.php:22
const STATUS_NEW
Определения posting.php:21
const STATUS_ABORT
Определения posting.php:25
const STATUS_WAIT
Определения posting.php:26
const STATUS_SENT
Определения posting.php:23
static getRecipientCount($id, $status='')
Определения posting.php:273
static addRecipient($ar, $checkDuplicate=false)
Определения posting.php:200
static initGroupRecipients($postingId, $checkDuplicate=true)
Определения posting.php:238
static getRecipientStatusToPostingFieldMap()
Определения posting.php:320
const STATUS_SENT_WITH_ERRORS
Определения posting.php:24
static getTableName()
Определения posting.php:31
static getMap()
Определения posting.php:565
static deleteList(array $filter)
Определения posting.php:634
static onAfterAdd(Entity\Event $event)
Определения posting.php:602
static getTableName()
Определения posting.php:557
$data['IS_AVAILABLE']
Определения .description.php:13
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$res
Определения filter_act.php:7
$result
Определения get_property_values.php:14
$select
Определения iblock_catalog_list.php:194
$filter
Определения iblock_catalog_list.php:54
$status
Определения session.php:10
Определения arrayresult.php:2
Определения ufield.php:9
$event
Определения prolog_after.php:141
$ar
Определения options.php:199
if( $guestStatuses !=='') if(!is_array($guestStatuses)) $statusList
Определения options.php:2065
$k
Определения template_pdf.php:567