Magento 2 tạo thuộc tính swatch tùy chỉnh theo chương trình


7

Tôi muốn tạo các thuộc tính với tùy chọn swatch theo chương trình trong Magento 2.


Theo lập trình, bạn có nghĩa là sử dụng API hoặc sử dụng mã hóa PHP?
Steve Johnson

@SteveJohnson Ý tôi là bằng mã hóa PHP
Gideon

Tôi cũng muốn giải pháp cho việc này. Bạn đã tìm thấy bất kỳ giải pháp sau đó xin vui lòng gửi ở đây.
Magecode

Câu trả lời:


4

Điều này tương tự như Magento 1, với một vài điểm khác biệt.

Bước 1

Bắt đầu bằng cách tạo một tập lệnh thiết lập cơ bản cho nó, nếu bạn chưa có.

<?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
    }
}

Bước 2

Thứ hai, chuẩn bị dữ liệu của bạn. Thay thế \\ to add in step 2nhận xét từ Bước 1 bằng một cái gì đó tương tự:

$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',
            ],
        ],
    ]
];

Bước 3

Cuối cùng, kết thúc thực hiện cho addProductAttributesphương thức:

/**
 * 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);
    }
}

Mimarcel, tốt nhất là luôn đăng toàn bộ câu trả lời của bạn để mọi người không liên kết với một trang web bên ngoài.
brentwpeterson

Tôi phải nhập tùy chọn thuộc tính với swatch trực quan và giá trị swatch là colorcode. Tôi đang theo liên kết này để tải lên các tùy chọn thuộc tính nhưng không nhận được giải pháp để thêm giá trị swatch trực quan. Làm ơn giúp tôi. Pearlbells.co.uk/ từ
Magecode

2

Gần đây đã thử mã dưới đây để tạo các tùy chọn thuộc tính swatch trực quan theo ngữ pháp. Đã tạo tệp trong root "import-visual-swatch.php" với mã bên dưới:

<?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();
?>

Cảm ơn bạn đã trả lời
Praveen Chelumalla
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.