Infinite Scroll: Magento 2 Ajax Scroll for The Automatically Load Products

I am going to explain how we can create an Ajax Infinite Scroll extension in Magento 2. The extension will help the value of users to reduce product load time by automatically loading products when users scroll down the product list page like category page, catalog search page without reloading the whole page.

Infinite Scroll in Magento 2

The Ajax scroll extension for Magento 2 helps the website's owners to increase their sales and drive more revenue by improving the user experience.

As soon as you enable the Wishusucess_InfiniteScroll extension from the admin then you will be automatically able to add the autoload product functionality on the category page or any other product list page like a catalog search page in Magento 2.

 

Infinite Scroll Features:

By adding automatically loading of the product it increases the quality of user experience and reduces the product loading time.

Ensure the web site's performance by adding autoload functionality.

Easy to navigate the product for the customer.

Adds Automatically loads functionality for the products on any others products listing page.

If the list page doesn't have more products then it shows a message like there are no more products to load after loading all products.

Admin configuration is given to customizing loading text content.

Admin can decide the delay time from the Magento admin for scroll-down loading time.

Improve customer experience for the owners of the website and increase the conversion rate.

You can add for the multi-store environment.

Magento 2 Infinite Scroll Products

Magento 2 Infinite Scroll Free Extensions in 2022

In 2021-2022 there are too many infinite scroll extensions are there in the market but we have picked one of the best ajax scroll products for your websites.

Wishusucess_InifiniteScroll is one of the best Magento 2 modules for the infinite automatically loading products.

The best Ajax Scroll for the products is Wishusucess automatically scroll products in 2021, This is an absolutely free extension. You can also Find more Magento 2 extensions here.

Infinite Scroll Button

Change Configuration of Ajax Scroll

You will have the option to change the configuration from the admin. This extension allows websites owners to customize the button color and text from the Admin > Store > Configuration > Wishusucess > Ajax Scroll.

 

Helper Class of Ajax Scroll

If you are a developer and you need to implement the helper class of this module then you can use the bewlow code for the help.

<?php
/**
* Category: Wishusucess_InfiniteScroll
* Developer: Hemant Singh Magento 2x Developer
* Website: http://wwww.wishusucess.com
*/
namespace Wishusucess\InfiniteScroll\Helper;

class Data extends \Magento\Framework\App\Helper\AbstractHelper
{
/**
* @var array
*/
protected $configModule;

public function __construct(
\Magento\Framework\App\Helper\Context $context
)
{
parent::__construct($context);
$this->configModule = $this->getConfig(strtolower($this->_getModuleName()));
}

public function getConfig($cfg='')
{
if($cfg) return $this->scopeConfig->getValue( $cfg, \Magento\Store\Model\ScopeInterface::SCOPE_STORE );
return $this->scopeConfig;
}

public function getConfigModule($cfg='', $value=null)
{
$values = $this->configModule;
if( !$cfg ) return $values;
$config = explode('/', $cfg);
$end = count($config) - 1;
foreach ($config as $key => $vl) {
if( isset($values[$vl]) ){
if( $key == $end ) {
$value = $values[$vl];
}else {
$values = $values[$vl];
}
}

}
return $value;
}
}

Magento 2.4 Installation Guide: How to Install Magento 2.4.2

How to Install Infinite Scroll Module

Download this module from here and paste it into the below directory of your store root installation directory.

app/code/Wishusucess/InfiniteScroll/

Now run the below code

php bin/magento setup:upgrade

php bin/magento setup:di:compile

php bin/magento setup:static-content:deploy -f

php bin/magento cache:clean

 

Similar Magento 2 Extensions of Wishusucess

Sticky Mini-Cart: How To Add Sticky Add to Cart Extension in Magento 2

Speed Up Your Magento 2 Website By Lazy Loading Extension Free

Login With Number: Magento 2 Customer Login With Mobile Number

Sticky Mini-Cart: How To Add Sticky Add to Cart Extension in Magento 2

In this article, I will explain to you how to add the sticky mini-cart on the current page. This step will help you to make users add to the cart always visible for easier checkout.

When a Magento 2 user scrolls down the current category page, home page, or product details page then this sticky cart extension will allow you to make "Add to cart" always visible for the customer so the customer can easily add more items or subtract items from the cart.

Magento 2 Sticky Mini-Cart

The Customers will also have the option to view a brief of product detail such as images, prices.

If the customer is looking for any change while scrolling the category page or product list page then they no need to scroll back to the top because the cart bar is always visible.

Therefore, this Magento 2 sticky cart extension will add value for your website customers by adding the above extremely convenient shopping experience to the users. Thus this functionality helps store owners to increase sales.

And where customers sometimes used to leave in the middle without completing the checkout, they will now be able to place their order easily.

 

Sticky Mini-Cart for The Magento Customer

The Sticky cart for the customer adds value to the customer experiance, it fixes the customer mini cart details at the bottom of the page when the page is scrolled down which leads to improves user experience.

This extension was implemented by the Wishusucess Magento development team that increase the conversion rate by encouraging customers to add products to the cart or buy now button.

 

Features of Magento Sticky Mini-Cart

The website admin panel has been implemented in such a way that anyone can manage the panel of Wishusucess_Stickycart without any coding knowledge.

We have added Enabled/Disable the features of the Wishusucess_Stickycart quickly from the admin.

Customers can view a brief of the details while scrolling the store page and also can manage their mini-cart details by just clicking on the icons.

Admin users can customize the size requirement from the admin panel of the product images.

The module is completely implemented as a responsive design so you don't have to worry about the different devices like mobiles, tablets, laptops. The module will readjust itself based on the original layout.

 

Helper Class of Sticky Cart in Magento 2

Hereby using this helper class of sticky cart you can implement the custom module for the Magento websites.

<?php
/*
* @category: Wishusucess_Stickycart
* @Wishusucess: (http://www.wishusucess.com/)
* @licence: http://www.wishusucess.com/
*/
namespace Wishusucess\Stickycart\Helper;

class Data extends \Magento\Framework\App\Helper\AbstractHelper
{
/**
* @var array
*/
protected $configModule;

/**
* @var \Magento\Framework\Json\Helper\Data
*/
protected $jsonHelper;

public function __construct(
\Magento\Framework\App\Helper\Context $context,
\Magento\Framework\Json\Helper\Data $jsonHelper
)
{
parent::__construct($context);
$this->configModule = $this->getConfig(strtolower($this->_getModuleName()));
$this->jsonHelper = $jsonHelper;
}

public function getConfig($cfg='')
{
if($cfg) return $this->scopeConfig->getValue( $cfg, \Magento\Store\Model\ScopeInterface::SCOPE_STORE );
return $this->scopeConfig;
}

public function getConfigModule($cfg='', $value=null)
{
$values = $this->configModule;
if( !$cfg ) return $values;
$config = explode('/', $cfg);
$end = count($config) - 1;
foreach ($config as $key => $vl) {
if( isset($values[$vl]) ){
if( $key == $end ) {
$value = $values[$vl];
}else {
$values = $values[$vl];
}
}

}
return $value;
}

public function isEnabled()
{
return $this->getConfigModule('general/enabled');
}
public function getWidthImage()
{
return $this->getConfigModule('general/width_image');
}
public function getHeightImage()
{
return $this->getConfigModule('general/height_image');
}
public function getHeightScroll()
{
return $this->getConfigModule('general/height_scroll');
}

public function getExcludeProducts()
{
return $this->getConfigModule('general/exclude_products');
}

public function getStickyCartConfigJson($product)
{ 
$data = [
"typeProduct" => $product->getTypeId(),
"scrollHeight" => $this->getConfigModule('general/height_scroll'),
"hiddenBottom" => $this->getConfigModule('general/hidden_bottom')
];
foreach ($data as $key => $value) {
if(is_numeric($value)){
$data[$key] = (float) $value;
continue;
}
$value = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
if(!is_null($value)){
$data[$key] = $value; 
}
}
return $this->jsonHelper->jsonEncode($data);
}

}

 

How to Install Magento 2 Wishusucess Sticky Mini-Cart

Download the module and paste it into the below directory:

root_directory_of store/app/code/Wishusucess/Stickycart/

Now run the below command step by step:-

php bin/magento setup:upgrade

php bin/magento setup:di:compile

php bin/magento setup:static-content:deploy -f

php bin/magento cache:clean

 

Help And Support by Magento Team

In case of any problem, you can talk to our Magento 2 development team. Basic installation is absolutely free.

If you want to add any new features to it, then our team is available 24 hours for this, you can tell your requirement to our development team and within 24 hours your features will be implemented.

 

Similar Module

Speed Up Your Magento 2 Website By Lazy Loading Extension Free

Login With Number: Magento 2 Customer Login With Mobile Number

 

Speed Up Your Magento 2 Website By Lazy Loading Extension Free

This is the biggest problem for most of the Magento 2 website owners, how to provide a better experience to their customers, it is necessary to eliminate its lazy loading problem, because if the website loading time is higher then that would be worse for your customer to experience the website.

Our Magento team understands this problem and has developed Magento 2 Lazy Load extension which provides a better experience for your customer.

It minimizes the loading problem of your website, due to which your website loads very quickly on your customer's computer and it also helps you to be at the top of the search.

The biggest contributor to its success in any online eCommerce business is its better application and it is very important for that application to load on the customer's device quickly and efficiently.

 

Magento 2 Lazy Loading Module

By using this Magento 2 Lazy Loading extension of the Wishusucess developer team you can boost your website performance up to 70% of your current speed.

Therefore, it will increase the chances that your customers will stay on your website for a long time. Then customers will want to browse most of your pages that also increases the sales of your products.

It will also help your website to rank in google because of the faster speed of your website because a faster website also adds the improvement of SEO ranking.

Especially, the Wishusucess LazyLoading module works effectively with all Magento 2 pages such as Content Management pages, the home pages, category pages, product pages, etc.

Lazy Loading Module in Magento 2

 

Lazy Loading Adds Business Values:

It reduces the page load so faster websites Improve the user experience greatly by consuming less load time.

A faster website adds value in the search engine rank like google so it will improve the SEO ranking of your website with faster loading speed.

This module will help you to reduce the bandwidth of the server to it will save you money.

 

Lazy Loading Product Image in Magento 2

With Wishusucess Lazy Load Extension in Magento 2 website helps websites owners to speed up their websites. It will help you to decrease the load time of the product images.

 

Optimize SEO for Magento 2 Stores

Faster websites improve the SEO ranking in google so it will help your website to rank in Google Search. Wishusucess Lazy Load Magento 2 extension results improve the SEO ranking in faster website speed.

Reduce server bandwidth
By loading images and videos on-demand, you can reduce server requests and page size. This will certainly save a huge amount of bandwidth for your website.

Apply Lazy Loading on All Pages

We have designed it in such a way that this extension works for all kinds of pages including CMS pages, home pages, category pages, product pages, etc.

Download LazyLoading Extension

 

Magento Helps and Supports

If you want to improve your e-commerce website or want to make it completely new then you can contact our team. Our team is committed to providing you with the best experience at the lowest cost.

Improve SEO Ranking of your Website

 

Other Post:

PayPal Account: How to Create New PayPal Account, Transfer

 

Login With Number: Magento 2 Customer Login With Mobile Number

In this article, I am going to explain how to implement Magento 2 login customer via phone number functionality in Magento 2 and onwards version.

As we want to add the customer log-in functionality for the customer login with numbers like phone numbers or mobile numbers with the same fields.

So, in order to achieve this functionality, we have to implement the module.

Customer Login With Number in Magento 2

 

Why Customer Login With Phone Number?

When a customer wants to log in with the email then the customer will be able to log in or if the customer wants to login via their phone number then also that can be login.

Today everyone has a lack of time in this digital era, in such a situation, if we do not provide various facilities to our customers, then our customers will leave us.

That's why keeping in mind our customers, we cannot harass them by filling the registration form again and again.

They should have so much facility that they can log in as they want.

The Magento development company named Wishusucess.com has developed a module that can help your customer to log in via their mobile number or phone number or email id and password.

This module has important features that include Magento store customers can save their number while registration of their account, and they will also have the facilities to log in to their account and update their mobile number or phone number from their My Account section.

 

Features of Customer Log Via Number:

Customers can log in via their email or phone number or mobile number or both.

This customer login via the Mobile number module can be enabled or disabled from the admin panel.

Customers also can save their number while registering or after the registration from the My Account sections dashboard.

Allows customers to change their registered mobile number from their "My Account" section

Admin will have the option in the backend to view and update any customer number or phone number.

While checkout the product order customer also can log in via their mobile number or phone number.

Customer Login Via Mobile Number

Download the Module  From GitHub

Current Product Version - 2.4.x

Supported Framework Version - Magento 2.0.x, 2.1.x, 2.2.x,2.3.x, 2.4.x

Admin > Customers > All Customer > Account Information Magento 2 Customer Login With Number

 

Sorting Products: Magento 2 REST API For Sort By Product on List Page

 

Customer Account Information

However, Navigating into the admin panel

Customers > All Customers and view the list of customers.

You can also directly edit the customer numbers from this dashboard section.Customer Login With Number

Customer Image: Upload Customer Profile Pic Image Module in Magento 2

Customer Attribute: How to Add Custom Customer Attribute in Magento 2

 

Customer Attribute: How to Add Custom Customer Attribute in Magento 2

This article is all about creating custom customer attribute so here, I am going to explain this. Magento 2 custom attributes provide you the options to add additional required fields for the customer. So by adding this custom field in customer you can collect information that is required to support the order, fulfillment, and customer management processes.

Add Customer Attribute in Magento 2

Do you want to provide the best service for your customers in your business? so, you might need some additional fields to collect information.

By installing this custom customers attributes module of Wishusucess you can add custom attributes to the Account Registration of the customer, Address Book, and Billing Information.

 

How to Add Custom Attribute in Customer Account

If you want to add extra fields in the customer registration page, then for that you have to create a file named setup install data and in that, you have to set the field type keeping in mind the requirements of your attribute.

Wishusucess/CustomerAttribute/registration.php

Wishusucess/CustomerAttribute/etc/module.xml

Wishusucess/CustomerAttribute/Setup/InstallData.php

As soon as you create these three files your model will be ready and after that, you have to run the command to install the Magento model.

For example, you want to add a mobile number or phone number or some other required field to the customer account page. So you just have to follow the following code to create a field for custom attributes.

Let’s follow the below steps to Create a Custom Attribute in Magento 2 :

You may also like this :

How to Override Block, Controller, and Model in Magento 2

 

Step 1: Create Customer Attribute Registration File

app/code/Wishusucess/CustomerAttribute/registration.php

<?php
/**
* Category: Wishusucess_CustomerAttribute',
* Developer: Hemant Singh Magento 2x Developer
* Website: http://wwww.wishusucess.com
*/
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Wishusucess_CustomerAttribute',
__DIR__
);

 

Step 2: Create Module XML File

app/code/Wishusucess/CustomerAttribute/etc/module.xml

<?xml version="1.0"?>
<!--
/**
* Category: Wishusucess_CustomerAttribute',
* Developer: Hemant Singh Magento 2x Developer
* Website: http://wwww.wishusucess.com
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Wishusucess_CustomerAttribute" setup_version="1.0.7" />
</config>

 

Step 3: InstallData.php File For Customer Custom Attribute

Here, you can decide your custom customer attribute identifier name, label, and others properties types.

So you have to enter an attribute code to identify the Magento 2 attribute within the system.

There is some default rule that needs to follow while creating your InstallData PHP file.

While adding custom attributes your attribute code must begin with a letter and can include any combination of lowercase letters (a-z) and numbers (0-9).

The custom attribute code can not be greater than thirty characters in length, and also you have to keep in mind that you cannot include any special characters or spaces.

The underscore character (_) we can use while defining the name.

app/code/Wishusucess/CustomerAttribute/Setup/InstallData.php

<?php
/**
* Category: Wishusucess_CustomerAttribute
* Developer: Hemant Singh Magento 2x Developer
* Website: http://wwww.wishusucess.com
*/ 
namespace Wishusucess\CustomerAttribute\Setup;

use Magento\Customer\Setup\CustomerSetupFactory;
use Magento\Customer\Model\Customer;
use Magento\Eav\Model\Entity\Attribute\Set as AttributeSet;
use Magento\Eav\Model\Entity\Attribute\SetFactory as AttributeSetFactory;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;

/**
* Install data
* @codeCoverageIgnore
*/
class InstallData implements InstallDataInterface
{

/**
* CustomerSetupFactory
* @var CustomerSetupFactory
*/
protected $customerSetupFactory;

/**
* $attributeSetFactory
* @var AttributeSetFactory
*/
private $attributeSetFactory;

/**
* initiate object
* @param CustomerSetupFactory $customerSetupFactory
* @param AttributeSetFactory $attributeSetFactory
*/
public function __construct(
CustomerSetupFactory $customerSetupFactory,
AttributeSetFactory $attributeSetFactory
)
{
$this->customerSetupFactory = $customerSetupFactory;
$this->attributeSetFactory = $attributeSetFactory;
}

/**
* install data method
* @param ModuleDataSetupInterface $setup
* @param ModuleContextInterface $context
*/
public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
{

/** @var CustomerSetup $customerSetup */
$customerSetup = $this->customerSetupFactory->create(['setup' => $setup]);

$customerEntity = $customerSetup->getEavConfig()->getEntityType('customer');
$attributeSetId = $customerEntity->getDefaultAttributeSetId();

/** @var $attributeSet AttributeSet */
$attributeSet = $this->attributeSetFactory->create();
$attributeGroupId = $attributeSet->getDefaultGroupId($attributeSetId);
/**
* customer registration form default field mobile number
*/
$customerSetup->addAttribute(Customer::ENTITY, 'wishusucess_customerattribute', [
'type' => 'varchar',
'label' => 'Wishusucess Customer Attribute',
'input' => 'text',
'required' => false,
'visible' => true,
'user_defined' => true,
'sort_order' => 1000,
'position' => 1000,
'system' => 0,
]);
//add attribute to attribute set
$attribute = $customerSetup->getEavConfig()->getAttribute(Customer::ENTITY, 'wishusucess_customerattribute')
->addData([
'attribute_set_id' => $attributeSetId,
'attribute_group_id' => $attributeGroupId,
'used_in_forms' => ['adminhtml_customer', 'customer_account_create'],
]);

$attribute->save();


}
}

 

Now, you need to run the below Magento 2 command to get install your custom attribute module.

php bin/magento s:up

php bin/magento s:s:d -f

php bin/magento c:c

 

Now you can see the result in

Admin > All Customer > Customer Name 

Magento 2 Custom Attribute

Download This Module

 

Suggested Post:

Cart Images: Get Product Image in Customer Cart Magento 2 REST API

How to Send Push Notifications on Android Application

Product Alert API: Get Magento 2 Product Alert Using API

Top Magento 2 Free Extension For Banner Image Slider

In this article, I am going to explain how we can add banner image sliders on the home page, category page, cms page, or block page in Magento 2 websites.

Wishusucess Magento 2 Banner Slider Free Extension

This extension helps you t add a banner image in your store which makes your store beautiful and appealing to the customer through installing a Wishusucess free banner slider extension.

By adding these slideshows extension websites look wonderful with magnificent slide effects with Magento 2 Wishusucess free module.

 

Wishusucess Banner Image Sliders

Allows you to create a banner for your stores and you can call that banner anywhere to promote your website. By adding these banner images usually, we can show the target information to the customer.

Moreover, the Wishusucess slider extension makes your store beautiful and attractive.

  • No needs to add extra code in your store.
  • very little time takes to add your banner slider Images on your desire pages.
  • Sliders banner Improve customer experience.
  • By adding this banner you can target specific information for the customer.
  • Banner to introduce business
  • Increase Click-Through-Rate(CTR) by installing this banner module. so its increases promotions and sales.T
  • No other dependencies are required.
  • Wishusucess banner Images extension is compatible with all Magento 2 versions, from Magento 2.0, Magento 2.1, Magento 2.2, Magento 2.3, Magento 2.4, etc.

 

Banner Images Sliders Compatibility

There is no other coding is required so, you can use the Banner Slider extension on any page like you can use it for Home Page Banner Slider, category page banner slider, cms page banner slider, block images slider.

 

Advantages of Wishusucess Banner Image Sliders

You can make your store too attractive just by installing this module. So when you add this slider you will have the option to make it appealing and informative for the customer.

  • Attractive slideshows

When the banner is informative and attractive then customers can easily get engaged with the product and that will increase sales Because it attracts customers' attention through the informative image.

  • Customers always pay attention to moving images.

With a gorgeous banner image slideshow, your store will have the extra capabilities to grab the attention of your customers.

It provides an images slider flexibly so you can add any page on your store like homepage, category page, product page, CMS page.

- It has the extra customization functionality in admin so you can increase the slider speed or decrease the slider speed.

 

How to Install Magento 2 Banner Slider Extension

Just visit our official Github directory and download the  Wishusucess Slider Extension and paste it into your Magento root app/code directory.

Download Wishusucess Images Slider

 

Run The Following Command in Magento 2 Root Folder:

php bin/magento setup:upgrade

php bin/magento setup:di:compile

php bin/magento setup:static-content:deploy -f

php bin/magento cache:clean

 

Hire Magento 2 Developers for your Stores

Banner image Sliders in Magento 2

You can add image video, image as a banner slider

Also, you can change the configuration of sliders.

Magento 2 Banner Image Sliders

 

Related Post:

Shipping Address API: Customer Shipping Details Using API in Magento 2

File Permissions: Magento 2 Ownership And File Permission At Installation

 

Recommended Post:

Magento 2.4 Installation Guide: How to Install Magento 2.4.2

Categories API Key: Get All Category List Through API Key in Magento 2

This article will help you to get all category list through the API key on the frontend. When we develop a mobile application using Magento for online shopping websites then we need this kind of module to load all the categories data. Using these Categories API key extensions of Magento 2 you will be easily able to get the data.

Categories API Key in Magento 2

 

Custom Categories API key Module To Get Data

In this Magento 2 module, we will show you how you can create Magento 2 extension to get the categories data from a Magento online shopping store through REST API.

Therefore, we have to use a tool to get access to the Magento 2 store data.

So first get the category list we have to create a token that will allow you to get access the Magento 2 website data.

Endpoint:

“http://www.wishusucess.com/rest/V1/integration/admin/token”
app/code/Wishuscess/CategoriesList/registration.php

app/code/Wishuscess/CategoriesList/etc/module.xml

app/code/Wishuscess/CategoriesList/etc/di.xml

app/code/Wishuscess/CategoriesList/etc/webapi.xml

app/code/Wishuscess/CategoriesList/Model/CategoryManagement.php

app/code/Wishuscess/CategoriesList/Model/Category/Tree.php

app/code/Wishuscess/CategoriesList/Api/CategoryManagementInterface.php

app/code/Wishuscess/CategoriesList/Data/CategoryTreeInterface.php

 

Step 1 : Register Categories API Key Module

app/code/Wishuscess/CategoriesList/registration.php

<?php
/**
* Developer:Wishuscess Magento 2x Developer Team
* Module: Wishuscess_CategoriesList
* Author: Hemant Singh Magento 2X Developer
* Website: http://www.wishusucess.com/
*
*/
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Wishuscess_CategoriesList',
__DIR__
);

 

Step: 2

app/code/Wishuscess/CategoriesList/etc/module.xml

<?xml version="1.0"?>
/**
* Developer:Wishuscess Magento 2x Developer Team
* Module: Wishuscess_CategoriesList
* Author: Hemant Singh Magento 2X Developer
* Website: http://www.wishusucess.com/
*
*/
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Wishusucess_CategoriesList" setup_version="1.0.0">
<sequence>
<module name="Magento_Catalog"/>
</sequence>
</module>
</config>

 

Step 3: Define Dependency of Categories API Key

app/code/Wishuscess/CategoriesList/etc/di.xml

<?xml version="1.0" ?>
/**
* Developer:Wishuscess Magento 2x Developer Team
* Module: Wishuscess_CategoriesList
* Author: Hemant Singh Magento 2X Developer
* Website: http://www.wishusucess.com/
*
*/
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Wishusucess\CategoriesList\Api\CategoryManagementInterface" type="Wishusucess\CategoriesList\Model\CategoryManagement"></preference>
</config>

 

Step 4: Create Categories List Web API

Wishuscess_CategoriesList Magento Web API will help you define your route id that can communicate with your Magento shopping website. So here we will get all category data using these APIs.

app/code/Wishuscess/CategoriesList/etc/webapi.xml

<?xml version="1.0"?>
/**
* Developer:Wishuscess Magento 2x Developer Team
* Module: Wishuscess_CategoriesList
* Author: Hemant Singh Magento 2X Developer
* Website: http://www.wishusucess.com/
*
*/
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd">
<route url="/V1/wishusucess/categories" method="GET">
<service class="Wishusucess\CategoriesList\Api\CategoryManagementInterface" method="getTree" />
<resources>
<resource ref="Magento_Catalog::categories" />
</resources>
</route>
</routes>

 

Step 5: Create API Category Management

app/code/Wishuscess/CategoriesList/Model/CategoryManagement.php

<?php
/**
* Developer:Wishuscess Magento 2x Developer Team
* Module: Wishuscess_CategoriesList
* Author: Hemant Singh Magento 2X Developer
* Website: http://www.wishusucess.com/
*
*/
namespace Wishusucess\CategoriesList\Model;
use Wishusucess\CategoriesList\Api\CategoryManagementInterface;
use Wishusucess\CategoriesList\Model\Category\Tree;

