I created simple importer for attribute's values.
It works really easy right now and it was necessary for import configurable products.
Importer for attribute values works fine (I'll paste code later).
Importer for products works fine also.
So where is issue?
I have to import values for 2 attributes: Size and Color.
Color is Visual Swatch
Size is Text Swatch.
Color works fine with no problem.
Size is not showing on frontend page:
(there is color swatch and I can select it).
On admin Size attribute, when I'm trying to save it as Text Swatch :
I'm able to save it as Dropdown, and works fine:
Snip for \project\app\code\Magento\Swatches\Model\Plugin\EavAttribute.php:173-183
protected function prepareOptionIds(array $optionsArray)
{
if (isset($optionsArray['value']) && is_array($optionsArray['value'])) {
foreach (array_keys($optionsArray['value']) as $optionId) {
if (isset($optionsArray['delete']) && $optionsArray['delete'][$optionId] == 1) {
unset($optionsArray['value'][$optionId]);
}
}
}
return $optionsArray;
}
code for my importer:
Controller:
namespace Cpny\AttributeImporter\Controller\Attr;
use Magento\Framework\App\Action\Context;
class Upload extends \Magento\Framework\App\Action\Action
{
protected $_eavSetupFactory;
protected $_storeManager;
protected $_attributeFactory;
protected $_csvImporter;
protected $_moduleReader;
public function __construct(
Context $context,
\Magento\Eav\Setup\EavSetupFactory $eavSetupFactory,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Catalog\Model\ResourceModel\Eav\Attribute $attributeFactory,
\Cpny\AttributeImporter\Model\Getcsv $_csvImporter
) {
$this->_eavSetupFactory = $eavSetupFactory;
$this->_storeManager = $storeManager;
$this->_attributeFactory = $attributeFactory;
$this->_csvImporter = $_csvImporter;
parent::__construct($context);
}
public function execute()
{
$attribute_arr = $this->_csvImporter->importFromCsvFile();
$attributeInfo = $this->_attributeFactory->getCollection()
->addFieldToFilter('attribute_code',['eq'=>"color"])
->getFirstItem();
$attribute_id = $attributeInfo->getAttributeId();
$option=array();
$option['attribute_id'] = $attribute_id;
foreach($attribute_arr as $key=>$value){
$option['value']['000a'.$value][0] = $value;
// $option['value'][$value][1] = $value;
}
$eavSetup = $this->_eavSetupFactory->create();
$eavSetup->addAttributeOption($option);
$eavSetup->save();
}
}
Model/Getcsv:
namespace Cpny\AttributeImporter\Model;
class Getcsv
{
protected $_fileCsv;
protected $_directory_list;
public function __construct(
\Magento\Framework\View\Element\Template\Context $context,
\Magento\Framework\File\Csv $csvProcessor,
\Magento\Framework\App\Filesystem\DirectoryList $directory_list,
array $data = []
)
{
$this->_directory_list = $directory_list;
$this->_fileCsv = $csvProcessor;
}
public function importFromCsvFile()
{
$directory = $this->_directory_list->getPath('var');
$returnValues = [];
$file = $directory . '/kolory.csv';
if (file_exists($file)) {
$data = $this->_fileCsv->getData($file);
foreach($data as $label => $value) {
$returnValues[] = $value[0];
}
}
return $returnValues;
}
}
~50 new values for Colors and ~500 new values for Size.
Should I import Text swatch in different way?
I had to use
$option['value']['000a'.$value][0] = $value;
because I want to create new ids for values.
I know it isn't perfect script and I will refactor and upgrade it later but right now I just need to fast import those values.
Best Answer
I solved the problem:
max_input_vars was too small for saving 500 values with 3 inputs.
Fix:
set
max_input_vars
to 5000 (or more if necessary).There is no Size on frontend because after import, size attribute doesn't have values for 'swatch' input.
Fix: