- Модуль: 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);
}