Your IP : 18.220.95.15


Current Path : /home/bitrix/ext_www/crm.klimatlend.ua/bitrix/modules/catalog/lib/controller/
Upload File :
Current File : /home/bitrix/ext_www/crm.klimatlend.ua/bitrix/modules/catalog/lib/controller/section.php

<?php


namespace Bitrix\Catalog\Controller;


use Bitrix\Main\Engine\Response\DataType\Page;
use Bitrix\Main\Error;
use Bitrix\Main\Result;

final class Section extends Controller
{
	//region Actions
	public function getFieldsAction()
	{
		$view = $this->getViewManager()
			->getView($this);

		return ['SECTION'=>$view->prepareFieldInfos(
			$view->getFields()
		)];
	}

	public function listAction($select=[], $filter=[], $order=[], $start=0)
	{
		$r = $this->checkPermissionIBlockSectionList($filter['IBLOCK_ID']);
		if($r->isSuccess())
		{
			$result = [];

			$select = empty($select)? ['*']:$select;
			$order = empty($order)? ['ID'=>'ASC']:$order;

			$r = \CIBlockSection::GetList($order, $filter, false, $select, self::getNavData($start));
			while ($l = $r->fetch())
				$result[] = $l;

			return new Page('SECTIONS', $result, function() use ($filter)
			{
				$list = [];
				$r = \CIBlockSection::GetList([], $filter);
				while ($l = $r->fetch())
					$list[] = $l;

				return count($list);
			});
		}
		else
		{
			$this->addErrors($r->getErrors());
			return null;
		}

	}

	public function getAction($id)
	{
		$r = $this->checkPermissionIBlockSectionGet($id);
		if($r->isSuccess())
		{
			$r = $this->exists($id);
			if($r->isSuccess())
			{
				return ['SECTION'=>$this->get($id)];
			}
			else
			{
				$this->addErrors($r->getErrors());
				return null;
			}
		}
		else
		{
			$this->addErrors($r->getErrors());
			return null;
		}
	}

	public function addAction($fields)
	{
		$r = $this->checkPermissionIBlockSectionAdd($fields['IBLOCK_ID']);
		if($r->isSuccess())
		{
			if(isset($fields['IBLOCK_SECTION_ID']) && intval($fields['IBLOCK_SECTION_ID']>0))
			{
				$r = $this->checkPermissionIBlockSectionSectionBindUpdate($fields['IBLOCK_SECTION_ID']);
			}
		}

		if($r->isSuccess())
		{
			$id = 0;
			$section = new \CIBlockSection();

			$r = $this->addValidate($fields);
			if($r->isSuccess())
			{
				$id = $section->Add($fields);
				if($section->LAST_ERROR<>'')
				{
					$r->addError(new Error($section->LAST_ERROR));
				}
			}
		}

		if(!$r->isSuccess())
		{
			$this->addErrors($r->getErrors());
			return null;
		}
		else
		{
			return ['SECTION'=>$this->get($id)];
		}
	}

	public function updateAction($id, array $fields)
	{
		$r = $this->checkPermissionIBlockSectionUpdate($id);
		if($r->isSuccess())
		{
			if(isset($fields['IBLOCK_SECTION_ID']) && intval($fields['IBLOCK_SECTION_ID']>0))
			{
				$r = $this->checkPermissionIBlockSectionSectionBindUpdate($fields['IBLOCK_SECTION_ID']);
			}
		}

		if($r->isSuccess())
		{
			$section = new \CIBlockSection();

			$r = $this->exists($id);
			if($r->isSuccess())
			{
				$r = $this->updateValidate($fields+['ID'=>$id]);
				if($r->isSuccess())
				{
					$section->Update($id, $fields);
					if($section->LAST_ERROR<>'')
					{
						$r->addError(new Error($section->LAST_ERROR));
					}
				}
			}
		}

		if($r->isSuccess())
		{
			return ['SECTION'=>$this->get($id)];
		}
		else
		{
			$this->addErrors($r->getErrors());
			return null;
		}
	}

	public function deleteAction($id)
	{
		$r = $this->checkPermissionIBlockSectionDelete($id);
		if($r->isSuccess())
		{
			$r = $this->exists($id);
			if($r->isSuccess())
			{
				if (!\CIBlockSection::Delete($id))
				{
					if ($ex = self::getApplication()->GetException())
						$r->addError(new Error($ex->GetString(), $ex->GetId()));
					else
						$r->addError(new Error('delete section error'));
				}
			}
		}

		if($r->isSuccess())
		{
			return true;
		}
		else
		{
			$this->addErrors($r->getErrors());
			return null;
		}
	}
	//endregion

