Мне нужно отобразить несколько изображений продукта во внешнем интерфейсе в зависимости от условия: следует проверить использование виртуального зеркала.
<?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);
}
}
}
}
}
}
magento2
database
attributes
event-observer
media-images
Шива Кумар Кодуру
источник
источник
ChangeTemplateObserver
?Ответы:
В вашем обозревателе много ненужного кода. Вы можете изменить это как:
Поскольку вам не нужно хранить данные из запроса, как это не имеет
value_id
во вновь создаваемых изображениях, поэтому ваши данные не остались при добавлении нового изображения.Для получения данных в других местах я написал плагин. Это добавление колонки
vm
в медиагалерее выберите:Код:
Так что теперь ваш пользовательский атрибут
vm
должен всегда существовать в медиа-данных продуктов.Чтобы скрыть vm-изображения на внешнем интерфейсе, вы можете написать плагин:
Код:
Чтобы получить vm-изображения из продукта, используйте код, написанный @Marius (без плагина, который удаляет эти изображения):
источник
Получение в веб-интерфейсе:
Допустим, продукт, для которого вы хотите отобразить виртуальное зеркало, есть
$product
.Вы можете получить изображения, помеченные вашим пользовательским атрибутом, например так:
Затем вы можете просмотреть
$images
массив и отобразить его там, где вам нужно.Чтобы сохранить значение этого флажка в бэкэнде, я думаю, вам нужно написать
after
плагин для метода, к\Magento\Catalog\Model\Product\Attribute\Backend\Media\ImageEntryConverter::convertFrom
которому вы прикрепляете значение, полученное из post в$entryArray
.источник