class CategoryManagement extends \Magento\Catalog\Model\CategoryManagement
implements CategoryManagementInterface
{
/**
* @var CategoryRepository
*/
protected $categoryRepository;

/**
* @var Tree
*/
protected $categoryTree;

/**
* @var \Magento\Catalog\Model\ResourceModel\Category\CollectionFactory
*/
private $categoriesFactory;

/**
* @param \Magento\Catalog\Api\CategoryRepositoryInterface $categoryRepository
* @param Tree $categoryTree
* @param \Magento\Catalog\Model\ResourceModel\Category\CollectionFactory $categoriesFactory
*/
public function __construct(
\Magento\Catalog\Api\CategoryRepositoryInterface $categoryRepository,
Tree $categoryTree,
\Magento\Catalog\Model\ResourceModel\Category\CollectionFactory $categoriesFactory
) {
$this->categoryRepository = $categoryRepository;
$this->categoryTree = $categoryTree;
$this->categoriesFactory = $categoriesFactory;
}


}

 

Retrieve Category Data in Tree Structure Magento 2

app/code/Wishuscess/CategoriesList/Model/Category/Tree.php

<?php
/**
* Developer:Wishuscess Magento 2x Developer Team
* Module: Wishuscess_CategoriesList
* Author: Hemant Singh Magento 2X Developer
* Website: http://www.wishusucess.com/
*
*/
namespace Wishusucess\CategoriesList\Model\Category;

/**
* Retrieve category data represented in tree structure
*/
class Tree
{
/**
* @var \Magento\Catalog\Model\ResourceModel\Category\Tree
*/
protected $categoryTree;

/**
* @var \Magento\Store\Model\StoreManagerInterface
*/
protected $storeManager;

/**
* @var \Magento\Catalog\Model\ResourceModel\Category\Collection
*/
protected $categoryCollection;

/**
* @var \Magento\Catalog\Api\Data\CategoryTreeInterfaceFactory
*/
protected $treeFactory;

/**
* @var \Magento\Catalog\Model\Indexer\Category\Flat\State
*/
protected $flatState;

/**
* @param \Magento\Catalog\Model\ResourceModel\Category\Tree $categoryTree
* @param \Magento\Store\Model\StoreManagerInterface $storeManager
* @param \Magento\Catalog\Model\ResourceModel\Category\Collection $categoryCollection
* @param \Magento\Catalog\Api\Data\CategoryTreeInterfaceFactory $treeFactory
*/
public function __construct(
\Magento\Catalog\Model\ResourceModel\Category\Tree $categoryTree,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Catalog\Model\ResourceModel\Category\Collection $categoryCollection,
\Magento\Catalog\Model\Indexer\Category\Flat\State $flatState,
\Magento\Catalog\Api\Data\CategoryTreeInterfaceFactory $treeFactory
) {
$this->categoryTree = $categoryTree;
$this->storeManager = $storeManager;
$this->categoryCollection = $categoryCollection;
$this->treeFactory = $treeFactory;
$this->flatState = $flatState;
}

/**
* @param \Magento\Catalog\Model\Category|null $category
* @return Node|null
*/
public function getRootNode($category = null)
{
if ($category !== null && $category->getId()) {
return $this->getNode($category);
}

$store = $this->storeManager->getStore();
$rootId = $store->getRootCategoryId();

$tree = $this->categoryTree->load(null);
$this->prepareCollection();
$tree->addCollectionData($this->categoryCollection);
$root = $tree->getNodeById($rootId);
return $root;
}

/**
* @param \Magento\Catalog\Model\Category $category
* @return Node
*/
protected function getNode(\Magento\Catalog\Model\Category $category)
{
$nodeId = $category->getId();
$node = $this->categoryTree->loadNode($nodeId);
$node->loadChildren();
$this->prepareCollection();
$this->categoryTree->addCollectionData($this->categoryCollection);
return $node;
}

/**
* @return void
*/
protected function prepareCollection()
{
$storeId = $this->storeManager->getStore()->getId();
$this->categoryCollection->addAttributeToSelect(
'name'
)->addAttributeToSelect(
'is_active'
)->setProductStoreId(
$storeId
)->setLoadProductCount(
true
)->setStoreId(
$storeId
);

if ($this->flatState->isAvailable()) {
$this->categoryCollection->addAttributeToSelect('image');
} else {
$this->categoryCollection->addAttributeToSelect('image', true);
}
}

/**
* @param \Magento\Framework\Data\Tree\Node $node
* @param int $depth
* @param int $currentLevel
* @return \Magento\Catalog\Api\Data\CategoryTreeInterface
*/
public function getTree($node, $depth = null, $currentLevel = 0)
{
/** @var \Magento\Catalog\Api\Data\CategoryTreeInterface[] $children */
$children = $this->getChildren($node, $depth, $currentLevel);
/** @var \Magento\Catalog\Api\Data\CategoryTreeInterface $tree */
$tree = $this->treeFactory->create();
$tree->setId($node->getId())
->setParentId($node->getParentId())
->setName($node->getName())
->setPosition($node->getPosition())
->setLevel($node->getLevel())
->setIsActive($node->getIsActive())
->setProductCount($node->getProductCount())
->setImage($node->getImage())
->setChildrenData($children);
return $tree;
}

/**
* @param \Magento\Framework\Data\Tree\Node $node
* @param int $depth
* @param int $currentLevel
* @return \Magento\Catalog\Api\Data\CategoryTreeInterface[]|[]
*/
protected function getChildren($node, $depth, $currentLevel)
{
if ($node->hasChildren()) {
$children = [];
foreach ($node->getChildren() as $child) {
if ($depth !== null && $depth <= $currentLevel) {
break;
}
$children[] = $this->getTree($child, $depth, $currentLevel + 1);
}
return $children;
}
return [];
}
}

 

Step 7: Retrieve List of Categories

app/code/Wishuscess/CategoriesList/Api/CategoryManagementInterface.php

<?php
/**
* Developer:Wishuscess Magento 2x Developer Team
* Module: Wishuscess_CategoriesList
* Author: Hemant Singh Magento 2X Developer
* Website: http://www.wishusucess.com/
*
*/
namespace Wishusucess\CategoriesList\Api;

/**
* @api
*/
interface CategoryManagementInterface
{
/**
* Retrieve list of categories
*
* @param int $rootCategoryId
* @param int $depth
* @throws \Magento\Framework\Exception\NoSuchEntityException If ID is not found
* @return \Wishusucess\CategoriesList\Api\Data\CategoryTreeInterface containing Tree objects
*/
public function getTree($rootCategoryId = null, $depth = null);

/**
* Move category
*
* @param int $categoryId
* @param int $parentId
* @param int $afterId
* @return bool
* @throws \Magento\Framework\Exception\LocalizedException
* @throws \Magento\Framework\Exception\NoSuchEntityException
*/
public function move($categoryId, $parentId, $afterId = null);

/**
* Provide the number of category count
*
* @return int
*/
public function getCount();
}

 

Step 8: Category Tree Interface - Categories API Key

app/code/Wishuscess/CategoriesList/Data/CategoryTreeInterface.php

<?php
/**
* Developer:Wishuscess Magento 2x Developer Team
* Module: Wishuscess_CategoriesList
* Author: Hemant Singh Magento 2X Developer
* Website: http://www.wishusucess.com/
*
*/
namespace Wishusucess\CategoriesList\Api\Data;

/**
* @api
*/
interface CategoryTreeInterface
{
/**
* @return int|null
* 
*/
public function getId();

/**
* @param int $id
* @return $this
*/
public function setId($id);

/**
* Get parent category ID
*
* @return int
*/
public function getParentId();

/**
* Set parent category ID
*
* @param int $parentId
* @return $this
*/
public function setParentId($parentId);

/**
* Get category name
*
* @return string
*/
public function getName();

/**
* Set category name
*
* @param string $name
* @return $this
*/
public function setName($name);

/**
* Get category image
*
* @return string
*/
public function getImage();

/**
* Set category image
*
* @param string $name
* @return $this
*/
public function setImage($image);

/**
* Check whether category is active
*
* @return bool
* @SuppressWarnings(PHPMD.BooleanGetMethodName)
*/
public function getIsActive();

/**
* Set whether category is active
*
* @param bool $isActive
* @return $this
*/
public function setIsActive($isActive);

/**
* Get category position
*
* @return int
*/
public function getPosition();

/**
* Set category position
*
* @param int $position
* @return $this
*/
public function setPosition($position);

/**
* Get category level
*
* @return int
*/
public function getLevel();

/**
* Set category level
*
* @param int $level
* @return $this
*/
public function setLevel($level);

/**
* Get product count
*
* @return int
*/
public function getProductCount();

/**
* Set product count
*
* @param int $productCount
* @return $this
*/
public function setProductCount($productCount);

/**
* @return \Wishusucess\CategoriesList\Api\Data\CategoryTreeInterface[]
*/
public function getChildrenData();

/**
* @param \Wishusucess\CategoriesList\Api\Data\CategoryTreeInterface[] $childrenData
* @return $this
*/
public function setChildrenData(array $childrenData = null);
}

 

Now, Run Following Command:

php bin/magento setup:upgrade

php bin/magento setup:static-content:deploy -f

php bin/magento cache:clean

php bin/magento cache:flush

 

Now you have the complete module so using this category API key module you can retrieve the category data from other frontend stores in  ReactJS or NodeJS. All you have to do is just call this API key your Reactjs or Nodejs store and you will get the data.

Hire Magento 2 Expert Developer to Develop Your Store

 

Related Post:

Custom Shipping Text Filed: Show Custom Text Magento 2

 

Recommended Post:

Magento 2.4 Installation Guide: How to Install Magento 2.4.2

 

SEO Packages: How Much Do SEO Packages Cost in India, SEO Pricing

Custom Customer Ajax Login Extension in Magento 2

In this article, we are going to develop a Magento 2 custom customer ajax login extension which will be something like adding a customer ajax popup in login and registration through the module in Magento 2.

 

Add Ajax PopUp Login And Registration

Now through this module, we will add an ajax popup in login and registration in Magento 2 so for that we need to create a module so in order to create that module we have to create the following files.

app/code/Wishusucess/CustomerAccount/registration.php

app/code/Wishusucess/CustomerAccount/etc/module.xml

app/code/Wishusucess/CustomerAccount/etc/frontend/sections.xml

app/code/Wishusucess/CustomerAccount/etc/frontend/routes.xml

app/code/Wishusucess/CustomerAccount/Controller/Customer/Ajax/Register.php

app/code/Wishusucess/CustomerAccount/Block/Form/Login.php

app/code/Wishusucess/CustomerAccount/Block/Form/Register.php

app/code/Wishusucess/CustomerAccount/view/frontend/layout/default.xml

app/code/Wishusucess/CustomerAccount/view/frontend/templates/login.phtml

app/code/Wishusucess/CustomerAccount/view/frontend/templates/register.phtml

app/code/Wishusucess/CustomerAccount/view/frontend/web/js/action/customer-authentication-popup.js

 

Magento 2 Add-in PopUp Customer Register

Create Customer Login PopUp

Magento 2 Customer PopUp Login

Custom Customer Ajax Login

Registration Customer Account PopUp Login

app/code/Wishusucess/CustomerAccount/registration.php

<?php
/**
* Source Wishusucess
* package Wishusucess_CustomerAccount
* Author Wishusucess Magento Development Team
* website https://www.wishusucess.com/
*/
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Wishusucess_CustomerAccount',
__DIR__
);

 

Declare Module information of Customer Account

app/code/Wishusucess/CustomerAccount/etc/module.xml

<?xml version="1.0"?>
<!--
/**
* Source Wishusucess
* package Wishusucess_CustomerAccount
* Author Wishusucess Magento Development Team
* website https://www.wishusucess.com/
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Wishusucess_CustomerAccount" setup_version="2.1.0" />
</config>

 

Create Section XML File For Custom Customer Ajax Login

This section XML file is a kind of customer data that is grouped together. So here that each section of customer data will have a key or that will be represented by a key that helps to access the content of customer data.

app/code/Wishusucess/CustomerAccount/etc/frontend/sections.xml

<?xml version="1.0"?>
<!--
/**
* Source Wishusucess
* package Wishusucess_CustomerAccount
* Author Wishusucess Magento Development Team
* website https://www.wishusucess.com/
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Customer:etc/sections.xsd">
<action name="wishusucess/customer_ajax/register">
<section name="checkout-data"/>
<section name="cart"/>
<section name="customer"/>
</action>
<action name="customer/ajax/login">
<section name="checkout-data"/>
<section name="cart"/>
<section name="customer"/>
</action>
</config>

 

Routes XML File For Customer Account in Magento 2

app/code/Wishusucess/CustomerAccount/etc/frontend/routes.xml

<?xml version="1.0"?>
<!--
/**
* Source Wishusucess
* package Wishusucess_CustomerAccount
* Author Wishusucess Magento Development Team
* website https://www.wishusucess.com/
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
<router id="standard">
<route id="wishusucess" frontName="wishusucess">
<module name="Wishusucess_CustomerAccount"/>
</route>
</router>
</config>

 

Custom Customer Ajax Login Register

This code will add Magento 2 PopUp Registration in your customer registration section.

app/code/Wishusucess/CustomerAccount/Controller/Customer/Ajax/Register.php

<?php
/**
* Source Wishusucess
* package Wishusucess_CustomerAccount
* Author Wishusucess Magento Development Team
* website https://www.wishusucess.com/
*/
namespace Wishusucess\CustomerAccount\Controller\Customer\Ajax;

