1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
addressbookprovider.php
См. документацию.
1<?php
2
4
12
14{
15 public const PROVIDER_ENTITY_ID = 'address_book';
16 private const ITEMS_TAB_LIMIT = 14;
17 private const SEARCH_ITEMS_LIMIT = 100;
18
19 private array $preinstalledItems = [];
20
21 public function __construct(array $options = [])
22 {
23 $this->setPreinstalledItems($options['preinstalledItems'] ?? []);
24 parent::__construct();
25 }
26
27 private static function buildName(string $name): string
28 {
29 return trim($name, "'\"");
30 }
31
32 private static function buildTitle(string $name, string $email): string
33 {
34 $emailIsEquivalentToName = $email === $name;
35
36 return ($emailIsEquivalentToName ? $name : $name . ' (' . $email . ')');
37 }
38
39 private static function buildSubtitle(string $name, string $email): string
40 {
41 $emailIsEquivalentToName = $email === $name;
42
43 return ($emailIsEquivalentToName ? '' : $email);
44 }
45
46 public function setPreinstalledItems($items, $updateData = false): void
47 {
48 $this->preinstalledItems = [];
49
50 foreach ($items as $item)
51 {
53 $email = $item['email'];
54
55 if (empty($email))
56 {
57 continue;
58 }
59
60 if ($updateData)
61 {
62 global $USER;
63
64 $contact = MailContactTable::getContactByEmail($email, $USER->getId());
65
66 $item['name'] = $contact['NAME'];
67 $item['entityId'] = $contact['ID'];
68
69 if($contact['ID'] === 0)
70 {
71 continue;
72 }
73 }
74
75 $name = self::buildName($item['name']) ?: $email;
76
77 $this->preinstalledItems[] = new Item(
78 [
79 'id' => $email,
80 'entityId' => self::PROVIDER_ENTITY_ID,
81 'tabs' => static::PROVIDER_ENTITY_ID,
82 'title' => $name,
83 'tagOptions' => [
84 'title' => self::buildTitle($name, $email),
85 ],
86 'subtitle' => self::buildSubtitle($name, $email),
87 'avatar' => self::getDefaultItemAvatar(),
88 'customData' => [
89 'entityType' => self::PROVIDER_ENTITY_ID,
90 'entityId' => is_null($item['entityId']) ? 0 : (int) $item['entityId'],
91 'name' => $name,
92 'email' => $email,
93 ],
94 ]
95 );
96 }
97 }
98
99 public function getPreinstalledItems(): array
100 {
101 return $this->preinstalledItems;
102 }
103
104 public function isAvailable(): bool
105 {
106 return true;
107 }
108
109 public function getItems(array $ids): array
110 {
111 return $this->getPreinstalledItems();
112 }
113
114 public static function getCurrentUserId(): int
115 {
116 return is_object($GLOBALS['USER']) ? (int)$GLOBALS['USER']->getId() : 0;
117 }
118
119 private static function buildItem($name, $email, $id = 0): Item
120 {
121 $name = self::buildName($name);
122
123 return new Item(
124 [
125 'id' => $email,
126 'entityId' => self::PROVIDER_ENTITY_ID,
127 'tabs' => static::PROVIDER_ENTITY_ID,
128 'title' => $name,
129 'tagOptions' => [
130 'title' => self::buildTitle($name, $email),
131 ],
132 'subtitle' => self::buildSubtitle($name, $email),
133 'avatar' => self::getDefaultItemAvatar(),
134 'customData' => [
135 'entityType' => self::PROVIDER_ENTITY_ID,
136 'id' => $id,
137 'name' => $name,
138 'email' => $email,
139 ],
140 ]
141 );
142 }
143
144 private static function addItemsToDialog(array $items, Dialog $dialog)
145 {
146 $addedItemsCount = 0;
147
148 foreach ($items as $item)
149 {
150 $dialog->addItem(self::buildItem($item['NAME'], $item['EMAIL'], $item['ID']));
151 $addedItemsCount++;
152 }
153
154 return $addedItemsCount;
155 }
156
157 public function doSearch(SearchQuery $searchQuery, Dialog $dialog): void
158 {
159 $items = MailContactTable::getList(
160 [
161 'limit' => static::SEARCH_ITEMS_LIMIT,
162 'filter' => [
163 '=USER_ID' => static::getCurrentUserId(),
164 [
165 'LOGIC' => 'OR',
166 '%NAME' => $searchQuery->getQuery(),
167 '%EMAIL' => $searchQuery->getQuery(),
168 ],
169 ],
170 'order' => [
171 'ID' => 'DESC',
172 ],
173 'select' => ['ID', 'NAME', 'EMAIL'],
174 ]
175 )->fetchAll();
176
177 self::addItemsToDialog($items, $dialog);
178 }
179
180 private static function getTabIcon(): string
181 {
182 return "data:image/svg+xml,%3Csvg%20width%3D%2228%22%20height%3D%2228%22%20viewBox%3D%220%200%2028%2028%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%3Cpath%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20d%3D%22M8.99999%204.66669C7.89542%204.66669%206.99999%205.56212%206.99999%206.66669V7.00002C8.28865%207.00002%209.33332%208.04469%209.33332%209.33335C9.33332%2010.622%208.28865%2011.6667%206.99999%2011.6667C8.28865%2011.6667%209.33332%2012.7114%209.33332%2014C9.33332%2015.2887%208.28865%2016.3334%206.99999%2016.3334C8.28865%2016.3334%209.33332%2017.378%209.33332%2018.6667C9.33332%2019.9554%208.28865%2021%206.99999%2021V21.3334C6.99999%2022.4379%207.89542%2023.3334%208.99999%2023.3334H20.1667C21.2712%2023.3334%2022.1667%2022.4379%2022.1667%2021.3334V6.66669C22.1667%205.56212%2021.2712%204.66669%2020.1667%204.66669H8.99999ZM4.66666%209.33335C4.66666%208.68902%205.18899%208.16669%205.83332%208.16669H6.99999C7.64432%208.16669%208.16666%208.68902%208.16666%209.33335C8.16666%209.97769%207.64432%2010.5%206.99999%2010.5H5.83332C5.18899%2010.5%204.66666%209.97769%204.66666%209.33335ZM5.83332%2012.8334C5.18899%2012.8334%204.66666%2013.3557%204.66666%2014C4.66666%2014.6444%205.18899%2015.1667%205.83332%2015.1667H6.99999C7.64432%2015.1667%208.16666%2014.6444%208.16666%2014C8.16666%2013.3557%207.64432%2012.8334%206.99999%2012.8334H5.83332ZM4.66666%2018.6667C4.66666%2018.0224%205.18899%2017.5%205.83332%2017.5H6.99999C7.64432%2017.5%208.16666%2018.0224%208.16666%2018.6667C8.16666%2019.311%207.64432%2019.8334%206.99999%2019.8334H5.83332C5.18899%2019.8334%204.66666%2019.311%204.66666%2018.6667ZM18.7264%2016.7869C18.7718%2017.0203%2018.649%2017.2552%2018.4278%2017.3364C17.5073%2017.6745%2016.4694%2017.8747%2015.3687%2017.8986H14.9234C13.8173%2017.8746%2012.7747%2017.6725%2011.8508%2017.3315C11.6391%2017.2534%2011.5154%2017.0333%2011.5514%2016.8084C11.5858%2016.5939%2011.6239%2016.3882%2011.6627%2016.2351C11.7956%2015.7116%2012.5432%2015.3228%2013.231%2015.0239C13.4111%2014.9456%2013.5198%2014.8831%2013.6297%2014.82C13.737%2014.7583%2013.8454%2014.6961%2014.0224%2014.6178C14.0425%2014.5214%2014.0506%2014.4229%2014.0464%2014.3246L14.3511%2014.288C14.3511%2014.288%2014.3912%2014.3616%2014.3269%2013.9292C14.3269%2013.9292%2013.9845%2013.8395%2013.9686%2013.1509C13.9686%2013.1509%2013.7112%2013.2374%2013.6957%2012.8201C13.6925%2012.737%2013.6712%2012.6571%2013.6509%2012.5805C13.602%2012.3968%2013.5583%2012.2324%2013.781%2012.0891L13.6203%2011.6561C13.6203%2011.6561%2013.4512%209.98415%2014.1921%2010.1195C13.8915%209.63832%2016.4266%209.23835%2016.5949%2010.7117C16.6612%2011.1558%2016.6612%2011.6072%2016.5949%2012.0513C16.5949%2012.0513%2016.9736%2012.0073%2016.7208%2012.7349C16.7208%2012.7349%2016.5816%2013.2585%2016.3679%2013.1409C16.3679%2013.1409%2016.4025%2013.8026%2016.0659%2013.9148C16.0659%2013.9148%2016.09%2014.2672%2016.09%2014.2911L16.3713%2014.3336C16.3713%2014.3336%2016.3628%2014.6274%2016.4189%2014.6593C16.6755%2014.8267%2016.9568%2014.9537%2017.2527%2015.0355C18.1262%2015.2596%2018.5697%2015.644%2018.5697%2015.9805L18.7264%2016.7869Z%22%20fill%3D%22%23959CA4%22%2F%3E%0A%3C%2Fsvg%3E%0A";
183 }
184
185 private static function getDefaultItemAvatar(): ?string
186 {
187 return '/bitrix/images/mail/entity_provider_icons/addressbook.svg';
188 }
189
190 private static function addTemplatesTab($dialog): void
191 {
192 $dialog->addTab(new Tab([
193 'id' => self::PROVIDER_ENTITY_ID,
194 'title' => Loc::getMessage("ADDRESS_BOOK_PROVIDER_TAB_TITLE_MSGVER_1"),
195 'header' => Loc::getMessage("ADDRESS_BOOK_PROVIDER_TAB_HEADER_MSGVER_1"),
196 'icon' => [
197 'default' => self::getTabIcon(),
198 'selected' => str_replace('959CA4', 'FFF', self::getTabIcon()),
199 ],
200 ]));
201 }
202
203 private static function sortDBItemsByEmailOrder($items, $order)
204 {
205 $orderMap = array_flip($order);
206
207 usort($items, function($a, $b) use ($orderMap) {
208 return $orderMap[$a['EMAIL']] - $orderMap[$b['EMAIL']];
209 });
210
211 return $items;
212 }
213
214 public function fillDialog(Dialog $dialog): void
215 {
216 self::addTemplatesTab($dialog);
217 $entity = $dialog->getEntity(static::PROVIDER_ENTITY_ID);
218 $entity?->setDynamicSearch();
219
220 $recentItems = $dialog->getRecentItems();
221 $addressBookRecentItems = $recentItems->getEntityItems(self::PROVIDER_ENTITY_ID);
222 $recentAddressBookIds = array_keys($addressBookRecentItems);
223 $skipItemsFilter = [];
224 $addedItemsCount = 0;
225
226 if (count($recentAddressBookIds) > 0)
227 {
228 $skipItemsFilter = [
229 '!@EMAIL' => $recentAddressBookIds,
230 ];
231
232 $recentItems = MailContactTable::getList(
233 [
234 'filter' => [
235 '=USER_ID' => self::getCurrentUserId(),
236 '@EMAIL' => $recentAddressBookIds,
237 ],
238 'select' => ['NAME', 'EMAIL', 'ID'],
239 ]
240 )->fetchAll();
241
242 $addedItemsCount = self::addItemsToDialog(self::sortDBItemsByEmailOrder($recentItems, $recentAddressBookIds), $dialog);
243 }
244
245 if ($addedItemsCount < self::ITEMS_TAB_LIMIT)
246 {
247 $itemsDB = MailContactTable::getList(
248 [
249 'filter' => array_merge([
250 '=USER_ID' => self::getCurrentUserId(),
251 ], $skipItemsFilter),
252 'order' => ['ID' => 'DESC'],
253 'limit' => (self::ITEMS_TAB_LIMIT - $addedItemsCount),
254 'select' => ['ID', 'NAME', 'EMAIL'],
255 ]
256 )->fetchAll();
257
258 self::addItemsToDialog($itemsDB, $dialog);
259 }
260 }
261}
doSearch(SearchQuery $searchQuery, Dialog $dialog)
Определения addressbookprovider.php:157
getEntity(string $entityId)
Определения dialog.php:298
addItem(Item $item)
Определения dialog.php:126
addTab(Tab $tab)
Определения dialog.php:256
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$entity
global $USER
Определения csv_new_run.php:40
$name
Определения menu_edit.php:35
$GLOBALS['____1690880296']
Определения license.php:1
$order
Определения payment.php:8
$email
Определения payment.php:49
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
$items
Определения template.php:224
else $a
Определения template.php:137