29 private array $elementFields = [];
30 private array $elementProperty = [];
37 $this->param = $param;
38 $this->params = $param->getParams();
43 $this->listObject = new \CList($this->iblockId);
55 $this->param->checkRequiredInputParams([
"IBLOCK_CODE",
"IBLOCK_ID",
"ELEMENT_CODE",
"ELEMENT_ID"]);
56 if ($this->param->hasErrors())
58 $this->errorCollection->add($this->param->getErrors());
63 $this->validateParams();
70 "ID" => $this->params[
"ELEMENT_ID"] ??
"",
72 "=CODE" => $this->params[
"ELEMENT_CODE"] ??
"",
73 "CHECK_PERMISSIONS" =>
"N",
75 $queryObject = \CIBlockElement::getList([],
$filter,
false,
false, [
"ID"]);
76 return (
bool) $queryObject->fetch();
86 $this->param->checkRequiredInputParams(
98 if ($this->param->hasErrors())
100 $this->errorCollection->add($this->param->getErrors());
105 $this->setUrlTemplate();
107 $this->validateParams();
108 $this->validateFields();
110 $isEnabledBp = $this->isEnabledBizproc($this->params[
"IBLOCK_TYPE_ID"]);
111 $hasBpTemplatesWithAutoStart =
false;
122 $elementFields = $this->getElementFields($this->elementId, $this->params[
"FIELDS"]);
124 $elementObject = new \CIBlockElement;
125 $this->elementId = $elementObject->add($elementFields,
false,
true,
true);
126 if ($this->elementId)
128 if ($isEnabledBp && $hasBpTemplatesWithAutoStart)
133 return $this->elementId;
137 if ($elementObject->LAST_ERROR)
139 $this->errorCollection->setError(
140 new Error($elementObject->LAST_ERROR, self::ERROR_ADD_ELEMENT)
145 $this->errorCollection->setError(
146 new Error(
"Unknown error", self::ERROR_ADD_ELEMENT)
161 public function get(
array $navData = [])
163 $this->param->checkRequiredInputParams([
"IBLOCK_TYPE_ID",
"IBLOCK_CODE",
"IBLOCK_ID"]);
164 if ($this->param->hasErrors())
166 $this->errorCollection->add($this->param->getErrors());
170 return $this->getElements($navData);
180 $this->param->checkRequiredInputParams(
189 if ($this->param->hasErrors())
191 $this->errorCollection->add($this->param->getErrors());
196 $this->validateParams();
197 $this->validateFields();
199 $isEnabledBp = $this->isEnabledBizproc($this->params[
"IBLOCK_TYPE_ID"]);
200 $hasBpTemplatesWithAutoStart =
false;
211 [$elementSelect, $elementFields, $elementProperty] = $this->getElementData();
212 $this->elementFields = $elementFields;
213 $this->elementProperty = $elementProperty;
215 $fields = $this->getElementFields($this->elementId, $this->params[
"FIELDS"]);
217 $elementObject = new \CIBlockElement;
218 $updateResult = $elementObject->update($this->elementId,
$fields,
false,
true,
true);
221 if ($isEnabledBp && $hasBpTemplatesWithAutoStart)
223 $changedElementFields = \CLists::checkChangedFields(
243 if ($elementObject->LAST_ERROR)
245 $this->errorCollection->setError(
246 new Error($elementObject->LAST_ERROR, self::ERROR_UPDATE_ELEMENT)
251 $this->errorCollection->setError(
252 new Error(
"Unknown error", self::ERROR_UPDATE_ELEMENT)
265 public function delete()
267 $this->param->checkRequiredInputParams([
"IBLOCK_TYPE_ID",
"IBLOCK_CODE",
"IBLOCK_ID",
268 "ELEMENT_CODE",
"ELEMENT_ID"]);
269 if ($this->param->hasErrors())
271 $this->errorCollection->add($this->param->getErrors());
275 $elementObject = new \CIBlockElement;
280 if ($elementObject->delete($this->elementId))
287 $this->errorCollection->setError(
new Error($exception->getString(), self::ERROR_UPDATE_ELEMENT));
289 $this->errorCollection->setError(
new Error(
"Unknown error", self::ERROR_UPDATE_ELEMENT));
302 $this->param->checkRequiredInputParams([
"IBLOCK_CODE",
"IBLOCK_ID",
"ELEMENT_CODE",
"ELEMENT_ID",
"FIELD_ID"]);
303 if ($this->param->hasErrors())
305 $this->errorCollection->add($this->param->getErrors());
311 $sefFolder = $this->getSefFolder();
313 $queryProperty = \CIBlockElement::getProperty($this->iblockId, $this->elementId,
314 "SORT",
"ASC",
array(
"ACTIVE"=>
"Y",
"EMPTY"=>
"N",
"ID" => $this->params[
"FIELD_ID"])
316 while ($property = $queryProperty->fetch())
318 if ($property[
"PROPERTY_TYPE"] ==
"F")
320 $file = new \CListFile($this->iblockId, 0, $this->elementId,
321 "PROPERTY_".$this->params[
"FIELD_ID"], $property[
"VALUE"]);
322 $file->SetSocnetGroup($this->params[
"SOCNET_GROUP_ID"]);
323 $urls[] = $file->GetImgSrc([
"url_template" => $sefFolder.
324 "#list_id#/file/#section_id#/#element_id#/#field_id#/#file_id#/"]);
326 elseif ($property[
"USER_TYPE"] ==
"DiskFile")
328 if (is_array($property[
"VALUE"]))
330 foreach ($property[
"VALUE"] as $attacheId)
332 $driver = \Bitrix\Disk\Driver::getInstance();
333 $urls[] = $driver->getUrlManager()->getUrlUfController(
334 "download",
array(
"attachedId" => $attacheId));
349 $availableFields =
array(
"ID",
"ACTIVE",
"NAME",
"TAGS",
"XML_ID",
"EXTERNAL_ID",
"PREVIEW_TEXT",
350 "PREVIEW_TEXT_TYPE",
"PREVIEW_PICTURE",
"DETAIL_TEXT",
"DETAIL_TEXT_TYPE",
"DETAIL_PICTURE",
351 "CHECK_PERMISSIONS",
"PERMISSIONS_BY",
"CATALOG_TYPE",
"MIN_PERMISSION",
"SEARCHABLE_CONTENT",
352 "SORT",
"TIMESTAMP_X",
"DATE_MODIFY_FROM",
"DATE_MODIFY_TO",
"MODIFIED_USER_ID",
"MODIFIED_BY",
353 "DATE_CREATE",
"CREATED_USER_ID",
"CREATED_BY",
"DATE_ACTIVE_FROM",
"DATE_ACTIVE_TO",
"ACTIVE_DATE",
354 "ACTIVE_FROM",
"ACTIVE_TO",
"SECTION_ID");
356 $listCustomFields = [];
358 $fields = $this->listObject->getFields();
362 if (!empty($field[
"CODE"]))
364 $availableFields[] =
"PROPERTY_".$field[
"CODE"];
367 if ($this->isFieldDateType($field[
"TYPE"]))
369 $callback = $field[
"PROPERTY_USER_TYPE"][
"ConvertToDB"] ??
null;
370 $listCustomFields[$field[
"FIELD_ID"]] =
function ($value) use ($callback) {
371 $regexDetectsIso8601 =
'/^([\+-]?\d{4}(?!\d{2}\b))'
372 .
'((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?'
373 .
'|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d'
374 .
'|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])'
375 .
'((:?)[0-5]\d)?|24\:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d'
376 .
'([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/';
377 if (is_string($value) && preg_match($regexDetectsIso8601, $value) === 1)
379 return \CRestUtil::unConvertDateTime($value);
381 elseif (is_callable($callback))
383 return call_user_func_array($callback, [[], [
"VALUE" => $value]]);
393 $availableFields = array_merge($availableFields, array_keys(
$fields));
395 return array($availableFields, $listCustomFields);
398 private function isEnabledBizproc(
string $iblockTypeId): bool
400 return (Loader::includeModule(
"bizproc") && \CLists::isBpFeatureEnabled(
$iblockTypeId));
403 private function setUrlTemplate()
405 if (!empty($this->params[
"LIST_ELEMENT_URL"]))
407 $this->listObject->actualizeDocumentAdminPage(str_replace(
408 [
"#list_id#",
"#group_id#"],
409 [$this->iblockId, $this->params[
"SOCNET_GROUP_ID"]],
410 $this->params[
"LIST_ELEMENT_URL"])
415 private function validateFields()
417 $fields = $this->listObject->getFields();
418 foreach (
$fields as $fieldId => $fieldData)
420 $fieldValue = $this->params[
"FIELDS"][$fieldId] ??
null;
423 empty($this->params[
"FIELDS"][$fieldId])
424 && $fieldData[
"IS_REQUIRED"] ===
"Y"
425 && !is_numeric($this->params[
"FIELDS"][$fieldId] ??
null)
428 $this->errorCollection->setError(
430 "The field \"".$fieldData[
"NAME"].
"\" is required",
431 self::ERROR_ELEMENT_FIELD_VALUE
436 if (!$this->listObject->is_field($fieldId))
438 if (!is_array($fieldValue))
440 $fieldValue = [$fieldValue];
443 switch ($fieldData[
"TYPE"])
446 foreach($fieldValue as
$key => $value)
448 $value = str_replace(
" ",
"", str_replace(
",",
".", $value));
449 if ($value && !is_numeric($value))
451 $this->errorCollection->setError(
new Error(
452 "Value of the \"".$fieldData[
"NAME"].
"\" field is not correct",
453 self::ERROR_ELEMENT_FIELD_VALUE)
463 private function validateParams()
465 if (isset($this->params[
"ELEMENT_CODE"]) && !is_scalar($this->params[
"ELEMENT_CODE"]))
467 $this->errorCollection->setError(
new Error(
468 'Value of the "ELEMENT_CODE" is not correct',
469 self::ERROR_ELEMENT_PARAM_VALUE
475 private function getElementFields($elementId,
array $values)
479 "CODE" => $this->params[
"ELEMENT_CODE"] ??
'',
481 "PROPERTY_VALUES" => [],
484 $fields = $this->listObject->getFields();
485 foreach (
$fields as $fieldId => $fieldData)
487 $fieldValue = $values[$fieldId] ??
null;
489 if ($this->listObject->is_field($fieldId))
491 if ($fieldId ==
"PREVIEW_PICTURE" || $fieldId ==
"DETAIL_PICTURE")
493 $this->setPictureValue($elementFields, $fieldId, $fieldValue, $values);
495 elseif ($fieldId ==
"PREVIEW_TEXT" || $fieldId ==
"DETAIL_TEXT")
497 $this->setTextValue($elementFields, $fieldId, $fieldValue, $fieldData);
501 $this->setBaseValue($elementFields, $fieldId, $fieldValue);
506 if (!is_array($fieldValue))
508 $fieldValue = [$fieldValue];
511 switch ($fieldData[
"TYPE"])
514 $this->setFileValue($elementFields, $fieldId, $fieldValue, $fieldData, $values);
517 $this->setIntegerValue($elementFields, $fieldValue, $fieldData);
520 $this->setFileDiskValue($elementFields, $fieldValue, $fieldData);
523 $this->setDateValue($elementFields, $fieldValue, $fieldData);
526 $this->setDateTimeValue($elementFields, $fieldValue, $fieldData);
529 $this->setHtmlValue($elementFields, $fieldValue, $fieldData);
532 $this->setPropertyValue($elementFields, $fieldValue, $fieldData);
538 if (empty($values[
"MODIFIED_BY"]) && isset(
$USER) && is_object(
$USER))
541 $elementFields[
"MODIFIED_BY"] =
$userId;
543 unset($elementFields[
"TIMESTAMP_X"]);
545 $elementFields[
"IBLOCK_SECTION_ID"] = (
546 is_numeric($values[
'IBLOCK_SECTION_ID'] ??
null)
547 ? (int) $values[
'IBLOCK_SECTION_ID'] : 0
550 return $elementFields;
553 private function setPictureValue(&$elementFields, $fieldId, $fieldValue,
array $values)
555 if (intval($fieldValue))
557 $elementFields[$fieldId] = \CFile::makeFileArray($fieldValue);
561 $elementFields[$fieldId] = \CRestUtil::saveFile($fieldValue);
564 if (!empty($values[$fieldId.
"_DEL"]))
566 $elementFields[$fieldId][
"del"] =
"Y";
570 private function setTextValue(&$elementFields, $fieldId, $fieldValue, $fieldData)
572 if (is_array($fieldValue))
574 $fieldValue = current($fieldValue);
577 if (!empty($fieldData[
"SETTINGS"][
"USE_EDITOR"]) && $fieldData[
"SETTINGS"][
"USE_EDITOR"] ==
"Y")
579 $elementFields[$fieldId.
"_TYPE"] =
"html";
583 $elementFields[$fieldId.
"_TYPE"] =
"text";
586 $elementFields[$fieldId] = $fieldValue;
589 private function setBaseValue(&$elementFields, $fieldId, $fieldValue)
591 if (is_array($fieldValue))
593 $fieldValue = current($fieldValue);
596 $elementFields[$fieldId] = $fieldValue;
599 private function setFileValue(&$elementFields, $fieldId,
array $fieldValue,
array $fieldData,
array $values)
601 if (!empty($values[$fieldId.
"_DEL"]))
602 $delete = $values[$fieldId.
"_DEL"];
606 if (!Loader::includeModule(
"rest"))
611 $property = isset($fieldData[
'ID'])
612 ? ($this->elementProperty[$fieldData[
'ID']] ??
null)
613 : ($this->elementFields[$fieldId] ?? null)
616 $prevIds = array_values($property[
'VALUES_LIST'] ?? []);
618 foreach ($fieldValue as
$key => $value)
620 if (is_array($value))
622 $elementFields[
"PROPERTY_VALUES"][$fieldData[
"ID"]][
$key][
"VALUE"] = \CRestUtil::saveFile($value);
626 if (is_numeric($value))
628 if (!in_array($value, $prevIds))
631 throw new RestException(
'Writing file values by ID is not supported', static::ERROR_ELEMENT_FIELD_VALUE);
633 $elementFields[
"PROPERTY_VALUES"][$fieldData[
"ID"]][
$key][
"VALUE"] = \CFile::makeFileArray($value);
637 $elementFields[
"PROPERTY_VALUES"][$fieldData[
"ID"]][
$key][
"VALUE"] = \CRestUtil::saveFile($fieldValue);
644 foreach ($delete as $elementPropertyId => $mark)
646 if (isset($elementFields[
"PROPERTY_VALUES"][$fieldData[
"ID"]][$elementPropertyId][
"VALUE"]))
647 $elementFields[
"PROPERTY_VALUES"][$fieldData[
"ID"]][$elementPropertyId][
"VALUE"][
"del"] =
"Y";
649 $elementFields[
"PROPERTY_VALUES"][$fieldData[
"ID"]][$elementPropertyId][
"del"] =
"Y";
654 private function setIntegerValue(&$elementFields,
array $fieldValue, $fieldData)
656 foreach ($fieldValue as
$key => $value)
658 $value = str_replace(
" ",
"", str_replace(
",",
".", $value));
659 $value = is_numeric($value) ? doubleval($value) :
'';
660 $elementFields[
"PROPERTY_VALUES"][$fieldData[
"ID"]][
$key][
"VALUE"] =
$value;
664 private function setFileDiskValue(&$elementFields,
array $fieldValue, $fieldData)
666 foreach ($fieldValue as
$key => $value)
668 if (is_array($value))
670 $elementFields[
"PROPERTY_VALUES"][$fieldData[
"ID"]][
$key][
"VALUE"] =
$value;
674 if (!is_array($elementFields[
"PROPERTY_VALUES"][$fieldData[
"ID"]][
"VALUE"]))
675 $elementFields[
"PROPERTY_VALUES"][$fieldData[
"ID"]][
"VALUE"] = [];
676 $elementFields[
"PROPERTY_VALUES"][$fieldData[
"ID"]][
"VALUE"][] =
$value;
681 private function setDateValue(&$elementFields,
array $fieldValue, $fieldData)
683 if (!Loader::includeModule(
"rest"))
688 foreach ($fieldValue as
$key => $value)
690 if (is_array($value))
692 foreach($value as
$k => $v)
694 $elementFields[
"PROPERTY_VALUES"][$fieldData[
"ID"]][
$k][
"VALUE"] = \CRestUtil::unConvertDate($v);
699 $elementFields[
"PROPERTY_VALUES"][$fieldData[
"ID"]][
$key][
"VALUE"] = \CRestUtil::unConvertDate($value);
704 private function setDateTimeValue(&$elementFields,
array $fieldValue, $fieldData)
706 if (!Loader::includeModule(
"rest"))
711 foreach ($fieldValue as
$key => $value)
713 if (is_array($value))
715 foreach($value as
$k => $v)
717 $elementFields[
"PROPERTY_VALUES"][$fieldData[
"ID"]][
$k][
"VALUE"] =
718 \CRestUtil::unConvertDateTime($v);
723 $elementFields[
"PROPERTY_VALUES"][$fieldData[
"ID"]][
$key][
"VALUE"] =
724 \CRestUtil::unConvertDateTime($value);
729 private function setHtmlValue(&$elementFields,
array $fieldValue, $fieldData)
731 foreach($fieldValue as
$key => $value)
733 if (!is_array($value))
738 foreach($value as
$k => $v)
742 $elementFields[
"PROPERTY_VALUES"][$fieldData[
"ID"]][
$k][
"VALUE"] = unserialize($v, [
'allowed_classes' =>
false]);
746 $elementFields[
"PROPERTY_VALUES"][$fieldData[
"ID"]][
$k][
"VALUE"][
"TYPE"] =
"html";
747 $elementFields[
"PROPERTY_VALUES"][$fieldData[
"ID"]][
$k][
"VALUE"][
"TEXT"] = $v;
753 private function setPropertyValue(&$elementFields,
array $fieldValue, $fieldData)
755 foreach($fieldValue as
$key => $value)
759 foreach($value as
$k => $v)
760 $elementFields[
"PROPERTY_VALUES"][$fieldData[
"ID"]][
$k][
"VALUE"] = $v;
764 $elementFields[
"PROPERTY_VALUES"][$fieldData[
"ID"]][
$key][
"VALUE"] =
$value;
769 private function hasBpTemplatesWithAutoStart(
int $execType): bool
771 $documentType = \BizProcDocument::generateDocumentComplexType(
772 $this->params[
"IBLOCK_TYPE_ID"],
776 $bpTemplatesWithAutoStart = \CBPWorkflowTemplateLoader::searchTemplatesByDocumentType(
781 foreach ($bpTemplatesWithAutoStart as
$template)
783 if (!\CBPWorkflowTemplateLoader::isConstantsTuned(
$template[
"ID"]))
785 $this->errorCollection->setError(
786 new Error(
"Workflow constants need to be configured", self::ERROR_ADD_ELEMENT)
791 return !empty($bpTemplatesWithAutoStart);
794 private function startBp(
int $elementId,
int $execType, $changedElementFields = []): void
796 $documentType = \BizprocDocument::generateDocumentComplexType(
797 $this->params[
"IBLOCK_TYPE_ID"],
800 $documentId = \BizProcDocument::getDocumentComplexId(
801 $this->params[
"IBLOCK_TYPE_ID"],
804 $documentStates = \CBPWorkflowTemplateLoader::getDocumentTypeStates(
809 if (is_array($documentStates) && !empty($documentStates))
815 $currentUserGroups =
$USER->getUserGroupArray();
816 if ($this->params[
"CREATED_BY"] ==
$userId)
818 $currentUserGroups[] =
"author";
823 $canWrite = \CBPDocument::canUserOperateDocumentType(
828 "AllUserGroups" => $currentUserGroups,
829 "DocumentStates" => $documentStates,
835 $canWrite = \CBPDocument::canUserOperateDocument(
840 "AllUserGroups" => $currentUserGroups,
841 "DocumentStates" => $documentStates,
848 $this->errorCollection->setError(
849 new Error(
"You do not have enough permissions to edit this record in its current bizproc state")
857 foreach ($documentStates as $documentState)
859 $parameters = \CBPDocument::startWorkflowParametersValidate(
860 $documentState[
"TEMPLATE_ID"],
861 $documentState[
"TEMPLATE_PARAMETERS"],
866 \CBPDocument::startWorkflow(
867 $documentState[
"TEMPLATE_ID"],
868 \BizProcDocument::getDocumentComplexId($this->params[
"IBLOCK_TYPE_ID"], $elementId),
872 \CBPDocument::PARAM_TAGRET_USER =>
"user_" . intval(
$userId),
873 \CBPDocument::PARAM_MODIFIED_DOCUMENT_FIELDS => $changedElementFields,
887 private function getElementData()
889 $elementSelect = [
"ID",
"IBLOCK_ID",
"NAME",
"IBLOCK_SECTION_ID",
"CREATED_BY",
"BP_PUBLISHED",
"CODE"];
891 $elementProperty = [];
893 $fields = $this->listObject->getFields();
895 foreach (
$fields as $fieldId => $field)
897 if ($this->listObject->is_field($fieldId))
898 $elementSelect[] = $fieldId;
902 if ($fieldId ==
"CREATED_BY")
903 $elementSelect[] =
"CREATED_USER_NAME";
904 if ($fieldId ==
"MODIFIED_BY")
905 $elementSelect[] =
"USER_NAME";
909 "IBLOCK_TYPE" => $this->params[
"IBLOCK_TYPE_ID"],
911 "ID" => $this->elementId,
912 "CHECK_PERMISSIONS" =>
"N",
914 $queryObject = \CIBlockElement::getList([],
$filter,
false,
false, $elementSelect);
915 if (
$result = $queryObject->fetch())
921 $queryProperty = \CIBlockElement::getProperty(
924 array(
"ACTIVE"=>
"Y",
"EMPTY"=>
"N")
926 while ($property = $queryProperty->fetch())
928 $propertyId = $property[
"ID"];
929 if (!array_key_exists($propertyId, $elementProperty))
931 $elementProperty[$propertyId] = $property;
932 unset($elementProperty[$propertyId][
"DESCRIPTION"]);
933 unset($elementProperty[$propertyId][
"VALUE_ENUM_ID"]);
934 unset($elementProperty[$propertyId][
"VALUE_ENUM"]);
935 unset($elementProperty[$propertyId][
"VALUE_XML_ID"]);
936 $elementProperty[$propertyId][
"FULL_VALUES"] = [];
937 $elementProperty[$propertyId][
"VALUES_LIST"] = [];
939 $elementProperty[$propertyId][
"FULL_VALUES"][$property[
"PROPERTY_VALUE_ID"]] = [
940 "VALUE" => $property[
"VALUE"],
941 "DESCRIPTION" => $property[
"DESCRIPTION"],
943 $elementProperty[$propertyId][
"VALUES_LIST"][$property[
"PROPERTY_VALUE_ID"]] = $property[
"VALUE"];
948 return [$elementSelect, $elementFields, $elementProperty];
951 private function getElements($navData)
955 $fields = $this->listObject->getFields();
957 $elementSelect = [
"ID",
"IBLOCK_ID",
"NAME",
"IBLOCK_SECTION_ID",
"CREATED_BY",
"BP_PUBLISHED",
"CODE"];
959 $ignoreSortFields = [
"S:Money",
"PREVIEW_TEXT",
"DETAIL_TEXT",
"S:ECrm",
"S:map_yandex",
"PREVIEW_PICTURE",
960 "DETAIL_PICTURE",
"S:DiskFile",
"IBLOCK_SECTION_ID",
"BIZPROC",
"COMMENTS"];
962 $availableFieldsIdForSort = [
"ID"];
963 foreach (
$fields as $fieldId => $field)
965 if ($this->listObject->is_field($fieldId))
966 $elementSelect[] = $fieldId;
970 if ($fieldId ==
"CREATED_BY")
971 $elementSelect[] =
"CREATED_USER_NAME";
972 if ($fieldId ==
"MODIFIED_BY")
973 $elementSelect[] =
"USER_NAME";
975 if (!($field[
"MULTIPLE"] ==
"Y" || in_array($field[
"TYPE"], $ignoreSortFields)))
977 $availableFieldsIdForSort[] = $fieldId;
981 $elementSelect = array_unique($elementSelect);
982 if (is_array($this->params[
'SELECT'] ??
null))
984 $elementSelect = array_intersect($elementSelect, $this->params[
'SELECT']);
986 if (empty($elementSelect))
988 $elementSelect = [
'ID'];
992 $order = $this->getOrder($availableFieldsIdForSort);
995 "=IBLOCK_TYPE" => $this->params[
"IBLOCK_TYPE_ID"],
997 "ID" => $this->params[
"ELEMENT_ID"] ??
"",
998 "=CODE" => $this->params[
"ELEMENT_CODE"] ??
"",
999 "SHOW_NEW" => (!empty($this->params[
"CAN_FULL_EDIT"]) && $this->params[
"CAN_FULL_EDIT"] ==
"Y" ?
"Y" :
"N"),
1000 "CHECK_PERMISSIONS" =>
"Y",
1003 $queryObject = \CIBlockElement::getList(
$order,
$filter,
false, $navData, $elementSelect);
1004 while (
$result = $queryObject->fetch())
1010 $queryProperty = \CIBlockElement::getProperty(
1019 while ($property = $queryProperty->fetch())
1021 $propertyId = $property[
"ID"];
1022 $elements[
$result[
"ID"]][
"PROPERTY_".$propertyId][
1023 $property[
"PROPERTY_VALUE_ID"]] = $property[
"VALUE"];
1028 return array($elements, $queryObject);
1031 private function getOrder($availableFieldsIdForSort)
1035 if (is_array($this->params[
"ELEMENT_ORDER"] ??
null))
1037 $orderList = [
"nulls,asc",
"asc,nulls",
"nulls,desc",
"desc,nulls",
"asc",
"desc"];
1038 foreach ($this->params[
"ELEMENT_ORDER"] as $fieldId => $orderParam)
1040 $orderParam = mb_strtolower($orderParam);
1041 if (!in_array($orderParam, $orderList) || !in_array($fieldId, $availableFieldsIdForSort))
1045 $order[$fieldId] = $orderParam;
1051 $order = [
"ID" =>
"asc"];
1059 if (is_array($this->params[
"FILTER"] ??
null))
1061 foreach ($this->resultSanitizeFilter as
$key => $value)
1063 $key = str_replace([
"ACTIVE_FROM",
"ACTIVE_TO"], [
"DATE_ACTIVE_FROM",
"DATE_ACTIVE_TO"],
$key);
1071 private function isFieldDateType(
$type)
1073 return (in_array(
$type, [
"DATE_CREATE",
"TIMESTAMP_X",
"DATE_MODIFY_FROM",
"DATE_MODIFY_TO",
"ACTIVE_DATE",
1074 "S:Date",
"S:DateTime",
"DATE_ACTIVE_FROM",
"DATE_ACTIVE_TO",
"ACTIVE_FROM",
"ACTIVE_TO"]));
1077 private function getSefFolder()
1079 $defaultSefFolder = [
1080 "lists" =>
"/company/lists/",
1081 "lists_socnet" =>
"/workgroups/group/#group_id#/lists/",
1082 "bitrix_processes" =>
"/bizproc/processes/",
1085 if (!empty($this->params[
"SEF_FOLDER"]))
1087 $sefFolder = $this->params[
"SEF_FOLDER"];
1089 elseif (!empty($defaultSefFolder[$this->params[
"IBLOCK_TYPE_ID"]]))
1091 $sefFolder = $defaultSefFolder[$this->params[
"IBLOCK_TYPE_ID"]];
1095 $sefFolder = $defaultSefFolder[
"lists"];