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

}

어떤 사건을 관찰하십니까? 나는 그것을 재현하고 그것이 작동하지 않는 이유를 확인하려고 노력할 것입니다.
Siarhey Uchukhlebau 2016 년

catalog_product_save_after, 이미지가 새로운 값이면 id는 null이므로 처음 작동하지 않습니다.
Siva Kumar Koduru 2016 년

그리고 어떤 이벤트를 사용하고 ChangeTemplateObserver있습니까?
Siarhey Uchukhlebau

<Preference for = "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미디어 갤러리 select에 열 을 추가합니다 .

앱 / 코드 /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 이미지를 숨기려면 플러그인을 작성할 수 있습니다.

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>

암호:

<?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를 얻으려면 @Marius가 작성한 코드를 사용하십시오 (이 이미지를 삭제하는 플러그인없이).

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

@SivaKumarKoduru 도와 드리겠습니다
Siarhey Uchukhlebau

안녕하세요, @Siarhey Uchukhlebau 나는 백엔드 측에서 코드를 구현해야하지만 여러 이미지를 업로드 할 때 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

이것에 대한 도움, 실제로는 magento2에서 js를 관리하기가 어렵습니다.
Siva Kumar Koduru

유용한 정보를 찾지 못했습니다. 퇴근 후 무언가를 얻을 수 있는지 확인하려고 노력할 것입니다.
Marius
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.