* @copyright Since 2007 PrestaShop SA and Contributors * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) */ namespace PrestaShop\PrestaShop\Adapter\Import; use Doctrine\DBAL\Connection; use PrestaShop\PrestaShop\Adapter\Configuration; use PrestaShop\PrestaShop\Core\Image\Deleter\ImageFileDeleterInterface; use PrestaShop\PrestaShop\Core\Import\Entity; use PrestaShop\PrestaShop\Core\Import\Entity\ImportEntityDeleterInterface; use PrestaShop\PrestaShop\Core\Import\Exception\NotSupportedImportEntityException; /** * Class ImportEntityDeleter is responsible for deleting import entities. */ final class ImportEntityDeleter implements ImportEntityDeleterInterface { /** * @var Connection */ private $connection; /** * @var string database prefix */ private $dbPrefix; /** * @var Configuration */ private $configuration; /** * @var ImageFileDeleterInterface */ private $imageFileDeleter; /** * @param Connection $connection * @param string $dbPrefix * @param Configuration $configuration * @param ImageFileDeleterInterface $imageFileDeleter */ public function __construct( Connection $connection, $dbPrefix, Configuration $configuration, ImageFileDeleterInterface $imageFileDeleter ) { $this->connection = $connection; $this->dbPrefix = $dbPrefix; $this->configuration = $configuration; $this->imageFileDeleter = $imageFileDeleter; } /** * {@inheritdoc} */ public function deleteAll($importEntity) { switch ($importEntity) { case Entity::TYPE_CATEGORIES: $this->deleteCategories(); break; case Entity::TYPE_PRODUCTS: $this->deleteProducts(); break; case Entity::TYPE_COMBINATIONS: $this->deleteCombinations(); break; case Entity::TYPE_CUSTOMERS: $this->truncateTables([ 'customer', ]); break; case Entity::TYPE_ADDRESSES: $this->truncateTables([ 'address', ]); break; case Entity::TYPE_MANUFACTURERS: $this->deleteManufacturers(); break; case Entity::TYPE_SUPPLIERS: $this->deleteSuppliers(); break; case Entity::TYPE_ALIAS: $this->truncateTables([ 'alias', ]); break; default: throw new NotSupportedImportEntityException("Import entity \"{$importEntity}\" is not supported"); } $this->imageFileDeleter->deleteAllImages($this->configuration->get('_PS_TMP_IMG_DIR_')); } /** * Delete all suppliers data and images. */ private function deleteSuppliers() { $this->truncateTables([ 'supplier', 'supplier_lang', 'supplier_shop', ]); $this->imageFileDeleter->deleteFromPath($this->configuration->get('_PS_SUPP_IMG_DIR_')); } /** * Delete all manufacturers images and data. */ private function deleteManufacturers() { $this->truncateTables([ 'manufacturer', 'manufacturer_lang', 'manufacturer_shop', ]); $this->imageFileDeleter->deleteFromPath($this->configuration->get('_PS_MANU_IMG_DIR_')); } /** * Delete all categories images and data, except Root and Home. */ private function deleteCategories() { $protectedCategoriesIds = [ $this->configuration->getInt('PS_HOME_CATEGORY'), $this->configuration->getInt('PS_ROOT_CATEGORY'), ]; $this->connection->executeQuery( "DELETE FROM {$this->dbPrefix}category WHERE id_category NOT IN (?)", [$protectedCategoriesIds], [Connection::PARAM_INT_ARRAY] ); $this->connection->executeQuery( "DELETE FROM {$this->dbPrefix}category_lang WHERE id_category NOT IN (?)", [$protectedCategoriesIds], [Connection::PARAM_INT_ARRAY] ); $this->connection->executeQuery( "DELETE FROM {$this->dbPrefix}category_shop WHERE id_category NOT IN (?)", [$protectedCategoriesIds], [Connection::PARAM_INT_ARRAY] ); $this->connection->executeQuery("ALTER TABLE {$this->dbPrefix}category AUTO_INCREMENT = 3"); $this->imageFileDeleter->deleteFromPath($this->configuration->get('_PS_CAT_IMG_DIR_')); } /** * Delete all products images and data. */ private function deleteProducts() { $truncateTables = [ 'product', 'product_shop', 'feature_product', 'product_lang', 'category_product', 'product_tag', 'image', 'image_lang', 'image_shop', 'specific_price', 'specific_price_priority', 'product_carrier', 'cart_product', 'product_attachment', 'product_country_tax', 'product_download', 'product_group_reduction_cache', 'product_sale', 'product_supplier', 'warehouse_product_location', 'stock', 'stock_available', 'stock_mvt', 'customization', 'customization_field', 'supply_order_detail', 'product_attribute', 'product_attribute_shop', 'product_attribute_combination', 'product_attribute_image', 'product_attribute_lang', 'pack', ]; $this->truncateTables($truncateTables); $truncateIfExists = [ 'favorite_product', ]; $this->truncateTablesIfExist($truncateIfExists); $imgDir = $this->configuration->get('_PS_PRODUCT_IMG_DIR_'); $this->imageFileDeleter->deleteFromPath($imgDir, true, true); } /** * Delete all combinations data. */ private function deleteCombinations() { $truncateTables = [ 'attribute', 'attribute_lang', 'attribute_group', 'attribute_group_lang', 'attribute_group_shop', 'attribute_shop', 'product_attribute', 'product_attribute_shop', 'product_attribute_combination', 'product_attribute_image', 'product_attribute_lang', ]; $this->truncateTables($truncateTables); $this->connection->executeQuery( "DELETE FROM `{$this->dbPrefix}stock_available` WHERE id_product_attribute != 0" ); } /** * Truncate multiple tables. * * @param array $tables * * @throws \Doctrine\DBAL\DBALException */ private function truncateTables(array $tables) { foreach ($tables as $table) { $this->connection->executeQuery("TRUNCATE TABLE `{$this->dbPrefix}{$table}`"); } } /** * Truncate tables if they exist. Truncates them one by one. * * @param array $tables * * @throws \Doctrine\DBAL\DBALException */ private function truncateTablesIfExist(array $tables) { foreach ($tables as $table) { $tableExists = $this->connection->getSchemaManager()->tablesExist( [ "{$this->dbPrefix}{$table}", ] ); if ($tableExists) { $this->connection->executeQuery("TRUNCATE TABLE `{$this->dbPrefix}{$table}`"); } } } }