* @copyright Since 2007 PrestaShop SA and Contributors * @license https://opensource.org/licenses/AFL-3.0 Academic Free License version 3.0 */ declare(strict_types=1); namespace PrestaShop\Module\Mbo\Module; use PrestaShop\PrestaShop\Adapter\Module\Module; /** * Builds a modules' collection formatted and filtered */ class CollectionFactory { public function build(array $modules, ?FiltersInterface $filters): Collection { return new Collection( $this->filter($modules, $filters) ); } /** * @return array retrieve a list of addons, regarding the $filters used */ protected function filter(array $modules, ?FiltersInterface $filters = null): array { $result = []; foreach ($modules as $key => $module) { // Part One : Removing addons not related to the selected product type if ($module->get('product_type') == 'module') { $productType = Filters\Type::MODULE; } elseif ($module->get('product_type') == 'service') { $productType = Filters\Type::SERVICE; } if (!isset($productType) || !$filters->hasType($productType)) { continue; } // Part Two : Remove module not installed if specified if (!$filters->hasStatus(Filters\Status::ALL)) { if ($module->database->get('installed') == 1 && ( $filters->hasStatus(~Filters\Status::INSTALLED) || !$filters->hasStatus(Filters\Status::INSTALLED) ) ) { unset($modules[$key]); continue; } if ($module->database->get('installed') == 0 && ( !$filters->hasStatus(~Filters\Status::INSTALLED) || $filters->hasStatus(Filters\Status::INSTALLED) ) ) { unset($modules[$key]); continue; } if ($module->database->get('installed') == 1 && $module->database->get('active') == 1 && !$filters->hasStatus(~Filters\Status::ENABLED) && $filters->hasStatus(Filters\Status::ENABLED) ) { unset($modules[$key]); continue; } if ($module->database->get('installed') == 1 && $module->database->get('active') == 0 && !$filters->hasStatus(Filters\Status::ENABLED) && $filters->hasStatus(~Filters\Status::ENABLED) ) { unset($modules[$key]); continue; } } $result[$key] = $module; } return $modules; } }