J'ai besoin d'afficher quelques images du produit en frontend en fonction de la condition: l'utilisation du miroir virtuel doit être vérifiée.
<?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');
}
}
Modèle:
<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>
Script d'installation:
<?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();
}
}
Comment enregistrer l'état des images vérifiées dans le backend? Et comment filtrer ces images en frontend? Pouvez-vous m'aider à ce sujet?
MISE À JOUR:
l'observateur suivant (sur événement catalog_product_save_after
) pour les images existantes fonctionne, mais pour les nouvelles images ne fonctionne pas.
<?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
la source
la source
ChangeTemplateObserver
?Réponses:
Dans votre observateur, il y a beaucoup de code inutile. Vous pouvez le changer comme:
Parce que vous n'avez pas besoin de stocker les données d'une demande, car il n'y
value_id
en a pas dans les images nouvellement créées, vos données ne sont donc pas restées lors de l'ajout de la nouvelle image.Pour obtenir des données ailleurs, j'ai écrit un plugin. Il ajoute la colonne
vm
à la galerie multimédia, sélectionnez:Code:
Alors maintenant, votre attribut personnalisé
vm
devrait toujours exister dans les données des médias des produits.Pour masquer les images vm sur le frontend, vous pouvez écrire un plugin:
Code:
Pour obtenir les images vm du produit, utilisez le code écrit par @Marius (sans plugin qui supprime ces images):
la source
Récupération en frontend:
Disons que le produit pour lequel vous souhaitez afficher le miroir virtuel est
$product
.Vous pouvez obtenir les images marquées de votre attribut personnalisé comme ceci:
Ensuite, vous pouvez parcourir le
$images
tableau et les afficher là où vous en avez besoin.Pour enregistrer la valeur de cette case à cocher dans le backend, je pense que vous devez écrire un
after
plugin pour la méthode\Magento\Catalog\Model\Product\Attribute\Backend\Media\ImageEntryConverter::convertFrom
où vous attachez la valeur que vous obtenez de la poste dans le$entryArray
.la source