Magento2: Function of enable/disable (yes/no) button for any module
-
21-03-2021 - |
Question
I Have a module for the new shipment method with dropdown option (yes/no), to enable and disable the module function. I want to know how the module function works off while select No, and module work starts while select Yes. how is module bind with on the button enable/disable the function. please check below module code and images. /Packt/Shipme/registration.php
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Packt_Shipme',
__DIR__
);
/Packt/Shipme/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="Packt_Shipme" setup_version="2.0.0">
<sequence>
<module name="Magento_Shipping"/>
</sequence>
</module>
</config>
/Packt/Shipme/etc/config.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Store:etc/con
fig.xsd">
<default>
<carriers>
<shipme>
<model>Packt\Shipme\Model\Carrier\Shipme</model>
<active>1</active>
<name>Shipme Shipping</name>
<title>Shipme Shipping</title>
<express_enabled>1</express_enabled>
<express_title>Express delivery</express_title>
<express_price>4</express_price><business_enabled>1</business_enabled>
<business_title>Business delivery</business_title>
<business_price>5</business_price>
<specificerrmsg>This shipping method is currently unavailable.
If you would like to ship using this shipping method, please contact
us.</specificerrmsg>
</shipme>
</carriers>
</default>
</config>
/Packt/Shipme/etc/adminhtml/system.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Config:etc/system_file.xsd">
<system>
<section id="carriers"><group id="shipme" translate="label" type="text" sortOrder="50"
showInDefault="1" showInWebsite="1" showInStore="1">
<label>Shipme</label>
<field id="active" translate="label" type="select"
sortOrder="10" showInDefault="1" showInWebsite="1" showInStore="0">
<label>Enabled</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
</field>
<field id="name" translate="label" type="text" sortOrder="20"
showInDefault="1" showInWebsite="1" showInStore="1">
<label>Method Name</label>
</field>
<field id="title" translate="label" type="text" sortOrder="20"
showInDefault="1" showInWebsite="1" showInStore="1">
<label>Method Title</label>
</field>
<field id="express_enabled" translate="label" type="select"
sortOrder="30" showInDefault="1" showInWebsite="1" showInStore="0"><label>Enable express</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
</field>
<field id="express_title" translate="label" type="text"
sortOrder="40" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Title express</label>
</field>
<field id="express_price" translate="label" type="text"
sortOrder="50" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Price express</label>
</field>
<field id="business_enabled" translate="label" type="select"
sortOrder="60" showInDefault="1" showInWebsite="1" showInStore="0">
<label>Enable business</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
</field>
<field id="business_title" translate="label" type="text"
sortOrder="70" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Title business</label>
</field>
<field id="business_price" translate="label" type="text"
sortOrder="80" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Price business</label>
</field>
<field id="specificerrmsg" translate="label" type="textarea"
sortOrder="90" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Displayed Error Message</label>
</field>
<field id="sallowspecific" translate="label" type="select"
sortOrder="100" showInDefault="1" showInWebsite="1" showInStore="0">
<label>Ship to Applicable Countries</label>
<frontend_class>shipping-applicable-country</frontend_class>
<source_model>Magento\Shipping\Model\Config\Source\Allspecificcountries</source_model>
</field>
<field id="specificcountry" translate="label" type="multiselect"
sortOrder="110" showInDefault="1" showInWebsite="1" showInStore="0">
<label>Ship to Specific Countries</label>
<source_model>Magento\Directory\Model\Config\Source\Country</source_model>
<can_be_empty>1</can_be_empty>
</field>
</group>
</section>
</system>
</config>
/Packt/Shipme/Model/Carrier/Shipme.php
<?php
namespace Packt\Shipme\Model\Carrier;
use Magento\Shipping\Model\Rate\Result;
class Shipme extends \Magento\Shipping\Model\Carrier\AbstractCarrier implements
\Magento\Shipping\Model\Carrier\CarrierInterface {
protected $_code = 'shipme';
/**
* @var \Magento\Shipping\Model\Rate\ResultFactory
*/
protected $_rateResultFactory;
/**
* @var \Magento\Quote\Model\Quote\Address\RateResult\MethodFactory
*/
protected $_rateMethodFactory;
public function __construct(
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
\Magento\Quote\Model\Quote\Address\RateResult\ErrorFactory
$rateErrorFactory,
\Psr\Log\LoggerInterface $logger,
\Magento\Shipping\Model\Rate\ResultFactory $rateResultFactory,
\Magento\Quote\Model\Quote\Address\RateResult\MethodFactory
$rateMethodFactory,
array $data = []
) {
$this->_rateResultFactory = $rateResultFactory;
$this->_rateMethodFactory = $rateMethodFactory;
parent::__construct($scopeConfig, $rateErrorFactory, $logger,
$data);
}
public function
collectRates(\Magento\Quote\Model\Quote\Address\RateRequest $request) {
if (!$this->getConfigFlag('active')) {
return false;
}
$result = $this->_rateResultFactory->create();
//Check if express method is enabled
if ($this->getConfigData('express_enabled')) {
$method = $this->_rateMethodFactory->create();
$method->setCarrier($this->_code);$method->setCarrierTitle($this->getConfigData('name'));
$method->setMethod('express');
$method->setMethodTitle($this->getConfigData('express_title'));
$method->setPrice($this->getConfigData('express_price'));
$method->setCost($this->getConfigData('express_price'));
$result->append($method);
}
//Check if business method is enabled
if ($this->getConfigData('business_enabled')) {
$method = $this->_rateMethodFactory->create();
$method->setCarrier($this->_code);
$method->setCarrierTitle($this->getConfigData('name'));
$method->setMethod('business');
$method->setMethodTitle($this->getConfigData('business_title'));
$method->setPrice($this->getConfigData('business_price'));
$method->setCost($this->getConfigData('business_price'));
$result->append($method);
}
return $result;
}
public function getAllowedMethods() {
return ['shipme' => $this->getConfigData('name')];
}
public function isTrackingAvailable()
{
return true;
}
}
Solution
This line of code in config.xml
makes your module Enabled as default on installation <active>1</active>
Next, these lines of code in your shipme.php
file tell the system to check if it is enabled or not.
protected $_code = 'shipme';
if (!$this->getConfigFlag('active')) {
return false;
}
This is how the system knows if your module is enabled or not.