use Magento\Framework\Exception\StateException;
use Magento\Framework\Exception\InputException;
use Magento\Framework\Exception\LocalizedException;
use Magento\Customer\Helper\Address;
use Magento\Customer\Model\Account\Redirect;
use Magento\Framework\App\ObjectManager;
use Magento\Customer\Api\AccountManagementInterface;

class Register extends \Magento\Framework\App\Action\Action
{
/**
* @var \Magento\Framework\Controller\Result\JsonFactory
*/
protected $resultJsonFactory;

/**
* @var \Magento\Framework\Controller\Result\RawFactory
*/
protected $resultRawFactory;

/**
* @var \Magento\Customer\Model\Session
*/
protected $session;

/**
* @var \Magento\Customer\Model\Registration
*/
protected $registration;

/**
* @var \Magento\Framework\Data\Form\FormKey\Validator
*/
protected $formKeyValidator;

/**
* @var \Magento\Customer\Model\CustomerExtractor
*/
protected $customerExtractor;

/**
* @var \Magento\Customer\Api\AccountManagementInterface
*/
protected $accountManagement;

/**
* @var \Magento\Newsletter\Model\SubscriberFactory
*/
protected $subscriberFactory;

/**
* @var \Magento\Customer\Model\Url
*/
protected $customerUrl;

/**
* @var \Magento\Customer\Helper\Address
*/
protected $addressHelper;

/**
* @var \Magento\Store\Model\StoreManagerInterface
*/
protected $storeManager;

/**
* @var \Magento\Customer\Model\Account\Redirect
*/
protected $accountRedirect;

/**
* @var \Magento\Framework\App\Config\ScopeConfigInterface
*/
protected $scopeConfig;

/**
* @var \Magento\Framework\Stdlib\Cookie\CookieMetadataFactory
*/
protected $cookieMetadataFactory;

/**
* @var \Magento\Framework\Stdlib\Cookie\PhpCookieManager
*/
protected $cookieMetadataManager;

/**
* @var \Magento\Framework\Escaper
*/
protected $escaper;

/**
* @param \Magento\Framework\App\Action\Context $context
* @param \Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory
* @param \Magento\Framework\Controller\Result\RawFactory $resultRawFactory
* @param \Magento\Customer\Model\Session $customerSession
* @param \Magento\Customer\Model\Registration $customerRegistration
* @param \Magento\Framework\Data\Form\FormKey\Validator $formKeyValidator
* @param \Magento\Customer\Api\AccountManagementInterface $accountManagement
* @param \Magento\Customer\Model\CustomerExtractor $customerExtractor
* @param \Magento\Newsletter\Model\SubscriberFactory $subscriberFactory
* @param \Magento\Customer\Model\Url $customerUrl
* @param \Magento\Framework\UrlInterface $urlModel
* @param \Magento\Customer\Helper\Address $addressHelper
* @param \Magento\Store\Model\StoreManagerInterface $storeManager
* @param \Magento\Customer\Model\Account\Redirect $accountRedirect
* @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
* @param \Magento\Framework\Escaper $escaper
* @param \Magento\Framework\Stdlib\Cookie\CookieMetadataFactory $cookieMetadataFactory
* @param \Magento\Framework\Stdlib\Cookie\PhpCookieManager $cookieMetadataManager
*/
public function __construct(
\Magento\Framework\App\Action\Context $context,
\Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory,
\Magento\Framework\Controller\Result\RawFactory $resultRawFactory,
\Magento\Customer\Model\Session $customerSession,
\Magento\Customer\Model\Registration $customerRegistration,
\Magento\Framework\Data\Form\FormKey\Validator $formKeyValidator,
\Magento\Customer\Api\AccountManagementInterface $accountManagement,
\Magento\Customer\Model\CustomerExtractor $customerExtractor,
\Magento\Newsletter\Model\SubscriberFactory $subscriberFactory,
\Magento\Customer\Model\Url $customerUrl,
\Magento\Framework\UrlInterface $urlModel,
\Magento\Customer\Helper\Address $addressHelper,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Customer\Model\Account\Redirect $accountRedirect,
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
\Magento\Framework\Escaper $escaper,
\Magento\Framework\Stdlib\Cookie\CookieMetadataFactory $cookieMetadataFactory,
\Magento\Framework\Stdlib\Cookie\PhpCookieManager $cookieMetadataManager
) {
parent::__construct($context);
$this->resultJsonFactory = $resultJsonFactory;
$this->resultRawFactory = $resultRawFactory;
$this->session = $customerSession;
$this->registration = $customerRegistration;
$this->formKeyValidator = $formKeyValidator;
$this->accountManagement = $accountManagement;
$this->customerExtractor = $customerExtractor;
$this->subscriberFactory = $subscriberFactory;
$this->customerUrl = $customerUrl;
$this->urlModel = $urlModel;
$this->addressHelper = $addressHelper;
$this->storeManager = $storeManager;
$this->accountRedirect = $accountRedirect;
$this->scopeConfig = $scopeConfig;
$this->escaper = $escaper;
}

/**
* Retrieve cookie manager
*
* @deprecated 100.1.0
* @return \Magento\Framework\Stdlib\Cookie\PhpCookieManager
*/
private function getCookieManager()
{
if (!$this->cookieMetadataManager) {
$this->cookieMetadataManager = ObjectManager::getInstance()->get(
\Magento\Framework\Stdlib\Cookie\PhpCookieManager::class
);
}
return $this->cookieMetadataManager;
}

/**
* Retrieve cookie metadata factory
*
* @deprecated 100.1.0
* @return \Magento\Framework\Stdlib\Cookie\CookieMetadataFactory
*/
private function getCookieMetadataFactory()
{
if (!$this->cookieMetadataFactory) {
$this->cookieMetadataFactory = ObjectManager::getInstance()->get(
\Magento\Framework\Stdlib\Cookie\CookieMetadataFactory::class
);
}
return $this->cookieMetadataFactory;
}

/**
* @return \Magento\Framework\Controller\ResultInterface
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
public function execute()
{
$credentials = null;
$httpBadRequestCode = 400;

/** @var \Magento\Framework\Controller\Result\Raw $resultRaw */
$resultRaw = $this->resultRawFactory->create();
if ($this->getRequest()->getMethod() !== 'POST' || !$this->getRequest()->isXmlHttpRequest()) {
return $resultRaw->setHttpResponseCode($httpBadRequestCode);
}

$formKeyValidation = $this->formKeyValidator->validate($this->getRequest());

$response = [
'errors' => false,
'message' => __('Login successful.')
];

if ($this->session->isLoggedIn()) {
$response = [
'errors' => false,
'message' => __('You are already logged in.')
];
} elseif (!$this->registration->isAllowed()) {
$response = [
'errors' => true,
'message' => __('Customer registration is already disabled.')
];
} elseif (!$formKeyValidation) {
$response = [
'errors' => true,
'message' => $this->getRequest()->getParam('password')
];
} else {
$this->session->regenerateId();
try {
$customer = $this->customerExtractor->extract('customer_account_create', $this->_request);

$password = $this->getRequest()->getParam('password');
$confirmation = $this->getRequest()->getParam('password_confirmation');

$this->checkPasswordConfirmation($password, $confirmation);

$customer = $this->accountManagement
->createAccount($customer, $password);

if ($this->getRequest()->getParam('is_subscribed', false)) {
$this->subscriberFactory->create()->subscribeCustomerById($customer->getId());
}

$this->_eventManager->dispatch(
'customer_register_success',
['account_controller' => $this, 'customer' => $customer]
);

$confirmationStatus = $this->accountManagement->getConfirmationStatus($customer->getId());
if ($confirmationStatus === AccountManagementInterface::ACCOUNT_CONFIRMATION_REQUIRED) {
$email = $this->customerUrl->getEmailConfirmationUrl($customer->getEmail());
$response = [
'errors' => true,
'message' => __(
'You must confirm your account. Please check your email for the confirmation link or <a href="%1">click here</a> for a new link.',
$email
)
];
} else {
$this->session->setCustomerDataAsLoggedIn($customer);
$response = [
'errors' => false,
'message' => $this->getSuccessMessage()
];
$requestedRedirect = $this->accountRedirect->getRedirectCookie();
if (!$this->scopeConfig->getValue('customer/startup/redirect_dashboard') && $requestedRedirect) {
$response['redirectUrl'] = $this->_redirect->success($requestedRedirect);
$this->accountRedirect->clearRedirectCookie();
}
}
if ($this->getCookieManager()->getCookie('mage-cache-sessid')) {
$metadata = $this->getCookieMetadataFactory()->createCookieMetadata();
$metadata->setPath('/');
$this->getCookieManager()->deleteCookie('mage-cache-sessid', $metadata);
}
} catch (StateException $e) {
$url = $this->_url->getUrl('customer/account/forgotpassword');
$response = [
'errors' => true,
'message' => __(
'There is already an account with this email address. If you are sure that it is your email address, <a href="%1">click here</a> to get your password and access your account.',
$url
)
];
} catch (InputException $e) {
$response = [
'errors' => true,
'message' => $this->escaper->escapeHtml($e->getMessage())
];
} catch (LocalizedException $e) {
$response = [
'errors' => true,
'message' => $this->escaper->escapeHtml($e->getMessage())
];
} catch (\Exception $e) {
$response = [
'errors' => true,
'message' => __('We can\'t save the customer.')
];
}

$this->session->setCustomerFormData($this->getRequest()->getPostValue());
}

/** @var \Magento\Framework\Controller\Result\Json $resultJson */
$resultJson = $this->resultJsonFactory->create();
return $resultJson->setData($response);
}

/**
* Make sure that password and password confirmation matched
*
* @param string $password
* @param string $confirmation
* @return void
* @throws InputException
*/
protected function checkPasswordConfirmation($password, $confirmation)
{
if ($password != $confirmation) {
throw new InputException(__('Please make sure your passwords match.'));
}
}

/**
* Retrieve success message
*
* @return string
*/
protected function getSuccessMessage()
{
if ($this->addressHelper->isVatValidationEnabled()) {
if ($this->addressHelper->getTaxCalculationAddressType() == Address::TYPE_SHIPPING) {
// @codingStandardsIgnoreStart
$message = __(
'If you are a registered VAT customer, please <a href="%1">click here</a> to enter your shipping address for proper VAT calculation.',
$this->_url->getUrl('customer/address/edit')
);
// @codingStandardsIgnoreEnd
} else {
// @codingStandardsIgnoreStart
$message = __(
'If you are a registered VAT customer, please <a href="%1">click here</a> to enter your billing address for proper VAT calculation.',
$this->_url->getUrl('customer/address/edit')
);
// @codingStandardsIgnoreEnd
}
} else {
$message = __('Thank you for registering with %1.', $this->storeManager->getStore()->getFrontendName());
}
return $message;
}
}

 

Magento 2 Ajax Login PopUp

So here we can add Magento 2 ajax login through this code. When we will click on the customer login then there will be one popup open for the customer login.

app/code/Wishusucess/CustomerAccount/Block/Form/Login.php

<?php
/**
* Source Wishusucess
* package Wishusucess_CustomerAccount
* Author Wishusucess Magento Development Team
* website https://www.wishusucess.com/
*/
namespace Wishusucess\CustomerAccount\Block\Form;

