วิธีบันทึกแอตทริบิวต์ที่กำหนดเองของรูปภาพใน magento 2


13

ดูตัวอย่างในแบ็กเอนด์

ดูตัวอย่างในแบ็กเอนด์ 2

ฉันต้องแสดงภาพผลิตภัณฑ์บางส่วนที่ด้านหน้าตามเงื่อนไข: ควรใช้การตรวจสอบกระจกเงาเสมือน

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

แม่แบบ:

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

ติดตั้งสคริปต์:

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

}

จะบันทึกสถานะภาพที่ถูกตรวจสอบในแบ็กเอนด์ได้อย่างไร? และวิธีการกรองภาพเหล่านั้นในส่วนหน้า? คุณช่วยฉันได้ไหม

UPDATE:

ผู้สังเกตการณ์ที่ติดตาม (สำหรับเหตุการณ์catalog_product_save_after) สำหรับรูปภาพที่มีอยู่ใช้งานได้ แต่สำหรับรูปภาพใหม่ไม่ทำงาน

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

}

เหตุการณ์ใดที่คุณสังเกต ฉันจะพยายามทำซ้ำและตรวจสอบว่าทำไมมันไม่ทำงาน
Siarhey Uchukhlebau

catalog_product_save_after หากภาพเป็นรหัสค่าใหม่จะเป็นโมฆะดังนั้นครั้งแรกที่ใช้งานไม่ได้
Siva Kumar Koduru

และเหตุการณ์ใดที่คุณใช้สำหรับChangeTemplateObserver?
Siarhey Uchukhlebau

<preferences สำหรับ = "Magento \ ProductVideo \ Observer \ ChangeTemplateObserver" type = "Dcw \ Vm \ Observer \ ChangeTemplateObserver" />
Siva Kumar Koduru

คำตอบของฉันช่วยคุณได้ไหม
Siarhey Uchukhlebau

คำตอบ:


9

ในผู้สังเกตการณ์ของคุณมีรหัสที่ไม่จำเป็นจำนวนมาก คุณสามารถเปลี่ยนได้เช่น:

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

}

เนื่องจากคุณไม่จำเป็นต้องจัดเก็บข้อมูลจากคำขอเนื่องจากไม่มีvalue_idในรูปภาพที่สร้างขึ้นใหม่ดังนั้นข้อมูลของคุณจึงไม่เหลืออยู่เมื่อเพิ่มรูปภาพใหม่

เพื่อรับข้อมูลในที่อื่นฉันเขียนปลั๊กอิน กำลังเพิ่มคอลัมน์vmลงในแกลเลอรี่สื่อบันทึกเลือก:

app / รหัส / DCW / เมล์ / 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>

รหัส:

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

ดังนั้นตอนนี้แอตทริบิวต์ที่กำหนดเองของคุณvmควรมีอยู่เสมอในข้อมูลสื่อผลิตภัณฑ์

หากต้องการซ่อน vm-images ที่ส่วนหน้าคุณสามารถเขียนปลั๊กอิน:

app / รหัส / DCW / เมล์ / 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\Product">
        <plugin name="afterGetMediaGalleryImages" type="Dcw\Vm\Plugin\Product" sortOrder="10" disabled="false"/>
    </type>
</config>

รหัส:

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

ในการรับ vm-images จากผลิตภัณฑ์ให้ใช้รหัส writen โดย @Marius (ไม่มีปลั๊กอินที่ลบภาพนี้):

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

@SivaKumarKoduru ฉันดีใจที่ได้ช่วยคุณ
Siarhey Uchukhlebau

สวัสดี @Siarhey Uchukhlebau ฉันต้องติดตั้งโค้ดของคุณที่ backend side.but เมื่อฉันอัปโหลดภาพหลายภาพจากนั้นฉันได้รับข้อมูลภาพเดียวกับ VM เช่นนี้จริง ๆ แล้วฉันต้องการภาพทั้งหมดที่เลือกลงในข้อมูลโพสต์
Rasik Miyani

@SiarheyUchukhlebau ขอบคุณสำหรับสิ่งนี้ฉันคิดว่าฉันเกือบจะอยู่ที่นั่นแล้ว: คุณลักษณะสำหรับฉันจะบันทึก แต่ค่าจะไม่แสดงในแบบฟอร์มการแก้ไขผลิตภัณฑ์หรือไม่ หากสงสัยว่าคุณมีเวลาคุณจะเห็นสิ่งที่ฉันทำผิดหรือเปล่า? คำถามที่กล่าวถึง data.useforvm เพื่อดึงค่า แต่ดูเหมือนจะไม่ได้อ้างอิงทุกที่มีขั้นตอนที่ฉันหายไป? magento.stackexchange.com/questions/301685/…
harri

4

ดึงข้อมูลในส่วนหน้า:

$productพูดเถอะว่าผลิตภัณฑ์ที่คุณต้องการแสดงกระจกเสมือน
คุณสามารถรับภาพที่ถูกทำเครื่องหมายด้วยแอตทริบิวต์ที่กำหนดเองของคุณเช่นนี้:

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

จากนั้นคุณสามารถวนซ้ำ$imagesอาร์เรย์และแสดงในตำแหน่งที่คุณต้องการ

เพื่อเป็นการประหยัดค่าของช่องทำเครื่องหมายว่าในแบ็กเอนด์ที่ผมคิดว่าคุณต้องเขียนafterปลั๊กอินสำหรับวิธีการที่คุณแนบค่าที่คุณได้รับจากการโพสต์ใน \Magento\Catalog\Model\Product\Attribute\Backend\Media\ImageEntryConverter::convertFrom$entryArray


ใน $ image ไม่มีคุณสมบัติที่มี vm แต่ใน db นั้นมีฟิลด์นั้นอยู่ดังนั้นจึงส่งกลับอาร์เรย์ว่างเปล่า
Siva Kumar Koduru

ตกลง. ฉันจะขุดต่อไป
Marius

ความช่วยเหลือใด ๆ เกี่ยวกับเรื่องนี้มันเป็นเรื่องยากที่จะจัดการ js ใน magento2
Siva Kumar Koduru

ขออภัยฉันไม่พบสิ่งที่มีประโยชน์ ฉันจะพยายามดูว่าฉันสามารถหาอะไรบางอย่างหลังเลิกงานได้ไหม
Marius
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.