Cách lưu thuộc tính tùy chỉnh hình ảnh trong magento 2


13

xem trước trong phụ trợ

xem trước trong phụ trợ 2

Tôi cần hiển thị một vài hình ảnh của sản phẩm ở lối vào dựa trên điều kiện: nên kiểm tra sử dụng cho gương ảo.

<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */

namespace Dcw\Vm\Observer;

use Magento\Framework\Event\ObserverInterface;

class ChangeTemplateObserver extends \Magento\ProductVideo\Observer\ChangeTemplateObserver
{
    /**
     * @param mixed $observer
     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
     * @return void
     */
    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        $observer->getBlock()->setTemplate('Dcw_Vm::helper/gallery.phtml');
    }
}

Bản mẫu:

<div class="admin__field field-image-vm">
    <div class="admin__field-control">
        <div class="admin__field admin__field-option">
            <input type="checkbox"
                   id="use-for-vm"
                   data-role="vm-save"
                   data-form-part="<?php /* @escapeNotVerified */ echo $formName ?>"
                   value="1"
                   class="admin__control-checkbox"
                   name="<?php /* @escapeNotVerified */ echo $elementName ?>[<%- data.file_id %>][vm]"
            <% if (data.useforvm == 1) { %>checked="checked"<% } %> />

            <label for="use-for-vm" class="admin__field-label">
                <?php /* @escapeNotVerified */ echo __('Use for Virutal Mirror')?>
            </label>
        </div>
    </div>
</div>

Cài đặt tập lệnh:

<?php

namespace Dcw\Vm\Setup;

use Magento\Framework\Setup\InstallSchemaInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Catalog\Model\ResourceModel\Product\Gallery;

class InstallSchema implements InstallSchemaInterface {

    public function install(SchemaSetupInterface $setup, ModuleContextInterface $context) {
        $setup->startSetup();

        $setup->getConnection()->addColumn(
                $setup->getTable(Gallery::GALLERY_TABLE), 'vm', [
            'type' => \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
            'unsigned' => true,
            'nullable' => false,
            'default' => 0,
            'comment' => 'use for Vm'                ]
        );

        $setup->endSetup();
    }

}

Làm thế nào để lưu trạng thái hình ảnh được kiểm tra trong phụ trợ? Và làm thế nào để lọc những hình ảnh trong frontend? Bạn có thể giúp tôi về điều này?

CẬP NHẬT:

quan sát sau (về sự kiện catalog_product_save_after) cho các hình ảnh hiện tại đang hoạt động, nhưng đối với các hình ảnh mới không hoạt động.

<?php

namespace Dcw\Vm\Observer;

use Magento\Framework\Event\ObserverInterface;

class Productsaveafter implements ObserverInterface {

    protected $request;
    protected $resource;

    /**
     * 
     * @param \Magento\Framework\App\RequestInterface $request
     * @param \Magento\Framework\App\ResourceConnection $resource\
     */
    public function __construct(
    \Magento\Framework\App\RequestInterface $request, \Magento\Framework\App\ResourceConnection $resource
    ) {
        $this->request = $request;
        $this->resource = $resource;
    }

    public function execute(\Magento\Framework\Event\Observer $observer) {

        $vm = array();
        $data = $this->request->getPostValue();

        if (isset($data['product']['media_gallery']['images'])) {
            $images = $data['product']['media_gallery']['images'];

            foreach ($images as $image) {
                if (isset($image['vm']) && $image['vm'] == 1) {
                    $vm[$image['value_id']] = 1;
                } else {
                    $vm[$image['value_id']] = 0;
                }
            }
   // print_r($images);exit;
            $connection = $this->resource->getConnection();
            $tableName = 'catalog_product_entity_media_gallery'; //gives table name with prefix
            $product = $observer->getProduct();
            $mediaGallery = $product->getMediaGallery();

            if (isset($mediaGallery['images'])) {
                foreach ($mediaGallery['images'] as $image) {
                    if (isset($vm[$image['value_id']])) {
                        //Update Data into table
                        $sql = "Update " . $tableName . " Set vm = " . $vm[$image['value_id']] . " where value_id = " . $image['value_id'];
                        $connection->query($sql);
                    }
                }
            }
        }
    }

}

Sự kiện nào bạn quan sát? Tôi sẽ cố gắng tái tạo nó và kiểm tra tại sao nó không hoạt động.
Siarhey Uchukhlebau

catalog_product_save_after, nếu hình ảnh là id giá trị mới sẽ là null, vì vậy lần đầu tiên không hoạt động.
Siva Kumar Koduru

Và sự kiện nào bạn đang sử dụng cho ChangeTemplateObserver?
Siarhey Uchukhlebau

<ưu tiên cho = "Magento \ ProductVideo \ Observer \ ChangeTemplateObserver" type = "Dcw \ Vm \ Observer \ ChangeTemplateObserver" />
Siva Kumar Koduru

Câu trả lời của tôi có giúp bạn không?
Siarhey Uchukhlebau

Câu trả lời:


9

Trong quan sát của bạn có rất nhiều mã không cần thiết. Bạn có thể thay đổi nó như:

<?php

namespace Dcw\Vm\Observer;

use Magento\Framework\Event\ObserverInterface;

class ProductSaveAfter implements ObserverInterface {

    protected $request;
    protected $resource;

    /**
     *
     * @param \Magento\Framework\App\RequestInterface $request
     * @param \Magento\Framework\App\ResourceConnection $resource\
     */
    public function __construct(
        \Magento\Framework\App\RequestInterface $request, \Magento\Framework\App\ResourceConnection $resource
    ) {
        $this->request = $request;
        $this->resource = $resource;
    }

    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        $data = $this->request->getPostValue();