class Login extends \Magento\Framework\View\Element\Template
{
/**
* @var \Magento\Customer\Model\Session
*/
protected $customerSession;

/**
* @var \Magento\Framework\App\Http\Context
*/
protected $httpContext;

/**
* Registration
*
* @var \Magento\Customer\Model\Registration
*/
protected $registration;

/**
* @param \Magento\Framework\View\Element\Template\Context $context
* @param \Magento\Customer\Model\Session $customerSession
* @param \Magento\Framework\App\Http\Context $httpContext
* @param \Magento\Customer\Model\Registration $registration
* @param array $data
*/
public function __construct(
\Magento\Framework\View\Element\Template\Context $context,
\Magento\Customer\Model\Session $customerSession,
\Magento\Framework\App\Http\Context $httpContext,
\Magento\Customer\Model\Registration $registration,
array $data = []
) {
parent::__construct($context, $data);
$this->customerSession = $customerSession;
$this->httpContext = $httpContext;
$this->registration = $registration;
}

/**
* Return registration
*
* @return \Magento\Customer\Model\Registration
*/
public function getRegistration()
{
return $this->registration;
}

/**
* Retrieve form posting url
*
* @return string
*/
public function getPostActionUrl()
{
return $this->getUrl('customer/ajax/login');
}

/**
* Check if autocomplete is disabled on storefront
*
* @return bool
*/
public function isAutocompleteDisabled()
{
return (bool)!$this->_scopeConfig->getValue(
\Magento\Customer\Model\Form::XML_PATH_ENABLE_AUTOCOMPLETE,
\Magento\Store\Model\ScopeInterface::SCOPE_STORE
);
}

/**
* Checking customer login status
*
* @return bool
*/
public function customerIsAlreadyLoggedIn()
{
return (bool)$this->httpContext->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH);
}

/**
* Retrieve registering URL
*
* @return string
*/
public function getCustomerRegistrationUrl()
{
return $this->getUrl('customer/account/create');
}
}

 

Create Block For Ajax Register

in order to create a Magento2 custom customer ajax login we have to create a block for the customer registration.

app/code/Wishusucess/CustomerAccount/Block/Form/Register.php

<?php
/**
* Source Wishusucess
* package Wishusucess_CustomerAccount
* Author Wishusucess Magento Development Team
* website https://www.wishusucess.com/
*/
namespace Wishusucess\CustomerAccount\Block\Form;

use Magento\Customer\Model\AccountManagement;

class Register extends \Magento\Directory\Block\Data
{
/**
* @var \Magento\Customer\Model\Session
*/
protected $customerSession;

/**
* @var \Magento\Framework\Module\Manager
*/
protected $moduleManager;

/**
* @var \Magento\Framework\App\Http\Context
*/
protected $httpContext;

/**
* Registration
*
* @var \Magento\Customer\Model\Registration
*/
protected $registration;

/**
* Constructor
*
* @param \Magento\Framework\View\Element\Template\Context $context
* @param \Magento\Directory\Helper\Data $directoryHelper
* @param \Magento\Framework\Json\EncoderInterface $jsonEncoder
* @param \Magento\Framework\App\Cache\Type\Config $configCacheType
* @param \Magento\Directory\Model\ResourceModel\Region\CollectionFactory $regionCollectionFactory
* @param \Magento\Directory\Model\ResourceModel\Country\CollectionFactory $countryCollectionFactory
* @param \Magento\Framework\Module\Manager $moduleManager
* @param \Magento\Customer\Model\Session $customerSession
* @param \Magento\Framework\App\Http\Context $httpContext
* @param \Magento\Customer\Model\Registration $registration
* @param array $data
*
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
*/
public function __construct(
\Magento\Framework\View\Element\Template\Context $context,
\Magento\Directory\Helper\Data $directoryHelper,
\Magento\Framework\Json\EncoderInterface $jsonEncoder,
\Magento\Framework\App\Cache\Type\Config $configCacheType,
\Magento\Directory\Model\ResourceModel\Region\CollectionFactory $regionCollectionFactory,
\Magento\Directory\Model\ResourceModel\Country\CollectionFactory $countryCollectionFactory,
\Magento\Framework\Module\Manager $moduleManager,
\Magento\Customer\Model\Session $customerSession,
\Magento\Customer\Model\Url $customerUrl,
\Magento\Framework\App\Http\Context $httpContext,
\Magento\Customer\Model\Registration $registration,
array $data = []
) {
$this->moduleManager = $moduleManager;
$this->customerSession = $customerSession;
$this->httpContext = $httpContext;
$this->registration = $registration;
parent::__construct(
$context,
$directoryHelper,
$jsonEncoder,
$configCacheType,
$regionCollectionFactory,
$countryCollectionFactory,
$data
);
}

/**
* Return registration
*
* @return \Magento\Customer\Model\Registration
*/
public function getRegistration()
{
return $this->registration;
}

/**
* Retrieve the form posting URL
*
* @return string
*/
public function getPostActionUrl()
{
return $this->getUrl('wishusucess/customer_ajax/register');
}

/**
* Retrieve back URL
*
* @return string
*/
public function getBackUrl()
{
return $this->getUrl('customer/account/login');
}

/**
* Retrieve form data
*
* @return mixed
*/
public function getFormData()
{
$data = $this->getData('form_data');
if ($data === null) {
$formData = $this->customerSession->getCustomerFormData(true);
$data = new \Magento\Framework\DataObject();
if ($formData) {
$data->addData($formData);
$data->setCustomerData(1);
}
if (isset($data['region_id'])) {
$data['region_id'] = (int)$data['region_id'];
}
$this->setData('form_data', $data);
}
return $data;
}

/**
* Newsletter module availability
*
* @return bool
*/
public function isNewsletterEnabled()
{
return $this->moduleManager->isOutputEnabled('Magento_Newsletter');
}

/**
* Get minimum password length
*
* @return string
*/
public function getMinimumPasswordLength()
{
return $this->_scopeConfig->getValue(AccountManagement::XML_PATH_MINIMUM_PASSWORD_LENGTH);
}

/**
* Get number of password required character classes
*
* @return string
*/
public function getRequiredCharacterClassesNumber()
{
return $this->_scopeConfig->getValue(AccountManagement::XML_PATH_REQUIRED_CHARACTER_CLASSES_NUMBER);
}

/**
* Checking customer login status
*
* @return bool
*/
public function customerIsAlreadyLoggedIn()
{
return (bool)$this->httpContext->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH);
}
}

 

Now Call Template in XML File

app/code/Wishusucess/CustomerAccount/view/frontend/layout/default.xml

<?xml version="1.0"?>
<!--
/**
* Source Wishusucess
* package Wishusucess_CustomerAccount
* Author Wishusucess Magento Development Team
* website https://www.wishusucess.com/
*/
-->
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceBlock name="register-link">
<arguments>
<argument name="class" xsi:type="string">customer-register-link</argument>
</arguments>
</referenceBlock>
<referenceBlock name="authorization-link-login">
<arguments>
<argument name="class" xsi:type="string">customer-login-link</argument>
</arguments>
</referenceBlock>
<referenceContainer name="before.body.end">
<block class="Wishusucess\CustomerAccount\Block\Form\Login" name="customer-popup-login" template="Wishusucess_CustomerAccount::login.phtml" />
<block class="Wishusucess\CustomerAccount\Block\Form\Register" name="customer-popup-register" template="Wishusucess_CustomerAccount::register.phtml" />
</referenceContainer>
</body>
</page>

 

Create Custom Customer Ajax Login View

app/code/Wishusucess/CustomerAccount/view/frontend/templates/login.phtml

<?php
/**
* Source Wishusucess
* package Wishusucess_CustomerAccount
* Author Wishusucess Magento Development Team
* website https://www.wishusucess.com/
*/
/** @var \Wishusucess\CustomerAccount\Block\Form\Login $block */
?>
<?php if (!$block->customerIsAlreadyLoggedIn()): ?>
<style>
.customer-popup-login {
display: none;
}
.or-another-selection {
display: inline-block;
padding-right: 5px;
}
@media(max-width: 767px) {
.or-another-selection {
display: block;
text-align: center;
margin-bottom: 5px;
}
}
</style>
<div id="customer-popup-login" class="customer-popup-login">
<div class="block block-customer-login">
<div class="block-content" aria-labelledby="block-customer-popup-login-heading">
<form class="form form-login"
action="<?php /* @escapeNotVerified */ echo $block->getPostActionUrl() ?>"
method="post"
id="customer-popup-login-form"
data-mage-init='{"validation":{}}'>
<?php echo $block->getBlockHtml('formkey'); ?>
<input type="hidden" name="redirect_url" value="<?php echo $this->getUrl('*/*/*', ['_current' => true, '_use_rewrite' => true]); ?>" />
<fieldset class="fieldset login" data-hasrequired="<?php /* @escapeNotVerified */ echo __('* Required Fields') ?>">
<div class="field note"><?php /* @escapeNotVerified */ echo __('If you have an account, sign in with your email address.') ?></div>
<div class="messages"></div>
<div class="field email required">
<label class="label" for="email"><span><?php /* @escapeNotVerified */ echo __('Email') ?></span></label>
<div class="control">
<input name="username" value="" <?php if ($block->isAutocompleteDisabled()) :?> autocomplete="off"<?php endif; ?> id="email-login" type="email" class="input-text" title="<?php /* @escapeNotVerified */ echo __('Email') ?>" data-validate="{required:true, 'validate-email':true}">
</div>
</div>
<div class="field password required">
<label for="pass" class="label"><span><?php /* @escapeNotVerified */ echo __('Password') ?></span></label>
<div class="control">
<input name="password" type="password" <?php if ($block->isAutocompleteDisabled()) :?> autocomplete="off"<?php endif; ?> class="input-text" id="pass-login" title="<?php /* @escapeNotVerified */ echo __('Password') ?>" data-validate="{required:true}" >
</div>
</div>
<div class="actions-toolbar">
<div class="primary"><button type="submit" class="action login primary" name="send" id="send2-login"><span><?php /* @escapeNotVerified */ echo __('Sign In') ?></span></button></div>
<?php if ($block->getRegistration()->isAllowed()): ?>
<div class="or-another-selection"><?php echo __('or'); ?></div>
<div class="secondary"><a class="action remind" href="<?php /* @escapeNotVerified */ echo $block->getCustomerRegistrationUrl() ?>" id="customer-popup-registration"><span><?php /* @escapeNotVerified */ echo __('Create an Account') ?></span></a></div>
<?php endif; ?>
</div>
</fieldset>
</form>
</div>
</div>
<script type="text/x-magento-init">
{
"#customer-popup-login": {
"Wishusucess_CustomerAccount/js/action/customer-authentication-popup": {
"popupTitle": "<?php /* @escapeNotVerified */ echo __('Sign In') ?>",
"innerWidth": "400"
}
}
}
</script>
</div>
<?php endif; ?>

 

Create Custom Customer Ajax Register View

app/code/Wishusucess/CustomerAccount/view/frontend/templates/register.phtml

<?php
/**
* Source Wishusucess
* package Wishusucess_CustomerAccount
* Author Wishusucess Magento Development Team
* website https://www.wishusucess.com/
*/
/** @var \Wishusucess\CustomerAccount\Block\Form\Register $block */
?>
<?php if (!$block->customerIsAlreadyLoggedIn() && $block->getRegistration()->isAllowed()): ?>
<style>
.customer-popup-register {
display: none;
}
</style>
<div id="customer-popup-register" class="customer-popup-register">
<form class="form-create-account" action="<?php /* @escapeNotVerified */ echo $block->getPostActionUrl() ?>" method="post" id="customer-popup-form-register" enctype="multipart/form-data" autocomplete="off" data-mage-init='{"validation":{}}'>
<?php echo $block->getBlockHtml('formkey'); ?>
<input type="hidden" name="redirect_url" value="<?php echo $this->getUrl('*/*/*', ['_current' => true, '_use_rewrite' => true]); ?>" />
<div class="messages"></div>
<p><?php /* @escapeNotVerified */ echo __('Creating an account has many benefits: check out faster, keep more than one address, track orders and more.') ?></p>
<fieldset class="fieldset create info">
<legend class="legend"><span><?php /* @escapeNotVerified */ echo __('Personal Information') ?></span></legend><br>
<?php echo $block->getLayout()->createBlock('Magento\Customer\Block\Widget\Name')->setObject($block->getFormData())->setForceUseCustomerAttributes(true)->toHtml() ?>
<?php if ($block->isNewsletterEnabled()): ?>
<div class="field choice newsletter">
<input type="checkbox" name="is_subscribed" title="<?php /* @escapeNotVerified */ echo __('Sign Up for Newsletter') ?>" value="1" id="popup-is_subscribed" class="checkbox">
<label for="is_subscribed" class="label"><span><?php /* @escapeNotVerified */ echo __('Sign Up for Newsletter') ?></span></label>
</div>
<?php endif ?>
</fieldset>
<fieldset class="fieldset create account" data-hasrequired="<?php /* @escapeNotVerified */ echo __('* Required Fields') ?>">
<legend class="legend"><span><?php /* @escapeNotVerified */ echo __('Sign-in Information') ?></span></legend><br>
<div class="field required">
<label for="popup-email_address" class="label"><span><?php /* @escapeNotVerified */ echo __('Email') ?></span></label>
<div class="control">
<input type="email" name="email" autocomplete="email" id="popup-email_address" value="" title="<?php /* @escapeNotVerified */ echo __('Email') ?>" class="input-text" data-validate="{required:true, 'validate-email':true}">
</div>
</div>
<div class="field password required" data-mage-init='{"passwordStrengthIndicator": {}}'>
<label for="password" class="label"><span><?php /* @escapeNotVerified */ echo __('Password') ?></span></label>
<div class="control">
<input type="password" name="password" id="password"
title="<?php /* @escapeNotVerified */ echo __('Password') ?>"
class="input-text"
data-password-min-length="<?php echo $block->escapeHtml($block->getMinimumPasswordLength()) ?>"
data-password-min-character-sets="<?php echo $block->escapeHtml($block->getRequiredCharacterClassesNumber()) ?>"
data-validate="{required:true, 'validate-customer-password':true}"
autocomplete="off">
<div id="password-strength-meter-container" data-role="password-strength-meter" >
<div id="password-strength-meter" class="password-strength-meter">
<?php /* @escapeNotVerified */ echo __('Password Strength'); ?>:
<span id="password-strength-meter-label" data-role="password-strength-meter-label" >
<?php /* @escapeNotVerified */ echo __('No Password'); ?>
</span>
</div>
</div>
</div>
</div>
<div class="field confirmation required">
<label for="password-confirmation" class="label"><span><?php /* @escapeNotVerified */ echo __('Confirm Password') ?></span></label>
<div class="control">
<input type="password" name="password_confirmation" title="<?php /* @escapeNotVerified */ echo __('Confirm Password') ?>" id="password-confirmation" class="input-text" data-validate="{required:true, equalTo:'#password'}" autocomplete="off">
</div>
</div>
</fieldset>
<div class="actions-toolbar">
<div class="primary">
<button type="submit" class="action submit primary" title="<?php /* @escapeNotVerified */ echo __('Create an Account') ?>"><span><?php /* @escapeNotVerified */ echo __('Create an Account') ?></span></button>
</div>
<div class="or-another-selection"><?php echo __('or'); ?></div>
<div class="secondary"><a class="action remind" href="<?php /* @escapeNotVerified */ echo $block->getBackUrl() ?>" id="customer-popup-sign-in"><span><?php /* @escapeNotVerified */ echo __('Sign In') ?></span></a></div>
</div>
</form>
<script type="text/x-magento-init">
{
"#customer-popup-register": {
"PHPCuong_CustomerAccount/js/action/customer-authentication-popup": {
"popupTitle": "<?php /* @escapeNotVerified */ echo __('Create an Account'); ?>",
"innerWidth": "600"
}
}
}
</script>
</div>
<?php endif; ?>

 