	protected function exists($id)
	{
		$r = new Result();
		if(isset($this->get($id)['ID']) == false)
			$r->addError(new Error('Section is not exists'));

		return $r;
	}

	protected function get($id)
	{
		return \CIBlockSection::GetByID($id)->Fetch();
	}

	protected function addValidate($fields)
	{
		return new Result();
	}

	protected function updateValidate($fields)
	{
		return new Result();
	}

	//region checkPermissionController
	protected function checkModifyPermissionEntity()
	{
		return $this->checkReadPermissionEntity();
	}

	protected function checkReadPermissionEntity()
	{
		$r = new Result();

		if (!static::getGlobalUser()->CanDoOperation('catalog_read') && !static::getGlobalUser()->CanDoOperation('catalog_view'))
		{
			$r->addError(new Error('Access Denied', 200040300010));
		}
		return $r;
	}
	//endregion

	//region checkPermissionIBlock
	protected function checkPermissionIBlockSectionAdd($iblockId)
	{
		return $this->checkPermissionIBlockSectionModify($iblockId, 0);
	}

	protected function checkPermissionIBlockSectionUpdate($sectionId)
	{
		$iblockId = $this->getIBlockBySectionId($sectionId);
		return $this->checkPermissionIBlockSectionModify($iblockId, $sectionId);
	}

	protected function checkPermissionIBlockSectionModify($iblockId, $sectionId)
	{
		$r = new Result();

		$arIBlock = \CIBlock::GetArrayByID($iblockId);
		if($arIBlock)
			$bBadBlock = !\CIBlockSectionRights::UserHasRightTo($iblockId, $sectionId, self::IBLOCK_EDIT);
		else
			$bBadBlock = true;

		if($bBadBlock)
		{
			$r->addError(new Error('Access Denied', 200040300040));
		}
		return $r;
	}

	protected function checkPermissionIBlockSectionSectionBindModify($iblockId, $iblockSectionId)
	{
		$r = new Result();

		$arIBlock = \CIBlock::GetArrayByID($iblockId);
		if($arIBlock)
			$bBadBlock = !\CIBlockSectionRights::UserHasRightTo($iblockId, $iblockSectionId, self::IBLOCK_SECTION_SECTION_BIND); //access update
		else
			$bBadBlock = true;

		if($bBadBlock)
		{
			$r->addError(new Error('Access Denied', 200040300050));
		}
		return $r;
	}

	protected function checkPermissionIBlockSectionSectionBindUpdate($iblockSectionId)
	{
		$iblockId = $this->getIBlockBySectionId($iblockSectionId);
		return $this->checkPermissionIBlockSectionModify($iblockId, $iblockSectionId);
	}

	protected function checkPermissionIBlockSectionDelete($sectionId)
	{
		$r = new Result();
		$iblockId = \CIBlockElement::GetIBlockByID($sectionId);
		$bBadBlock = !\CIBlockElementRights::UserHasRightTo($iblockId, $sectionId, self::IBLOCK_SECTION_DELETE); //access delete

		if($bBadBlock)
		{
			$r->addError(new Error('Access Denied', 200040300050));
		}

		return $r;
	}

	protected function checkPermissionIBlockSectionGet($sectionId)
	{
		$r = new Result();

		$iblockId = $this->getIBlockBySectionId($sectionId);
		$arIBlock = \CIBlock::GetArrayByID($iblockId);

		if($arIBlock)
			$bBadBlock = !\CIBlockSectionRights::UserHasRightTo($iblockId, $sectionId, self::IBLOCK_SECTION_READ);
		else
			$bBadBlock = true;

		if($bBadBlock)
		{
			$r->addError(new Error('Access Denied', 200040300040));
		}
		return $r;
	}

	protected function checkPermissionIBlockSectionList($iblockId)
	{
		$r = new Result();

		$arIBlock = \CIBlock::GetArrayByID($iblockId);
		if($arIBlock)
			$bBadBlock = !\CIBlockRights::UserHasRightTo($iblockId, $iblockId, self::IBLOCK_READ);
		else
			$bBadBlock = true;

		if($bBadBlock)
		{
			$r->addError(new Error('Access Denied', 200040300030));
		}
		return $r;
	}

	protected function getIBlockBySectionId($id)
	{
		$iblockId = 0;

		$section = \CIBlockSection::GetByID($id);
		if ($res = $section->GetNext())
		{
			$iblockId = $res["IBLOCK_ID"];
		}

		return $iblockId;
	}
	//endregion
}