Widget is a manageable component of Magento 2, which allows users to display data anywhere on their own front-end site.
So are you looking for the way how to create a widget in Magento 2?
You’re welcome!
In this blog, I would like to share with you the detailed procedure of adding a custom widget that can show a list of Instagram photos on your store’s front-end as a particular example for my instruction.
Table of Contents
How to Create a widget in Magento 2 in 5 steps
Step 1: Setting up Module
First, we need to create a custom module.
- Create a registration file: your_magento_base/app/code/Magenest/InstagramShop/resgistration.php
<?php \Magento\Framework\Component\ComponentRegistrar::register( \Magento\Framework\Component\ComponentRegistrar::MODULE, 'Magenest_InstagramShop', __DIR__ );
- Create file: your_magento_base/app/code/Magenest/InstagramShop/etc/module.xml
<config xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="Magenest_InstagramShop" setup_version="1.0.0"> <sequence> <module name="Magento_CatalogWidget"/> </sequence> </module> </config>
- Create file: your_magento_base/app/code/Magenest/InstagramShop/composer.json
{ "name": "magenest/module-instagram-shop", "description": "N/A", "require": { "php": "~5.5.22|~5.6.0|7.0.2|7.0.4|~7.0.6" }, "type": "magento2-module", "version": "1.0.0", "license": [ "OSL-3.0", "proprietary" ], "autoload": { "files": [ "registration.php" ], "psr-4": { "Magenest\\InstagramShop\\": "" } } }
Step 2: Declare new Widget
Initialize your widget by creating the file : Magenest/InstagramShop/etc/widget.xml
<?xml version="1.0" encoding="UTF-8"?> <widgets xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Widget:etc/widget.xsd"> <widget id="instagram_photo_slider" class="Magenest\InstagramShop\Block\Photo\Slider" placeholder_image="Magento_Widget::placeholder.gif"> <label translate="true">Instagram Slider</label> <description translate="true">List of Photos on Instagram Account</description> <parameters> <parameter name="title" xsi:type="text" required="true" visible="true"> <label translate="true">Title</label> </parameter> <parameter name="template" xsi:type="select" required="true" visible="true"> <label translate="true">Template</label> <options> <option name="default" value="slider/slider.phtml" selected="true"> <label translate="true">Photo List slider</label> </option> </options> </parameter> </parameters> </widget> </widgets>
- As in this file, the class=”Magenest\InstagramShop\Block\Photo\Slider” is the block file we’re gonna create later, and value=”slider/slider.phtml” is the widget’s template file.
Step 3: Add Widget Block
Follow this path Magenest/InstagramShop/Block/Photo and create a file named Slider.php to add block class for our widget:
<?php namespace Magenest\InstagramShop\Block\Photo; class Slider extends \Magento\Framework\View\Element\Template { /** * @var \Magenest\InstagramShop\Model\PhotoFactory */ protected $_photoFactory; /** * Slider constructor. * @param \Magento\Framework\View\Element\Template\Context $context * Paramus \Magenest\InstagramShop\Model\PhotoFactory $photoFactory * @param array $data */ public function __construct( \Magento\Framework\View\Element\Template\Context $context, \Magenest\InstagramShop\Model\PhotoFactory $photoFactory, array $data = [] ) { $this->_photoFactory = $photoFactory; parent::__construct($context, $data); } /** * @return $this */ public function getPhotos() { return $this->_photoFactory->create() ->getCollection() ->setOrder('id', 'DESC') ->setPageSize(30) ->setCurPage(1); } }
- This is where we’re gonna call to get some Images Data to display.
Step 4: Create Widget Template
File template: Magenest/InstagramShop/view/frontend/templates/slider/slider.phtml
<?php /** * @var $block \Magenest\InstagramShop\Block\Photo\Slider */ $photos = $block->getPhotos(); ?> <div class="block block-photo-slider slider-list"> <div class="block-title"> <h2><?php echo $block->getTitle() ?></h2> </div> <div class="block-content"> <?php if ($photos->getSize() > 0) { ?> <div class="photo-slider"> <?php foreach ($photos as $photo) { ?> <div class="photo"> <a href="<?php echo $photo->getUrl() ?>" target="_blank"> <img src="<?php echo $photo->getSource() ?>" alt="image" width="250" height="250"/> <img style="float: left;" src="//i.imgur.com/nZYx1YJ.jpg" alt="likes:" width="27" height="27"> <span style="float:left; height: 27px; margin-right: 7px; line-height: 27px; font-size:22px; color:black"><?php echo $photo->getLikes() ?></span> <img style="float: left;" src="//i.imgur.com/fHIOmkv.jpg" alt="likes:" width="27" height="27"> <span style="float:left; height: 27px; margin-right: 7px; line-height: 27px; font-size:22px; color:black"><?php echo $photo->getComments() ?></span> </a> </div> <?php } ?> </div> <?php } ?> </div> </div>
- This is where the content of the widget is.
And we’re done for the coding path. Let’s move on with the configuration on the Magento Backend.
Step 5: Configuration and Result
- Go to Magento Backend => Content => Widget => Add new
- Choose Type as Instagram Slider and Choose your Design theme.
- This is where you choose to display the Widget. For example, we chose Main Content Top on All Pages.
- On Widget Options tab, enter the title of the widget.
- Press Save, flush your Magento cache and let’s go to your front-end site to see the final result.
Bravo! You just created a slide of Instagram photos on your store’s front end. Pretty easy, right?
Hope this topic is helpful to you. If you need help setting up and configuring a widget on your Magento 2 store, or you’d like to gain more knowledge about our Magento development services, don’t hesitate to reach out! We are proud to offer the highest quality services at a competitive price – a pledge that can be seen in every service we provide.