Customer Authentication Popup in Magento 2

app/code/Wishusucess/CustomerAccount/view/frontend/web/js/action/customer-authentication-popup.js

/**
* Source Wishusucess
* package Wishusucess_CustomerAccount
* Author Wishusucess Magento Development Team
* website https://www.wishusucess.com/
*/
define([
'jquery',
'Magento_Ui/js/modal/modal',
'Magento_Customer/js/customer-data',
'mage/storage',
'mage/translate',
'mage/mage',
'jquery/ui'
], function ($, modal, customerData, storage, $t) {
'use strict';

$.widget('wishusucess.customerAuthenticationPopup', {
options: {
login: '#customer-popup-login',
nextRegister: '#customer-popup-registration',
register: '#customer-popup-register',
prevLogin: '#customer-popup-sign-in'
},

/**
*
* @private
*/
_create: function () {
var self = this,
authentication_options = {
type: 'popup',
responsive: true,
innerScroll: true,
title: this.options.popupTitle,
buttons: false,
modalClass : 'customer-popup'
};

modal(authentication_options, this.element);

// Show the login form in a popup when clicking on the sign in text
$('body').on('click', '.customer-login-link, '+self.options.prevLogin, function() {
$(self.options.register).modal('closeModal');
$(self.options.login).modal('openModal');
self._setStyleCss();
return false;
});

// Show the registration form in a popup when clicking on the create an account text
$('body').on('click', '.customer-register-link, '+self.options.nextRegister, function() {
$(self.options.login).modal('closeModal');
$(self.options.register).modal('openModal');
self._setStyleCss(self.options.innerWidth);
return false;
});

this._ajaxSubmit();
this._resetStyleCss();
},

/**
* Set width of the popup
* @private
*/
_setStyleCss: function(width) {
width = width || 400;
if (window.innerWidth > 786) {
this.element.parent().parent('.modal-inner-wrap').css({'max-width': width+'px'});
}
},

/**
* Reset width of the popup
* @private
*/
_resetStyleCss: function() {
var self = this;
$( window ).resize(function() {
if (window.innerWidth <= 786) {
self.element.parent().parent('.modal-inner-wrap').css({'max-width': 'initial'});
} else {
self._setStyleCss(self.options.innerWidth);
}
});
},

/**
* Submit data by Ajax
* @private
*/
_ajaxSubmit: function() {
var self = this,
form = this.element.find('form'),
inputElement = form.find('input');

inputElement.keyup(function (e) {
self.element.find('.messages').html('');
});

form.submit(function (e) {
if (form.validation('isValid')) {
if (form.hasClass('form-create-account')) {
$.ajax({
url: $(e.target).attr('action'),
data: $(e.target).serializeArray(),
showLoader: true,
type: 'POST',
dataType: 'json',
success: function (response) {
self._showResponse(response, form.find('input[name="redirect_url"]').val());
},
error: function() {
self._showFailingMessage();
}
});
} else {
var submitData = {},
formDataArray = $(e.target).serializeArray();
formDataArray.forEach(function (entry) {
submitData[entry.name] = entry.value;
});
$('body').loader().loader('show');
storage.post(
$(e.target).attr('action'),
JSON.stringify(submitData)
).done(function (response) {
$('body').loader().loader('hide');
self._showResponse(response, form.find('input[name="redirect_url"]').val());
}).fail(function () {
$('body').loader().loader('hide');
self._showFailingMessage();
});
}
}
return false;
});
},

/**
* Display messages on the screen
* @private
*/
_displayMessages: function(className, message) {
$('<div class="message '+className+'"><div>'+message+'</div></div>').appendTo(this.element.find('.messages'));
},

/**
* Showing response results
* @private
* @param {Object} response
* @param {String} locationHref
*/
_showResponse: function(response, locationHref) {
var self = this,
timeout = 800;
this.element.find('.messages').html('');
if (response.errors) {
this._displayMessages('message-error error', response.message);
} else {
this._displayMessages('message-success success', response.message);
}
this.element.find('.messages .message').show();
setTimeout(function() {
if (!response.errors) {
self.element.modal('closeModal');
window.location.href = locationHref;
}
}, timeout);
},

/**
* Show the failing message
* @private
*/
_showFailingMessage: function() {
this.element.find('.messages').html('');
this._displayMessages('message-error error', $t('An error occurred, please try again later.'));
this.element.find('.messages .message').show();
}
});

return $.wishusucess.customerAuthenticationPopup;
});

 

 

Now, Run Following Command:

php bin/magento setup:upgrade

php bin/magento setup:di:compile

php bin/magento setup:static-content:deploy -f

php bin/magento cache:clean

php bin/magento cache:flush

 

Hire Magento 2 Expert Developer to Develop Your Store

GitHub

Related Post:

Custom Shipping Text Filed: Show Custom Text Magento 2

Search AutoComplete: Magento 2 Module Add All Category for Search

Share Product on WhatsApp: With Products Image And URL in Magento 2

 

Recommended Post:

Magento 2.4 Installation Guide: How to Install Magento 2.4.2

Magento Store: Best 36 Magento Websites Example in The World

SEO Packages: How Much Do SEO Packages Cost in India, SEO Pricing

Newsletter Subscription: Male & Female Wise Subscription in Magento 2

Here we have developed a Magento 2 Newsletter Subscription extension that helps you to add gender-wise subscription functionality to your Magento 2 store.

Wishusucess_Newsletter Magento 2 extension developed by Wishusucess expert Magento 2 Team.

So this newsletter module will add a great experience to your shopping store and when your customer visits your site then they can subscribe to your newsletter based on their gender. So you can notify your customers based on their gender and can increase more seals. you will also be able to provide them special offer about a particular product to your customer on your Magento 2 store.

Magento 2 Newsletter Subscription Male Female

 

Create Custom Magento 2 Newwsletter Suibscription

app/code/Wishusucess/Newsletter/registration.php

app/code/Wishusucess/Newsletter/etc/module.xml

app/code/Wishusucess/Newsletter/etc/di.xml

app/code/Wishusucess/Newsletter/Setup/InstallSchema.php

app/code/Wishusucess/Newsletter/Controller/Subscribe/NewAction.php

app/code/Wishusucess/Newsletter/Block/Subscribe.php

app/code/Wishusucess/Newsletter/Model/Subscriber.php

app/code/Wishusucess/Newsletter/view/adminhtml/layout/newsletter_subscriber_block.xml

app/code/Wishusucess/Newsletter/view/frontend/layout/default.xml

app/code/Wishusucess/Newsletter/view/frontend/templates/subscribe.phtml

 

Turn off Magento 2 Newsletter Subscription

So when you don't need this feature then you will also be able to turn off these custom newsletter_subscription features from your admin.

In order to turn off, these features just go to the Magento admin and click

Stores -> Configuration -> Customers -> Newsletter Tab

and then choose your setting like set to disable if you don't need it to need then turns on this feature by setting enable newsletter.

 

Register Magento 2 Newsletter Module

app/code/Wishusucess/Newsletter/registration.php

<?php
/*
* @Author Hemant Singh
* @Developer Hemant Singh
* @Module Wishusucess_Newsletter
* @copyright Copyright (c) Wishusucess (http://www.wishusucess.com/)
*/
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Wishusucess_Newsletter',
__DIR__
);

 

Define Basic Information of Newsletter

app/code/Wishusucess/Newsletter/etc/module.xml

<?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="Wishusucess_Newsletter" setup_version="1.0.0"/>
<sequence>
<module name="Magento_Newsletter" />
</sequence>
</config>

 

Decide Preferences Through Dependency Injection

So here you will be able to decide your newly added class and then you have to give the preferences in the di.xml file.

app/code/Wishusucess/Newsletter/etc/di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\Newsletter\Controller\Subscriber\NewAction" type="Wishusucess\Newsletter\Controller\Subscribe\NewAction" />
<preference for="Magento\Newsletter\Model\Subscriber" type="Wishusucess\Newsletter\Model\Subscriber" />
</config>

 

Add Column Gender in Magento 2 Newsletter Table

So here you can add the custom column which is gender in Magento 2 newsletter_subscriber database table.

app/code/Wishusucess/Newsletter/Setup/InstallSchema.php

<?php
/*
* @Author Hemant Singh
* @Developer Hemant Singh
* @Module Wishusucess_Newsletter
* @copyright Copyright (c) Wishusucess (http://www.wishusucess.com/)
*/
namespace Wishusucess\Newsletter\Setup;

use Magento\Framework\Setup\InstallSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
use Magento\Framework\DB\Ddl\Table;

class InstallSchema implements InstallSchemaInterface {
public function install(SchemaSetupInterface $setup, ModuleContextInterface $context) {
$setup->startSetup();
$table = $setup->getTable('newsletter_subscriber');

$setup->getConnection()->addColumn(
$table, 'gender', [
'type' => Table::TYPE_INTEGER,
'nullable' => true,
'comment' => 'Gender'
]
);

$setup->endSetup();
}
}

 

Create Controller For Magento 2 Newsletter

So here execute() method processed over the newly added column gender Magento 2 newsletter subscription. So you can decide the action which you have to perform over this column.

app/code/Wishusucess/Newsletter/Controller/Subscribe/NewAction.php

<?php
/*
* @Author Hemant Singh
* @Developer Hemant Singh
* @Module Wishusucess_Newsletter
* @copyright Copyright (c) Wishusucess (http://www.wishusucess.com/)
*/
namespace Wishusucess\Newsletter\Controller\Subscribe;

use Magento\Customer\Api\AccountManagementInterface as CustomerAccountManagement;
use Magento\Customer\Model\Session;
use Magento\Customer\Model\Url as CustomerUrl;
use Magento\Framework\App\Action\Context;
use Magento\Framework\App\Action\HttpPostActionInterface;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\App\ObjectManager;
use Magento\Framework\Controller\Result\Redirect;
use Magento\Framework\Controller\ResultFactory;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Phrase;
use Magento\Framework\Validator\EmailAddress as EmailValidator;
use Magento\Newsletter\Controller\Subscriber as SubscriberController;
use Magento\Newsletter\Model\Subscriber;
use Magento\Newsletter\Model\SubscriptionManagerInterface;
use Magento\Store\Model\ScopeInterface;
use Magento\Store\Model\StoreManagerInterface;
use Magento\Newsletter\Model\SubscriberFactory;

class NewAction extends \Magento\Newsletter\Controller\Subscriber\NewAction {

/**
* @var CustomerAccountManagement
*/
protected $customerAccountManagement;

/**
* @var EmailValidator
*/
private $emailValidator;

/**
* @var SubscriptionManagerInterface
*/
private $subscriptionManager;

/**
* Initialize dependencies.
*
* @param Context $context
* @param SubscriberFactory $subscriberFactory
* @param Session $customerSession
* @param StoreManagerInterface $storeManager
* @param CustomerUrl $customerUrl
* @param CustomerAccountManagement $customerAccountManagement
* @param SubscriptionManagerInterface $subscriptionManager
* @param EmailValidator $emailValidator
*/
public function __construct(
Context $context,
SubscriberFactory $subscriberFactory,
Session $customerSession,
StoreManagerInterface $storeManager,
CustomerUrl $customerUrl,
CustomerAccountManagement $customerAccountManagement,
SubscriptionManagerInterface $subscriptionManager,
EmailValidator $emailValidator = null
) {
$this->customerAccountManagement = $customerAccountManagement;
$this->subscriptionManager = $subscriptionManager;
$this->emailValidator = $emailValidator ?: ObjectManager::getInstance()->get(EmailValidator::class);
parent::__construct(
$context,
$subscriberFactory,
$customerSession,
$storeManager,
$customerUrl,
$customerAccountManagement,
$subscriptionManager,
$emailValidator
);
}

public function execute()
{
if ($this->getRequest()->isPost() && $this->getRequest()->getPost('email')) {
$gender = $this->getRequest()->getPost('gender');

$email = (string)$this->getRequest()->getPost('email');

try {
$this->validateEmailFormat($email);
$this->validateGuestSubscription();
$this->validateEmailAvailable($email);

$websiteId = (int)$this->_storeManager->getStore()->getWebsiteId();
/** @var Subscriber $subscriber */
$subscriber = $this->_subscriberFactory->create()->loadBySubscriberEmail($email, $websiteId);
if ($subscriber->getId()
&& (int)$subscriber->getSubscriberStatus() === Subscriber::STATUS_SUBSCRIBED) {
throw new LocalizedException(
__('This email address is already subscribed.')
);
}

$storeId = (int)$this->_storeManager->getStore()->getId();
$currentCustomerId = $this->getSessionCustomerId($email);
$subscriber = $currentCustomerId
? $this->subscriptionManager->subscribeCustomer($currentCustomerId, $storeId)
: $this->subscriptionManager->subscribe($email, $storeId);
// add gender data to the model
$subscriber->setData('gender',$gender);
$subscriber->save();
$message = $this->getSuccessMessage((int)$subscriber->getSubscriberStatus());
$this->messageManager->addSuccessMessage($message);
} catch (LocalizedException $e) {
$this->messageManager->addComplexErrorMessage(
'localizedSubscriptionErrorMessage',
['message' => $e->getMessage()]
);
} catch (\Exception $e) {
$this->messageManager->addExceptionMessage($e, __('Something went wrong with the subscription.'));
}
}
/** @var Redirect $redirect */
$redirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT);
$redirectUrl = $this->_redirect->getRedirectUrl();
return $redirect->setUrl($redirectUrl);
}

/**
* Get customer id from session if he is owner of the email
*
* @param string $email
* @return int|null
*/
private function getSessionCustomerId(string $email): ?int
{
if (!$this->_customerSession->isLoggedIn()) {
return null;
}

$customer = $this->_customerSession->getCustomerDataObject();
if ($customer->getEmail() !== $email) {
return null;
}

return (int)$this->_customerSession->getId();
}


/**
* Get success message
*
* @param int $status
* @return Phrase
*/
private function getSuccessMessage(int $status): Phrase
{
if ($status === Subscriber::STATUS_NOT_ACTIVE) {
return __('The confirmation request has been sent.');
}

return __('Thank you for your subscription.');
}
}

 

Create Block for Magento 2 Newsletter Subscription

Now you can retrieve the form action URL and set the "secure" param to avoid confirmation. and you also decide what message you want to show when action submits the form from a secure page to unsecure.

app/code/Wishusucess/Newsletter/Block/Subscribe.php

<?php
/*
* @Author Hemant Singh
* @Developer Hemant Singh
* @Module Wishusucess_Newsletter
* @copyright Copyright (c) Wishusucess (http://www.wishusucess.com/)
*/
namespace Wishusucess\Newsletter\Block;
use Magento\Framework\View\Element\Template;

class Subscribe extends \Magento\Framework\View\Element\Template
{
/**
* Retrieve form action url and set "secure" param to avoid confirm
* message when we submit form from secure page to unsecure
*
* @return string
*/
public function getFormActionUrl()
{
return $this->getUrl('newsletter/subscriber/new', ['_secure' => true]);
}
}




/*class Subscribe extends Template {
public function __construct(Template\Context $context,array $data = []) {
parent::__construct($context, $data);
}
public function beforeToHtml(\Magento\Newsletter\Block\Subscribe $originalBlock){
$originalBlock->setTemplate('BDC_Newsletter::subscribe.phtml');
}
}*/

 

Model Class in Newsletter Subscription

app/code/Wishusucess/Newsletter/Model/Subscriber.php

<?php
/*
* @Author Hemant Singh
* @Developer Hemant Singh
* @Module Wishusucess_Newsletter
* @copyright Copyright (c) Wishusucess (http://www.wishusucess.com/)
*/
namespace Wishusucess\Newsletter\Model;

class Subscriber extends \Magento\Newsletter\Model\Subscriber {

/**
* Initialize resource model
*
* @return void
*/

public function subscribe($email) {
echo "=----------->";exit;

$this->loadByEmail($email);

if (!$this->getId()) {
$this->setSubscriberConfirmCode($this->randomSequence());
}

$isConfirmNeed = $this->_scopeConfig->getValue(
self::XML_PATH_CONFIRMATION_FLAG, \Magento\Store\Model\ScopeInterface::SCOPE_STORE
) == 1 ? true : false;
$isOwnSubscribes = false;

$isSubscribeOwnEmail = $this->_customerSession->isLoggedIn() && $this->_customerSession->getCustomerDataObject()->getEmail() == $email;

if (!$this->getId() || $this->getStatus() == self::STATUS_UNSUBSCRIBED || $this->getStatus() == self::STATUS_NOT_ACTIVE
) {
if ($isConfirmNeed === true) {
// if user subscribes own login email - confirmation is not needed
$isOwnSubscribes = $isSubscribeOwnEmail;
if ($isOwnSubscribes == true) {
$this->setStatus(self::STATUS_SUBSCRIBED);
} else {
$this->setStatus(self::STATUS_NOT_ACTIVE);
}
} else {
$this->setStatus(self::STATUS_SUBSCRIBED);
}

$this->setSubscriberEmail($_POST['email']);

}

if(!empty($_POST['subscriber_name']) ){
$this->setSubscriberName($_POST['subscriber_name']); //subscriber_name
$this->setSubscriberDateofbirth($_POST['subscriber_dateofbirth']); //date of birth
$this->setSubscriberCountrycode($_POST['subscriber_countrycode']); //country code
}

if ($isSubscribeOwnEmail) {
try {
$customer = $this->customerRepository->getById($this->_customerSession->getCustomerId());
$this->setStoreId($customer->getStoreId());
$this->setCustomerId($customer->getId());
} catch (NoSuchEntityException $e) {
$this->setStoreId($this->_storeManager->getStore()->getId());
$this->setCustomerId(0);
}
} else {
$this->setStoreId($this->_storeManager->getStore()->getId());
$this->setCustomerId(0);
}

$this->setStatusChanged(true);

try {
$this->save();
if ($isConfirmNeed === true && $isOwnSubscribes === false
) {
$this->sendConfirmationRequestEmail();
} else {
$this->sendConfirmationSuccessEmail();
}
return $this->getStatus();
} catch (\Exception $e) {
throw new \Exception($e->getMessage());
}
}

}

 

Adminhtml Layout XML File

app/code/Wishusucess/Newsletter/view/adminhtml/layout/newsletter_subscriber_block.xml

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceBlock name="adminhtml.newslettrer.subscriber.grid.columnSet">
<block class="Magento\Backend\Block\Widget\Grid\Column">
<arguments>
<argument name="header" xsi:type="string" translate="true">Gender</argument>
<argument name="index" xsi:type="string">gender</argument>
<argument name="type" xsi:type="string">options</argument>
<argument name="options" xsi:type="array">
<item name="gender_male" xsi:type="array">
<item name="value" xsi:type="string">1</item>
<item name="label" xsi:type="string" translate="true">Male</item>
</item>
<item name="gender_female" xsi:type="array">
<item name="value" xsi:type="string">2</item>
<item name="label" xsi:type="string" translate="true">Female</item>
</item>
<item name="gender_not_specified" xsi:type="array">
<item name="value" xsi:type="string">3</item>
<item name="label" xsi:type="string" translate="true">Not Specified</item>
</item>
</argument>
<argument name="header_css_class" xsi:type="string">col-gender</argument>
<argument name="column_css_class" xsi:type="string">ccol-gender</argument>
</arguments>
</block>
</referenceBlock>
</body>
</page>

 

Frontend Layout Component in Newsletter

Now we to call the component.phtml file in this default.xml so this will show everywhere of Magento 2 stores.

app/code/Wishusucess/Newsletter/view/frontend/layout/default.xml

 

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceBlock name="head.components">
<block class="Magento\Framework\View\Element\Js\Components" name="newsletter_head_components" template="Magento_Newsletter::js/components.phtml"/>
</referenceBlock>

<!--referenceContainer name="footer">
<block class="Magento\Newsletter\Block\Subscribe" name="form.subscribe" as="subscribe" before="-" template="Magento_Newsletter::subscribe.phtml"/>
</referenceContainer-->


<!-- <referenceContainer name="footer">
<referenceBlock name="form.subscribe" remove="true"/>
<block class="BDC\Newsletter\Block\Subscribe" name="form.custom.subscribe" before="-" template="BDC_Newsletter::subscribe.phtml"/>

<block class="BDC\Newsletter\Block\Review" name="review.list" template="right-review.phtml">
<block class="Magento\Newsletter\Block\Subscribe" name="review_list_pager" as="review_list_pager"/>
</block>
</referenceContainer> -->
</body>
</page>

 

Get Data Of Newsletter Subscription in Magento 2

Here is how you want to show the data on the front end you can decide now your newsletter_subscription extension will show the data of the extra column of the newsletter_subscription table.

app/code/Wishusucess/Newsletter/view/frontend/templates/subscribe.phtml

<?php
/*
* @Author Hemant Singh
* @Developer Hemant Singh
* @Module Wishusucess_Newsletter
* @copyright Copyright (c) Wishusucess (http://www.wishusucess.com/)
*/
?>
<div class="block newsletter">
<div class="title"><strong><?php /* @escapeNotVerified */ echo __('Newsletter') ?></strong></div>
<div class="content">
<form class="form subscribe"
novalidate
action="<?php echo $block->escapeUrl($block->getFormActionUrl()) ?>"
method="post"
data-mage-init='{"validation": {"errorClass": "mage-error"}}'
id="newsletter-validate-detail">
<div class="field firstname">
<label class="label" for="firstname"><span><?php echo $block->escapeHtml(__('First Name')) ?></span></label>
<div class="control">
<input name="firstname" type="text" id="firstname" placeholder="<?php echo $block->escapeHtmlAttr(__('First Name')) ?>"
data-validate="{required:true}"/>
</div>
</div>
<div class="field lastname">
<label class="label" for="lastname"><span><?php echo $block->escapeHtml(__('Last Name')) ?></span></label>
<div class="control">
<input name="lastname" type="text" id="lastname" placeholder="<?php echo $block->escapeHtmlAttr(__('Last Name')) ?>"
data-validate="{required:true}"/>
</div>
</div>
<?php $_gender = $block->getLayout()->createBlock('Magento\Customer\Block\Widget\Gender') ?>
<?php echo $_gender->toHtml() ?>
<div class="field newsletter">
<label class="label" for="newsletter"><span><?php echo $block->escapeHtml(__('Sign Up for Our Newsletter:')) ?></span></label>
<div class="control">
<input name="email" type="email" id="newsletter"
placeholder="<?php echo $block->escapeHtmlAttr(__('Enter your email address')) ?>"
data-validate="{required:true, 'validate-email':true}"/>
</div>
</div>
<div class="actions">
<button class="action subscribe primary" title="<?php echo $block->escapeHtmlAttr(__('Subscribe')) ?>" type="submit">
<span><?php echo $block->escapeHtml(__('Subscribe')) ?></span>
</button>
</div>
</form>
</div>
</div>

 

Now, Run Following Command:

php bin/magento setup:upgrade

php bin/magento setup:di:compile

php bin/magento setup:static-content:deplpy -f

php bin/magento cache:clean

 

Extra Column in Newsletter Subsription

Download Link:

Wishusucess Newsletter_Subscription Extension in Magento 2

