Objectif:
Dans la fonction suivante, je souhaite rajouter en else
la possibilité d’afficher la placeholder image rendue disponible par Magento 2 si l’utilisateur admin backoffice n’a pas uploadé d’image spécifique.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/** * Get Page Url * * @return string * @throws \Magento\Framework\Exception\NoSuchEntityException */ public function getPageImageUrl() { /** @var \Magento\Framework\DataObject $item */ $item = $this->getItem(); if ($item) { if (!empty($item->getData('image_url'))) { /** @var \Magento\Store\Model\Store $store */ $store = $this->_storeManager->getStore(); return $store->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA) . $item->getData('image_url'); } } return ''; } |
Solution:
Tout d’abord, juste après la déclaration class myClassName extends…, déclarer le Helper Image et sa variable $imageHelper
:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/** * Class myClassName * * @package Blurrrblll\MainSearch\Block\ItemRenderer */ class myClassName extends \Magento\Framework\View\Element\Template implements \Blurrrblll\MainSearch\Api\ItemRendererInterface { [...] /** * @var \Magento\Catalog\Helper\Image */ protected $imageHelper; |
NOTE: dans mon cas (un peu particulier), une protected function _construct(): void
existe déjà dans le block. Il ne faut pas chercher à la modifier!
1 2 3 4 5 6 7 8 9 |
/** * Initialize block * @return void */ protected function _construct(): void { parent::_construct(); $this->setTemplate('Blurrrblll_MainSearch::item_renderer/page.phtml'); } |
Au lieu de ça, dans notre code et juste en-dessous ce premier contructeur, on crée une nouvelle extension de public function __construct
sur le modèle de la fonction _construct
tout droit issue de vendor/magento/framework/View/Element/Template.php et on y ajoute le image helper:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/** * Constructor * * @param \Magento\Catalog\Helper\Image $imageHelper * @param \Magento\Framework\View\Element\Template\Context $context * @param array $data */ public function __construct( \Magento\Catalog\Helper\Image $imageHelper, \Magento\Framework\View\Element\Template\Context $context, array $data = [] ) { $this->imageHelper = $imageHelper; parent::__construct($context, $data); } |
NOTE: \Template\Context $context
devient \Magento\Framework\View\Element\Template\Context $context
pour l’occasion.
Puis compléter la fonction de départ avec un else
qui retourne l’image placeholder:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
/** * Get Page Url * * @return string * @throws \Magento\Framework\Exception\NoSuchEntityException */ public function getPageImageUrl() { /** @var \Magento\Framework\DataObject $item */ $item = $this->getItem(); if ($item) { if (!empty($item->getData('image_url'))) { /** @var \Magento\Store\Model\Store $store */ $store = $this->_storeManager->getStore(); return $store->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA) . $item->getData('image_url'); } else { // Display default placeholder if no image is defined return $this->imageHelper->getDefaultPlaceholderUrl('image'); } } return ''; } |
Cette manip’ donnera le même résultat que si on mettait en place le code suivant la le fichier template PHTML chargé d’afficher les images ou, à défaut, le placeholder. On est cependant plus efficace en renvoyant directement l’image adéquate via le block PHP. Donc, le code ci-dessous est présent juste à titre informatif mais éviter de l’utiliser dans la mesure du possible (on voit qu’on utilise, comme argument de la condition, la même méthode empty()
que dans le block PHP):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php /** @var \Magento\Framework\DataObject $item */ $item = $block->getItem(); /** @var \Magento\Catalog\Helper\Image $imageHelper */ $imageHelper = $this->helper(\Magento\Catalog\Helper\Image::class); $imageUrl = $block->escapeUrl($block->getPageImageUrl()); $placeholderImageUrl = $imageHelper->getDefaultPlaceholderUrl('image'); ?> <?php if ($item) : ?> <li class="search-item search-item-page follow-url"<?= (string) $item->getData('localization'); ?>> <div class="search-item-image"> <picture> <?php if (!empty($imageUrl)) : ?> <img src="<?= (string) $imageUrl ?>" alt="<?= $block->escapeHtmlAttr(__('Article') . ' - ' . $block->stripTags($item->getData('name'))) ?>"/> <?php else : ?> <img src="<?= (string) $placeholderImageUrl ?>" alt="<?= $block->escapeHtmlAttr(__('Article') . ' - ' . $block->stripTags($item->getData('name'))) ?>"/> <?php endif; ?> </picture> </div> |