Created
September 5, 2017 12:53
-
-
Save julienanquetil/00f6e5947cde8f96dcf0557f562b7529 to your computer and use it in GitHub Desktop.
PIMGento-2/Product/Model/Factory/Import.php
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| namespace Pimgento\Product\Model\Factory; | |
| use \Pimgento\Import\Model\Factory; | |
| use \Pimgento\Entities\Model\Entities; | |
| use \Pimgento\Import\Helper\Config as helperConfig; | |
| use \Pimgento\Import\Helper\UrlRewrite as urlRewriteHelper; | |
| use \Pimgento\Product\Helper\Config as productHelper; | |
| use \Pimgento\Product\Helper\Media as mediaHelper; | |
| use \Pimgento\Product\Model\Factory\Import\Related; | |
| use \Pimgento\Product\Model\Factory\Import\Media; | |
| use \Magento\Catalog\Model\Product; | |
| use \Magento\Catalog\Model\Product\Link as Link; | |
| use \Magento\Framework\Event\ManagerInterface; | |
| use \Magento\Framework\App\Cache\TypeListInterface; | |
| use \Magento\Eav\Model\Entity\Attribute\SetFactory; | |
| use \Magento\Framework\Module\Manager as moduleManager; | |
| use \Magento\Framework\App\Config\ScopeConfigInterface as scopeConfig; | |
| use \Magento\Framework\DB\Adapter\AdapterInterface; | |
| use \Magento\Staging\Model\VersionManager; | |
| use \Zend_Db_Expr as Expr; | |
| class Import extends Factory | |
| { | |
| /** | |
| * @var Entities | |
| */ | |
| protected $_entities; | |
| /** | |
| * @var \Magento\Eav\Model\Entity\Attribute\SetFactory | |
| */ | |
| protected $_attributeSetFactory; | |
| /** | |
| * @var TypeListInterface | |
| */ | |
| protected $_cacheTypeList; | |
| /** | |
| * @var \Pimgento\Product\Helper\Config | |
| */ | |
| protected $_productHelper; | |
| /** | |
| * @var \Pimgento\Product\Helper\Media | |
| */ | |
| protected $_mediaHelper; | |
| /** | |
| * list of allowed type_id that can be imported | |
| * @var string[] | |
| */ | |
| protected $_allowedTypeId = ['simple', 'virtual']; | |
| /** | |
| * @var urlRewriteHelper | |
| */ | |
| protected $_urlRewriteHelper; | |
| /** | |
| * @var Media $_media | |
| */ | |
| protected $_media; | |
| /** | |
| * @var Related $_related | |
| */ | |
| protected $_related; | |
| /** | |
| * @var Product $_product | |
| */ | |
| protected $_product; | |
| /** | |
| * PHP Constructor | |
| * | |
| * @param \Pimgento\Import\Helper\Config $helperConfig | |
| * @param \Magento\Framework\Event\ManagerInterface $eventManager | |
| * @param \Magento\Framework\Module\Manager $moduleManager | |
| * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig | |
| * @param \Pimgento\Entities\Model\Entities $entities | |
| * @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypeList | |
| * @param \Magento\Eav\Model\Entity\Attribute\SetFactory $attributeSetFactory | |
| * @param \Pimgento\Product\Helper\Config $productHelper | |
| * @param \Pimgento\Product\Helper\Media $mediaHelper | |
| * @param urlRewriteHelper $urlRewriteHelper | |
| * @param Related $related | |
| * @param Media $media | |
| * @param Product $product | |
| * @param array $data | |
| */ | |
| public function __construct( | |
| helperConfig $helperConfig, | |
| ManagerInterface $eventManager, | |
| moduleManager $moduleManager, | |
| scopeConfig $scopeConfig, | |
| Entities $entities, | |
| TypeListInterface $cacheTypeList, | |
| SetFactory $attributeSetFactory, | |
| productHelper $productHelper, | |
| mediaHelper $mediaHelper, | |
| urlRewriteHelper $urlRewriteHelper, | |
| Related $related, | |
| Media $media, | |
| Product $product, | |
| array $data = [] | |
| ) { | |
| parent::__construct($helperConfig, $eventManager, $moduleManager, $scopeConfig, $data); | |
| $this->_entities = $entities; | |
| $this->_cacheTypeList = $cacheTypeList; | |
| $this->_attributeSetFactory = $attributeSetFactory; | |
| $this->_productHelper = $productHelper; | |
| $this->_mediaHelper = $mediaHelper; | |
| $this->_urlRewriteHelper = $urlRewriteHelper; | |
| $this->_related = $related; | |
| $this->_media = $media; | |
| $this->_product = $product; | |
| } | |
| /** | |
| * Create temporary table | |
| */ | |
| public function createTable() | |
| { | |
| $file = $this->getFileFullPath(); | |
| if (!is_file($file)) { | |
| $this->setContinue(false); | |
| $this->setStatus(false); | |
| $this->setMessage($this->getFileNotFoundErrorMessage()); | |
| } else { | |
| $this->_entities->createTmpTableFromFile($file, $this->getCode(), array('sku')); | |
| } | |
| } | |
| /** | |
| * Insert data into temporary table | |
| */ | |
| public function insertData() | |
| { | |
| $file = $this->getFileFullPath(); | |
| $count = $this->_entities->insertDataFromFile($file, $this->getCode()); | |
| $this->setMessage( | |
| __('%1 line(s) found', $count) | |
| ); | |
| } | |
| /** | |
| * Add required data | |
| */ | |
| public function addRequiredData() | |
| { | |
| $connection = $this->_entities->getResource()->getConnection(); | |
| $tmpTable = $this->_entities->getTableName($this->getCode()); | |
| $connection->addColumn($tmpTable, '_type_id', 'VARCHAR(255) NOT NULL DEFAULT "simple"'); | |
| $connection->addColumn($tmpTable, '_options_container', 'VARCHAR(255) NOT NULL DEFAULT "container2"'); | |
| $connection->addColumn($tmpTable, '_tax_class_id', 'INT(11) NOT NULL DEFAULT 0'); // None | |
| $connection->addColumn($tmpTable, '_attribute_set_id', 'INT(11) NOT NULL DEFAULT "4"'); // Default | |
| $connection->addColumn($tmpTable, '_visibility', 'INT(11) NOT NULL DEFAULT "4"'); // catalog, search | |
| $connection->addColumn($tmpTable, '_status', 'INT(11) NOT NULL DEFAULT "2"'); // Disabled | |
| if (!$connection->tableColumnExists($tmpTable, 'url_key')) { | |
| $connection->addColumn($tmpTable, 'url_key', 'varchar(255) NOT NULL DEFAULT ""'); | |
| $connection->update($tmpTable, array('url_key' => new Expr('LOWER(`sku`)'))); | |
| } | |
| if ($connection->tableColumnExists($tmpTable, 'enabled')) { | |
| $connection->update($tmpTable, array('_status' => new Expr('IF(`enabled` <> 1, 2, 1)'))); | |
| } | |
| if ($connection->tableColumnExists($tmpTable, 'groups')) { | |
| $connection->update($tmpTable, array('_visibility' => new Expr('IF(`groups` <> "", 1, 4)'))); | |
| } | |
| if ($connection->tableColumnExists($tmpTable, 'type_id')) { | |
| $types = $connection->quote($this->_allowedTypeId); | |
| $connection->update( | |
| $tmpTable, | |
| array( | |
| '_type_id' => new Expr("IF(`type_id` IN ($types), `type_id`, 'simple')") | |
| ) | |
| ); | |
| } | |
| $matches = $this->_scopeConfig->getValue('pimgento/product/attribute_mapping'); | |
| if ($matches) { | |
| $matches = unserialize($matches); | |
| if (is_array($matches)) { | |
| $stores = array_merge( | |
| $this->_helperConfig->getStores(array('lang')), // en_US | |
| $this->_helperConfig->getStores(array('lang', 'channel_code')), // en_US-channel | |
| $this->_helperConfig->getStores(array('channel_code')), // channel | |
| $this->_helperConfig->getStores(array('currency')), // USD | |
| $this->_helperConfig->getStores(array('channel_code', 'currency')), // channel-USD | |
| $this->_helperConfig->getStores(array('lang', 'channel_code', 'currency')) // en_US-channel-USD | |
| ); | |
| foreach ($matches as $match) { | |
| $pimAttr = $match['pim_attribute']; | |
| $magentoAttr = $match['magento_attribute']; | |
| $this->_entities->copyColumn($tmpTable, $pimAttr, $magentoAttr); | |
| foreach ($stores as $local => $affected) { | |
| $this->_entities->copyColumn($tmpTable, $pimAttr . '-' . $local, $magentoAttr . '-' . $local); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| /** | |
| * Create Configurable products | |
| */ | |
| public function createConfigurable() | |
| { | |
| $resource = $this->_entities->getResource(); | |
| $connection = $resource->getConnection(); | |
| $tmpTable = $this->_entities->getTableName($this->getCode()); | |
| if (!$this->moduleIsEnabled('Pimgento_Variant')) { | |
| $this->setStatus(false); | |
| $this->setMessage( | |
| __('Module Pimgento_Variant is not enabled') | |
| ); | |
| } else if (!$connection->tableColumnExists($tmpTable, 'groups')) { | |
| $this->setStatus(false); | |
| $this->setMessage( | |
| __('Column groups not found') | |
| ); | |
| } else { | |
| $connection->addColumn($tmpTable, '_children', 'TEXT NULL'); | |
| $connection->addColumn($tmpTable, '_axis', 'VARCHAR(255) NULL'); | |
| $data = array( | |
| 'sku' => 'e.groups', | |
| 'url_key' => 'e.groups', | |
| '_children' => new Expr('GROUP_CONCAT(e.sku SEPARATOR ",")'), | |
| '_type_id' => new Expr('"configurable"'), | |
| '_options_container' => new Expr('"container1"'), | |
| '_status' => 'e._status', | |
| '_axis' => 'v.axis' | |
| ); | |
| if ($connection->tableColumnExists($tmpTable, 'family')) { | |
| $data['family'] = 'e.family'; | |
| } | |
| if ($connection->tableColumnExists($tmpTable, 'categories')) { | |
| $data['categories'] = 'e.categories'; | |
| } | |
| $additional = $this->_scopeConfig->getValue('pimgento/product/configurable_attributes'); | |
| if ($additional) { | |
| $additional = unserialize($additional); | |
| if (is_array($additional)) { | |
| $stores = array_merge( | |
| $this->_helperConfig->getStores(array('lang')), // en_US | |
| $this->_helperConfig->getStores(array('lang', 'channel_code')), // en_US-channel | |
| $this->_helperConfig->getStores(array('channel_code')), // channel | |
| $this->_helperConfig->getStores(array('currency')), // USD | |
| $this->_helperConfig->getStores(array('channel_code', 'currency')), // channel-USD | |
| $this->_helperConfig->getStores(array('lang', 'channel_code', 'currency')) // en_US-channel-USD | |
| ); | |
| foreach ($additional as $attribute) { | |
| $attr = $attribute['attribute']; | |
| $value = $attribute['value']; | |
| $columns = array(trim($attr)); | |
| foreach ($stores as $local => $affected) { | |
| $columns[] = trim($attr) . '-' . $local; | |
| } | |
| foreach ($columns as $column) { | |
| if ($column == 'enabled') { | |
| if ($connection->tableColumnExists($tmpTable, 'enabled')) { | |
| $column = '_status'; | |
| if ($value == "0") { | |
| $value = "2"; | |
| } | |
| } | |
| } | |
| /*if ($connection->tableColumnExists($tmpTable, $column)) { | |
| if (!strlen($value)) { | |
| if ($connection->tableColumnExists($resource->getTable('pimgento_variant'), $column)) { | |
| $data[$column] = 'v.' . $column; | |
| } else { | |
| $data[$column] = 'e.' . $column; | |
| } | |
| } else { | |
| $data[$column] = new Expr('"' . $value . '"'); | |
| } | |
| } | |
| }*/ | |
| if ($connection->tableColumnExists($tmpTable, $column) || $connection->tableColumnExists($connection->getTableName('pimgento_variant'), $column)) { | |
| if (!strlen($value)) { | |
| if ($connection->tableColumnExists($connection->getTableName('pimgento_variant'), $column)) { | |
| if ($column == 'name'){ | |
| $data[$column] = 'v.' . $column.'-fr_FR'; | |
| } | |
| else { | |
| $data[$column] = 'v.' . $column; | |
| } | |
| //$data[$column] = 'v.1' . $column; | |
| } elseif ( ! isset($data[$column])) { | |
| if ($column == 'name'){ | |
| $data[$column] = 'v.' . $column.'-fr_FR'; | |
| } | |
| else { | |
| $data[$column] = 'e.' . $column; | |
| } | |
| } | |
| foreach (array_keys($stores) as $store) { | |
| if ($connection->tableColumnExists($tmpTable, $column.'-'.$store)) { | |
| var_dump($column.'-'.$store); | |
| // unset variant group label in data array | |
| unset($data[$column]); | |
| $data[$column] = 'v.' . $column; | |
| } | |
| } | |
| } else { | |
| $data[$column] = new Expr('"' . $value . '"'); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| unset($data["name-fr_FR"]); | |
| $configurable = $connection->select() | |
| ->from(array('e' => $tmpTable), $data) | |
| ->joinInner( | |
| array('v' => $resource->getTable('pimgento_variant')), | |
| 'e.groups = v.code', | |
| array() | |
| ) | |
| ->where('groups <> ""') | |
| ->group('e.groups'); | |
| $connection->query( | |
| $connection->insertFromSelect($configurable, $tmpTable, array_keys($data)) | |
| ); | |
| } | |
| } | |
| /** | |
| * Match code with entity | |
| */ | |
| public function matchEntity() | |
| { | |
| $this->_entities->matchEntity($this->getCode(), 'sku', 'catalog_product_entity', 'entity_id'); | |
| } | |
| /** | |
| * Update product attribute set id | |
| */ | |
| public function updateAttributeSetId() | |
| { | |
| $resource = $this->_entities->getResource(); | |
| $connection = $resource->getConnection(); | |
| $tmpTable = $this->_entities->getTableName($this->getCode()); | |
| if (!$connection->tableColumnExists($tmpTable, 'family')) { | |
| $this->setStatus(false); | |
| $this->setMessage( | |
| __('Column family is missing') | |
| ); | |
| } else { | |
| $families = $connection->select() | |
| ->from(false, array('_attribute_set_id' => 'c.entity_id')) | |
| ->joinLeft( | |
| array('c' => $resource->getTable('pimgento_entities')), | |
| 'p.family = c.code AND c.import = "family"', | |
| array() | |
| ); | |
| $connection->query( | |
| $connection->updateFromSelect($families, array('p' => $tmpTable)) | |
| ); | |
| $noFamily = $connection->fetchOne( | |
| $connection->select() | |
| ->from($tmpTable, array('COUNT(*)')) | |
| ->where('_attribute_set_id = ?', 0) | |
| ); | |
| if ($noFamily) { | |
| $this->setStatus(false); | |
| $this->setMessage( | |
| __('Warning: %1 product(s) without family. Please try to import families.', $noFamily) | |
| ); | |
| } | |
| $connection->update( | |
| $tmpTable, | |
| array('_attribute_set_id' => $this->_product->getDefaultAttributeSetId()), | |
| array('_attribute_set_id = ?' => 0) | |
| ); | |
| } | |
| } | |
| /** | |
| * Replace option code by id | |
| */ | |
| public function updateOption() | |
| { | |
| $resource = $this->_entities->getResource(); | |
| $connection = $resource->getConnection(); | |
| $tmpTable = $this->_entities->getTableName($this->getCode()); | |
| $columns = array_keys($connection->describeTable($tmpTable)); | |
| $except = array( | |
| '_entity_id', | |
| '_is_new', | |
| '_status', | |
| '_type_id', | |
| '_options_container', | |
| '_tax_class_id', | |
| '_attribute_set_id', | |
| '_visibility', | |
| '_children', | |
| '_axis', | |
| 'sku', | |
| 'categories', | |
| 'family', | |
| 'groups', | |
| 'url_key', | |
| 'enabled', | |
| ); | |
| foreach ($columns as $column) { | |
| if (in_array($column, $except)) { | |
| continue; | |
| } | |
| if (preg_match('/-unit/', $column)) { | |
| continue; | |
| } | |
| $columnPrefix = explode('-', $column); | |
| $columnPrefix = reset($columnPrefix); | |
| if ($connection->tableColumnExists($tmpTable, $column)) { | |
| //get number of chars to remove from code in order to use the substring. | |
| $prefixL = strlen($columnPrefix . '_') + 1; | |
| // Sub select to increase performance versus FIND_IN_SET | |
| $subSelect = $connection->select() | |
| ->from( | |
| array('c' => $resource->getTable('pimgento_entities')), | |
| array('code' => 'SUBSTRING(`c`.`code`,' . $prefixL . ')', 'entity_id' => 'c.entity_id') | |
| ) | |
| ->where("c.code like '".$columnPrefix."_%' ") | |
| ->where("c.import = ?", 'option'); | |
| // if no option no need to continue process | |
| if (!$connection->query($subSelect)->rowCount()) { | |
| continue; | |
| } | |
| //in case of multiselect | |
| $conditionJoin = "IF ( locate(',', `".$column."`) > 0 , ". "`p`.`".$column."` like ". | |
| new Expr("CONCAT('%', `c1`.`code`, '%')") .", `p`.`".$column."` = `c1`.`code` )"; | |
| $select = $connection->select() | |
| ->from( | |
| array('p' => $tmpTable), | |
| array( | |
| 'sku' => 'p.sku', | |
| 'entity_id' => 'p._entity_id' | |
| ) | |
| ) | |
| ->joinInner( | |
| array('c1' => new Expr('('.(string) $subSelect.')')), | |
| new Expr($conditionJoin), | |
| array( | |
| $column => new Expr('GROUP_CONCAT(`c1`.`entity_id` SEPARATOR ",")') | |
| ) | |
| ) | |
| ->group('p.sku'); | |
| $connection->query( | |
| $connection->insertFromSelect($select, $tmpTable, array('sku', '_entity_id', $column), 1) | |
| ); | |
| } | |
| } | |
| } | |
| /** | |
| * Create product entities | |
| */ | |
| public function createEntities() | |
| { | |
| $resource = $this->_entities->getResource(); | |
| $connection = $resource->getConnection(); | |
| $tmpTable = $this->_entities->getTableName($this->getCode()); | |
| if ($connection->isTableExists($resource->getTable('sequence_product'))) { | |
| $values = array( | |
| 'sequence_value' => '_entity_id', | |
| ); | |
| $parents = $connection->select()->from($tmpTable, $values); | |
| $connection->query( | |
| $connection->insertFromSelect( | |
| $parents, $resource->getTable('sequence_product'), array_keys($values), 1 | |
| ) | |
| ); | |
| } | |
| $values = array( | |
| 'entity_id' => '_entity_id', | |
| 'attribute_set_id' => '_attribute_set_id', | |
| 'type_id' => '_type_id', | |
| 'sku' => 'sku', | |
| 'has_options' => new Expr(0), | |
| 'required_options' => new Expr(0), | |
| 'updated_at' => new Expr('now()'), | |
| ); | |
| $table = $resource->getTable('catalog_product_entity'); | |
| $columnIdentifier = $this->_entities->getColumnIdentifier($table); | |
| if ($columnIdentifier == 'row_id') { | |
| $values['row_id'] = '_entity_id'; | |
| } | |
| $parents = $connection->select()->from($tmpTable, $values); | |
| $connection->query( | |
| $connection->insertFromSelect( | |
| $parents, $table, array_keys($values), 1 | |
| ) | |
| ); | |
| $values = array( | |
| 'created_at' => new Expr('now()') | |
| ); | |
| $connection->update($table, $values, 'created_at IS NULL'); | |
| if ($columnIdentifier == 'row_id') { | |
| $values = [ | |
| 'created_in' => new Expr(1), | |
| 'updated_in' => new Expr(VersionManager::MAX_VERSION), | |
| ]; | |
| $connection->update($table, $values, 'created_in = 0 AND updated_in = 0'); | |
| } | |
| } | |
| /** | |
| * Set values to attributes | |
| */ | |
| public function setValues() | |
| { | |
| $resource = $this->_entities->getResource(); | |
| $connection = $resource->getConnection(); | |
| $tmpTable = $this->_entities->getTableName($this->getCode()); | |
| $stores = array_merge( | |
| $this->_helperConfig->getStores(array('lang')), // en_US | |
| $this->_helperConfig->getStores(array('lang', 'channel_code')), // en_US-channel | |
| $this->_helperConfig->getStores(array('channel_code')), // channel | |
| $this->_helperConfig->getStores(array('currency')), // USD | |
| $this->_helperConfig->getStores(array('channel_code', 'currency')), // channel-USD | |
| $this->_helperConfig->getStores(array('lang', 'channel_code', 'currency')) // en_US-channel-USD | |
| ); | |
| $columns = array_keys($connection->describeTable($tmpTable)); | |
| $except = array( | |
| '_entity_id', | |
| '_is_new', | |
| '_status', | |
| '_type_id', | |
| '_options_container', | |
| '_tax_class_id', | |
| '_attribute_set_id', | |
| '_visibility', | |
| '_children', | |
| '_axis', | |
| 'sku', | |
| 'categories', | |
| 'family', | |
| 'groups', | |
| 'enabled', | |
| ); | |
| $values = array( | |
| 0 => array( | |
| 'options_container' => '_options_container', | |
| 'tax_class_id' => '_tax_class_id', | |
| 'visibility' => '_visibility', | |
| ) | |
| ); | |
| if ($connection->tableColumnExists($tmpTable, 'enabled')) { | |
| $values[0]['status'] = '_status'; | |
| } | |
| $taxClasses = $this->_productHelper->getProductTaxClasses(); | |
| if (count($taxClasses)) { | |
| foreach ($taxClasses as $storeId => $taxClassId) { | |
| $values[$storeId]['tax_class_id'] = new Expr($taxClassId); | |
| } | |
| } | |
| foreach ($columns as $column) { | |
| if (in_array($column, $except)) { | |
| continue; | |
| } | |
| if (preg_match('/-unit/', $column)) { | |
| continue; | |
| } | |
| $columnPrefix = explode('-', $column); | |
| $columnPrefix = reset($columnPrefix); | |
| foreach ($stores as $suffix => $affected) { | |
| if (preg_match('/^' . $columnPrefix . '-' . $suffix . '$/', $column)) { | |
| foreach ($affected as $store) { | |
| if (!isset($values[$store['store_id']])) { | |
| $values[$store['store_id']] = array(); | |
| } | |
| $values[$store['store_id']][$columnPrefix] = $column; | |
| } | |
| } | |
| } | |
| if (!isset($values[0][$columnPrefix])) { | |
| $values[0][$columnPrefix] = $column; | |
| } | |
| } | |
| foreach($values as $storeId => $data) { | |
| $this->_entities->setValues( | |
| $this->getCode(), $resource->getTable('catalog_product_entity'), $data, 4, $storeId, 1 | |
| ); | |
| } | |
| } | |
| /** | |
| * Link configurable with children | |
| */ | |
| public function linkConfigurable() | |
| { | |
| $resource = $this->_entities->getResource(); | |
| $connection = $resource->getConnection(); | |
| $tmpTable = $this->_entities->getTableName($this->getCode()); | |
| if (!$this->moduleIsEnabled('Pimgento_Variant')) { | |
| $this->setStatus(false); | |
| $this->setMessage( | |
| __('Module Pimgento_Variant is not enabled') | |
| ); | |
| } else if (!$connection->tableColumnExists($tmpTable, 'groups')) { | |
| $this->setStatus(false); | |
| $this->setMessage( | |
| __('Column groups not found') | |
| ); | |
| } else { | |
| $stores = $this->_helperConfig->getStores('store_id'); | |
| $query = $connection->query( | |
| $connection->select() | |
| ->from( | |
| $tmpTable, | |
| array( | |
| '_entity_id', | |
| '_axis', | |
| '_children' | |
| ) | |
| ) | |
| ->where('_type_id = ?', 'configurable') | |
| ->where('_axis IS NOT NULL') | |
| ->where('_children IS NOT NULL') | |
| ); | |
| $stepSize = 500; | |
| $valuesLabels = []; | |
| $valuesRelations = []; | |
| $valuesSuperLink = []; | |
| while (($row = $query->fetch())) { | |
| $attributes = explode(',', $row['_axis']); | |
| $position = 0; | |
| foreach ($attributes as $id) { | |
| if (!is_numeric($id)) { | |
| continue; | |
| } | |
| $hasOptions = $connection->fetchOne( | |
| $connection->select() | |
| ->from($resource->getTable('eav_attribute_option'), array(new Expr(1))) | |
| ->where('attribute_id = ?', $id) | |
| ->limit(1) | |
| ); | |
| if (!$hasOptions) { | |
| continue; | |
| } | |
| /* catalog_product_super_attribute */ | |
| $values = array( | |
| 'product_id' => $row['_entity_id'], | |
| 'attribute_id' => $id, | |
| 'position' => $position++, | |
| ); | |
| $connection->insertOnDuplicate( | |
| $resource->getTable('catalog_product_super_attribute'), $values, array() | |
| ); | |
| /* catalog_product_super_attribute_label */ | |
| $superAttributeId = $connection->fetchOne( | |
| $connection->select() | |
| ->from($resource->getTable('catalog_product_super_attribute')) | |
| ->where('attribute_id = ?', $id) | |
| ->where('product_id = ?', $row['_entity_id']) | |
| ->limit(1) | |
| ); | |
| foreach ($stores as $storeId => $affected) { | |
| $valuesLabels[] = array( | |
| 'product_super_attribute_id' => $superAttributeId, | |
| 'store_id' => $storeId, | |
| 'use_default' => 0, | |
| 'value' => '' | |
| ); | |
| } | |
| $children = explode(',', $row['_children']); | |
| /* catalog_product_relation & catalog_product_super_link */ | |
| foreach ($children as $child) { | |
| $childId = $connection->fetchOne( | |
| $connection->select() | |
| ->from( | |
| $resource->getTable('catalog_product_entity'), | |
| array( | |
| 'entity_id' | |
| ) | |
| ) | |
| ->where('sku = ?', $child) | |
| ->limit(1) | |
| ); | |
| if ($childId) { | |
| /* catalog_product_relation */ | |
| $valuesRelations[] = array( | |
| 'parent_id' => $row['_entity_id'], | |
| 'child_id' => $childId, | |
| ); | |
| /* catalog_product_super_link */ | |
| $valuesSuperLink[] = array( | |
| 'product_id' => $childId, | |
| 'parent_id' => $row['_entity_id'], | |
| ); | |
| } | |
| } | |
| if (count($valuesSuperLink) > $stepSize) { | |
| $connection->insertOnDuplicate( | |
| $resource->getTable('catalog_product_super_attribute_label'), | |
| $valuesLabels, | |
| array() | |
| ); | |
| $connection->insertOnDuplicate( | |
| $resource->getTable('catalog_product_relation'), | |
| $valuesRelations, | |
| array() | |
| ); | |
| $connection->insertOnDuplicate( | |
| $resource->getTable('catalog_product_super_link'), | |
| $valuesSuperLink, | |
| array() | |
| ); | |
| $valuesLabels = []; | |
| $valuesRelations = []; | |
| $valuesSuperLink = []; | |
| } | |
| } | |
| } | |
| if (count($valuesSuperLink) > 0) { | |
| $connection->insertOnDuplicate( | |
| $resource->getTable('catalog_product_super_attribute_label'), | |
| $valuesLabels, | |
| array() | |
| ); | |
| $connection->insertOnDuplicate( | |
| $resource->getTable('catalog_product_relation'), | |
| $valuesRelations, | |
| array() | |
| ); | |
| $connection->insertOnDuplicate( | |
| $resource->getTable('catalog_product_super_link'), | |
| $valuesSuperLink, | |
| array() | |
| ); | |
| } | |
| } | |
| } | |
| /** | |
| * Set website | |
| */ | |
| public function setWebsites() | |
| { | |
| $resource = $this->_entities->getResource(); | |
| $connection = $resource->getConnection(); | |
| $tmpTable = $this->_entities->getTableName($this->getCode()); | |
| $websites = $this->_helperConfig->getStores('website_id'); | |
| foreach ($websites as $websiteId => $affected) { | |
| if ($websiteId == 0) { | |
| continue; | |
| } | |
| $select = $connection->select() | |
| ->from( | |
| $tmpTable, | |
| array( | |
| 'product_id' => '_entity_id', | |
| 'website_id' => new Expr($websiteId) | |
| ) | |
| ); | |
| $connection->query( | |
| $connection->insertFromSelect( | |
| $select, $resource->getTable('catalog_product_website'), array('product_id', 'website_id'), 1 | |
| ) | |
| ); | |
| } | |
| } | |
| /** | |
| * Set categories | |
| */ | |
| public function setCategories() | |
| { | |
| $resource = $this->_entities->getResource(); | |
| $connection = $resource->getConnection(); | |
| $tmpTable = $this->_entities->getTableName($this->getCode()); | |
| if (!$connection->tableColumnExists($tmpTable, 'categories')) { | |
| $this->setStatus(false); | |
| $this->setMessage( | |
| __('Column categories not found') | |
| ); | |
| } else { | |
| $select = $connection->select() | |
| ->from( | |
| array( | |
| 'c' => $resource->getTable('pimgento_entities') | |
| ), | |
| array() | |
| ) | |
| ->joinInner( | |
| array('p' => $tmpTable), | |
| 'FIND_IN_SET(`c`.`code`, `p`.`categories`) AND `c`.`import` = "category"', | |
| array( | |
| 'category_id' => 'c.entity_id', | |
| 'product_id' => 'p._entity_id' | |
| ) | |
| ) | |
| ->joinInner( | |
| array('e' => $resource->getTable('catalog_category_entity')), | |
| 'c.entity_id = e.entity_id', | |
| array() | |
| ); | |
| $connection->query( | |
| $connection->insertFromSelect( | |
| $select, | |
| $resource->getTable('catalog_category_product'), | |
| array('category_id', 'product_id'), | |
| 1 | |
| ) | |
| ); | |
| //Remove product from old categories | |
| $selectToDelete = $connection->select() | |
| ->from( | |
| array( | |
| 'c' => $resource->getTable('pimgento_entities') | |
| ), | |
| array() | |
| ) | |
| ->joinInner( | |
| array('p' => $tmpTable), | |
| '!FIND_IN_SET(`c`.`code`, `p`.`categories`) AND `c`.`import` = "category"', | |
| array( | |
| 'category_id' => 'c.entity_id', | |
| 'product_id' => 'p._entity_id' | |
| ) | |
| ) | |
| ->joinInner( | |
| array('e' => $resource->getTable('catalog_category_entity')), | |
| 'c.entity_id = e.entity_id', | |
| array() | |
| ); | |
| $connection->delete($resource->getTable('catalog_category_product'), | |
| '(category_id, product_id) IN (' . $selectToDelete->assemble() . ')'); | |
| } | |
| } | |
| /** | |
| * Init Stock | |
| */ | |
| public function initStock() | |
| { | |
| $resource = $this->_entities->getResource(); | |
| $connection = $resource->getConnection(); | |
| $tmpTable = $this->_entities->getTableName($this->getCode()); | |
| $websiteId = $this->_helperConfig->getDefaultScopeId(); | |
| $values = array( | |
| 'product_id' => '_entity_id', | |
| 'stock_id' => new Expr(1), | |
| 'qty' => new Expr(0), | |
| 'is_in_stock' => new Expr(0), | |
| 'low_stock_date' => new Expr('NULL'), | |
| 'stock_status_changed_auto' => new Expr(0), | |
| 'website_id' => new Expr($websiteId), | |
| ); | |
| $select = $connection->select()->from($tmpTable, $values); | |
| $connection->query( | |
| $connection->insertFromSelect( | |
| $select, | |
| $resource->getTable('cataloginventory_stock_item'), | |
| array_keys($values), | |
| AdapterInterface::INSERT_IGNORE | |
| ) | |
| ); | |
| } | |
| /** | |
| * Set Url Rewrite | |
| */ | |
| public function setUrlRewrite() | |
| { | |
| $resource = $this->_entities->getResource(); | |
| $connection = $resource->getConnection(); | |
| $tmpTable = $this->_entities->getTableName($this->getCode()); | |
| $stores = array_merge( | |
| $this->_helperConfig->getStores(['lang']), // en_US | |
| $this->_helperConfig->getStores(['lang', 'channel_code']) // en_US-channel | |
| ); | |
| $this->_urlRewriteHelper->createUrlTmpTable(); | |
| foreach ($stores as $local => $affected) { | |
| $column = 'url_key'; | |
| if ($connection->tableColumnExists($tmpTable, 'url_key-' . $local)) { | |
| $column = 'url_key-' . $local; | |
| } | |
| if ($connection->tableColumnExists($tmpTable, $column)) { | |
| $duplicates = $connection->fetchCol( | |
| $connection->select() | |
| ->from($tmpTable, [$column]) | |
| ->group($column) | |
| ->having('COUNT(*) > 1') | |
| ); | |
| foreach ($duplicates as $urlKey) { | |
| if ($urlKey) { | |
| $connection->update( | |
| $tmpTable, | |
| [$column => new Expr('CONCAT(`' . $column . '`, "-", `sku`)')], | |
| ['`' . $column . '` = ?' => $urlKey] | |
| ); | |
| } | |
| } | |
| foreach ($affected as $store) { | |
| if ($store['store_id'] == 0) { | |
| continue; | |
| } | |
| $this->_entities->setValues( | |
| $this->getCode(), | |
| $resource->getTable('catalog_product_entity'), | |
| ['url_key' => $column], | |
| 4, | |
| $store['store_id'], | |
| 1 | |
| ); | |
| $this->_urlRewriteHelper->rewriteUrls( | |
| $this->getCode(), | |
| $store['store_id'], | |
| $column, | |
| $this->_scopeConfig->getValue('catalog/seo/product_url_suffix') | |
| ); | |
| } | |
| } | |
| } | |
| $this->_urlRewriteHelper->dropUrlRewriteTmpTable(); | |
| } | |
| /** | |
| * Drop temporary table | |
| */ | |
| public function dropTable() | |
| { | |
| $this->_entities->dropTable($this->getCode()); | |
| } | |
| /** | |
| * Clean cache | |
| */ | |
| public function cleanCache() | |
| { | |
| $types = array( | |
| \Magento\Framework\App\Cache\Type\Block::TYPE_IDENTIFIER, | |
| \Magento\PageCache\Model\Cache\Type::TYPE_IDENTIFIER | |
| ); | |
| foreach ($types as $type) { | |
| $this->_cacheTypeList->cleanType($type); | |
| } | |
| $this->setMessage( | |
| __('Cache cleaned for: %1', join(', ', $types)) | |
| ); | |
| } | |
| /** | |
| * Clean the media folder | |
| */ | |
| public function cleanMediaFolder() | |
| { | |
| $this->_media->cleanMediaFolder(); | |
| } | |
| /** | |
| * Set related, up-sell and cross-sell | |
| */ | |
| public function setRelated() | |
| { | |
| $this->_related->setCode($this->getCode()); | |
| $connection = $this->_entities->getResource()->getConnection(); | |
| $tmpTable = $this->_entities->getTableName($this->getCode()); | |
| $related = array(); | |
| // Product relations | |
| if ($connection->tableColumnExists($tmpTable, 'RELATED-products')) { | |
| $related[] = array( | |
| 'type_id' => Link::LINK_TYPE_RELATED, | |
| 'column' => 'RELATED-products', | |
| ); | |
| } | |
| if ($connection->tableColumnExists($tmpTable, 'UPSELL-products')) { | |
| $related[] = array( | |
| 'type_id' => Link::LINK_TYPE_UPSELL, | |
| 'column' => 'UPSELL-products', | |
| ); | |
| } | |
| if ($connection->tableColumnExists($tmpTable, 'X_SELL-products')) { | |
| $related[] = array( | |
| 'type_id' => Link::LINK_TYPE_CROSSSELL, | |
| 'column' => 'X_SELL-products', | |
| ); | |
| } | |
| if ($connection->tableColumnExists($tmpTable, 'CROSSSELL-products')) { | |
| $related[] = array( | |
| 'type_id' => Link::LINK_TYPE_CROSSSELL, | |
| 'column' => 'CROSSSELL-products', | |
| ); | |
| } | |
| // Product group relations | |
| if ($connection->tableColumnExists($tmpTable, 'RELATED-groups')) { | |
| $related[] = array( | |
| 'type_id' => Link::LINK_TYPE_RELATED, | |
| 'column' => 'RELATED-groups', | |
| ); | |
| } | |
| if ($connection->tableColumnExists($tmpTable, 'UPSELL-groups')) { | |
| $related[] = array( | |
| 'type_id' => Link::LINK_TYPE_UPSELL, | |
| 'column' => 'UPSELL-groups', | |
| ); | |
| } | |
| if ($connection->tableColumnExists($tmpTable, 'X_SELL-groups')) { | |
| $related[] = array( | |
| 'type_id' => Link::LINK_TYPE_CROSSSELL, | |
| 'column' => 'X_SELL-groups', | |
| ); | |
| } | |
| if ($connection->tableColumnExists($tmpTable, 'CROSSSELL-groups')) { | |
| $related[] = array( | |
| 'type_id' => Link::LINK_TYPE_CROSSSELL, | |
| 'column' => 'CROSSSELL-groups', | |
| ); | |
| } | |
| $this->_related->relatedCreateTmpTables(); | |
| foreach ($related as $type) { | |
| $this->_related->relatedImportColumn($type); | |
| } | |
| $this->_related->relatedDropTmpTables(); | |
| } | |
| /** | |
| * Import the medias | |
| */ | |
| public function importMedia() | |
| { | |
| $this->_media->setCode($this->getCode()); | |
| $this->_mediaHelper->initHelper(dirname($this->getFileFullPath())); | |
| $connection = $this->_entities->getResource()->getConnection(); | |
| $tmpTable = $this->_entities->getTableName($this->getCode()); | |
| $tableColumns = array_keys($connection->describeTable($tmpTable)); | |
| $fields = $this->_mediaHelper->getFields(); | |
| $this->_media->mediaCreateTmpTables(); | |
| foreach ($fields as $field) { | |
| foreach ($field['columns'] as $position => $column) { | |
| if (in_array($column, $tableColumns)) { | |
| $this->_media->mediaPrepareValues($column, $field['attribute_id'], $position); | |
| } | |
| } | |
| } | |
| $this->_media->mediaCleanValues(); | |
| $this->_media->mediaRemoveUnknownFiles(); | |
| $this->_media->mediaCopyFiles(); | |
| $this->_media->mediaUpdateDataBase(); | |
| $this->_media->mediaDropTmpTables(); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment