We are very exciting after we have successfully created featured product module and We want to share with you.
Let’s create the featured product module. We will need
app/code/Stepbystepprograming/Featuredproduct/Block
app/code/Stepbystepprograming/Featuredproduct/etc
app/code/Stepbystepprograming/Featuredproduct/Setup
app/code/Stepbystepprograming/Featuredproduct/view/frontend/templates
Now, We have created directory structure for the module. Now we will create the file for this.
1. First we create the configuration file module.xml in app/code/Stepbystepprograming/Featuredproduct/etc
The content for the file will be as:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
<module name="Stepbystepprograming_Featuredproduct" setup_version="2.0.0" />
</config>
2. we create the product attribute named InstallData.php in app/code/Stepbystepprograming/Featuredproduct/Setup
The content for the file should be:
<?php
namespace Stepbystepprograming\Featuredproduct\Setup;
use Magento\Eav\Setup\EavSetup;
use Magento\Eav\Setup\EavSetupFactory;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
class InstallData implements InstallDataInterface
{
/**
* EAV setup factory
*
* @var EavSetupFactory
*/
private $eavSetupFactory;
/**
* Init
*
* @param EavSetupFactory $eavSetupFactory
*/
public function __construct(EavSetupFactory $eavSetupFactory)
{
$this->eavSetupFactory = $eavSetupFactory;
}
public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
{
/** @var EavSetup $eavSetup */
$eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);
/**
* Add attributes to the eav/attribute
*/
$eavSetup->addAttribute(
\Magento\Catalog\Model\Product::ENTITY,
'is_featured',
[
'group' => 'General',
'type' => 'int',
'backend' => '',
'frontend' => '',
'label' => 'Featured Product',
'input' => 'boolean',
'class' => '',
'source' => '',
'global' => \Magento\Catalog\Model\Resource\Eav\Attribute::SCOPE_GLOBAL,
'visible' => true,
'required' => false,
'user_defined' => true,
'default' => '',
'searchable' => false,
'filterable' => false,
'comparable' => false,
'visible_on_front' => false,
'used_in_product_listing' => true,
'unique' => false,
'apply_to' => 'simple,configurable,virtual,bundle,downloadable'
]
);
}
}
3. Create the block file named Featuredproduct.php in app/code/Stepbystepprograming/Featuredproduct/Block
<?php
namespace Stepbystepprograming\Featuredproduct\Block;
use Magento\Catalog\Model\Product;
use Magento\Eav\Model\Entity\Collection\AbstractCollection;
class Featuredproduct extends \Magento\Catalog\Block\Product\AbstractProduct
{
protected $_productcollection;
/**
* @var \Magento\Framework\Url\Helper\Data
*/
protected $urlHelper;
/**
* Catalog product visibility
*
* @var \Magento\Catalog\Model\Product\Visibility
*/
protected $_catalogProductVisibility;
/**
* @var \Magento\Framework\App\Http\Context
*/
// protected $httpContext;
//var $collection;
public function __construct(
\Magento\Catalog\Block\Product\Context $context,
\Magento\Framework\Stdlib\String $string,
\Magento\Catalog\Model\Resource\Product\CollectionFactory $productcollection,
\Magento\Catalog\Model\Product\Visibility $catalogProductVisibility,
\Magento\Framework\Url\Helper\Data $urlHelper,
array $data = []
) {
//$this->string = $string;
$this->_productcollection = $productcollection;
$this->_catalogProductVisibility = $catalogProductVisibility;
$this->urlHelper = $urlHelper;
parent::__construct($context, $data);
}
public function getFeaturedProduct(){
$collection = $this->_productcollection->create()
->addAttributeToFilter('status', '1')
->addAttributeToFilter('is_featured', '1');
$collection->setVisibility($this->_catalogProductVisibility->getVisibleInCatalogIds());
$collection = $this->_addProductAttributesAndPrices($collection)
->setPageSize(4)
->setCurPage(1);
return $collection;
}
/*public function getIdentities()
{
return [\Magento\Catalog\Model\Product::CACHE_TAG];
}*/
/**
* Get post parameters
*
* @param \Magento\Catalog\Model\Product $product
* @return string
*/
public function getAddToCartPostParams(\Magento\Catalog\Model\Product $product)
{
$url = $this->getAddToCartUrl($product);
return [
'action' => $url,
'data' => [
'product' => $product->getEntityId(),
\Magento\Framework\App\Action\Action::PARAM_NAME_URL_ENCODED =>
$this->urlHelper->getEncodedUrl($url),
]
];
}
}
4. Create the featuredprodcut.phtml file in app/code/Stepbystepprograming/Featuredproduct/view/frontend/templates
<h1><?php echo __('Featured Product'); ?></h1>
<?php
$_productCollection = $block->getFeaturedProduct();
$_helper = $this->helper('Magento\Catalog\Helper\Output');
$imageBlock = $block->getLayout()->createBlock('Magento\Catalog\Block\Product\Image');
?>
<?php
$viewMode = 'grid';
$image = 'category_page_grid';
$showDescription = false;
$templateType = \Magento\Catalog\Block\Product\ReviewRendererInterface::SHORT_VIEW;
/**
* Position for actions regarding image size changing in vde if needed
*/
$pos = $block->getPositioned();
$position = '';
if ($pos != null) {
$position = ' style="left:' . $block->getVar("{$image}:width") . 'px;'
. 'top:' . $block->getVar("{$image}:height") . 'px;"';
}
?>
<?php if ($_productCollection->getSize()): ?>
<div class="products wrapper <?php echo $viewMode; ?> products-<?php echo $viewMode; ?>">
<?php $iterator = 1; ?>
<ol class="products list items product-items">
<?php /** @var $_product \Magento\Catalog\Model\Product */ ?>
<?php foreach ($_productCollection as $_product): ?><?php //echo "<pre>"; print_r($_product->getData()); exit; ?>
<?php echo($iterator++ == 1) ? '<li class="item product product-item">' : '</li><li class="item product product-item">' ?>
<div class="product-item-info" data-container="product-grid">
<?php // Product Image ?>
<a href="<?php echo $_product->getProductUrl() ?>" class="product photo product-item-photo" tabindex="-1">
<?php echo $imageBlock->init($_product, $image)->toHtml() ?>
</a>
<div class="product details product-item-details">
<?php
$_productNameStripped = $block->stripTags($_product->getName(), null, true);
?>
<strong class="product name product-item-name">
<a class="product-item-link"
href="<?php echo $_product->getProductUrl() ?>">
<?php echo $_helper->productAttribute($_product, $_product->getName(), 'name'); ?>
</a>
</strong>
<?php echo $block->getReviewsSummaryHtml($_product, $templateType); ?>
<?php echo $block->getProductPrice($_product) ?>
<div class="product-item-inner">
<div class="product actions product-item-actions"<?php echo strpos($pos, $viewMode . '-actions') ? $position : ''; ?>>
<div class="actions-primary"<?php echo strpos($pos, $viewMode . '-primary') ? $position : ''; ?>>
<?php if ($_product->isSaleable()): ?>
<?php $postParams = $block->getAddToCartPostParams($_product); ?><?php //echo "<pre>"; print_r($postParams); exit;?>
<form data-role="tocart-form" action="<?php echo $postParams['action']; ?>" method="post">
<input type="hidden" name="product" value="<?php echo $postParams['data']['product']; ?>">
<input type="hidden" name="<?php echo \Magento\Framework\App\Action\Action::PARAM_NAME_URL_ENCODED; ?>" value="<?php echo $postParams['data'][\Magento\Framework\App\Action\Action::PARAM_NAME_URL_ENCODED]; ?>">
<button type="submit"
title="<?php echo $block->escapeHtml(__('Add to Cart')); ?>"
class="action tocart primary">
<span><?php echo __('Add to Cart') ?></span>
</button>
</form>
<?php else: ?>
<?php if ($_product->getIsSalable()): ?>
<div class="stock available"><span><?php echo __('In stock') ?></span></div>
<?php else: ?>
<div class="stock unavailable"><span><?php echo __('Out of stock') ?></span></div>
<?php endif; ?>
<?php endif; ?>
</div>
<div data-role="add-to-links" class="actions-secondary"<?php echo strpos($pos, $viewMode . '-secondary') ? $position : ''; ?>>
<?php if ($this->helper('Magento\Wishlist\Helper\Data')->isAllow()): ?>
<a href="#"
class="action towishlist"
title="<?php echo $block->escapeHtml(__('Add to Wishlist')); ?>"
aria-label="<?php echo $block->escapeHtml(__('Add to Wishlist')); ?>"
data-post='<?php echo $block->getAddToWishlistParams($_product); ?>'
data-action="add-to-wishlist"
role="button">
<span><?php echo __('Add to Wishlist') ?></span>
</a>
<?php endif; ?>
<?php
$compareHelper = $this->helper('Magento\Catalog\Helper\Product\Compare');
?>
<a href="#"
class="action tocompare"
title="<?php echo $block->escapeHtml(__('Add to Compare')); ?>"
aria-label="<?php echo $block->escapeHtml(__('Add to Compare')); ?>"
data-post='<?php echo $compareHelper->getPostDataParams($_product); ?>'
role="button">
<span><?php echo __('Add to Compare') ?></span>
</a>
</div>
</div>
<?php if ($showDescription):?>
<div class="product description product-item-description">
<?php echo $_helper->productAttribute($_product, $_product->getShortDescription(), 'short_description') ?>
<a href="<?php echo $_product->getProductUrl() ?>" title="<?php echo $_productNameStripped ?>"
class="action more"><?php echo __('Learn More') ?></a>
</div>
<?php endif; ?>
</div>
</div>
</div>
</div>
<?php echo($iterator == count($_productCollection)+1) ? '</li>' : '' ?>
<?php endforeach; ?>
</ol>
</div>
<?php endif; ?>
Now you think module is ready but how it displayed in front. Let’s we are displaying the featured product block in home page
In Cms page we will add
{{block class="Stepbystepprograming\Featuredproduct\Block\Featuredproduct" name="feaured" template="list.phtml"}}
Now Refresh the home page. We have sucessfully created the featured product module.
Enjoy the module. :)
Let’s create the featured product module. We will need
app/code/Stepbystepprograming/Featuredproduct/Block
app/code/Stepbystepprograming/Featuredproduct/etc
app/code/Stepbystepprograming/Featuredproduct/Setup
app/code/Stepbystepprograming/Featuredproduct/view/frontend/templates
Now, We have created directory structure for the module. Now we will create the file for this.
1. First we create the configuration file module.xml in app/code/Stepbystepprograming/Featuredproduct/etc
The content for the file will be as:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
<module name="Stepbystepprograming_Featuredproduct" setup_version="2.0.0" />
</config>
2. we create the product attribute named InstallData.php in app/code/Stepbystepprograming/Featuredproduct/Setup
The content for the file should be:
<?php
namespace Stepbystepprograming\Featuredproduct\Setup;
use Magento\Eav\Setup\EavSetup;
use Magento\Eav\Setup\EavSetupFactory;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
class InstallData implements InstallDataInterface
{
/**
* EAV setup factory
*
* @var EavSetupFactory
*/
private $eavSetupFactory;
/**
* Init
*
* @param EavSetupFactory $eavSetupFactory
*/
public function __construct(EavSetupFactory $eavSetupFactory)
{
$this->eavSetupFactory = $eavSetupFactory;
}
public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
{
/** @var EavSetup $eavSetup */
$eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);
/**
* Add attributes to the eav/attribute
*/
$eavSetup->addAttribute(
\Magento\Catalog\Model\Product::ENTITY,
'is_featured',
[
'group' => 'General',
'type' => 'int',
'backend' => '',
'frontend' => '',
'label' => 'Featured Product',
'input' => 'boolean',
'class' => '',
'source' => '',
'global' => \Magento\Catalog\Model\Resource\Eav\Attribute::SCOPE_GLOBAL,
'visible' => true,
'required' => false,
'user_defined' => true,
'default' => '',
'searchable' => false,
'filterable' => false,
'comparable' => false,
'visible_on_front' => false,
'used_in_product_listing' => true,
'unique' => false,
'apply_to' => 'simple,configurable,virtual,bundle,downloadable'
]
);
}
}
3. Create the block file named Featuredproduct.php in app/code/Stepbystepprograming/Featuredproduct/Block
<?php
namespace Stepbystepprograming\Featuredproduct\Block;
use Magento\Catalog\Model\Product;
use Magento\Eav\Model\Entity\Collection\AbstractCollection;
class Featuredproduct extends \Magento\Catalog\Block\Product\AbstractProduct
{
protected $_productcollection;
/**
* @var \Magento\Framework\Url\Helper\Data
*/
protected $urlHelper;
/**
* Catalog product visibility
*
* @var \Magento\Catalog\Model\Product\Visibility
*/
protected $_catalogProductVisibility;
/**
* @var \Magento\Framework\App\Http\Context
*/
// protected $httpContext;
//var $collection;
public function __construct(
\Magento\Catalog\Block\Product\Context $context,
\Magento\Framework\Stdlib\String $string,
\Magento\Catalog\Model\Resource\Product\CollectionFactory $productcollection,
\Magento\Catalog\Model\Product\Visibility $catalogProductVisibility,
\Magento\Framework\Url\Helper\Data $urlHelper,
array $data = []
) {
//$this->string = $string;
$this->_productcollection = $productcollection;
$this->_catalogProductVisibility = $catalogProductVisibility;
$this->urlHelper = $urlHelper;
parent::__construct($context, $data);
}
public function getFeaturedProduct(){
$collection = $this->_productcollection->create()
->addAttributeToFilter('status', '1')
->addAttributeToFilter('is_featured', '1');
$collection->setVisibility($this->_catalogProductVisibility->getVisibleInCatalogIds());
$collection = $this->_addProductAttributesAndPrices($collection)
->setPageSize(4)
->setCurPage(1);
return $collection;
}
/*public function getIdentities()
{
return [\Magento\Catalog\Model\Product::CACHE_TAG];
}*/
/**
* Get post parameters
*
* @param \Magento\Catalog\Model\Product $product
* @return string
*/
public function getAddToCartPostParams(\Magento\Catalog\Model\Product $product)
{
$url = $this->getAddToCartUrl($product);
return [
'action' => $url,
'data' => [
'product' => $product->getEntityId(),
\Magento\Framework\App\Action\Action::PARAM_NAME_URL_ENCODED =>
$this->urlHelper->getEncodedUrl($url),
]
];
}
}
4. Create the featuredprodcut.phtml file in app/code/Stepbystepprograming/Featuredproduct/view/frontend/templates
<h1><?php echo __('Featured Product'); ?></h1>
<?php
$_productCollection = $block->getFeaturedProduct();
$_helper = $this->helper('Magento\Catalog\Helper\Output');
$imageBlock = $block->getLayout()->createBlock('Magento\Catalog\Block\Product\Image');
?>
<?php
$viewMode = 'grid';
$image = 'category_page_grid';
$showDescription = false;
$templateType = \Magento\Catalog\Block\Product\ReviewRendererInterface::SHORT_VIEW;
/**
* Position for actions regarding image size changing in vde if needed
*/
$pos = $block->getPositioned();
$position = '';
if ($pos != null) {
$position = ' style="left:' . $block->getVar("{$image}:width") . 'px;'
. 'top:' . $block->getVar("{$image}:height") . 'px;"';
}
?>
<?php if ($_productCollection->getSize()): ?>
<div class="products wrapper <?php echo $viewMode; ?> products-<?php echo $viewMode; ?>">
<?php $iterator = 1; ?>
<ol class="products list items product-items">
<?php /** @var $_product \Magento\Catalog\Model\Product */ ?>
<?php foreach ($_productCollection as $_product): ?><?php //echo "<pre>"; print_r($_product->getData()); exit; ?>
<?php echo($iterator++ == 1) ? '<li class="item product product-item">' : '</li><li class="item product product-item">' ?>
<div class="product-item-info" data-container="product-grid">
<?php // Product Image ?>
<a href="<?php echo $_product->getProductUrl() ?>" class="product photo product-item-photo" tabindex="-1">
<?php echo $imageBlock->init($_product, $image)->toHtml() ?>
</a>
<div class="product details product-item-details">
<?php
$_productNameStripped = $block->stripTags($_product->getName(), null, true);
?>
<strong class="product name product-item-name">
<a class="product-item-link"
href="<?php echo $_product->getProductUrl() ?>">
<?php echo $_helper->productAttribute($_product, $_product->getName(), 'name'); ?>
</a>
</strong>
<?php echo $block->getReviewsSummaryHtml($_product, $templateType); ?>
<?php echo $block->getProductPrice($_product) ?>
<div class="product-item-inner">
<div class="product actions product-item-actions"<?php echo strpos($pos, $viewMode . '-actions') ? $position : ''; ?>>
<div class="actions-primary"<?php echo strpos($pos, $viewMode . '-primary') ? $position : ''; ?>>
<?php if ($_product->isSaleable()): ?>
<?php $postParams = $block->getAddToCartPostParams($_product); ?><?php //echo "<pre>"; print_r($postParams); exit;?>
<form data-role="tocart-form" action="<?php echo $postParams['action']; ?>" method="post">
<input type="hidden" name="product" value="<?php echo $postParams['data']['product']; ?>">
<input type="hidden" name="<?php echo \Magento\Framework\App\Action\Action::PARAM_NAME_URL_ENCODED; ?>" value="<?php echo $postParams['data'][\Magento\Framework\App\Action\Action::PARAM_NAME_URL_ENCODED]; ?>">
<button type="submit"
title="<?php echo $block->escapeHtml(__('Add to Cart')); ?>"
class="action tocart primary">
<span><?php echo __('Add to Cart') ?></span>
</button>
</form>
<?php else: ?>
<?php if ($_product->getIsSalable()): ?>
<div class="stock available"><span><?php echo __('In stock') ?></span></div>
<?php else: ?>
<div class="stock unavailable"><span><?php echo __('Out of stock') ?></span></div>
<?php endif; ?>
<?php endif; ?>
</div>
<div data-role="add-to-links" class="actions-secondary"<?php echo strpos($pos, $viewMode . '-secondary') ? $position : ''; ?>>
<?php if ($this->helper('Magento\Wishlist\Helper\Data')->isAllow()): ?>
<a href="#"
class="action towishlist"
title="<?php echo $block->escapeHtml(__('Add to Wishlist')); ?>"
aria-label="<?php echo $block->escapeHtml(__('Add to Wishlist')); ?>"
data-post='<?php echo $block->getAddToWishlistParams($_product); ?>'
data-action="add-to-wishlist"
role="button">
<span><?php echo __('Add to Wishlist') ?></span>
</a>
<?php endif; ?>
<?php
$compareHelper = $this->helper('Magento\Catalog\Helper\Product\Compare');
?>
<a href="#"
class="action tocompare"
title="<?php echo $block->escapeHtml(__('Add to Compare')); ?>"
aria-label="<?php echo $block->escapeHtml(__('Add to Compare')); ?>"
data-post='<?php echo $compareHelper->getPostDataParams($_product); ?>'
role="button">
<span><?php echo __('Add to Compare') ?></span>
</a>
</div>
</div>
<?php if ($showDescription):?>
<div class="product description product-item-description">
<?php echo $_helper->productAttribute($_product, $_product->getShortDescription(), 'short_description') ?>
<a href="<?php echo $_product->getProductUrl() ?>" title="<?php echo $_productNameStripped ?>"
class="action more"><?php echo __('Learn More') ?></a>
</div>
<?php endif; ?>
</div>
</div>
</div>
</div>
<?php echo($iterator == count($_productCollection)+1) ? '</li>' : '' ?>
<?php endforeach; ?>
</ol>
</div>
<?php endif; ?>
Now you think module is ready but how it displayed in front. Let’s we are displaying the featured product block in home page
In Cms page we will add
{{block class="Stepbystepprograming\Featuredproduct\Block\Featuredproduct" name="feaured" template="list.phtml"}}
Now Refresh the home page. We have sucessfully created the featured product module.
Enjoy the module. :)
No comments:
Post a Comment