• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/lib/Controller/DefaultElement.php
  • Класс: BitrixIblockControllerDefaultElement
  • Вызов: DefaultElement::listAction
public function listAction($iblock, $select = ['*'], $filter = [], $order = [], PageNavigation $pageNavigation = null)
{
	$elementEntity = IblockTable::compileEntity($iblock);
	$elementDataClass = $elementEntity->getDataClass();

	if (!$elementEntity->getIblock()->fillRestOn())
	{
		throw new ArgumentException(sprintf('Restricted iblock ID:%s (%s)',
			$elementEntity->getIblock()->getId(),
			$elementEntity->getIblock()->getApiCode()
		));
	}

	$query = $elementDataClass::query();

	// prepare id select
	$query->addSelect(new ExpressionField('DISTINCT_ID', 'DISTINCT %s', 'ID'));

	// prepare filter
	if (!empty($filter))
	{
		$qFilter = static::prepareFilter($filter, $elementEntity);
		$query->where($qFilter);
	}

	// prepare order
	if (!empty($order))
	{
		$qOrder = static::prepareOrder($order, $elementEntity);
		$query->setOrder($qOrder);
	}

	// prepare limit
	$qLimit = $pageNavigation ? $pageNavigation->getLimit() : static::DEFAULT_LIMIT;
	$qOffset = $pageNavigation ? $pageNavigation->getOffset() : 0;

	// get elements
	$result = $query
		->setLimit($qLimit)
		->setOffset($qOffset)
		->exec();

	// count records
	if ($result->getSelectedRowsCount() < $qLimit)
	{
		// optimization for first and last pages
		$countTotal = $qOffset + $result->getSelectedRowsCount();
	}
	else
	{
		$countTotal = function () use ($query) {
			return $query->queryCountTotal();
		};
	}

	// get elements data
	$elements = [];
	$ids = [];

	foreach ($result->fetchAll() as $row)
	{
		$ids[] = $row['DISTINCT_ID'];
	}

	if (!empty($ids))
	{
		$query = $elementDataClass::query();

		$qSelect = static::prepareSelect($select, $elementEntity);
		$query->setSelect($qSelect);

		$query->whereIn('ID', $ids);

		$resultElements = [];

		foreach ($query->fetchCollection() as $elementObject)
		{
			/** @var EntityObject $elementObject */
			$resultElements[$elementObject->getId()] = $elementObject->collectValues(Values::ALL, FieldTypeMask::ALL, true);
		}

		// original sort
		foreach ($ids as $id)
		{
			$elements[] = $resultElements[$id];
		}
	}

	return new Page('elements', $elements, $countTotal);
}