hello,
Since days i try to show my custom RRP price-attribute (for reccomended retail prices) on product detail pages near other prices, unfortunately without success.
I've added a price-attribute in magento 2-backend, called "rrp" and visibility are setted to yes. It's shown in "more information"-tab, but not near other prices. My module is activated and enabled.
I've added registration.php for my module with following code, saved in "app/code/Acme/RRP"
<?php \Magento\Framework\Component\ComponentRegistrar::register( \Magento\Framework\Component\ComponentRegistrar::MODULE, 'Acme_RRP', __DIR__ );
For module.xml i used following code, saved in app/code/Acme/RRP/etc
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="Acme_RRP" setup_version="2.1.3" /> </config>
My module, called "RRP", includes a new attribute, set up below in app/code/Acme/RRP/Setup/InstallData.php
<?php namespace Acme\RRP\Setup; use Magento\Framework\Setup\InstallDataInterface; use Magento\Framework\Setup\ModuleContextInterface; use Magento\Eav\Setup\EavSetup; use Magento\Framework\Setup\ModuleDataSetupInterface; class InstallData implements InstallDataInterface { protected $eavSetup; public function __construct(EavSetup $eavSetup) { $this->eavSetup = $eavSetup; } public function install(ModuleDataSetupInterface $setup,ModuleContextInterface $context) { $setup->startSetup(); $this->eavSetup->addAttribute("catalog_product", "rrp", [ 'type' => 'decimal', 'backend' => 'Magento\Catalog\Model\Product\Attribute\Backend\Price', 'label' => 'RRP', 'input' => 'price', 'required' => false, 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_WEBSITE, 'group' => 'General' ]); $setup->endSetup(); } }
At app/code/Acme/RRP/Pricing/Price/RRPPrice.php i've tried to setup a custom price type by creating a new class that extends Magento/Framework/Pricing/Price/AbstractPrice
<?php namespace Acme\RRP\Pricing\Price; use Magento\Framework\Pricing\Price\AbstractPrice; use Magento\Framework\Pricing\Price\BasePriceProviderInterface; /** * Class RRPPrice */ class RRPPrice extends AbstractPrice { /** * Price type */ const PRICE_CODE = 'rrp_price'; /** * Get price value * * @return float|bool */ public function getValue() { if ($this->value === null) { $price = $this->product->getRrp(); $priceInCurrentCurrency = $this->priceCurrency->convertAndRound($price); $this->value = $priceInCurrentCurrency ? floatval($priceInCurrentCurrency) : false; } return $this->value; } }
I've created di.xml in app/code/Acme/RRP/etc
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <virtualType name="Magento\Catalog\Pricing\Price\Pool"> <arguments> <argument name="prices" xsi:type="array"> <item name="rrp_price" xsi:type="string">Acme\RRP\Pricing\Price\RRPPrice</item> </argument> </arguments> </virtualType> </config>
I've declared template for the "rrp_price" type in app/code/Acme/RRP/view/base/layout/catalog_product_prices.xml
<?xml version="1.0"?> <layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/layout_generic.xsd"> <referenceBlock name="render.product.prices"> <arguments> <argument name="default" xsi:type="array"> <item name="prices" xsi:type="array"> <item name="rrp_price" xsi:type="array"> <item name="render_template" xsi:type="string">Acme_RRP::product/price/rrp_price.phtml</item> </item> </item> </argument> </arguments> </referenceBlock> </layout>
I've created template for the RRP price in app/code/Acem/RRP/view/base/templates/product/price/rrp_price.phtml
<?php /** @var \Magento\Catalog\Pricing\Render\FinalPriceBox $block */ $productId = $block->getSaleableItem()->getId(); /** @var \Magento\Catalog\Pricing\Price\RegularPrice $priceModel */ $priceModel = $block->getPriceType('regular_price'); /* @escapeNotVerified */ echo $block->renderAmount($priceModel->getAmount(), [ 'price_id' => $block->getPriceId('product-price-'), 'include_container' => true ]); ?>
At least, i override final_price.phtml to include a call to render new RRP price in app/design/frontend/Acme/luma/Magento_Catalog/templates/product/price/final_price.phtml
<?php /** @var \Magento\Catalog\Pricing\Render\FinalPriceBox $block */ $productId = $block->getSaleableItem()->getId(); /** @var \Magento\Catalog\Pricing\Price\RegularPrice $priceModel */ $priceModel = $block->getPriceType('regular_price'); /** @var \Magento\Catalog\Pricing\Price\FinalPrice $finalPriceModel */ $finalPriceModel = $block->getPriceType('final_price'); /** @var \Acme\RRP\Pricing\Price\RRPPrice $rrpPriceModel */ $rrpPriceModel = $block->getPriceType('rrp_price'); $idSuffix = $block->getIdSuffix() ? $block->getIdSuffix() : ''; $schema = ($block->getZone() == 'item_view') ? true : false; ?> <?php /* @escapeNotVerified */ echo $block->renderAmount($rrpPriceModel->getAmount(), [ 'price_id' => $block->getPriceId('rrp-price-' . $idSuffix), 'price_type' => 'rrpPrice', 'include_container' => true, 'schema' => $schema ]); ?> <?php if ($block->hasSpecialPrice()): ?> <span class="special-price"> <?php /* @escapeNotVerified */ echo $block->renderAmount($finalPriceModel->getAmount(), [ 'display_label' => __('Special Price'), 'price_id' => $block->getPriceId('product-price-' . $idSuffix), 'price_type' => 'finalPrice', 'include_container' => true, 'schema' => $schema ]); ?> </span> <span class="old-price"> <?php /* @escapeNotVerified */ echo $block->renderAmount($priceModel->getAmount(), [ 'display_label' => __('Regular Price'), 'price_id' => $block->getPriceId('old-price-' . $idSuffix), 'price_type' => 'oldPrice', 'include_container' => true, 'skip_adjustments' => true ]); ?> </span> <?php else: ?> <?php /* @escapeNotVerified */ echo $block->renderAmount($finalPriceModel->getAmount(), [ 'price_id' => $block->getPriceId('product-price-' . $idSuffix), 'price_type' => 'finalPrice', 'include_container' => true, 'schema' => $schema ]); ?> <?php endif; ?> <?php if ($block->showMinimalPrice()): ?> <?php if ($block->getUseLinkForAsLowAs()):?> <a href="<?php /* @escapeNotVerified */ echo $block->getSaleableItem()->getProductUrl(); ?>" class="minimal-price-link"> <?php /* @escapeNotVerified */ echo $block->renderAmountMinimal(); ?> </a> <?php else:?> <span class="minimal-price-link"> <?php /* @escapeNotVerified */ echo $block->renderAmountMinimal(); ?> </span> <?php endif?> <?php endif; ?>
Does anybody knows what i've did wrong? Unfortunately nothing is shown on product detail pages.
Thank you so much for your help and have a good day!