        if (isset($data['product']['media_gallery']['images'])) {
            // print_r($images);exit;
            $connection = $this->resource->getConnection();
            $tableName = 'catalog_product_entity_media_gallery'; //gives table name with prefix
            $product = $observer->getProduct();
            $mediaGallery = $product->getMediaGallery();

            if (isset($mediaGallery['images'])) {
                foreach ($mediaGallery['images'] as $image) {
                        //Update Data into table
                    $vmValue = !empty($image['vm']) ? (int)$image['vm'] : 0;
                        $sql = "UPDATE " . $tableName . " SET vm = " . $vmValue . " WHERE value_id = " . $image['value_id'];
                        $connection->query($sql);
                }
            }
        }
    }

}

Bởi vì bạn không cần lưu trữ dữ liệu từ một yêu cầu, vì nó không có value_idtrong các hình ảnh mới được tạo, do đó dữ liệu của bạn không còn tồn tại khi thêm hình ảnh mới.

Để có được dữ liệu ở những nơi khác, tôi đã viết một plugin. Đó là thêm cột vmvào thư viện phương tiện chọn:

ứng dụng / mã / Dcw / Vm / etc / di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Catalog\Model\ResourceModel\Product\Gallery">
        <plugin name="afterCreateBatchBaseSelect" type="Dcw\Vm\Plugin\Product\Gallery" sortOrder="10" disabled="false"/>
    </type>
</config>

Mã số:

<?php

namespace Dcw\Vm\Plugin\Product;

class Gallery
{
    public function afterCreateBatchBaseSelect(
        \Magento\Catalog\Model\ResourceModel\Product\Gallery $subject,
        \Magento\Framework\DB\Select $select
    ) {
        $select->columns('vm');

        return $select;
    }
}

Vì vậy, bây giờ thuộc tính tùy chỉnh của bạn vmphải luôn tồn tại trong dữ liệu phương tiện sản phẩm.

Để ẩn hình ảnh vm trên frontend, bạn có thể viết plugin:

ứng dụng / mã / Dcw / Vm / etc / frontend / di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Catalog\Model\Product">
        <plugin name="afterGetMediaGalleryImages" type="Dcw\Vm\Plugin\Product" sortOrder="10" disabled="false"/>
    </type>
</config>

Mã số:

<?php

namespace Dcw\Vm\Plugin;

class Product
{
    /**
     * @param \Magento\Catalog\Model\Product $subject
     * @param \Magento\Framework\Data\Collection $result
     * @return mixed
     */
    public function afterGetMediaGalleryImages(\Magento\Catalog\Model\Product $subject, $result)
    {
        foreach ($result as $key => $image) {
            if ($image['vm']) {
                $result->removeItemByKey($key);
            }
        }

        return $result;
    }
}

Để có được hình ảnh vm từ sản phẩm, hãy sử dụng mã được viết bởi @Marius (không có plugin xóa hình ảnh này):

$images = []; 
foreach ($product->getMediaGalleryImages() as $image) {
    if ($image->getVm()) {
        $images[] = $image;
    }
}

@SivaKumarKoduru Tôi rất vui lòng giúp bạn
Siarhey Uchukhlebau

Xin chào, @Siarhey Uchukhlebau Tôi phải triển khai mã của bạn ở phía phụ trợ. Nhưng khi tôi tải lên nhiều hình ảnh thì tôi chỉ nhận được một dữ liệu hình ảnh với VM, như thế này thực sự tôi cần tất cả các hình ảnh được chọn vào dữ liệu bài đăng.
Rasik Miyani

@SiarheyUchukhlebau Cảm ơn vì điều này tôi nghĩ rằng tôi đang ở gần đó: các thuộc tính lưu cho tôi tuy nhiên các giá trị không hiển thị trong biểu mẫu chỉnh sửa sản phẩm? Tự hỏi nếu bạn có thời gian bạn có thể thấy những gì tôi đã làm sai? Câu hỏi đề cập đến data.useforvm để lấy các giá trị tuy nhiên dường như không được tham chiếu ở bất cứ đâu, có thiếu bước nào không? magento.stackexchange.com/questions/301685/...
Harri

4

Lấy về phía trước:

Hãy nói rằng sản phẩm mà bạn muốn hiển thị gương ảo là $product.
Bạn có thể lấy các hình ảnh được đánh dấu bằng thuộc tính tùy chỉnh của bạn như thế này:

$images = []; 
foreach ($product->getMediaGalleryImages() as $image) {
    if ($image->getVm()) {
        $images[] = $image;
    }
}

Sau đó, bạn có thể lặp qua $imagesmảng và hiển thị chúng ở nơi bạn cần.

Để lưu giá trị của hộp kiểm đó trong phần phụ trợ, tôi nghĩ bạn cần viết một afterplugin cho phương thức \Magento\Catalog\Model\Product\Attribute\Backend\Media\ImageEntryConverter::convertFrommà bạn đính kèm giá trị bạn nhận được từ bài đăng trong $entryArray.


trong $ image không có thuộc tính với vm, nhưng trong db trường đó đã tồn tại. Ngoài ra mảng trống của nó sẽ trả về.
Siva Kumar Koduru

Đồng ý. Tôi sẽ đào sâu hơn.
Marius

bất kỳ trợ giúp về điều này, thực sự là một cái gì đó khó quản lý js trong magento2.
Siva Kumar Koduru

Xin lỗi tôi đã không tìm thấy bất cứ điều gì hữu ích. Tôi sẽ cố gắng xem liệu tôi có thể nhận được một cái gì đó sau khi làm việc.
Marius
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.