Necesito mostrar algunas imágenes del producto en la interfaz según la condición: se debe verificar el uso del espejo virtual.
<?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');
}
}
Modelo:
<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>
Instalar script:
<?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();
}
}
¿Cómo guardar el estado de las imágenes marcadas en el backend? ¿Y cómo filtrar esas imágenes en frontend? ¿Me puedes ayudar con esto?
ACTUALIZAR:
El siguiente observador (en caso de evento catalog_product_save_after) para imágenes existentes funciona, pero para imágenes nuevas no funciona.
<?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
Siva Kumar Koduru
fuente
fuente



ChangeTemplateObserver?Respuestas:
En su observador hay mucho código innecesario. Puedes cambiarlo como:
Debido a que no necesita almacenar datos de una solicitud, ya que no existe
value_iden las imágenes recién creadas, sus datos no permanecieron al agregar la nueva imagen.Para obtener datos en otros lugares escribí un complemento. Está agregando la columna
vma la galería de medios seleccione:Código:
Por lo tanto, ahora su atributo personalizado
vmsiempre debe existir en los datos multimedia de los productos.Para ocultar las imágenes vm en la interfaz, puede escribir el complemento:
Código:
Para obtener las imágenes vm del producto, use el código escrito por @Marius (sin un complemento que elimine estas imágenes):
fuente
Recuperando en frontend:
Digamos que el producto para el que desea mostrar el espejo virtual es
$product.Puede obtener las imágenes que están marcadas con su atributo personalizado como este:
Luego puede recorrer la
$imagesmatriz y mostrarlos donde lo necesite.Para guardar el valor de esa casilla de verificación en el backend, creo que debe escribir un
aftercomplemento para el método\Magento\Catalog\Model\Product\Attribute\Backend\Media\ImageEntryConverter::convertFromdonde adjunta el valor que obtiene de la publicación en el$entryArray.fuente