How to override model in magento2?
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ margin-bottom:0;
}
I want to remove the below lines in MagentoQuoteModelPaymentMethodManagement model file
if (!$this->zeroTotalValidator->isApplicable($payment->getMethodInstance(), $quote)) {
throw new InvalidTransitionException(__('The requested Payment Method is not available.'));
}
In PaymentMethodManagement file:
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace MagentoQuoteModel;
use MagentoFrameworkExceptionStateInvalidTransitionException;
/**
* Class PaymentMethodManagement
*/
class PaymentMethodManagement implements MagentoQuoteApiPaymentMethodManagementInterface
{
/**
* @var MagentoQuoteApiCartRepositoryInterface
*/
protected $quoteRepository;
/**
* @var MagentoPaymentModelChecksZeroTotal
*/
protected $zeroTotalValidator;
/**
* @var MagentoPaymentModelMethodList
*/
protected $methodList;
/**
* Constructor
*
* @param MagentoQuoteApiCartRepositoryInterface $quoteRepository
* @param MagentoPaymentModelChecksZeroTotal $zeroTotalValidator
* @param MagentoPaymentModelMethodList $methodList
*/
public function __construct(
MagentoQuoteApiCartRepositoryInterface $quoteRepository,
MagentoPaymentModelChecksZeroTotal $zeroTotalValidator,
MagentoPaymentModelMethodList $methodList
) {
$this->quoteRepository = $quoteRepository;
$this->zeroTotalValidator = $zeroTotalValidator;
$this->methodList = $methodList;
}
/**
* {@inheritdoc}
*/
public function set($cartId, MagentoQuoteApiDataPaymentInterface $method)
{
/** @var MagentoQuoteModelQuote $quote */
$quote = $this->quoteRepository->get($cartId);
$method->setChecks([
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_CHECKOUT,
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_FOR_COUNTRY,
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_FOR_CURRENCY,
MagentoPaymentModelMethodAbstractMethod::CHECK_ORDER_TOTAL_MIN_MAX,
]);
$payment = $quote->getPayment();
$data = $method->getData();
$payment->importData($data);
if ($quote->isVirtual()) {
$quote->getBillingAddress()->setPaymentMethod($payment->getMethod());
} else {
// check if shipping address is set
if ($quote->getShippingAddress()->getCountryId() === null) {
throw new InvalidTransitionException(__('Shipping address is not set'));
}
$quote->getShippingAddress()->setPaymentMethod($payment->getMethod());
}
if (!$quote->isVirtual() && $quote->getShippingAddress()) {
$quote->getShippingAddress()->setCollectShippingRates(true);
}
if (!$this->zeroTotalValidator->isApplicable($payment->getMethodInstance(), $quote)) {
throw new InvalidTransitionException(__('The requested Payment Method is not available.'));
}
$quote->setTotalsCollectedFlag(false)->collectTotals()->save();
return $quote->getPayment()->getId();
}}
How to do this.
Thanks.
magento2 php-7.2
add a comment |
I want to remove the below lines in MagentoQuoteModelPaymentMethodManagement model file
if (!$this->zeroTotalValidator->isApplicable($payment->getMethodInstance(), $quote)) {
throw new InvalidTransitionException(__('The requested Payment Method is not available.'));
}
In PaymentMethodManagement file:
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace MagentoQuoteModel;
use MagentoFrameworkExceptionStateInvalidTransitionException;
/**
* Class PaymentMethodManagement
*/
class PaymentMethodManagement implements MagentoQuoteApiPaymentMethodManagementInterface
{
/**
* @var MagentoQuoteApiCartRepositoryInterface
*/
protected $quoteRepository;
/**
* @var MagentoPaymentModelChecksZeroTotal
*/
protected $zeroTotalValidator;
/**
* @var MagentoPaymentModelMethodList
*/
protected $methodList;
/**
* Constructor
*
* @param MagentoQuoteApiCartRepositoryInterface $quoteRepository
* @param MagentoPaymentModelChecksZeroTotal $zeroTotalValidator
* @param MagentoPaymentModelMethodList $methodList
*/
public function __construct(
MagentoQuoteApiCartRepositoryInterface $quoteRepository,
MagentoPaymentModelChecksZeroTotal $zeroTotalValidator,
MagentoPaymentModelMethodList $methodList
) {
$this->quoteRepository = $quoteRepository;
$this->zeroTotalValidator = $zeroTotalValidator;
$this->methodList = $methodList;
}
/**
* {@inheritdoc}
*/
public function set($cartId, MagentoQuoteApiDataPaymentInterface $method)
{
/** @var MagentoQuoteModelQuote $quote */
$quote = $this->quoteRepository->get($cartId);
$method->setChecks([
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_CHECKOUT,
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_FOR_COUNTRY,
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_FOR_CURRENCY,
MagentoPaymentModelMethodAbstractMethod::CHECK_ORDER_TOTAL_MIN_MAX,
]);
$payment = $quote->getPayment();
$data = $method->getData();
$payment->importData($data);
if ($quote->isVirtual()) {
$quote->getBillingAddress()->setPaymentMethod($payment->getMethod());
} else {
// check if shipping address is set
if ($quote->getShippingAddress()->getCountryId() === null) {
throw new InvalidTransitionException(__('Shipping address is not set'));
}
$quote->getShippingAddress()->setPaymentMethod($payment->getMethod());
}
if (!$quote->isVirtual() && $quote->getShippingAddress()) {
$quote->getShippingAddress()->setCollectShippingRates(true);
}
if (!$this->zeroTotalValidator->isApplicable($payment->getMethodInstance(), $quote)) {
throw new InvalidTransitionException(__('The requested Payment Method is not available.'));
}
$quote->setTotalsCollectedFlag(false)->collectTotals()->save();
return $quote->getPayment()->getId();
}}
How to do this.
Thanks.
magento2 php-7.2
add a comment |
I want to remove the below lines in MagentoQuoteModelPaymentMethodManagement model file
if (!$this->zeroTotalValidator->isApplicable($payment->getMethodInstance(), $quote)) {
throw new InvalidTransitionException(__('The requested Payment Method is not available.'));
}
In PaymentMethodManagement file:
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace MagentoQuoteModel;
use MagentoFrameworkExceptionStateInvalidTransitionException;
/**
* Class PaymentMethodManagement
*/
class PaymentMethodManagement implements MagentoQuoteApiPaymentMethodManagementInterface
{
/**
* @var MagentoQuoteApiCartRepositoryInterface
*/
protected $quoteRepository;
/**
* @var MagentoPaymentModelChecksZeroTotal
*/
protected $zeroTotalValidator;
/**
* @var MagentoPaymentModelMethodList
*/
protected $methodList;
/**
* Constructor
*
* @param MagentoQuoteApiCartRepositoryInterface $quoteRepository
* @param MagentoPaymentModelChecksZeroTotal $zeroTotalValidator
* @param MagentoPaymentModelMethodList $methodList
*/
public function __construct(
MagentoQuoteApiCartRepositoryInterface $quoteRepository,
MagentoPaymentModelChecksZeroTotal $zeroTotalValidator,
MagentoPaymentModelMethodList $methodList
) {
$this->quoteRepository = $quoteRepository;
$this->zeroTotalValidator = $zeroTotalValidator;
$this->methodList = $methodList;
}
/**
* {@inheritdoc}
*/
public function set($cartId, MagentoQuoteApiDataPaymentInterface $method)
{
/** @var MagentoQuoteModelQuote $quote */
$quote = $this->quoteRepository->get($cartId);
$method->setChecks([
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_CHECKOUT,
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_FOR_COUNTRY,
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_FOR_CURRENCY,
MagentoPaymentModelMethodAbstractMethod::CHECK_ORDER_TOTAL_MIN_MAX,
]);
$payment = $quote->getPayment();
$data = $method->getData();
$payment->importData($data);
if ($quote->isVirtual()) {
$quote->getBillingAddress()->setPaymentMethod($payment->getMethod());
} else {
// check if shipping address is set
if ($quote->getShippingAddress()->getCountryId() === null) {
throw new InvalidTransitionException(__('Shipping address is not set'));
}
$quote->getShippingAddress()->setPaymentMethod($payment->getMethod());
}
if (!$quote->isVirtual() && $quote->getShippingAddress()) {
$quote->getShippingAddress()->setCollectShippingRates(true);
}
if (!$this->zeroTotalValidator->isApplicable($payment->getMethodInstance(), $quote)) {
throw new InvalidTransitionException(__('The requested Payment Method is not available.'));
}
$quote->setTotalsCollectedFlag(false)->collectTotals()->save();
return $quote->getPayment()->getId();
}}
How to do this.
Thanks.
magento2 php-7.2
I want to remove the below lines in MagentoQuoteModelPaymentMethodManagement model file
if (!$this->zeroTotalValidator->isApplicable($payment->getMethodInstance(), $quote)) {
throw new InvalidTransitionException(__('The requested Payment Method is not available.'));
}
In PaymentMethodManagement file:
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace MagentoQuoteModel;
use MagentoFrameworkExceptionStateInvalidTransitionException;
/**
* Class PaymentMethodManagement
*/
class PaymentMethodManagement implements MagentoQuoteApiPaymentMethodManagementInterface
{
/**
* @var MagentoQuoteApiCartRepositoryInterface
*/
protected $quoteRepository;
/**
* @var MagentoPaymentModelChecksZeroTotal
*/
protected $zeroTotalValidator;
/**
* @var MagentoPaymentModelMethodList
*/
protected $methodList;
/**
* Constructor
*
* @param MagentoQuoteApiCartRepositoryInterface $quoteRepository
* @param MagentoPaymentModelChecksZeroTotal $zeroTotalValidator
* @param MagentoPaymentModelMethodList $methodList
*/
public function __construct(
MagentoQuoteApiCartRepositoryInterface $quoteRepository,
MagentoPaymentModelChecksZeroTotal $zeroTotalValidator,
MagentoPaymentModelMethodList $methodList
) {
$this->quoteRepository = $quoteRepository;
$this->zeroTotalValidator = $zeroTotalValidator;
$this->methodList = $methodList;
}
/**
* {@inheritdoc}
*/
public function set($cartId, MagentoQuoteApiDataPaymentInterface $method)
{
/** @var MagentoQuoteModelQuote $quote */
$quote = $this->quoteRepository->get($cartId);
$method->setChecks([
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_CHECKOUT,
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_FOR_COUNTRY,
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_FOR_CURRENCY,
MagentoPaymentModelMethodAbstractMethod::CHECK_ORDER_TOTAL_MIN_MAX,
]);
$payment = $quote->getPayment();
$data = $method->getData();
$payment->importData($data);
if ($quote->isVirtual()) {
$quote->getBillingAddress()->setPaymentMethod($payment->getMethod());
} else {
// check if shipping address is set
if ($quote->getShippingAddress()->getCountryId() === null) {
throw new InvalidTransitionException(__('Shipping address is not set'));
}
$quote->getShippingAddress()->setPaymentMethod($payment->getMethod());
}
if (!$quote->isVirtual() && $quote->getShippingAddress()) {
$quote->getShippingAddress()->setCollectShippingRates(true);
}
if (!$this->zeroTotalValidator->isApplicable($payment->getMethodInstance(), $quote)) {
throw new InvalidTransitionException(__('The requested Payment Method is not available.'));
}
$quote->setTotalsCollectedFlag(false)->collectTotals()->save();
return $quote->getPayment()->getId();
}}
How to do this.
Thanks.
magento2 php-7.2
magento2 php-7.2
asked Apr 17 at 4:37
Mano MMano M
1,087219
1,087219
add a comment |
add a comment |
4 Answers
4
active
oldest
votes
Steps to Follow :
- Override di.xml
- Override PaymentMethodManagement.php
- Launch SSH and Run Commands
Override di.xml
app/code/Namespace/Modulename/etc
<?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="MagentoQuoteModelPaymentMethodManagement" type="NamespaceModulenamePaymentMethodManagement" />
</config>
Override PaymentMethodManagement.php
/**
* {@inheritdoc}
*/
public function set($cartId, MagentoQuoteApiDataPaymentInterface $method)
{
/** @var MagentoQuoteModelQuote $quote */
$quote = $this->quoteRepository->get($cartId);
$method->setChecks([
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_CHECKOUT,
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_FOR_COUNTRY,
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_FOR_CURRENCY,
MagentoPaymentModelMethodAbstractMethod::CHECK_ORDER_TOTAL_MIN_MAX,
]);
$payment = $quote->getPayment();
$data = $method->getData();
$payment->importData($data);
if ($quote->isVirtual()) {
$quote->getBillingAddress()->setPaymentMethod($payment->getMethod());
} else {
// check if shipping address is set
if ($quote->getShippingAddress()->getCountryId() === null) {
throw new InvalidTransitionException(__('Shipping address is not set'));
}
$quote->getShippingAddress()->setPaymentMethod($payment->getMethod());
}
if (!$quote->isVirtual() && $quote->getShippingAddress()) {
$quote->getShippingAddress()->setCollectShippingRates(true);
}
/*** Do stuff with this code ***/
if (!$this->zeroTotalValidator->isApplicable($payment->getMethodInstance(), $quote)) {
throw new InvalidTransitionException(__(''));
}
/*** Do stuff with this code ***/
$quote->setTotalsCollectedFlag(false)->collectTotals()->save();
return $quote->getPayment()->getId();
}
Launch SSH and Run Commands
php bin/magento setup:di:compile
php bin/magento cache:clean
php bin/magento cache:flush
I hope it helps!
add a comment |
You can do it by using Preference in your di.xml file of your custom module.
<?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="MagentoQuoteModelPaymentMethodManagement" type="vendormoduleModelPaymentMethodManagement" />
</config>
add a comment |
in you 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="MagentoQuoteModelPaymentMethodManagement" type="VendorModuleModelRewriteQuotePaymentMethodManagement" />
</config>
in your Model file
<?php
namespace VendorModuleModelRewriteQuote;
class PaymentMethodManagement extends MagentoQuoteModelPaymentMethodManagement
{
public function set($cartId, MagentoQuoteApiDataPaymentInterface $method)
{
/** @var MagentoQuoteModelQuote $quote */
$quote = $this->quoteRepository->get($cartId);
$method->setChecks([
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_CHECKOUT,
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_FOR_COUNTRY,
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_FOR_CURRENCY,
MagentoPaymentModelMethodAbstractMethod::CHECK_ORDER_TOTAL_MIN_MAX,
]);
$payment = $quote->getPayment();
$data = $method->getData();
$payment->importData($data);
if ($quote->isVirtual()) {
$quote->getBillingAddress()->setPaymentMethod($payment->getMethod());
} else {
// check if shipping address is set
if ($quote->getShippingAddress()->getCountryId() === null) {
throw new InvalidTransitionException(__('Shipping address is not set'));
}
$quote->getShippingAddress()->setPaymentMethod($payment->getMethod());
}
if (!$quote->isVirtual() && $quote->getShippingAddress()) {
$quote->getShippingAddress()->setCollectShippingRates(true);
}
/*** Do stuff with this code ***/
if (!$this->zeroTotalValidator->isApplicable($payment->getMethodInstance(), $quote)) {
throw new InvalidTransitionException(__(''));
}
/*** Do stuff with this code ***/
$quote->setTotalsCollectedFlag(false)->collectTotals()->save();
return $quote->getPayment()->getId();
}
}
add a comment |
All above answers tell you how to rewrite the model, exactly what is asked. But Magento 2 offers another solution to your problem: Plugins. With plugins you can change the outcome of about any public method in Magento 2. You want to change the result of this function:
if (!$this->zeroTotalValidator->isApplicable($payment->getMethodInstance(), $quote)) {
throw new InvalidTransitionException(__('The requested Payment Method is not available.'));
}
You can do this by adding a plugin on the MagentoPaymentModelChecksZeroTotal
class. Add this to your etc/di.xml
file:
<type name="MagentoQuoteModelPaymentMethodManagement">
<plugin name="your_unique_name_for_this_plugin" type="VendorModulePluginPaymentMethodManagement" />
</type>
Then create the file:
Vendor/Module/Plugin/PaymentMethodManagement
namespace Vendor/Module/Plugin;
class PaymentMethodManagement {
public function afterIsApplicable($subject, $result)
{
return true;
}
}
This will make sure the function always returns true. If you want a more granular approach you can change the function to this:
public function aroundIsApplicable($subject, callable $proceed, ...$args)
{
if ($this->meetsMyCustomRequirement()) {
// This will call the original function and return it's results.
return $proceed(...$args);
}
return false;
}
If the $proceed
function isn't called then the original function is also never called.
This is the best solution. I always refer plugin for overriding the class
– Amit Bera♦
Apr 19 at 3:15
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "479"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmagento.stackexchange.com%2fquestions%2f270381%2fhow-to-override-model-in-magento2%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
4 Answers
4
active
oldest
votes
4 Answers
4
active
oldest
votes
active
oldest
votes
active
oldest
votes
Steps to Follow :
- Override di.xml
- Override PaymentMethodManagement.php
- Launch SSH and Run Commands
Override di.xml
app/code/Namespace/Modulename/etc
<?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="MagentoQuoteModelPaymentMethodManagement" type="NamespaceModulenamePaymentMethodManagement" />
</config>
Override PaymentMethodManagement.php
/**
* {@inheritdoc}
*/
public function set($cartId, MagentoQuoteApiDataPaymentInterface $method)
{
/** @var MagentoQuoteModelQuote $quote */
$quote = $this->quoteRepository->get($cartId);
$method->setChecks([
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_CHECKOUT,
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_FOR_COUNTRY,
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_FOR_CURRENCY,
MagentoPaymentModelMethodAbstractMethod::CHECK_ORDER_TOTAL_MIN_MAX,
]);
$payment = $quote->getPayment();
$data = $method->getData();
$payment->importData($data);
if ($quote->isVirtual()) {
$quote->getBillingAddress()->setPaymentMethod($payment->getMethod());
} else {
// check if shipping address is set
if ($quote->getShippingAddress()->getCountryId() === null) {
throw new InvalidTransitionException(__('Shipping address is not set'));
}
$quote->getShippingAddress()->setPaymentMethod($payment->getMethod());
}
if (!$quote->isVirtual() && $quote->getShippingAddress()) {
$quote->getShippingAddress()->setCollectShippingRates(true);
}
/*** Do stuff with this code ***/
if (!$this->zeroTotalValidator->isApplicable($payment->getMethodInstance(), $quote)) {
throw new InvalidTransitionException(__(''));
}
/*** Do stuff with this code ***/
$quote->setTotalsCollectedFlag(false)->collectTotals()->save();
return $quote->getPayment()->getId();
}
Launch SSH and Run Commands
php bin/magento setup:di:compile
php bin/magento cache:clean
php bin/magento cache:flush
I hope it helps!
add a comment |
Steps to Follow :
- Override di.xml
- Override PaymentMethodManagement.php
- Launch SSH and Run Commands
Override di.xml
app/code/Namespace/Modulename/etc
<?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="MagentoQuoteModelPaymentMethodManagement" type="NamespaceModulenamePaymentMethodManagement" />
</config>
Override PaymentMethodManagement.php
/**
* {@inheritdoc}
*/
public function set($cartId, MagentoQuoteApiDataPaymentInterface $method)
{
/** @var MagentoQuoteModelQuote $quote */
$quote = $this->quoteRepository->get($cartId);
$method->setChecks([
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_CHECKOUT,
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_FOR_COUNTRY,
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_FOR_CURRENCY,
MagentoPaymentModelMethodAbstractMethod::CHECK_ORDER_TOTAL_MIN_MAX,
]);
$payment = $quote->getPayment();
$data = $method->getData();
$payment->importData($data);
if ($quote->isVirtual()) {
$quote->getBillingAddress()->setPaymentMethod($payment->getMethod());
} else {
// check if shipping address is set
if ($quote->getShippingAddress()->getCountryId() === null) {
throw new InvalidTransitionException(__('Shipping address is not set'));
}
$quote->getShippingAddress()->setPaymentMethod($payment->getMethod());
}
if (!$quote->isVirtual() && $quote->getShippingAddress()) {
$quote->getShippingAddress()->setCollectShippingRates(true);
}
/*** Do stuff with this code ***/
if (!$this->zeroTotalValidator->isApplicable($payment->getMethodInstance(), $quote)) {
throw new InvalidTransitionException(__(''));
}
/*** Do stuff with this code ***/
$quote->setTotalsCollectedFlag(false)->collectTotals()->save();
return $quote->getPayment()->getId();
}
Launch SSH and Run Commands
php bin/magento setup:di:compile
php bin/magento cache:clean
php bin/magento cache:flush
I hope it helps!
add a comment |
Steps to Follow :
- Override di.xml
- Override PaymentMethodManagement.php
- Launch SSH and Run Commands
Override di.xml
app/code/Namespace/Modulename/etc
<?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="MagentoQuoteModelPaymentMethodManagement" type="NamespaceModulenamePaymentMethodManagement" />
</config>
Override PaymentMethodManagement.php
/**
* {@inheritdoc}
*/
public function set($cartId, MagentoQuoteApiDataPaymentInterface $method)
{
/** @var MagentoQuoteModelQuote $quote */
$quote = $this->quoteRepository->get($cartId);
$method->setChecks([
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_CHECKOUT,
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_FOR_COUNTRY,
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_FOR_CURRENCY,
MagentoPaymentModelMethodAbstractMethod::CHECK_ORDER_TOTAL_MIN_MAX,
]);
$payment = $quote->getPayment();
$data = $method->getData();
$payment->importData($data);
if ($quote->isVirtual()) {
$quote->getBillingAddress()->setPaymentMethod($payment->getMethod());
} else {
// check if shipping address is set
if ($quote->getShippingAddress()->getCountryId() === null) {
throw new InvalidTransitionException(__('Shipping address is not set'));
}
$quote->getShippingAddress()->setPaymentMethod($payment->getMethod());
}
if (!$quote->isVirtual() && $quote->getShippingAddress()) {
$quote->getShippingAddress()->setCollectShippingRates(true);
}
/*** Do stuff with this code ***/
if (!$this->zeroTotalValidator->isApplicable($payment->getMethodInstance(), $quote)) {
throw new InvalidTransitionException(__(''));
}
/*** Do stuff with this code ***/
$quote->setTotalsCollectedFlag(false)->collectTotals()->save();
return $quote->getPayment()->getId();
}
Launch SSH and Run Commands
php bin/magento setup:di:compile
php bin/magento cache:clean
php bin/magento cache:flush
I hope it helps!
Steps to Follow :
- Override di.xml
- Override PaymentMethodManagement.php
- Launch SSH and Run Commands
Override di.xml
app/code/Namespace/Modulename/etc
<?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="MagentoQuoteModelPaymentMethodManagement" type="NamespaceModulenamePaymentMethodManagement" />
</config>
Override PaymentMethodManagement.php
/**
* {@inheritdoc}
*/
public function set($cartId, MagentoQuoteApiDataPaymentInterface $method)
{
/** @var MagentoQuoteModelQuote $quote */
$quote = $this->quoteRepository->get($cartId);
$method->setChecks([
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_CHECKOUT,
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_FOR_COUNTRY,
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_FOR_CURRENCY,
MagentoPaymentModelMethodAbstractMethod::CHECK_ORDER_TOTAL_MIN_MAX,
]);
$payment = $quote->getPayment();
$data = $method->getData();
$payment->importData($data);
if ($quote->isVirtual()) {
$quote->getBillingAddress()->setPaymentMethod($payment->getMethod());
} else {
// check if shipping address is set
if ($quote->getShippingAddress()->getCountryId() === null) {
throw new InvalidTransitionException(__('Shipping address is not set'));
}
$quote->getShippingAddress()->setPaymentMethod($payment->getMethod());
}
if (!$quote->isVirtual() && $quote->getShippingAddress()) {
$quote->getShippingAddress()->setCollectShippingRates(true);
}
/*** Do stuff with this code ***/
if (!$this->zeroTotalValidator->isApplicable($payment->getMethodInstance(), $quote)) {
throw new InvalidTransitionException(__(''));
}
/*** Do stuff with this code ***/
$quote->setTotalsCollectedFlag(false)->collectTotals()->save();
return $quote->getPayment()->getId();
}
Launch SSH and Run Commands
php bin/magento setup:di:compile
php bin/magento cache:clean
php bin/magento cache:flush
I hope it helps!
answered Apr 17 at 4:49
Chirag PatelChirag Patel
2,648423
2,648423
add a comment |
add a comment |
You can do it by using Preference in your di.xml file of your custom module.
<?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="MagentoQuoteModelPaymentMethodManagement" type="vendormoduleModelPaymentMethodManagement" />
</config>
add a comment |
You can do it by using Preference in your di.xml file of your custom module.
<?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="MagentoQuoteModelPaymentMethodManagement" type="vendormoduleModelPaymentMethodManagement" />
</config>
add a comment |
You can do it by using Preference in your di.xml file of your custom module.
<?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="MagentoQuoteModelPaymentMethodManagement" type="vendormoduleModelPaymentMethodManagement" />
</config>
You can do it by using Preference in your di.xml file of your custom module.
<?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="MagentoQuoteModelPaymentMethodManagement" type="vendormoduleModelPaymentMethodManagement" />
</config>
answered Apr 17 at 4:47
magefmsmagefms
2,8052528
2,8052528
add a comment |
add a comment |
in you 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="MagentoQuoteModelPaymentMethodManagement" type="VendorModuleModelRewriteQuotePaymentMethodManagement" />
</config>
in your Model file
<?php
namespace VendorModuleModelRewriteQuote;
class PaymentMethodManagement extends MagentoQuoteModelPaymentMethodManagement
{
public function set($cartId, MagentoQuoteApiDataPaymentInterface $method)
{
/** @var MagentoQuoteModelQuote $quote */
$quote = $this->quoteRepository->get($cartId);
$method->setChecks([
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_CHECKOUT,
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_FOR_COUNTRY,
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_FOR_CURRENCY,
MagentoPaymentModelMethodAbstractMethod::CHECK_ORDER_TOTAL_MIN_MAX,
]);
$payment = $quote->getPayment();
$data = $method->getData();
$payment->importData($data);
if ($quote->isVirtual()) {
$quote->getBillingAddress()->setPaymentMethod($payment->getMethod());
} else {
// check if shipping address is set
if ($quote->getShippingAddress()->getCountryId() === null) {
throw new InvalidTransitionException(__('Shipping address is not set'));
}
$quote->getShippingAddress()->setPaymentMethod($payment->getMethod());
}
if (!$quote->isVirtual() && $quote->getShippingAddress()) {
$quote->getShippingAddress()->setCollectShippingRates(true);
}
/*** Do stuff with this code ***/
if (!$this->zeroTotalValidator->isApplicable($payment->getMethodInstance(), $quote)) {
throw new InvalidTransitionException(__(''));
}
/*** Do stuff with this code ***/
$quote->setTotalsCollectedFlag(false)->collectTotals()->save();
return $quote->getPayment()->getId();
}
}
add a comment |
in you 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="MagentoQuoteModelPaymentMethodManagement" type="VendorModuleModelRewriteQuotePaymentMethodManagement" />
</config>
in your Model file
<?php
namespace VendorModuleModelRewriteQuote;
class PaymentMethodManagement extends MagentoQuoteModelPaymentMethodManagement
{
public function set($cartId, MagentoQuoteApiDataPaymentInterface $method)
{
/** @var MagentoQuoteModelQuote $quote */
$quote = $this->quoteRepository->get($cartId);
$method->setChecks([
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_CHECKOUT,
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_FOR_COUNTRY,
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_FOR_CURRENCY,
MagentoPaymentModelMethodAbstractMethod::CHECK_ORDER_TOTAL_MIN_MAX,
]);
$payment = $quote->getPayment();
$data = $method->getData();
$payment->importData($data);
if ($quote->isVirtual()) {
$quote->getBillingAddress()->setPaymentMethod($payment->getMethod());
} else {
// check if shipping address is set
if ($quote->getShippingAddress()->getCountryId() === null) {
throw new InvalidTransitionException(__('Shipping address is not set'));
}
$quote->getShippingAddress()->setPaymentMethod($payment->getMethod());
}
if (!$quote->isVirtual() && $quote->getShippingAddress()) {
$quote->getShippingAddress()->setCollectShippingRates(true);
}
/*** Do stuff with this code ***/
if (!$this->zeroTotalValidator->isApplicable($payment->getMethodInstance(), $quote)) {
throw new InvalidTransitionException(__(''));
}
/*** Do stuff with this code ***/
$quote->setTotalsCollectedFlag(false)->collectTotals()->save();
return $quote->getPayment()->getId();
}
}
add a comment |
in you 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="MagentoQuoteModelPaymentMethodManagement" type="VendorModuleModelRewriteQuotePaymentMethodManagement" />
</config>
in your Model file
<?php
namespace VendorModuleModelRewriteQuote;
class PaymentMethodManagement extends MagentoQuoteModelPaymentMethodManagement
{
public function set($cartId, MagentoQuoteApiDataPaymentInterface $method)
{
/** @var MagentoQuoteModelQuote $quote */
$quote = $this->quoteRepository->get($cartId);
$method->setChecks([
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_CHECKOUT,
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_FOR_COUNTRY,
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_FOR_CURRENCY,
MagentoPaymentModelMethodAbstractMethod::CHECK_ORDER_TOTAL_MIN_MAX,
]);
$payment = $quote->getPayment();
$data = $method->getData();
$payment->importData($data);
if ($quote->isVirtual()) {
$quote->getBillingAddress()->setPaymentMethod($payment->getMethod());
} else {
// check if shipping address is set
if ($quote->getShippingAddress()->getCountryId() === null) {
throw new InvalidTransitionException(__('Shipping address is not set'));
}
$quote->getShippingAddress()->setPaymentMethod($payment->getMethod());
}
if (!$quote->isVirtual() && $quote->getShippingAddress()) {
$quote->getShippingAddress()->setCollectShippingRates(true);
}
/*** Do stuff with this code ***/
if (!$this->zeroTotalValidator->isApplicable($payment->getMethodInstance(), $quote)) {
throw new InvalidTransitionException(__(''));
}
/*** Do stuff with this code ***/
$quote->setTotalsCollectedFlag(false)->collectTotals()->save();
return $quote->getPayment()->getId();
}
}
in you 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="MagentoQuoteModelPaymentMethodManagement" type="VendorModuleModelRewriteQuotePaymentMethodManagement" />
</config>
in your Model file
<?php
namespace VendorModuleModelRewriteQuote;
class PaymentMethodManagement extends MagentoQuoteModelPaymentMethodManagement
{
public function set($cartId, MagentoQuoteApiDataPaymentInterface $method)
{
/** @var MagentoQuoteModelQuote $quote */
$quote = $this->quoteRepository->get($cartId);
$method->setChecks([
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_CHECKOUT,
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_FOR_COUNTRY,
MagentoPaymentModelMethodAbstractMethod::CHECK_USE_FOR_CURRENCY,
MagentoPaymentModelMethodAbstractMethod::CHECK_ORDER_TOTAL_MIN_MAX,
]);
$payment = $quote->getPayment();
$data = $method->getData();
$payment->importData($data);
if ($quote->isVirtual()) {
$quote->getBillingAddress()->setPaymentMethod($payment->getMethod());
} else {
// check if shipping address is set
if ($quote->getShippingAddress()->getCountryId() === null) {
throw new InvalidTransitionException(__('Shipping address is not set'));
}
$quote->getShippingAddress()->setPaymentMethod($payment->getMethod());
}
if (!$quote->isVirtual() && $quote->getShippingAddress()) {
$quote->getShippingAddress()->setCollectShippingRates(true);
}
/*** Do stuff with this code ***/
if (!$this->zeroTotalValidator->isApplicable($payment->getMethodInstance(), $quote)) {
throw new InvalidTransitionException(__(''));
}
/*** Do stuff with this code ***/
$quote->setTotalsCollectedFlag(false)->collectTotals()->save();
return $quote->getPayment()->getId();
}
}
edited Apr 17 at 4:55
answered Apr 17 at 4:47
Rakesh DongaRakesh Donga
2,679317
2,679317
add a comment |
add a comment |
All above answers tell you how to rewrite the model, exactly what is asked. But Magento 2 offers another solution to your problem: Plugins. With plugins you can change the outcome of about any public method in Magento 2. You want to change the result of this function:
if (!$this->zeroTotalValidator->isApplicable($payment->getMethodInstance(), $quote)) {
throw new InvalidTransitionException(__('The requested Payment Method is not available.'));
}
You can do this by adding a plugin on the MagentoPaymentModelChecksZeroTotal
class. Add this to your etc/di.xml
file:
<type name="MagentoQuoteModelPaymentMethodManagement">
<plugin name="your_unique_name_for_this_plugin" type="VendorModulePluginPaymentMethodManagement" />
</type>
Then create the file:
Vendor/Module/Plugin/PaymentMethodManagement
namespace Vendor/Module/Plugin;
class PaymentMethodManagement {
public function afterIsApplicable($subject, $result)
{
return true;
}
}
This will make sure the function always returns true. If you want a more granular approach you can change the function to this:
public function aroundIsApplicable($subject, callable $proceed, ...$args)
{
if ($this->meetsMyCustomRequirement()) {
// This will call the original function and return it's results.
return $proceed(...$args);
}
return false;
}
If the $proceed
function isn't called then the original function is also never called.
This is the best solution. I always refer plugin for overriding the class
– Amit Bera♦
Apr 19 at 3:15
add a comment |
All above answers tell you how to rewrite the model, exactly what is asked. But Magento 2 offers another solution to your problem: Plugins. With plugins you can change the outcome of about any public method in Magento 2. You want to change the result of this function:
if (!$this->zeroTotalValidator->isApplicable($payment->getMethodInstance(), $quote)) {
throw new InvalidTransitionException(__('The requested Payment Method is not available.'));
}
You can do this by adding a plugin on the MagentoPaymentModelChecksZeroTotal
class. Add this to your etc/di.xml
file:
<type name="MagentoQuoteModelPaymentMethodManagement">
<plugin name="your_unique_name_for_this_plugin" type="VendorModulePluginPaymentMethodManagement" />
</type>
Then create the file:
Vendor/Module/Plugin/PaymentMethodManagement
namespace Vendor/Module/Plugin;
class PaymentMethodManagement {
public function afterIsApplicable($subject, $result)
{
return true;
}
}
This will make sure the function always returns true. If you want a more granular approach you can change the function to this:
public function aroundIsApplicable($subject, callable $proceed, ...$args)
{
if ($this->meetsMyCustomRequirement()) {
// This will call the original function and return it's results.
return $proceed(...$args);
}
return false;
}
If the $proceed
function isn't called then the original function is also never called.
This is the best solution. I always refer plugin for overriding the class
– Amit Bera♦
Apr 19 at 3:15
add a comment |
All above answers tell you how to rewrite the model, exactly what is asked. But Magento 2 offers another solution to your problem: Plugins. With plugins you can change the outcome of about any public method in Magento 2. You want to change the result of this function:
if (!$this->zeroTotalValidator->isApplicable($payment->getMethodInstance(), $quote)) {
throw new InvalidTransitionException(__('The requested Payment Method is not available.'));
}
You can do this by adding a plugin on the MagentoPaymentModelChecksZeroTotal
class. Add this to your etc/di.xml
file:
<type name="MagentoQuoteModelPaymentMethodManagement">
<plugin name="your_unique_name_for_this_plugin" type="VendorModulePluginPaymentMethodManagement" />
</type>
Then create the file:
Vendor/Module/Plugin/PaymentMethodManagement
namespace Vendor/Module/Plugin;
class PaymentMethodManagement {
public function afterIsApplicable($subject, $result)
{
return true;
}
}
This will make sure the function always returns true. If you want a more granular approach you can change the function to this:
public function aroundIsApplicable($subject, callable $proceed, ...$args)
{
if ($this->meetsMyCustomRequirement()) {
// This will call the original function and return it's results.
return $proceed(...$args);
}
return false;
}
If the $proceed
function isn't called then the original function is also never called.
All above answers tell you how to rewrite the model, exactly what is asked. But Magento 2 offers another solution to your problem: Plugins. With plugins you can change the outcome of about any public method in Magento 2. You want to change the result of this function:
if (!$this->zeroTotalValidator->isApplicable($payment->getMethodInstance(), $quote)) {
throw new InvalidTransitionException(__('The requested Payment Method is not available.'));
}
You can do this by adding a plugin on the MagentoPaymentModelChecksZeroTotal
class. Add this to your etc/di.xml
file:
<type name="MagentoQuoteModelPaymentMethodManagement">
<plugin name="your_unique_name_for_this_plugin" type="VendorModulePluginPaymentMethodManagement" />
</type>
Then create the file:
Vendor/Module/Plugin/PaymentMethodManagement
namespace Vendor/Module/Plugin;
class PaymentMethodManagement {
public function afterIsApplicable($subject, $result)
{
return true;
}
}
This will make sure the function always returns true. If you want a more granular approach you can change the function to this:
public function aroundIsApplicable($subject, callable $proceed, ...$args)
{
if ($this->meetsMyCustomRequirement()) {
// This will call the original function and return it's results.
return $proceed(...$args);
}
return false;
}
If the $proceed
function isn't called then the original function is also never called.
answered Apr 17 at 11:02
MichielMichiel
1584
1584
This is the best solution. I always refer plugin for overriding the class
– Amit Bera♦
Apr 19 at 3:15
add a comment |
This is the best solution. I always refer plugin for overriding the class
– Amit Bera♦
Apr 19 at 3:15
This is the best solution. I always refer plugin for overriding the class
– Amit Bera♦
Apr 19 at 3:15
This is the best solution. I always refer plugin for overriding the class
– Amit Bera♦
Apr 19 at 3:15
add a comment |
Thanks for contributing an answer to Magento Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmagento.stackexchange.com%2fquestions%2f270381%2fhow-to-override-model-in-magento2%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown