%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/sale/lib/internals/ |
| Current File : /home/bitrix/www/bitrix/modules/sale/lib/internals/entitycollection.php |
<?php
namespace Bitrix\Sale\Internals;
use Bitrix\Sale;
use Bitrix\Main;
/**
* Class EntityCollection
* @package Bitrix\Sale\Internals
*/
abstract class EntityCollection
extends CollectionBase
{
private $index = -1;
protected $isClone = false;
protected $anyItemDeleted = false;
/**
* EntityCollection constructor.
*/
protected function __construct()
{
}
/**
* @param CollectableEntity $item
* @param null $name
* @param null $oldValue
* @param null $value
* @return Sale\Result
*/
public function onItemModify(CollectableEntity $item, $name = null, $oldValue = null, $value = null)
{
return new Sale\Result();
}
/**
* @internal
*
* @param $index
* @return mixed
* @throws Main\ArgumentOutOfRangeException
*/
public function deleteItem($index)
{
if (!isset($this->collection[$index]))
throw new Main\ArgumentOutOfRangeException("collection item index wrong");
$oldItem = $this->collection[$index];
$eventManager = Main\EventManager::getInstance();
$eventsList = $eventManager->findEventHandlers('sale', 'OnBeforeCollectionDeleteItem');
if (!empty($eventsList))
{
/** @var Main\Entity\Event $event */
$event = new Main\Event('sale', 'OnBeforeCollectionDeleteItem', array(
'COLLECTION' => $this->collection,
'ENTITY' => $oldItem,
));
$event->send();
}
unset($this->collection[$index]);
$this->setAnyItemDeleted(true);
return $oldItem;
}
/**
* @param CollectableEntity $item
* @return CollectableEntity
* @throws Main\ArgumentTypeException
*/
protected function addItem(CollectableEntity $item)
{
$index = $this->createIndex();
$item->setInternalIndex($index);
$this->collection[$index] = $item;
$eventManager = Main\EventManager::getInstance();
$eventsList = $eventManager->findEventHandlers('sale', 'OnCollectionAddItem');
if (!empty($eventsList))
{
/** @var Main\Entity\Event $event */
$event = new Main\Event('sale', 'OnCollectionAddItem', array(
'COLLECTION' => $this->collection,
'ENTITY' => $item,
));
$event->send();
}
return $item;
}
/**
* @return int
*/
protected function createIndex()
{
$this->index++;
return $this->index;
}
public function clearCollection()
{
$eventManager = Main\EventManager::getInstance();
$eventsList = $eventManager->findEventHandlers('sale', 'OnBeforeCollectionClear');
if (!empty($eventsList))
{
/** @var Main\Entity\Event $event */
$event = new Main\Event('sale', 'OnBeforeCollectionClear', array(
'COLLECTION' => $this->collection,
));
$event->send();
}
/** @var CollectableEntity $item */
foreach ($this->collection as $item)
$item->delete();
}
/**
* @param $id
*
* @return CollectableEntity|bool
* @throws Main\ArgumentNullException
*/
public function getItemById($id)
{
if (intval($id) <= 0)
{
throw new Main\ArgumentNullException('id');
}
$index = $this->getIndexById($id);
if ($index === null)
{
return null;
}
if (isset($this->collection[$index]))
{
return $this->collection[$index];
}
return null;
}
/**
* @param $id
*
* @return bool|int|null
* @throws Main\ArgumentNullException
*/
public function getIndexById($id)
{
if (intval($id) <= 0)
{
throw new Main\ArgumentNullException('id');
}
/** @var CollectableEntity $item */
foreach ($this->collection as $item)
{
if ($item->getId() > 0 && $id == $item->getId())
{
return $item->getInternalIndex();
}
}
return null;
}
/**
* @param $index
*
* @return CollectableEntity|null
* @throws Main\ArgumentNullException
*/
public function getItemByIndex($index)
{
if (intval($index) < 0)
{
throw new Main\ArgumentNullException('id');
}
/** @var CollectableEntity $item */
foreach ($this->collection as $item)
{
if ($item->getInternalIndex() == $index)
{
return $item;
}
}
return null;
}
/**
* @return Entity
*/
abstract protected function getEntityParent();
/**
* @param bool $isMeaningfulField
* @return bool
*/
public function isStartField($isMeaningfulField = false)
{
$parent = $this->getEntityParent();
if ($parent === null)
return false;
return $parent->isStartField($isMeaningfulField);
}
/**
* @return bool
*/
public function clearStartField()
{
$parent = $this->getEntityParent();
if ($parent === null)
return false;
return $parent->clearStartField();
}
/**
* @return bool
*/
public function hasMeaningfulField()
{
$parent = $this->getEntityParent();
if ($parent === null)
return false;
return $parent->hasMeaningfulField();
}
/**
* @param bool $hasMeaningfulField
* @return Sale\Result
*/
public function doFinalAction($hasMeaningfulField = false)
{
$parent = $this->getEntityParent();
if ($parent === null)
return new Sale\Result();
return $parent->doFinalAction($hasMeaningfulField);
}
/**
* @return bool
*/
public function isMathActionOnly()
{
$parent = $this->getEntityParent();
if ($parent === null)
return false;
return $parent->isMathActionOnly();
}
/**
* @param bool|false $value
* @return bool
*/
public function setMathActionOnly($value = false)
{
$parent = $this->getEntityParent();
if ($parent == null)
return false;
return $parent->setMathActionOnly($value);
}
/**
* @return bool
*/
public function isChanged()
{
if (count($this->collection) > 0)
{
/** @var Entity $item */
foreach ($this->collection as $item)
{
if ($item->isChanged())
return true;
}
}
return $this->isAnyItemDeleted();
}
/**
* @return Sale\Result
*/
public function verify()
{
return new Sale\Result();
}
/**
* @return bool
*/
public function isClone()
{
return $this->isClone;
}
/**
* @return bool
*/
public function isAnyItemDeleted()
{
return $this->anyItemDeleted;
}
/**
* @param $value
*
* @return bool
*/
protected function setAnyItemDeleted($value)
{
return $this->anyItemDeleted = ($value === true);
}
/**
* @internal
*/
public function clearChanged()
{
if (!empty($this->collection))
{
foreach ($this->collection as $entityItem)
{
if ($entityItem instanceof Entity)
{
$entityItem->clearChanged();
}
}
}
}
/**
* @internal
* @param \SplObjectStorage $cloneEntity
*
* @return EntityCollection
*/
public function createClone(\SplObjectStorage $cloneEntity)
{
if ($this->isClone() && $cloneEntity->contains($this))
{
return $cloneEntity[$this];
}
$entityClone = clone $this;
$entityClone->isClone = true;
if (!$cloneEntity->contains($this))
{
$cloneEntity[$this] = $entityClone;
}
/**
* @var int key
* @var CollectableEntity $entity
*/
foreach ($entityClone->collection as $key => $entity)
{
if (!$cloneEntity->contains($entity))
{
$cloneEntity[$entity] = $entity->createClone($cloneEntity);
}
$entityClone->collection[$key] = $cloneEntity[$entity];
}
return $entityClone;
}
}