cara menyimpan atribut gambar kustom di magento 2

13

pratinjau di backend

pratinjau di backend 2

Saya perlu menampilkan beberapa gambar produk di frontend berdasarkan kondisi: penggunaan untuk mirror virtual harus diperiksa.

<?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');
    }
}

Templat:

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

Pasang skrip:

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

}

Bagaimana cara menyimpan status gambar yang dicentang di backend? Dan bagaimana cara memfilter gambar-gambar itu di frontend? Bisakah Anda membantu saya dalam hal ini?

MEMPERBARUI:

mengikuti pengamat (pada acara catalog_product_save_after) untuk gambar yang ada berfungsi, tetapi untuk gambar baru tidak berfungsi.

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

}
Siva Kumar Koduru
sumber
Acara apa yang Anda amati? Saya akan mencoba mereproduksinya dan memeriksa mengapa itu tidak berfungsi.
Siarhey Uchukhlebau
catalog_product_save_after, jika gambar id nilai baru akan null, jadi pertama kali tidak berfungsi.
Siva Kumar Koduru
Dan acara apa yang Anda gunakan untuk ChangeTemplateObserver?
Siarhey Uchukhlebau
<preferensi untuk = "Magento \ ProductVideo \ Observer \ ChangeTemplateObserver" type = "Dcw \ Vm \ Observer \ ChangeTemplateObserver" />
Siva Kumar Koduru
Apakah jawaban saya membantu Anda?
Siarhey Uchukhlebau

Jawaban:

9

Di pengamat Anda ada banyak kode yang tidak perlu. Anda dapat mengubahnya seperti:

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

}

Karena Anda tidak perlu menyimpan data dari permintaan, karena tidak ada value_iddalam gambar yang baru dibuat, oleh karena itu data Anda tidak tetap saat menambahkan gambar baru.

Untuk mendapatkan data di tempat lain saya menulis sebuah plugin. Itu menambahkan kolom vmke galeri media pilih:

app / code / 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>

Kode:

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

Jadi sekarang atribut khusus Anda vmharus selalu ada di data media produk.

Untuk menyembunyikan vm-gambar di frontend Anda dapat menulis plugin:

app / code / 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>

Kode:

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

Untuk mendapatkan vm-gambar dari produk, gunakan kode writen oleh @Marius (tanpa plugin yang menghapus gambar ini):

$images = []; 
foreach ($product->getMediaGalleryImages() as $image) {
    if ($image->getVm()) {
        $images[] = $image;
    }
}
Siarhey Uchukhlebau
sumber
@SivaKumarKoduru Saya senang membantu Anda
Siarhey Uchukhlebau
Halo, @Siarhey Uchukhlebau Saya harus Menerapkan kode Anda di backend side.but ketika saya mengunggah beberapa gambar maka saya hanya mendapatkan satu data gambar dengan VM, Seperti ini sebenarnya saya perlu semua gambar memilih nilai ke dalam data posting.
Rasik Miyani
@SiarheyUchukhlebau Terima kasih untuk ini saya pikir saya hampir sampai: atribut save for me, tetapi nilainya tidak ditampilkan dalam formulir edit produk? Ingin tahu jika Anda punya waktu, Anda bisa melihat kesalahan saya? Pertanyaannya menyebutkan data.useforvm untuk menarik nilai namun sepertinya tidak dirujuk di mana pun, apakah ada langkah yang saya lewatkan? magento.stackexchange.com/questions/301685/…
harri
4

Mengambil di frontend:

Katakanlah produk yang ingin Anda tampilkan cermin virtualnya $product.
Anda bisa mendapatkan gambar yang ditandai dengan atribut khusus Anda seperti ini:

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

Kemudian Anda dapat mengulang melalui $imagesarray dan menampilkannya di tempat yang Anda butuhkan.

Untuk menyimpan nilai kotak centang itu di backend saya pikir Anda perlu menulis sebuah afterplugin untuk metode di \Magento\Catalog\Model\Product\Attribute\Backend\Media\ImageEntryConverter::convertFrommana Anda melampirkan nilai yang Anda dapatkan dari pos di $entryArray.

Marius
sumber
dalam $ image tidak ada properti dengan vm, tetapi dalam db bidang itu ada.
Siva Kumar Koduru
Baik. Saya akan menggali lebih jauh.
Marius
bantuan apa pun, benar-benar sesuatu yang sulit mengelola js di magento2.
Siva Kumar Koduru
Maaf saya tidak menemukan sesuatu yang berguna. Saya akan mencoba melihat apakah saya bisa mendapatkan sesuatu setelah bekerja.
Marius