ম্যাজেন্টো 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);
                    }
                }
            }
        }
    }

}

কোন অনুষ্ঠানটি আপনি পালন করেন? আমি এটিকে পুনরুত্পাদন করার এবং এটি কেন কাজ করছে না তা খতিয়ে দেখার চেষ্টা করব।
সিয়ারে উখখলেবাউ

ক্যাটালগ_প্রডাক্ট_সেভ_এর পরে, ইমেজটি যদি নতুন মান হয় তবে এটি প্রথমবার কাজ করবে না id
শিব কুমার কোডুড়ু

এবং আপনি কোন অনুষ্ঠানের জন্য ব্যবহার করছেন ChangeTemplateObserver?
সিয়ারে উছুখলেবাউ

<অগ্রাধিকার = "ম্যাজেন্টো \ প্রোডাক্টভিডিও \ পর্যবেক্ষক \ চেঞ্জটেম্পলেটObserver" প্রকার = "ডিসিডাব্লু \ ভিএম \ পর্যবেক্ষক \ চেঞ্জটেম্পলেটঅবেসভার" />
শিবা কুমার কোডারু

আমার উত্তর কি আপনাকে সাহায্য করে?
সিয়ারে উখুলেবাউ

উত্তর:


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সর্বদা পণ্য মিডিয়া ডেটাতে উপস্থিত থাকা উচিত।

ফ্রন্টএন্ডে ভিএম-চিত্রগুলি আড়াল করতে আপনি প্লাগইন লিখতে পারেন:

অ্যাপ্লিকেশন / কোড / 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;
    }
}

পণ্যটি থেকে ভিএম-চিত্রগুলি পেতে, @ মারিয়াসের দ্বারা লিখিত কোড ব্যবহার করুন (এই চিত্রগুলি মোছার কোনও প্লাগইন ছাড়াই):

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


হ্যালো, @ সিয়ারে উখুলেবাউ আমাকে আপনার কোডটি ব্যাকেন্ড সাইডে প্রয়োগ করতে হবে b তবে আমি যখন একাধিক চিত্র আপলোড করি তখন ভিএম এর সাথে আমার কেবল একটি চিত্রের ডেটা পাওয়া যায়, এর মতো পোস্টের ডেটাতে আমার পছন্দ মতো সমস্ত চিত্রের মান প্রয়োজন।
রসিক মিয়াণী

@ সিয়ারে উচুখলেবাউ এর জন্য ধন্যবাদ আমি মনে করি যে আমি প্রায় এসেছি: বৈশিষ্ট্যগুলি আমার জন্য সংরক্ষণ করুন তবে মানগুলি পণ্য সম্পাদনা আকারে প্রদর্শিত হচ্ছে না? ভাবছেন আপনার যদি সময় থাকে তবে আপনি কী দেখতে পাবে আমি কী ভুল করেছি? প্রশ্নটিতে মানগুলি টানতে ডেটা.উসফোর্বসের উল্লেখ রয়েছে তবে কোথাও রেফারেন্স বলে মনে হচ্ছে না, এমন একটি পদক্ষেপ আছে যা আমি মিস করছি? 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


$ ছবিতে ভিএম সহ কোনও সম্পত্তি নেই, তবে ডিবিতে সেই ক্ষেত্রটি বিদ্যমান ছিল so সুতরাং এটি খালি অ্যারে ফিরে আসবে।
শিব কুমার কোডুড়ু

ঠিক আছে. আমি আরও খনন করব।
মারিয়াস

এটিতে কোনও সহায়তা, সত্যিই magento2 এ জেএস পরিচালনা করতে এটির কিছু কঠিন।
শিব কুমার কোডুড়ু

দুঃখিত, আমি দরকারী কিছু পাইনি। কাজের পরে আমি কিছু পেতে পারি কিনা তা দেখার চেষ্টা করব।
মারিয়াস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.