कैसे 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();
    }

}

बैकएंड में चेक किए गए इमेज स्टेट को कैसे सेव करें? और उन चित्रों को कैसे दृश्य में फ़िल्टर किया जाए? क्या आप इस पर मेरी मदद कर सकते हैं?

अपडेट करें:

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

}

आप किस घटना का निरीक्षण करते हैं? मैं इसे पुन: पेश करने और यह जांचने की कोशिश करूंगा कि यह काम क्यों नहीं कर रहा है।
सियारि उचुकलेबौ

कैटलॉग_प्रोडक्ट_सैव_आफ्टर, अगर इमेज न्यू वैल्यू आईडी है तो यह शून्य हो जाएगा, इसलिए पहली बार काम नहीं कर रहा है।
शिव कुमार कोडरु

और आप किस घटना का उपयोग कर रहे हैं ChangeTemplateObserver?
सियारि उचुकलेबौ

<प्राथमिकता के लिए = "Magento \ ProductVideo \ Observer \ ChangeTemplateObserver" प्रकार = "Dcw \ Vm \ Observer \ ChangeTemplateObserver" />
शिव कुमार कोडरन

क्या मेरे जवाब से आपको मदद मिली?
सियारि उचुकलेबौ

जवाबों:


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मीडिया गैलरी के चयन में कॉलम जोड़ रहा है :

एप्लिकेशन / कोड / 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>

कोड:

<?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 को छिपाने के लिए आप प्लगइन लिख सकते हैं:

एप्लिकेशन / कोड / 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\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 प्राप्त करने के लिए, @ मारी द्वारा कोड रिटेन का उपयोग करें (एक प्लगइन के बिना जो इस चित्र को हटाता है):

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

@ शिवकुमारकुरु मुझे आपकी मदद करने में खुशी है
सिरैय उचुकलेबौ

नमस्कार, @Siarhey Uchukhlebau मुझे आपके कोड को बैकएंड साइड पर लागू करना है। लेकिन जब मैं कई चित्र अपलोड करता हूं, तो मुझे VM के साथ केवल एक छवि डेटा मिला है, जैसे वास्तव में मुझे पोस्ट डेटा में चयनित सभी छवियों की आवश्यकता है।
रसिक मयानी

@SiarheyUchukhlebau इसके लिए धन्यवाद मुझे लगता है कि मैं लगभग वहाँ हूं: मेरे लिए विशेषताएँ सहेजना हालांकि मान उत्पाद संपादन रूप में नहीं दिखाई दे रहे हैं? आश्चर्य है कि अगर आपके पास समय है तो आप देख सकते हैं कि मैंने क्या गलत किया? प्रश्न में डेटा .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


$ छवि में vm के साथ कोई संपत्ति नहीं है, लेकिन db में उस क्षेत्र का अस्तित्व है। उसके खाली खाली होने पर।
शिव कुमार कोडरु

ठीक। मैं आगे खुदाई करूंगा।
मारियस

इस पर कोई मदद, वास्तव में इसके कुछ मुश्किल प्रबंध js Magento2 में।
शिव कुमार कोडरु

क्षमा करें, मुझे कुछ उपयोगी नहीं मिला। मैं यह देखने की कोशिश करूंगा कि काम के बाद मुझे कुछ मिल सकता है या नहीं।
मारियस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.