magento 2'de görüntü özel özniteliği nasıl kaydedilir


13

arka uçta önizleme

arka uçta önizleme 2

Duruma göre ön uçta birkaç ürün görüntüsü göstermem gerekiyor: sanal ayna kullanımı kontrol edilmelidir.

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

Şablon:

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

Komut dosyasını yükle:

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

}

İşaretli görüntülerin durumunu arka uçta nasıl kaydederim? Ve bu görüntüleri ön uçta nasıl filtreleyebilirim? Bana bu konuda yardım edebilir misin?

GÜNCELLEME:

catalog_product_save_aftervarolan görüntüler için aşağıdaki olayda (olayda ) çalışıyor, ancak yeni görüntüler için çalışmıyor.

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

}

Hangi olayı gözlemliyorsunuz? Onu çoğaltmaya ve neden çalışmadığını kontrol etmeye çalışacağım.
Siarhey Uchukhlebau

catalog_product_save_after, eğer görüntü yeni ise id değeri boş olacaktır, bu yüzden ilk kez çalışmaz.
Siva Kumar Koduru

Ve hangi etkinlik için kullanıyorsunuz ChangeTemplateObserver?
Siarhey Uchukhlebau

<= "Magento \ ProductVideo \ Gözlemci \ ChangeTemplateObserver" type = "Dcw \ Vm \ Gözlemci \ ChangeTemplateObserver" / için tercihi>
Siva Kumar Koduru

Cevabım size yardımcı oldu mu?
Siarhey Uchukhlebau

Yanıtlar:


9

Gözlemcinizde çok fazla gereksiz kod var. Aşağıdaki gibi değiştirebilirsiniz:

<?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_idYeni oluşturulan görüntülerde bulunmadığından, bir istekte veri depolamanız gerekmediğinden , yeni görüntü eklenirken verileriniz kalmaz.

Başka yerlerde veri almak için bir eklenti yazdım. vmMedya galerisi seçimine sütun ekliyor :

Uygulamanın / kod / 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>

Kod:

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

Şimdi özel özelliğiniz vmher zaman ürünlerin medya verilerinde bulunmalıdır.

Ön uçtaki vm görüntülerini gizlemek için eklenti yazabilirsiniz:

Uygulamanın / kod / Dcw / Vm / etc / kullanıcı arayüzü / 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>

Kod:

<?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-görüntülerini üründen elde etmek için, @Marius tarafından yazılan kodu kullanın (bu görüntüleri silen bir eklenti olmadan):

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

@SivaKumarKoduru Sana yardım etmekten memnunum
Siarhey Uchukhlebau

Merhaba, @Siarhey Uchukhlebau Kodunuzu arka uç tarafında uygulamak zorundayım.Ancak birden fazla görüntü yüklediğimde VM ile sadece bir görüntü verisi aldım, aslında bu gibi tüm resimlere yazı verilerine değer seçmeliyim.
Rasik Miyani

@SiarheyUchukhlebau Bunun için teşekkürler i neredeyse orada olduğumu düşünüyorum: özellikler benim için tasarruf ancak değerler ürün düzenleme formunda gösterilmiyor? Zamanın olup olmadığını merak ettim ne yanlış yaptım? Soru data.useforvm'den bahsetmektedir ancak değerleri herhangi bir yerde referans olarak görünmemektedir, eksik bir adım var mı? magento.stackexchange.com/questions/301685/…
harri

4

Ön uçta alma:

Sanal aynayı görüntülemek istediğiniz ürünün olduğunu varsayalım $product.
Özel özniteliğinizle işaretlenmiş resimleri şu şekilde alabilirsiniz:

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

Sonra $imagesdizi arasında döngü ve ihtiyacınız olan yerde görüntüleyebilirsiniz.

Bu onay kutusunun değerini arka uçta kaydetmek için, postadan aldığınız değeri eklediğiniz afteryöntem için bir eklenti yazmanız gerektiğini düşünüyorum . \Magento\Catalog\Model\Product\Attribute\Backend\Media\ImageEntryConverter::convertFrom$entryArray


$ görüntüde vm ile bir özellik yoktur, ancak db'de bu alan mevcuttu. bu yüzden dönen boş dizi.
Siva Kumar Koduru

Tamam. Daha fazla kazacağım.
Marius

Bu konuda herhangi bir yardım, gerçekten onun magento2 js yönetmek zor bir şey.
Siva Kumar Koduru

Üzgünüm yararlı bir şey bulamadım. İşten sonra bir şey alıp alamayacağımı görmeye çalışacağım.
Marius
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.