From 58f500f7aaaf44dafbb109ab5bef344f41499301 Mon Sep 17 00:00:00 2001 From: Romain Ruaud Date: Tue, 15 Nov 2016 17:27:59 +0100 Subject: [PATCH] Use price renderer defined in layout to render product prices in autocomplete box. --- .../Autocomplete/Product/ItemFactory.php | 76 ++++++++++++++++++- .../view/frontend/web/css/source/_module.less | 6 ++ .../web/template/autocomplete/product.html | 2 +- .../view/frontend/web/js/form-mini.js | 2 +- 4 files changed, 80 insertions(+), 6 deletions(-) diff --git a/src/module-elasticsuite-catalog/Model/Autocomplete/Product/ItemFactory.php b/src/module-elasticsuite-catalog/Model/Autocomplete/Product/ItemFactory.php index 0aea74953..0efa2f228 100644 --- a/src/module-elasticsuite-catalog/Model/Autocomplete/Product/ItemFactory.php +++ b/src/module-elasticsuite-catalog/Model/Autocomplete/Product/ItemFactory.php @@ -14,9 +14,11 @@ namespace Smile\ElasticsuiteCatalog\Model\Autocomplete\Product; +use Magento\Framework\App\ObjectManager; use Magento\Framework\ObjectManagerInterface; use Magento\Catalog\Helper\Image as ImageHelper; use Magento\Catalog\Api\Data\ProductInterface; +use Magento\Framework\Pricing\Render; /** * Create an autocomplete item from a product. @@ -37,16 +39,29 @@ class ItemFactory extends \Magento\Search\Model\Autocomplete\ItemFactory */ private $imageHelper; + /** + * @var \Magento\Framework\Pricing\Render + */ + private $priceRenderer; + + /** + * @var ObjectManagerInterface + */ + private $objectManager; + /** * Constructor. * * @param ObjectManagerInterface $objectManager Object manager used to instantiate new item. * @param ImageHelper $imageHelper Catalog product image helper. + * @param Render $priceRenderer Catalog product price renderer. */ - public function __construct(ObjectManagerInterface $objectManager, ImageHelper $imageHelper) + public function __construct(ObjectManagerInterface $objectManager, ImageHelper $imageHelper, Render $priceRenderer) { parent::__construct($objectManager); $this->imageHelper = $imageHelper; + $this->priceRenderer = $priceRenderer; + $this->objectManager = $objectManager; } /** @@ -72,11 +87,10 @@ private function addProductData($data) $product = $data['product']; $productData = [ - 'title' => html_entity_decode($product->getName()), + 'title' => $product->getName(), 'image' => $this->getImageUrl($product), 'url' => $product->getProductUrl(), - 'price' => $product->getFinalPrice(), - 'final_price' => $product->getPrice(), + 'price' => $this->renderProductPrice($product, \Magento\Catalog\Pricing\Price\FinalPrice::PRICE_CODE), ]; $data = array_merge($data, $productData); @@ -97,4 +111,58 @@ private function getImageUrl($product) return $this->imageHelper->getUrl(); } + + + /** + * Renders product price. + * + * @param \Magento\Catalog\Model\Product $product The product + * @param string $priceCode The Price Code to render + * + * @return string + */ + private function renderProductPrice(\Magento\Catalog\Model\Product $product, $priceCode) + { + $priceRender = $this->getPriceRenderer(); + + $price = $product->getData($priceCode); + + if ($priceRender) { + $price = $priceRender->render( + $priceCode, + $product, + [ + 'include_container' => false, + 'display_minimal_price' => true, + 'zone' => Render::ZONE_ITEM_LIST, + 'list_category_page' => true, + ] + ); + } + + return $price; + } + + /** + * Retrieve Price Renderer Block + * + * @return bool|\Magento\Framework\View\Element\BlockInterface + */ + private function getPriceRenderer() + { + /** @var \Magento\Framework\View\LayoutInterface $layout */ + $layout = $this->objectManager->get('\Magento\Framework\View\LayoutInterface'); + $layout->getUpdate()->addHandle('default'); + $priceRenderer = $layout->getBlock('product.price.render.default'); + + if (!$priceRenderer) { + $priceRenderer = $layout->createBlock( + 'Magento\Framework\Pricing\Render', + 'product.price.render.default', + ['data' => ['price_render_handle' => 'catalog_product_prices']] + ); + } + + return $priceRenderer; + } } diff --git a/src/module-elasticsuite-catalog/view/frontend/web/css/source/_module.less b/src/module-elasticsuite-catalog/view/frontend/web/css/source/_module.less index d91fc2302..d3e5f685b 100644 --- a/src/module-elasticsuite-catalog/view/frontend/web/css/source/_module.less +++ b/src/module-elasticsuite-catalog/view/frontend/web/css/source/_module.less @@ -97,4 +97,10 @@ font-size: 63%; color: #777; } + + .price-box { + span.old-price { + display:block; + } + } } diff --git a/src/module-elasticsuite-catalog/view/frontend/web/template/autocomplete/product.html b/src/module-elasticsuite-catalog/view/frontend/web/template/autocomplete/product.html index 17f665187..c367eab09 100644 --- a/src/module-elasticsuite-catalog/view/frontend/web/template/autocomplete/product.html +++ b/src/module-elasticsuite-catalog/view/frontend/web/template/autocomplete/product.html @@ -7,7 +7,7 @@
<%- data.title %>
- <%- data.price %> + <%= data.price %>
diff --git a/src/module-elasticsuite-core/view/frontend/web/js/form-mini.js b/src/module-elasticsuite-core/view/frontend/web/js/form-mini.js index 11ff31148..6b61396ea 100644 --- a/src/module-elasticsuite-core/view/frontend/web/js/form-mini.js +++ b/src/module-elasticsuite-core/view/frontend/web/js/form-mini.js @@ -119,7 +119,7 @@ define([ var template = this._getTemplate(element); element.index = index; - if (element.price) { + if (element.price && (!isNaN(element.price))) { element.price = priceUtil.formatPrice(element.price, this.options.priceFormat); }