Hire Magento 2 Expert Developer to Develop Your Store

 

Related Post:

Custom Shipping Text Filed: Show Custom Text Magento 2

Search AutoComplete: Magento 2 Module Add All Category for Search

Share Product on WhatsApp: With Products Image And URL in Magento 2

 

Recommended Post:

Magento 2.4 Installation Guide: How to Install Magento 2.4.2

Magento Store: Best 36 Magento Websites Example in The World

SEO Packages: How Much Do SEO Packages Cost in India, SEO Pricing

Breadcrumb Image: Add Category Attribute for Upload Image in Magento 2

In this article, I am going to explaining how we can add custom image icons in the breadcrumb section on the list page and product detail page. Through this module, you can add custom category attributes for Breadcrumb Image upload and can save those images.

Category Breadcumb Image Upload

 

Create Module For Category Breadcrumb Image Upload

In order to get the brand icon on the list page and product details page breadcrumb section, you have to create a module that can create custom category attributes and upload the images or brand icon images in the breadcrumb section for the list page and detail page.

app/code/Wishusucess/CategoryBreadcrumbImage/registration.php

app/code/Wishusucess/CategoryBreadcrumbImage/etc/module.xml

app/code/Wishusucess/CategoryBreadcrumbImage/etc/di.xml

app/code/Wishusucess/CategoryBreadcrumbImage/etc/adminhtml/routes.xml

app/code/Wishusucess/CategoryBreadcrumbImage/Setup/InstallData.php

app/code/Wishusucess/CategoryBreadcrumbImage/Model/Category/DataProvider.php

app/code/Wishusucess/CategoryBreadcrumbImage/Controller/Adminhtml/Category/BreadcrumbImage/Upload.php

app/code/Wishusucess/CategoryBreadcrumbImage/view/adminhtml/ui_component/category_form.xml

 

Register Breadcrumb image Module

app/code/Wishusucess/CategoryBreadcrumbImage/registration.php

<?php
/*
* @Author Hemant Singh
* @Developer Hemant Singh
* @Module Wishusucess_CategoryBreadcrumbImage
* @copyright Copyright (c) Wishusucess (http://www.wishusucess.com/)
*/
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Wishusucess_CategoryBreadcrumbImage',
__DIR__
);

 

Give Basic information About Module

app/code/Wishusucess/CategoryBreadcrumbImage/etc/module.xml

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Wishusucess_CategoryBreadcrumbImage" setup_version="1.0.0">
</module>
</config>

 

Create Dependency Injection File

This di.xml basically we use for ( rewrite ) preference of a particular class. So through this file, we can inform the Magento core class to replace with a new class or existing class arguments.

app/code/Wishusucess/CategoryBreadcrumbImage/etc/di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Wishusucess\CategoryBreadcrumbImage\Controller\Adminhtml\Category\BreadcrumbImage\Upload">
<arguments>
<argument name="imageUploader" xsi:type="object">CategoryImageUpload</argument>
</arguments>
</type>
<virtualType name="CategoryImageUpload" type="Magento\Catalog\Model\ImageUploader">
<arguments>
<argument name="baseTmpPath" xsi:type="string">catalog/category/tmp</argument>
<argument name="basePath" xsi:type="string">catalog/category</argument>
<argument name="allowedExtensions" xsi:type="array">
<item name="jpg" xsi:type="string">jpg</item>
<item name="jpeg" xsi:type="string">jpeg</item>
<item name="gif" xsi:type="string">gif</item>
<item name="png" xsi:type="string">png</item>
</argument>
</arguments>
</virtualType>
<preference for="Magento\Catalog\Model\Category\DataProvider" type="Wishusucess\CategoryBreadcrumbImage\Model\Category\DataProvider" />
</config>

 

Define Routes ID

In Magento 2 Shopping applications routing basically we use to provide the data from a URL request to the appropriate class for processing. Magento 2 has some format to define the route ID like the below syntax.

<store-url>/<store-code>/<front-name>/<controller-name>/<action-name>

app/code/Wishusucess/CategoryBreadcrumbImage/etc/adminhtml/routes.xml

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
<router id="admin">
<route id="breadcrumbimage" frontName="breadcrumbimage">
<module name="Wishusucess_CategoryBreadcrumbImage" before="Magento_Backend" />
</route>
</router>
</config>

 

Create Custom Category Image Upload Attribute

Using this InstallSchame.php file we can create a custom category attribute to upload the brand image on the list page breadcrumb section and as well as product detail page breadcrumb section.

$setup->addAttribute(
\Magento\Catalog\Model\Category::ENTITY, 'breadcrumb_image');

In the above code, we have decided on a custom category which is "breadcrumb_image" and we will use this identifier view/adminhtml/ui_component/category_form.xml to get the data from Magento admin.

app/code/Wishusucess/CategoryBreadcrumbImage/Setup/InstallData.php

<?php
/*
* @Author Hemant Singh
* @Developer Hemant Singh
* @Module Wishusucess_CategoryBreadcrumbImage
* @copyright Copyright (c) Wishusucess (http://www.wishusucess.com/)
*/
namespace Wishusucess\CategoryBreadcrumbImage\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;
use Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface;

/**
* @codeCoverageIgnore
*/
class InstallData implements InstallDataInterface
{
/**
* EAV setup factory.
*
* @var EavSetupFactory
*/
private $_eavSetupFactory;
protected $categorySetupFactory;

/**
* Init.
*
* @param EavSetupFactory $eavSetupFactory
*/
public function __construct(EavSetupFactory $eavSetupFactory, \Magento\Catalog\Setup\CategorySetupFactory $categorySetupFactory)
{
$this->_eavSetupFactory = $eavSetupFactory;
$this->categorySetupFactory = $categorySetupFactory;
}

/**
* {@inheritdoc}
*
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
*/
public function install(
ModuleDataSetupInterface $setup,
ModuleContextInterface $context
) {
/** @var EavSetup $eavSetup */
$eavSetup = $this->_eavSetupFactory->create(['setup' => $setup]);
$setup = $this->categorySetupFactory->create(['setup' => $setup]); 
$setup->addAttribute(
\Magento\Catalog\Model\Category::ENTITY, 'breadcrumb_image', [
'type' => 'varchar',
'label' => 'Breadcrumb Image',
'input' => 'image',
'backend' => 'Magento\Catalog\Model\Category\Attribute\Backend\Image',
'required' => false,
'sort_order' => 9,
'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE,
'group' => 'General Information',
]
);
}
}

 

Create Model Class for Custom Upload Image Attribute in Magento 2

Here Model class we will use to process over the breadcrumb_image attribute and do data operations like create, read, update and delete, on a database.

app/code/Wishusucess/CategoryBreadcrumbImage/Model/Category/DataProvider.php

$fields = parent::getFieldsMap();
$fields['content'][] = 'breadcrumb_image'; // breadcrumb image field

In the above code we have mapped the breadcrumb_image attribute field.

<?php
/*
* @Author Hemant Singh
* @Developer Hemant Singh
* @Module Wishusucess_CategoryBreadcrumbImage
* @copyright Copyright (c) Wishusucess (http://www.wishusucess.com/)
*/
namespace Wishusucess\CategoryBreadcrumbImage\Model\Category;

class DataProvider extends \Magento\Catalog\Model\Category\DataProvider
{

protected function getFieldsMap()
{
$fields = parent::getFieldsMap();
$fields['content'][] = 'breadcrumb_image'; // breadcrumb image field

return $fields;
}
}

 

Breadcrumb Image Upload Class in Magento 2

This controller class basically follow the actual operation on breadcrumb_image. This class has execute() method which  contain action to do.

app/code/Wishusucess/CategoryBreadcrumbImage/Controller/Adminhtml/Category/BreadcrumbImage/Upload.php

<?php
/*
* @Author Hemant Singh
* @Developer Hemant Singh
* @Module Wishusucess_CategoryBreadcrumbImage
* @copyright Copyright (c) Wishusucess (http://www.wishusucess.com/)
*/
namespace Wishusucess\CategoryBreadcrumbImage\Controller\Adminhtml\Category\BreadcrumbImage;

use Magento\Framework\Controller\ResultFactory;

/**
* Class Upload
*/
class Upload extends \Magento\Backend\App\Action
{
/**
* Image uploader
*
* @var \Magento\Catalog\Model\ImageUploader
*/
protected $imageUploader;

/**
* Uploader factory
*
* @var \Magento\MediaStorage\Model\File\UploaderFactory
*/
private $uploaderFactory;

/**
* Media directory object (writable).
*
* @var \Magento\Framework\Filesystem\Directory\WriteInterface
*/
protected $mediaDirectory;

/**
* Store manager
*
* @var \Magento\Store\Model\StoreManagerInterface
*/
protected $storeManager;

/**
* Core file storage database
*
* @var \Magento\MediaStorage\Helper\File\Storage\Database
*/
protected $coreFileStorageDatabase;

/**
* @var \Psr\Log\LoggerInterface
*/
protected $logger;

/**
* Upload constructor.
*
* @param \Magento\Backend\App\Action\Context $context
* @param \Magento\Catalog\Model\ImageUploader $imageUploader
*/
public function __construct(
\Magento\Backend\App\Action\Context $context,
\Magento\Catalog\Model\ImageUploader $imageUploader,
\Magento\MediaStorage\Model\File\UploaderFactory $uploaderFactory,
\Magento\Framework\Filesystem $filesystem,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\MediaStorage\Helper\File\Storage\Database $coreFileStorageDatabase,
\Psr\Log\LoggerInterface $logger
) {
parent::__construct($context);
$this->imageUploader = $imageUploader;
$this->uploaderFactory = $uploaderFactory;
$this->mediaDirectory = $filesystem->getDirectoryWrite(\Magento\Framework\App\Filesystem\DirectoryList::MEDIA);
$this->storeManager = $storeManager;
$this->coreFileStorageDatabase = $coreFileStorageDatabase;
$this->logger = $logger;
}

/**
* Check admin permissions for this controller
*
* @return boolean
*/
protected function _isAllowed()
{
return $this->_authorization->isAllowed('Wishusucess_CategoryBreadcrumbImag::category');
}

/**
* Upload file controller action
*
* @return \Magento\Framework\Controller\ResultInterface
*/
public function execute()
{
try {
$result = $this->imageUploader->saveFileToTmpDir('breadcrumb_image');
$result['cookie'] = [
'name' => $this->_getSession()->getName(),
'value' => $this->_getSession()->getSessionId(),
'lifetime' => $this->_getSession()->getCookieLifetime(),
'path' => $this->_getSession()->getCookiePath(),
'domain' => $this->_getSession()->getCookieDomain(),
];
} catch (\Exception $e) {
$result = ['error' => $e->getMessage(), 'errorcode' => $e->getCode()];
}
return $this->resultFactory->create(ResultFactory::TYPE_JSON)->setData([[$result]]);
}
}

 

Add field ID in Category Form For Breadcrumb Image

app/code/Wishusucess/CategoryBreadcrumbImage/view/adminhtml/ui_component/category_form.xml

<?xml version="1.0" encoding="UTF-8"?>
<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
<fieldset name="cat-breadcrumb-image">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="label" xsi:type="string" translate="true">Breadcrumb Image</item>
<item name="collapsible" xsi:type="boolean">true</item>
<item name="sortOrder" xsi:type="number">100</item>
</item>
</argument>
<field name="breadcrumb_image">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="dataType" xsi:type="string">string</item>
<item name="source" xsi:type="string">category</item>
<item name="label" xsi:type="string" translate="true">Breadcrumb Image</item>
<item name="visible" xsi:type="boolean">true</item>
<item name="formElement" xsi:type="string">fileUploader</item>
<item name="elementTmpl" xsi:type="string">ui/form/element/uploader/uploader</item>
<item name="previewTmpl" xsi:type="string">Magento_Catalog/image-preview</item>
<item name="required" xsi:type="boolean">false</item>
<item name="sortOrder" xsi:type="number">40</item>
<item name="uploaderConfig" xsi:type="array">
<item name="url" xsi:type="url" path="catalog/category_image/upload"/>
</item>
</item>
</argument>
</field>
</fieldset>
</form>

 

Now, Run Following Command:

php bin/magento setup:upgrade

php bin/magento setup:di:compile

php bin/magento setup:static-content:deplpy -f

php bin/magento cache:clean

 

Download Link:

Category Breadcrumb Image Extension in Magento 2

Hire Magento 2 Expert Developer to Develop Your Store

 

Related Post:

Custom Shipping Text Filed: Show Custom Text Magento 2

Search AutoComplete: Magento 2 Module Add All Category for Search

Share Product on WhatsApp: With Products Image And URL in Magento 2

 

Recommended Post:

Magento 2.4 Installation Guide: How to Install Magento 2.4.2

Magento Store: Best 36 Magento Websites Example in The World

SEO Packages: How Much Do SEO Packages Cost in India, SEO Pricing