I was trying to disable the Cash on Delivery
payment method using payment_method_is_active
event and observer. But It stopped placing orders due to JavaSript error in the console.
Error in the checkout page:
Uncaught TypeError: Unable to process binding "html: function(){return getInstructions() }"
Message: Cannot read properties of undefined (reading 'cashondelivery')
at UiClass.getInstructions (cashondelivery-method.min.js:1:256)
at html (eval at createBindingsStringEvaluator (knockout.min.js:285:237), <anonymous>:3:64)
at evaluateValueAccessor (knockout.min.js:306:54)
at knockout.min.js:330:181
at update (knockout.min.js:399:434)
at ko.dependentObservable.disposeWhenNodeIsRemoved (knockout.min.js:336:74)
at Function.evaluateImmediate_CallReadThenEndDependencyDetection (knockout.min.js:212:240)
at Function.evaluateImmediate_CallReadWithDependencyDetection (knockout.min.js:207:626)
at Function.evaluateImmediate (knockout.min.js:206:46)
at ko.computed.ko.dependentObservable (knockout.min.js:195:71)
Observer
<?php
declare(strict_types=1);
namespace Vendor\Module\Observer;
use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;
class TogglePaymentMethods implements ObserverInterface
{
/**
* @param Observer $observer
* @return void
*/
public function execute(Observer $observer)
{
$result = $observer->getEvent()->getResult();
$method_instance = $observer->getEvent()->getMethodInstance();
$quote = $observer->getEvent()->getQuote();
if($method_instance->getCode() == 'cashondelivery'){
$result->setData('is_available', false);
}
}
}