1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
iblocktable.php
См. документацию.
1<?php
2namespace Bitrix\Iblock;
3
4use Bitrix\Iblock\ORM\ElementEntity;
5use Bitrix\Iblock\ORM\ElementV1Table;
6use Bitrix\Iblock\ORM\ElementV2Table;
7use Bitrix\Iblock\ORM\Fields\PropertyOneToMany;
8use Bitrix\Iblock\ORM\Fields\PropertyReference;
9use Bitrix\Main\Localization\Loc;
10use Bitrix\Main\ORM\Data\DataManager;
11use Bitrix\Main\ORM\Event;
12use Bitrix\Main\ORM\EventResult;
13use Bitrix\Main\ORM\Fields\BooleanField;
14use Bitrix\Main\ORM\Fields\Relations\CascadePolicy;
15use Bitrix\Main\ORM\Fields\Relations\ManyToMany;
16use Bitrix\Main\ORM\Fields\Relations\OneToMany;
17use Bitrix\Main\ORM\Fields\Relations\Reference;
18use Bitrix\Main\ORM\Fields\StringField;
19use Bitrix\Main\ORM\Fields\Validators;
20use Bitrix\Main\ORM\Query\Join;
21use Bitrix\Main\ORM\Query\Query;
22use Bitrix\Main\Type\DateTime;
23use CIBlockProperty;
24
25
80{
81 public const TYPE_TEXT = 'text';
82 public const TYPE_HTML = 'html';
83
84 public const PROPERTY_STORAGE_COMMON = 1;
85 public const PROPERTY_STORAGE_SEPARATE = 2;
86
87 public const RIGHTS_SIMPLE = 'S';
88 public const RIGHTS_EXTENDED = 'E';
89
90 public const PROPERTY_INDEX_DISABLE = 'N';
91 public const PROPERTY_INDEX_ENABLE = 'Y';
92 public const PROPERTY_INDEX_INVALID = 'I';
93
94 public const LIST_MODE_SEPARATE = 'S';
95 public const LIST_MODE_COMBINED = 'C';
96
97 public const SECTION_CHOOSER_SELECT = 'L';
98 public const SECTION_CHOOSER_DROPDOWNS = 'D';
99 public const SECTION_CHOOSER_PATH = 'P';
100
101 /* deprecated constants */
102 public const SELECT = self::SECTION_CHOOSER_SELECT;
103 public const DROPDOWNS = self::SECTION_CHOOSER_DROPDOWNS;
104 public const PATH = self::SECTION_CHOOSER_PATH;
105 public const SIMPLE = self::RIGHTS_SIMPLE;
106 public const EXTENDED = self::RIGHTS_EXTENDED;
107 public const SEPARATE = self::LIST_MODE_SEPARATE;
108 public const COMBINED = self::LIST_MODE_COMBINED;
109 public const INVALID = self::PROPERTY_INDEX_INVALID;
110
111 public const DATA_CLASS_NAMESPACE = 'Bitrix\Iblock\Elements';
112
113 public const DATA_CLASS_PREFIX = 'Element';
114
120 public static function getTableName(): string
121 {
122 return 'b_iblock';
123 }
124
125 public static function getObjectClass(): string
126 {
127 return Iblock::class;
128 }
129
135 public static function getMap(): array
136 {
137 return [
138 'ID' => [
139 'data_type' => 'integer',
140 'primary' => true,
141 'autocomplete' => true,
142 'title' => Loc::getMessage('IBLOCK_ENTITY_ID_FIELD'),
143 ],
144 'TIMESTAMP_X' => [
145 'data_type' => 'datetime',
146 'default_value' => function()
147 {
148 return new DateTime();
149 }
150 ,
151 'title' => Loc::getMessage('IBLOCK_ENTITY_TIMESTAMP_X_FIELD'),
152 ],
153 'IBLOCK_TYPE_ID' => [
154 'data_type' => 'string',
155 'required' => true,
156 'title' => Loc::getMessage('IBLOCK_ENTITY_IBLOCK_TYPE_ID_FIELD'),
157 'validation' => function()
158 {
159 return [
160 new Validators\LengthValidator(null, 50),
161 ];
162 },
163 ],
164 'LID' => [
165 'data_type' => 'string',
166 'validation' => function()
167 {
168 return [
169 new Validators\LengthValidator(null, 2),
170 ];
171 },
172 ],
173 'CODE' => [
174 'data_type' => 'string',
175 'title' => Loc::getMessage('IBLOCK_ENTITY_CODE_FIELD'),
176 'validation' => function()
177 {
178 return [
179 new Validators\LengthValidator(null, 50),
180 ];
181 },
182 ],
183 (new StringField('API_CODE'))
184 ->configureSize(50),
185 (new BooleanField('REST_ON'))
186 ->configureValues('N', 'Y')
187 ->configureDefaultValue('N'),
188 'NAME' => [
189 'data_type' => 'string',
190 'required' => true,
191 'title' => Loc::getMessage('IBLOCK_ENTITY_NAME_FIELD'),
192 'validation' => function()
193 {
194 return [
195 new Validators\LengthValidator(null, 255),
196 ];
197 },
198 ],
199 'ACTIVE' => [
200 'data_type' => 'boolean',
201 'values' => ['N','Y'],
202 'title' => Loc::getMessage('IBLOCK_ENTITY_ACTIVE_FIELD'),
203 ],
204 'SORT' => [
205 'data_type' => 'integer',
206 'title' => Loc::getMessage('IBLOCK_ENTITY_SORT_FIELD'),
207 ],
208 'LIST_PAGE_URL' => [
209 'data_type' => 'string',
210 'title' => Loc::getMessage('IBLOCK_ENTITY_LIST_PAGE_URL_FIELD'),
211 'validation' => function()
212 {
213 return [
214 new Validators\LengthValidator(null, 255),
215 ];
216 },
217 ],
218 'DETAIL_PAGE_URL' => [
219 'data_type' => 'string',
220 'title' => Loc::getMessage('IBLOCK_ENTITY_DETAIL_PAGE_URL_FIELD'),
221 'validation' => function()
222 {
223 return [
224 new Validators\LengthValidator(null, 255),
225 ];
226 },
227 ],
228 'SECTION_PAGE_URL' => [
229 'data_type' => 'string',
230 'title' => Loc::getMessage('IBLOCK_ENTITY_SECTION_PAGE_URL_FIELD'),
231 'validation' => function()
232 {
233 return [
234 new Validators\LengthValidator(null, 255),
235 ];
236 },
237 ],
238 'CANONICAL_PAGE_URL' => [
239 'data_type' => 'string',
240 'title' => Loc::getMessage('IBLOCK_ENTITY_CANONICAL_PAGE_URL_FIELD'),
241 'validation' => function()
242 {
243 return [
244 new Validators\LengthValidator(null, 255),
245 ];
246 },
247 ],
248 'PICTURE' => [
249 'data_type' => 'integer',
250 'title' => Loc::getMessage('IBLOCK_ENTITY_PICTURE_FIELD'),
251 ],
252 'DESCRIPTION' => [
253 'data_type' => 'string',
254 'title' => Loc::getMessage('IBLOCK_ENTITY_DESCRIPTION_FIELD'),
255 ],
256 'DESCRIPTION_TYPE' => [
257 'data_type' => 'enum',
258 'values' => [
259 self::TYPE_TEXT,
260 self::TYPE_HTML,
261 ],
262 'default_value' => self::TYPE_TEXT,
263 'title' => Loc::getMessage('IBLOCK_ENTITY_DESCRIPTION_TYPE_FIELD'),
264 ],
265 'XML_ID' => [
266 'data_type' => 'string',
267 'title' => Loc::getMessage('IBLOCK_ENTITY_XML_ID_FIELD'),
268 'validation' => function()
269 {
270 return [
271 new Validators\LengthValidator(null, 255),
272 ];
273 },
274 ],
275 'TMP_ID' => [
276 'data_type' => 'string',
277 'title' => Loc::getMessage('IBLOCK_ENTITY_TMP_ID_FIELD'),
278 'validation' => function()
279 {
280 return [
281 new Validators\LengthValidator(null, 40),
282 ];
283 },
284 ],
285 'INDEX_ELEMENT' => [
286 'data_type' => 'boolean',
287 'values' => ['N','Y'],
288 'title' => Loc::getMessage('IBLOCK_ENTITY_INDEX_ELEMENT_FIELD'),
289 ],
290 'INDEX_SECTION' => [
291 'data_type' => 'boolean',
292 'values' => ['N','Y'],
293 'title' => Loc::getMessage('IBLOCK_ENTITY_INDEX_SECTION_FIELD'),
294 ],
295 'WORKFLOW' => [
296 'data_type' => 'boolean',
297 'values' => ['N','Y'],
298 'title' => Loc::getMessage('IBLOCK_ENTITY_WORKFLOW_FIELD'),
299 ],
300 'BIZPROC' => [
301 'data_type' => 'boolean',
302 'values' => ['N','Y'],
303 'title' => Loc::getMessage('IBLOCK_ENTITY_BIZPROC_FIELD'),
304 ],
305 'SECTION_CHOOSER' => [
306 'data_type' => 'enum',
307 'values' => [
308 self::SECTION_CHOOSER_SELECT,
309 self::SECTION_CHOOSER_DROPDOWNS,
310 self::SECTION_CHOOSER_PATH
311 ],
312 'default_value' => self::SECTION_CHOOSER_SELECT,
313 'title' => Loc::getMessage('IBLOCK_ENTITY_SECTION_CHOOSER_FIELD'),
314 ],
315 'LIST_MODE' => [
316 'data_type' => 'enum',
317 'values' => [self::LIST_MODE_COMBINED, self::LIST_MODE_SEPARATE],
318 'default_value' => self::LIST_MODE_COMBINED,
319 'title' => Loc::getMessage('IBLOCK_ENTITY_LIST_MODE_FIELD'),
320 ],
321 'RIGHTS_MODE' => [
322 'data_type' => 'enum',
323 'values' => [self::RIGHTS_SIMPLE, self::RIGHTS_EXTENDED],
324 'default_value' => self::RIGHTS_SIMPLE,
325 'title' => Loc::getMessage('IBLOCK_ENTITY_RIGHTS_MODE_FIELD'),
326 ],
327 'SECTION_PROPERTY' => [
328 'data_type' => 'boolean',
329 'values' => ['N','Y'],
330 'title' => Loc::getMessage('IBLOCK_ENTITY_SECTION_PROPERTY_FIELD'),
331 ],
332 'PROPERTY_INDEX' => [
333 'data_type' => 'enum',
334 'values' => [self::PROPERTY_INDEX_DISABLE, self::PROPERTY_INDEX_ENABLE, self::PROPERTY_INDEX_INVALID],
335 'default' => self::PROPERTY_INDEX_DISABLE,
336 'title' => Loc::getMessage('IBLOCK_ENTITY_PROPERTY_INDEX_FIELD'),
337 ],
338 'VERSION' => [
339 'data_type' => 'enum',
340 'values' => [self::PROPERTY_STORAGE_COMMON, self::PROPERTY_STORAGE_SEPARATE],
341 'default_value' => self::PROPERTY_STORAGE_COMMON,
342 'title' => Loc::getMessage('IBLOCK_ENTITY_VERSION_FIELD'),
343 ],
344 'LAST_CONV_ELEMENT' => [
345 'data_type' => 'integer',
346 'title' => Loc::getMessage('IBLOCK_ENTITY_LAST_CONV_ELEMENT_FIELD'),
347 ],
348 'SOCNET_GROUP_ID' => [
349 'data_type' => 'integer',
350 'title' => Loc::getMessage('IBLOCK_ENTITY_SOCNET_GROUP_ID_FIELD'),
351 ],
352 'EDIT_FILE_BEFORE' => [
353 'data_type' => 'string',
354 'title' => Loc::getMessage('IBLOCK_ENTITY_EDIT_FILE_BEFORE_FIELD'),
355 'validation' => function()
356 {
357 return [
358 new Validators\LengthValidator(null, 255),
359 ];
360 },
361 ],
362 'EDIT_FILE_AFTER' => [
363 'data_type' => 'string',
364 'title' => Loc::getMessage('IBLOCK_ENTITY_EDIT_FILE_AFTER_FIELD'),
365 'validation' => function()
366 {
367 return [
368 new Validators\LengthValidator(null, 255),
369 ];
370 },
371 ],
372 'TYPE' => [
373 'data_type' => 'Bitrix\Iblock\Type',
374 'reference' => ['=this.IBLOCK_TYPE_ID' => 'ref.ID'],
375 ],
376
377 'FULLTEXT_INDEX' => [
378 'data_type' => 'boolean',
379 'values' => ['N', 'Y'],
380 'default' => 'N',
381 'title' => Loc::getMessage('IBLOCK_ENTITY_FULLTEXT_INDEX'),
382 ],
383
384 new OneToMany('PROPERTIES', PropertyTable::class, 'IBLOCK')
385 ];
386 }
387
396 public static function compileEntity($iblockApiCode)
397 {
398 // get iblock
399 if ($iblockApiCode instanceof Iblock)
400 {
401 $iblock = $iblockApiCode;
402 $iblock->fillApiCode();
403 }
404 else
405 {
407 'select' => ['ID', 'API_CODE'],
408 'filter' => Query::filter()->where('API_CODE', $iblockApiCode)
409 ])->fetchObject();
410 }
411
412 if (!$iblock || empty($iblock->getApiCode()))
413 {
414 return false;
415 }
416
417 // class info
418 $iblockNamespace = static::DATA_CLASS_NAMESPACE;
419 $iblockDataClassName = $iblock->getEntityDataClassName();
420
421 if ($iblockDataClassName == '')
422 {
423 return false;
424 }
425
426 // check if already compiled
427 $iblockDataClass = $iblock->getEntityDataClass();
428
429 if (class_exists($iblockDataClass, false))
430 {
431 return $iblockDataClass::getEntity();
432 }
433
434 // fill some necessary info
435 $iblock->fill(['VERSION', 'PROPERTIES']);
436
437 // iblock personal entity
438 $parentDataClass = $iblock->getVersion() == 1
439 ? ElementV1Table::class
440 : ElementV2Table::class;
441
443 $elementEntity = \Bitrix\Main\ORM\Entity::compileEntity(
444 $iblockDataClassName,
445 [],
446 [
447 'namespace' => $iblockNamespace,
448 'parent' => $parentDataClass,
449 ]
450 );
451
452 // set iblock to the entity
453 $elementEntity->setIblock($iblock);
454
455 // set relation with sections
456 SectionElementTable::getEntity()->addField(
457 (new Reference('REGULAR_ELEMENT_'.$iblock->getId(), $elementEntity,
458 Join::on('this.IBLOCK_ELEMENT_ID', 'ref.ID')->whereNull('this.ADDITIONAL_PROPERTY_ID')))
459 );
460
461 $elementEntity->addField((new ManyToMany('SECTIONS', SectionTable::class))
462 ->configureMediatorEntity(SectionElementTable::class)
463 ->configureLocalReference('REGULAR_ELEMENT_'.$iblock->getId())
464 ->configureRemoteReference('IBLOCK_SECTION')
465 );
466
467 //$baseTypeList = \Bitrix\Iblock\Helpers\Admin\Property::getBaseTypeList(true);
468 $userTypeList = CIBlockProperty::GetUserType();
469
470 // get properties
471 foreach ($iblock->getProperties() as $property)
472 {
473 if (empty($property->getCode()))
474 {
475 continue;
476 }
477
478 // build property entity with base fields
479 $propertyValueEntity = $property->getValueEntity($elementEntity);
480
481 // add custom fields
482 if (!empty($property->getUserType()) && !empty($userTypeList[$property->getUserType()]['GetORMFields']))
483 {
484 call_user_func($userTypeList[$property->getUserType()]['GetORMFields'], $propertyValueEntity, $property);
485 }
486
487 // add relations with property entity
488 $niceColumnName = $property->getCode();
489
490 if ($property->getMultiple())
491 {
492 // classic OneToMany
493 $elementRefName = 'SRC_ELEMENT';
494
495 // ref from prop entity to src element
496 $propertyValueEntity->addField(
497 (new Reference(
498 $elementRefName,
499 $elementEntity,
500 Join::on('this.IBLOCK_ELEMENT_ID', 'ref.ID')
501 ->where('this.IBLOCK_PROPERTY_ID', $property->getId())
502 ))
503 ->configureJoinType(Join::TYPE_INNER)
504
505 );
506
507 // OneToMany from src element to prop entity
508 $elementEntity->addField(
509 (new PropertyOneToMany($niceColumnName, $propertyValueEntity, $elementRefName))
510 ->configureJoinType(Join::TYPE_LEFT)
512 ->configureCascadeDeletePolicy(
514 )
515 );
516 }
517 else
518 {
519 // classic ref
520 $joinType = Join::TYPE_INNER;
521 $joinFilter = Join::on('this.ID', 'ref.IBLOCK_ELEMENT_ID');
522
523 if ($iblock->getVersion() == 1)
524 {
525 // additional clause for shared value table in v1.0
526 $joinType = Join::TYPE_LEFT;
527 $joinFilter->where('ref.IBLOCK_PROPERTY_ID', $property->getId());
528 }
529
530 // ref from src element to prop entity
531 $elementEntity->addField(
532 (new PropertyReference($niceColumnName, $propertyValueEntity, $joinFilter))
533 ->configureJoinType($joinType)
535 ->configureCascadeDeletePolicy(
536 CascadePolicy::NO_ACTION // will be removed together in onAfterDelete
537 )
538 );
539 }
540 }
541
542 return $elementEntity;
543 }
544
550 public static function compileAllEntities()
551 {
552 foreach (static::getList(['select' => ['ID', 'API_CODE']])->fetchCollection() as $iblock)
553 {
554 static::compileEntity($iblock);
555 }
556 }
557
564 public static function onAfterAdd(Event $event): void
565 {
566 $primary = $event->getParameter('primary');
567 \CIBlock::CleanCache($primary['ID']);
568 }
569
576 public static function onBeforeAdd(Event $event): EventResult
577 {
578 $result = new EventResult;
579 $fields = $event->getParameter('fields');
580 if (!isset($fields['TIMESTAMP_X']))
581 {
582 $result->modifyFields([
583 'TIMESTAMP_X' => new DateTime(),
584 ]);
585 }
586
587 return $result;
588 }
589
596 public static function onBeforeUpdate(Event $event): EventResult
597 {
598 $result = new EventResult;
599 $fields = $event->getParameter('fields');
600 if (!isset($fields['TIMESTAMP_X']))
601 {
602 $result->modifyFields([
603 'TIMESTAMP_X' => new DateTime(),
604 ]);
605 }
606
607 return $result;
608 }
609
616 public static function onAfterUpdate(Event $event): void
617 {
618 $primary = $event->getParameter('primary');
619 \CIBlock::CleanCache($primary['ID']);
620 }
621
628 public static function onAfterDelete(Event $event): void
629 {
630 $primary = $event->getParameter('primary');
631 \CIBlock::CleanCache($primary['ID']);
632 }
633
641 public static function resolveIdByCode(string $code, ?string $siteId = null): ?int
642 {
643 if ($code === '')
644 {
645 return null;
646 }
647
648 $row = static::getRow([
649 'select' => [
650 'ID',
651 ],
652 'filter' => [
653 '=CODE' => $code,
654 ],
655 'cache' => [
656 'ttl' => 86400,
657 ],
658 ]);
659
660 if ($row === null)
661 {
662 return null;
663 }
664
665 $iblockId = (int)$row['ID'];
666
667 if ($siteId === '')
668 {
669 $siteId = null;
670 }
671 if ($siteId !== null)
672 {
673 $row = IblockSiteTable::getRow([
674 'select' => [
675 'IBLOCK_ID',
676 ],
677 'filter' => [
678 '=IBLOCK_ID' => $iblockId,
679 '=SITE_ID' => $siteId,
680 ],
681 'cache' => [
682 'ttl' => 86400,
683 ],
684 ]);
685 if ($row === null)
686 {
687 $iblockId = null;
688 }
689 }
690
691 return $iblockId;
692 }
693}
Определения iblock.php:18
const COMBINED
Определения iblocktable.php:108
const PROPERTY_STORAGE_COMMON
Определения iblocktable.php:84
static compileAllEntities()
Определения iblocktable.php:550
const PROPERTY_INDEX_INVALID
Определения iblocktable.php:92
const PATH
Определения iblocktable.php:104
static getMap()
Определения iblocktable.php:135
static onAfterUpdate(Event $event)
Определения iblocktable.php:616
const RIGHTS_EXTENDED
Определения iblocktable.php:88
const SELECT
Определения iblocktable.php:102
const EXTENDED
Определения iblocktable.php:106
const SECTION_CHOOSER_DROPDOWNS
Определения iblocktable.php:98
static resolveIdByCode(string $code, ?string $siteId=null)
Определения iblocktable.php:641
const INVALID
Определения iblocktable.php:109
const LIST_MODE_COMBINED
Определения iblocktable.php:95
static onAfterAdd(Event $event)
Определения iblocktable.php:564
const DATA_CLASS_PREFIX
Определения iblocktable.php:113
static onBeforeAdd(Event $event)
Определения iblocktable.php:576
const PROPERTY_STORAGE_SEPARATE
Определения iblocktable.php:85
const LIST_MODE_SEPARATE
Определения iblocktable.php:94
const TYPE_HTML
Определения iblocktable.php:82
const PROPERTY_INDEX_ENABLE
Определения iblocktable.php:91
const DATA_CLASS_NAMESPACE
Определения iblocktable.php:111
static onAfterDelete(Event $event)
Определения iblocktable.php:628
const SECTION_CHOOSER_SELECT
Определения iblocktable.php:97
const RIGHTS_SIMPLE
Определения iblocktable.php:87
const SIMPLE
Определения iblocktable.php:105
const SECTION_CHOOSER_PATH
Определения iblocktable.php:99
const DROPDOWNS
Определения iblocktable.php:103
static onBeforeUpdate(Event $event)
Определения iblocktable.php:596
const TYPE_TEXT
Определения iblocktable.php:81
const PROPERTY_INDEX_DISABLE
Определения iblocktable.php:90
static getObjectClass()
Определения iblocktable.php:125
static getTableName()
Определения iblocktable.php:120
const SEPARATE
Определения iblocktable.php:107
Определения event.php:5
static getList(array $parameters=array())
Определения datamanager.php:431
static GetUserType($USER_TYPE=false)
Определения iblockproperty.php:1314
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
$iblockId
Определения iblock_catalog_edit.php:30
if(! $catalogEdit->isSuccess()) $iblock
Определения iblock_catalog_edit.php:38
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
Определения options.php:195
$siteId
Определения ajax.php:8
configureIblockElementProperty($property)
Определения propertyrelation.php:35
$event
Определения prolog_after.php:141
$fields
Определения yandex_run.php:501