Your IP : 216.73.216.86


Current Path : /var/www/homesaver/www/bitrix/modules/iblock/lib/grid/panel/ui/actions/item/
Upload File :
Current File : /var/www/homesaver/www/bitrix/modules/iblock/lib/grid/panel/ui/actions/item/editactionsitem.php

<?php

namespace Bitrix\Iblock\Grid\Panel\UI\Actions\Item;

use Bitrix\Iblock\Grid\Access\IblockRightsChecker;
use Bitrix\Iblock\Grid\ActionType;
use Bitrix\Iblock\Grid\Column\ElementPropertyProvider;
use Bitrix\Iblock\Grid\RowType;
use Bitrix\Main\Error;
use Bitrix\Main\Filter\Filter;
use Bitrix\Main\Grid\Column\Columns;
use Bitrix\Main\Grid\Editor\Types;
use Bitrix\Main\HttpRequest;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\Result;
use CIBlockElement;
use CIBlockSection;

class EditActionsItem extends \Bitrix\Main\Grid\Panel\Action\EditAction
{
	private int $iblockId;
	private Columns $columns;
	private IblockRightsChecker $rights;
	private CIBlockElement $elementEntity;
	private CIBlockSection $sectionEntity;

	public static function getId(): string
	{
		return ActionType::EDIT;
	}

	public function __construct(int $iblockId, Columns $columns, IblockRightsChecker $rights)
	{
		$this->iblockId = $iblockId;
		$this->columns = $columns;
		$this->rights = $rights;
	}

	private function getElementEntity(): CIBlockElement
	{
		if (!isset($this->elementEntity))
		{
			$this->elementEntity = new CIBlockElement();
			$this->elementEntity->setIblock($this->getIblockId());
		}

		return $this->elementEntity;
	}

	private function getSectionEntity(): CIBlockSection
	{
		if (!isset($this->sectionEntity))
		{
			$this->sectionEntity = new CIBlockSection();
			$this->sectionEntity->setIblock($this->getIblockId());
		}

		return $this->sectionEntity;
	}

	final protected function getIblockId(): int
	{
		return $this->iblockId;
	}

	final protected function getColumns(): Columns
	{
		return $this->columns;
	}

	public function processRequest(HttpRequest $request, bool $isSelectedAllRows, ?Filter $filter): ?Result
	{
		$result = new Result();

		$rows = $request->getPost('FIELDS');
		if (!is_array($rows))
		{
			return $result;
		}
		$rows = $this->appendFilesToRows($request, $rows);

		foreach ($rows as $id => $fields)
		{
			$index = RowType::parseIndex($id);
			if ($index === null)
			{
				continue;
			}
			[$type, $id] = $index;

			$fields = $this->getColumns()->prepareEditableColumnsValues($fields);
			if (empty($fields))
			{
				continue;
			}

			if ($type === RowType::ELEMENT)
			{
				if (!$this->rights->canEditElement($id))
				{
					$message = Loc::getMessage('', [
						'#ID#' => $id,
					]);
					$result->addError(
						new Error($message)
					);

					continue;
				}

				$result->addErrors(
					$this->saveElement($id, $fields)->getErrors()
				);
			}
			elseif ($type === RowType::SECTION)
			{
				if (!$this->rights->canEditSection($id))
				{
					$message = Loc::getMessage('IBLOCK_GRID_PANEL_UI_EDIT_ACTIONS_ITEM_ACCESS_DENIED', [
						'#ID#' => $id,
					]);
					$result->addError(
						new Error($message)
					);

					continue;
				}

				$result->addErrors(
					$this->saveSection($id, $fields)->getErrors()
				);
			}
		}

		return $result;
	}

	private function splitElementFields(array $fields): array
	{
		$elementFields = [];
		$propertyFields = [];

		$propertyColumnIds = ElementPropertyProvider::getPropertyIdsFromColumnsIds(array_keys($fields));
		foreach ($fields as $name => $value)
		{
			$propertyId = $propertyColumnIds[$name] ?? null;
			if (isset($propertyId))
			{
				$propertyFields[$propertyId] = $value;
			}
			else
			{
				$elementFields[$name] = $value;
			}
		}

		return [$elementFields, $propertyFields];
	}

	protected function saveElement(int $id, array $fields): Result
	{
		$result = new Result();

		$fields = $this->prepareColumnsTypesValues($fields);

		[$elementFields, $propertyFields] = $this->splitElementFields($fields);

		if (!empty($elementFields))
		{
			$entity = $this->getElementEntity();
			$entity->Update($id, $fields);
			if ($entity->getLastError())
			{
				$result->addError(
					new Error($entity->getLastError())
				);
			}
		}

		if ($result->isSuccess() && !empty($propertyFields))
		{
			CIBlockElement::SetPropertyValuesEx($id, 0, $propertyFields);
		}

		return $result;
	}

	protected function saveSection(int $id, array $fields): Result
	{
		$result = new Result();

		$entity = $this->getSectionEntity();
		$entity->Update($id, $fields);

		if ($entity->getLastError())
		{
			$result->addError(
				new Error($entity->getLastError())
			);
		}

		return $result;
	}

	private function prepareColumnsTypesValues(array $fields): array
	{
		foreach ($this->getColumns() as $column)
		{
			$columnId = $column->getId();
			$value = $fields[$columnId] ?? null;
			if (!isset($value))
			{
				continue;
			}

			$editable = $column->getEditable();
			if (!isset($editable))
			{
				continue;
			}
			elseif ($editable->getType() === Types::MULTISELECT)
			{
				if (is_array($value))
				{
					$fields[$columnId] = array_column($value, 'VALUE');
				}
			}
			elseif ($editable->getType() === Types::IMAGE)
			{
				if ($value === 'null')
				{
					$fields[$columnId] = [
						'VALUE' => [
							'del' => 'Y',
						],
					];
				}
			}
		}

		return $fields;
	}

	protected function appendFilesToRows(HttpRequest $request, array $rows): array
	{
		$files = $request->getFile('FIELDS');
		if (empty($files['name']))
		{
			return $rows;
		}

		foreach ($files['name'] as $rowId => $fields)
		{
			foreach ($fields as $fieldName => $fieldValue)
			{
				$rows[$rowId] ??= [];
				$rows[$rowId][$fieldName] = [
					'name' => $fieldValue,
					'type' => $files['type'][$rowId][$fieldName] ?? null,
					'size' => $files['size'][$rowId][$fieldName] ?? null,
					'error' => $files['error'][$rowId][$fieldName] ?? null,
					'tmp_name' => $files['tmp_name'][$rowId][$fieldName] ?? null,
					'full_path' => $files['full_path'][$rowId][$fieldName] ?? null,
				];
			}
		}

		return $rows;
	}
}