Ich möchte Attribute mit Swatch-Option programmgesteuert in Magento 2 erstellen.
Ich möchte Attribute mit Swatch-Option programmgesteuert in Magento 2 erstellen.
Antworten:
Dies ähnelt Magento 1 mit einigen Unterschieden.
Erstellen Sie zunächst ein grundlegendes Setup-Skript, falls Sie noch keines haben.
<?php
namespace Package\Module\Setup;
use Magento\Framework\Setup\UpgradeDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
class UpgradeData implements UpgradeDataInterface
{
const PRODUCT_GROUP = 'Product Details';
/** @var \Magento\Framework\App\State */
protected $state;
/** @var \Magento\Catalog\Model\Product\Attribute\Repository $attributeRepository */
protected $attributeRepository;
/** @var \Magento\Framework\Filesystem */
protected $filesystem;
/** @var \Magento\Swatches\Helper\Media */
protected $swatchHelper;
/** @var \Magento\Catalog\Model\Product\Media\Config */
protected $productMediaConfig;
/** @var \Magento\Framework\Filesystem\Driver\File */
protected $driverFile;
/** @var \Magento\Eav\Setup\EavSetupFactory */
protected $eavSetupFactory;
public function __construct(
\Magento\Eav\Setup\EavSetupFactory $eavSetupFactory,
\Magento\Framework\App\State $state,
\Magento\Catalog\Model\Product\Attribute\Repository $attributeRepository,
\Magento\Framework\Filesystem $filesystem,
\Magento\Swatches\Helper\Media $swatchHelper,
\Magento\Catalog\Model\Product\Media\Config $productMediaConfig,
\Magento\Framework\Filesystem\Driver\File $driverFile
) {
$this->eavSetupFactory = $eavSetupFactory;
$this->state = $state;
$this->attributeRepository = $attributeRepository;
$this->filesystem = $filesystem;
$this->swatchHelper = $swatchHelper;
$this->productMediaConfig = $productMediaConfig;
$this->driverFile = $driverFile;
}
/**
* {@inheritdoc}
*/
public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
{
$setup->startSetup();
if (version_compare($context->getVersion(), '1.0.0', '<')) {
$attributesData = [
// to add in step 2
];
$attributesOptionsData = [
// to add in step 2
];
$this->addProductAttributes($attributesData, $attributesOptionsData, $setup);
}
$setup->endSetup();
}
/**
* Add product attributes.
*
* @param $attributesData
* @param $attributesOptionsData
* @param ModuleDataSetupInterface $setup
*
* @throws \Exception
*/
public function addProductAttributes($attributesData, $attributesOptionsData, ModuleDataSetupInterface $setup)
{
// to implement in step 3
}
}
Zweitens bereiten Sie Ihre Daten vor. Ersetzen Sie \\ to add in step 2
Kommentare aus Schritt 1 durch etwas Ähnliches:
$attributesData = [
'fit' => [
'type' => 'int',
'label' => 'Fit',
'input' => 'select',
'backend' => 'Magento\Eav\Model\Entity\Attribute\Backend\ArrayBackend',
'source' => 'Magento\Eav\Model\Entity\Attribute\Source\Table',
'required' => false,
'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL,
'group' => self::PRODUCT_GROUP,
'used_in_product_listing' => true,
'visible_on_front' => true,
'user_defined' => true,
'filterable' => 2,
'filterable_in_search' => true,
'used_for_promo_rules' => true,
'is_html_allowed_on_front' => true,
'used_for_sort_by' => true,
],
];
$attributesOptionsData = [
'fit' => [
\Magento\Swatches\Model\Swatch::SWATCH_INPUT_TYPE_KEY => \Magento\Swatches\Model\Swatch::SWATCH_INPUT_TYPE_VISUAL,
'optionvisual' => [
'value' => [
'option_0' => [
0 => 'FITTED'
],
'option_1' => [
0 => 'RELAXED'
],
'option_2' => [
0 => 'REGULAR'
],
],
],
'swatchvisual' => [
'value' => [
'option_0' => 'Fitted.png',
'option_1' => 'Relaxed.png',
'option_2' => 'Regular.png',
],
],
]
];
Beenden Sie schließlich die Implementierung für die addProductAttributes
Methode:
/**
* Add product attributes.
*
* @param $attributesData
* @param $attributesOptionsData
* @param ModuleDataSetupInterface $setup
*
* @throws \Exception
*/
public function addProductAttributes($attributesData, $attributesOptionsData, ModuleDataSetupInterface $setup)
{
try {
// Make sure we don't get error "Area code is not set".
$this->state->setAreaCode('admin');
} catch (\Exception $ignored) {}
try {
/** @var \Magento\Eav\Setup\EavSetup $eavSetup */
$eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);
// Add attributes.
foreach ($attributesData as $code => $attributeData) {
$eavSetup->addAttribute(\Magento\Catalog\Model\Product::ENTITY, $code, $attributeData);
}
// Add order if it doesn't exist. This is an important step to make sure everything will be created correctly.
foreach ($attributesOptionsData as &$attributeOptionsData) {
$order = 0;
$swatchVisualFiles = isset($attributeOptionsData['optionvisual']['value'])
? $attributeOptionsData['optionvisual']['value']
: [];
foreach ($swatchVisualFiles as $index => $swatchVisualFile) {
if (!isset($attributeOptionsData['optionvisual']['order'][$index])) {
$attributeOptionsData['optionvisual']['order'][$index] = ++$order;
}
}
}
// Prepare visual swatches files.
$mediaDirectory = $this->filesystem->getDirectoryRead(\Magento\Framework\App\Filesystem\DirectoryList::MEDIA);
$tmpMediaPath = $this->productMediaConfig->getBaseTmpMediaPath();
$fullTmpMediaPath = $mediaDirectory->getAbsolutePath($tmpMediaPath);
$this->driverFile->createDirectory($fullTmpMediaPath);
foreach ($attributesOptionsData as &$attributeOptionsData) {
$swatchVisualFiles = $attributeOptionsData['swatchvisual']['value'] ?? [];
foreach ($swatchVisualFiles as $index => $swatchVisualFile) {
$this->driverFile->copy(
__DIR__ . DIRECTORY_SEPARATOR . 'images' . DIRECTORY_SEPARATOR . $swatchVisualFile,
$fullTmpMediaPath . DIRECTORY_SEPARATOR . $swatchVisualFile
);
$newFile = $this->swatchHelper->moveImageFromTmp($swatchVisualFile);
if (substr($newFile, 0, 1) == '.') {
$newFile = substr($newFile, 1); // Fix generating swatch variations for files beginning with ".".
}
$this->swatchHelper->generateSwatchVariations($newFile);
$attributeOptionsData['swatchvisual']['value'][$index] = $newFile;
}
}
// Add attribute options.
foreach ($attributesOptionsData as $code => $attributeOptionsData) {
/* @var \Magento\Catalog\Model\ResourceModel\Eav\Attribute $attribute */
$attribute = $this->attributeRepository->get($code);
$attribute->addData($attributeOptionsData);
$attribute->save();
}
} catch (\Exception $ex) {
throw new \Exception(__('There was an error adding product attributes.'), 0, $ex);
}
}
Kürzlich wurde der folgende Code zum programmgesteuerten Erstellen von Optionen für visuelle Farbfeldattribute ausprobiert. Erstellt Datei im Stammverzeichnis "import-visual-swatch.php" mit folgendem Code:
<?php
use Magento\Framework\App\Bootstrap;
require __DIR__ . '/app/bootstrap.php';
// adding bootstrap
$bootstraps = Bootstrap::create(BP, $_SERVER);
$object_Manager = $bootstraps->getObjectManager();
$app_state = $object_Manager->get('\Magento\Framework\App\State');
$app_state->setAreaCode('frontend');
// Visual Swatch option values array containing name, unique code as key and image url for swatch
// Swatch image are to be placed within "project_root\import" directory
// After code execution swatch images will be uploaded to "project_root\pub\media\attribute\swatch" directory
$finalProductData = array(
'BLKV' => array("label" => "Black", "url" => "Black.JPG"),
'BLKV1' => array("label" => "Black1", "url" => "Black1.JPG")
);
$stores = getAllStores($object_Manager);
$eavConfig = $object_Manager->get('\Magento\Eav\Model\Config');
$attribute = $eavConfig->getAttribute('catalog_product', 'color');
// Generating options as we are creating Visual Swatch hence passing 'visual' as parameter
$data = generateOptions($finalProductData, 'visual');
$filesystem = $object_Manager->create('\Magento\Framework\Filesystem');
// Prepare visual swatches files.
$mediaDirectory = $filesystem->getDirectoryRead(\Magento\Framework\App\Filesystem\DirectoryList::MEDIA);
$productMediaConfig = $object_Manager->create('\Magento\Catalog\Model\Product\Media\Config');
$tmpMediaPath = $productMediaConfig->getBaseTmpMediaPath();
$fullTmpMediaPath = $mediaDirectory->getAbsolutePath($tmpMediaPath);
$driverFile = $object_Manager->create('\Magento\Framework\Filesystem\Driver\File');
$driverFile->createDirectory($fullTmpMediaPath);
$swatchHelper = $object_Manager->create('\Magento\Swatches\Helper\Media');
foreach ($data as $key => $attributeOptionsData) {
if($key == "swatchvisual" ){
$swatchVisualFiles = isset($attributeOptionsData['value'])
? $attributeOptionsData['value']
: [];
foreach ($swatchVisualFiles as $index => $swatchVisualFile) {
if(!empty($swatchVisualFile)){
if(file_exists(__DIR__ . DIRECTORY_SEPARATOR . 'images' . DIRECTORY_SEPARATOR . $swatchVisualFile)) {
$driverFile->copy(
__DIR__ . DIRECTORY_SEPARATOR . 'images' . DIRECTORY_SEPARATOR . $swatchVisualFile,
$fullTmpMediaPath . '/' . $swatchVisualFile
);
$newFile = $swatchHelper->moveImageFromTmp($swatchVisualFile);
if (substr($newFile, 0, 1) == '.') {
$newFile = substr($newFile, 1); // Fix generating swatch variations for files beginning with ".".
}
$swatchHelper->generateSwatchVariations($newFile);
$data[$key]['value'][$index] = $newFile;
} else {
$data[$key]['value'][$index] = "";
}
}
}
}
}
function generateOptions($values, $swatchType = 'visual')
{
$i = 0;
foreach($values as $key => $value) {
$order["option_{$i}"] = $i;
$optionsStore["option_{$i}"] = array(
0 => $key, // admin
1 => $value['label'], // default store view
);
$textSwatch["option_{$i}"] = array(
1 => $value['label'],
);
$visualSwatch["option_{$i}"] = $value['url'];
$delete["option_{$i}"] = '';
$i++;
}
switch($swatchType)
{
case 'text':
return [
'optiontext' => [
'order' => $order,
'value' => $optionsStore,
'delete' => $delete,
],
'swatchtext' => [
'value' => $textSwatch,
],
];
break;
case 'visual':
return [
'optionvisual' => [
'order' => $order,
'value' => $optionsStore,
'delete' => $delete,
],
'swatchvisual' => [
'value' => $visualSwatch,
],
];
break;
default:
return [
'option' => [
'order' => $order,
'value' => $optionsStore,
'delete' => $delete,
],
];
}
}
$attribute->addData($data)->save();
?>