I am creating an extension for displaying labels in product page and listing page. Everything works fine except the cache issue. If I set the status to inactive, then the labels will display in the frontend until I clear the cache. How can I automatically display/off these?
Here is my code.
Layout XML
<referenceContainer name="content">
<block class="Company\ProductLabel\Block\Productlabel" name="product.label" template="Company_ProductLabel::productlabel.phtml" />
</referenceContainer>
Phtml
<?php
if($block->isActive()):
$productStickerBlock = $block->setStickerHTML();
?>
<script type="text/x-magento-init">
{
"*":{
"viewPageSticker":{
"imageTag": {
"imagePath": "<?php echo $productStickerBlock; ?>"
}
}
}
}
</script>
<?php endif; ?>
Block
use Magento\Backend\Block\Widget\Tab\TabInterface;
use Magento\Backend\Block\Widget\Form\Generic;
use Magento\Framework\DataObject\IdentityInterface;
class Productlabel extends \Magento\Framework\View\Element\Template
{
protected $product = null;
protected $coreRegistry;
protected $productFactory;
protected $collectionFactory;
private $scopeConfig;
private $_regularPrice;
private $_finalPrice;
public function __construct(
\Magento\Framework\View\Element\Template\Context $context,
\Magento\Framework\Registry $registry,
\Magento\Catalog\Model\ProductFactory $productFactory,
\Company\ProductLabel\Model\ResourceModel\Productlabel\Grid\CollectionFactory $collectionFactory,
array $data = []
) {
$this->scopeConfig = $context->getScopeConfig();
$this->coreRegistry = $registry;
$this->productFactory = $productFactory;
$this->collectionFactory = $collectionFactory;
parent::__construct($context, $data);
$this->addData([
'cache_lifetime' => 360
]);
}
public function getCacheKeyInfo()
{
$productId = $this->_getProduct()?$this->_getProduct()->getId() : null;
$mode = 'cat' ;
if($productId) {
$mode = 'prod';
}
return [
$this->_storeManager->getStore()->getId(),
$this->_design->getDesignTheme()->getId(),
$mode,
rand(),
$productId
];
}
protected function _getProduct()
{
if (!$this->product) {
$this->product = $this->coreRegistry->registry('product');
}
return $this->product;
}
public function isActive()
{
$active = $this->scopeConfig->getValue(
'company_productlabel/general/enable',
\Magento\Store\Model\ScopeInterface::SCOPE_STORE
);
if ($active) {
return true;
}
return false;
}
public function setStickerHTML()
{
$now = new \DateTime();
$collection = $this->collectionFactory->create()
->addFieldToFilter('status', 1)
->addFieldToFilter( array('from_date'), array( array( array('lteq' => $now->format('Y-m-d H:i:s')), array('null' => true))))
->addFieldToFilter( array('to_date'), array( array( array('gteq' => $now->format('Y-m-d H:i:s')), array('null' => true))))
->addFieldToFilter('product_id', $this->_getProduct()->getId());
$html = '';
if($collection->getSize()) {
$discount = '' ;
$html = "";
foreach($collection as $label){
$html .= "<div class='productsticker-wrapper ".$label->getLabelPosition()."'><img class='productlabelImage' src='".$this->getUrl('pub/media').$label->getImagePath()."' /></div>";
}
}
return $html;
}
}
Require Js
var config = {
map: {
'*': {
viewPageSticker: 'Company_ProductLabel/js/viewPageSticker'
}
}
};
JS File
define(
[
'jquery'
],
function ($) {
$.widget(
'company.viewPageSticker',
{
_create: function () {
var self = this;
$(".product.media").append(self.options.imageTag.imagePath);
}
}
);
return $.company.viewPageSticker;
}
);