%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/report/lib/visualconstructor/runtimeprovider/ |
Current File : /home/bitrix/www/bitrix/modules/report/lib/visualconstructor/runtimeprovider/base.php |
<?php namespace Bitrix\Report\VisualConstructor\RuntimeProvider; use Bitrix\Report\VisualConstructor\Internal\Error\Error; use Bitrix\Report\VisualConstructor\Internal\Error\IErrorable; use Bitrix\Report\VisualConstructor\IProvidable; /** * Class Base * @package Bitrix\Report\VisualConstructor\RuntimeProvider */ abstract class Base implements IErrorable { private $results = array(); private $filters = array(); private $errors = array(); private $relations = array(); /** * @return array */ abstract protected function availableFilterKeys(); /** * @return \Bitrix\Report\VisualConstructor\Internal\Manager\Base */ abstract protected function getManagerInstance(); /** * @return IProvidable[] */ abstract protected function getEntitiesList(); /** * @return mixed */ abstract protected function getIndices(); /** * Check is available filter in filters list of provider. * * @param string $filterKey Needle filter key. * @return bool */ private function isAvailableFilter($filterKey) { $availableFilterKeys = $this->availableFilterKeys(); return in_array($filterKey, $availableFilterKeys); } /** * @param string $key Filter key. * @param mixed $value Filter value. * @return bool */ public function addFilter($key, $value) { if ($this->isAvailableFilter($key)) { $this->filters[$key] = $this->normaliseFilterValue($value); return true; } else { $this->errors[] = new Error('Filter with key:' . $key . ' not available for this provider'); return false; } } /** * @param string $key Key of relation. * @return void */ public function addRelation($key) { $this->relations[] = $key; } /** * @return array */ public function getFilters() { return $this->filters; } /** * @return array */ public function getRelations() { return $this->relations; } /** * @return $this */ public function execute() { $this->callManager(); $indices = $this->getIndices(); $filteredEntityIds = $this->getFilteredValues($indices); $entities = $this->getEntitiesList(); $result = array(); $filters = $this->getFilters(); if (!empty($filters)) { foreach ($entities as $key => $entity) { if (in_array($key, $filteredEntityIds)) { $this->processAvailableRelations($entity); $result[] = $entity; } } } else { foreach ($entities as $key => $entity) { $this->processAvailableRelations($entity); $result[] = $entity; } } $this->setResults($result); return $this; } /** * @param array $indices Indices for search by filters. * @return array */ private function getFilteredValues($indices) { $filteredEntityIds = array(); foreach ($this->getFilters() as $filterType => $filterValues) { if ($filterType !== 'primary') { $newFilterEntityIds = array(); foreach ($filterValues as $filterValue) { if (isset($indices[$filterType][$filterValue])) { $newFilterEntityIds = array_merge($newFilterEntityIds, $indices[$filterType][$filterValue]); } } if (!empty($filteredEntityIds)) { $filteredEntityIds = array_intersect($filteredEntityIds, $newFilterEntityIds); } else { $filteredEntityIds = $newFilterEntityIds; } } else { if (!empty($filteredEntityIds)) { $filteredEntityIds = array_intersect($filteredEntityIds, $filterValues); } else { $filteredEntityIds = $filterValues; } } } return array_unique($filteredEntityIds); } /** * @return array */ public function getErrors() { return $this->errors; } /** * @param array|mixed $value Value to normalise. * @return array */ private function normaliseFilterValue($value) { $result = is_array($value) ? array_unique($value) : array($value); return $result; } /** * @param object $entity Entity passed to processor. * @return void */ protected function processAvailableRelations($entity) { foreach ($this->getRelations() as $relationName) { $processMethodName = 'processWith' . ucfirst($relationName); call_user_func_array(array($this, $processMethodName), array($entity)); } } protected function callManager() { $this->getManagerInstance()->call(); } /** * @return mixed */ public function getFirstResult() { $results = $this->getResults(); return array_shift($results); } /** * @return array */ public function getResults() { return $this->results; } /** * @param array $results Result for setting as result of provider. * @return void */ public function setResults($results) { $this->results = $results; } }