Implement invoice payment in frontend
Edit on GitHubCreate a form
In Yves, the starting point is to build a form.
- Add a new module in Yves.
- Add the
Form
folder, where you will place the implementation for building the form.
1. Add the data provider
In the Form/DataProvider/
folder, add the data provider:
<?php
namespace Pyz\Yves\PaymentMethods\Form\DataProvider;
use Generated\Shared\Transfer\QuoteTransfer;
use Pyz\Yves\Checkout\Dependency\DataProvider\DataProviderInterface;
class InvoiceDataProvider implements DataProviderInterface
{
/**
* @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
*
* @return \Generated\Shared\Transfer\QuoteTransfer
*/
public function getData(QuoteTransfer $quoteTransfer)
{
return $quoteTransfer;
}
/**
* @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
*
* @return array
*/
public function getOptions(QuoteTransfer $quoteTransfer)
{
return [];
}
}
2. Implement the form
<?php
namespace Pyz\Yves\PaymentMethods\Form;
use Pyz\Shared\PaymentMethods\PaymentMethodsConstants;
use Pyz\Yves\Checkout\Dependency\CheckoutAbstractSubFormType;
use Pyz\Yves\Checkout\Dependency\SubFormInterface;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class InvoiceSubForm extends CheckoutAbstractSubFormType implements SubFormInterface
{
/**
* @const string
*/
const PAYMENT_PROVIDER = PaymentMethodsConstants::PROVIDER;
/**
* @const string
*/
const PAYMENT_METHOD = PaymentMethodsConstants::PAYMENT_METHOD_INVOICE;
/**
* @return string
*/
public function getPropertyPath()
{
return PaymentMethodsConstants::PAYMENT_INVOICE_FORM_PROPERTY_PATH;
}
/**
* @return string
*/
public function getName()
{
return static::PAYMENT_PROVIDER . '_' . static::PAYMENT_METHOD;
}
/**
* @return string
*/
public function getTemplatePath()
{
return static::PAYMENT_PROVIDER . '/' . static::PAYMENT_METHOD;
}
/**
* @param \Symfony\Component\OptionsResolver\OptionsResolverInterface $resolver
*
* @return void
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
parent::setDefaultOptions($resolver);
$resolver->setDefaults([
SubFormInterface::OPTIONS_FIELD_NAME => [],
]);
}
}
3. Add a plugin
After implementing the form, you need to plug this form into the checkout. To do that, in the Plugin/
folder, add a plugin for it:
<?php
namespace Pyz\Yves\PaymentMethods\Plugin;
use Spryker\Yves\Kernel\AbstractPlugin;
use Spryker\Yves\StepEngine\Dependency\Plugin\Form\SubFormPluginInterface;
/**
* @method \Pyz\Yves\PaymentMethods\PaymentMethodsFactory getFactory()
*/
class InvoiceSubFormPlugin extends AbstractPlugin implements SubFormPluginInterface
{
/**
* @return \Pyz\Yves\PaymentMethods\Form\InvoiceSubForm
*/
public function createSubForm()
{
return $this->getFactory()->createInvoiceForm();
}
/**
* @return \Pyz\Yves\Checkout\Dependency\DataProvider\DataProviderInterface
*/
public function createSubFormDataProvider()
{
return $this->getFactory()->createInvoiceFormDataProvider();
}
}
Set up a payment handler
The next procedure to be performed is to set up a payment handler.
1. Handle the new payment type
To handle this new payment type, in the Handler/
folder, add the InvoiceHandler
class:
<?php
namespace Pyz\Yves\PaymentMethods\Handler;
use Generated\Shared\Transfer\QuoteTransfer;
use Pyz\Shared\PaymentMethods\PaymentMethodsConstants;
use Symfony\Component\HttpFoundation\Request;
class InvoiceHandler
{
/**
* @const string
*/
const PAYMENT_PROVIDER = PaymentMethodsConstants::PROVIDER;
/**
* @const string
*/
const PAYMENT_METHOD = PaymentMethodsConstants::PAYMENT_METHOD_INVOICE;
/**
* @param \Symfony\Component\HttpFoundation\Request $request
* @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
*
* @return \Generated\Shared\Transfer\QuoteTransfer
*/
public function addPaymentToQuote(Request $request, QuoteTransfer $quoteTransfer)
{
$quoteTransfer->getPayment()
->setPaymentProvider(static::PAYMENT_PROVIDER)
->setPaymentMethod(static::PAYMENT_METHOD);
return $quoteTransfer;
}
}
2. Plug the payment handler into the checkout
To plug this payment handler into the checkout, in the Plugin/
folder, add a plugin for it:
<?php
namespace Pyz\Yves\PaymentMethods\Plugin;
use Spryker\Shared\Kernel\Transfer\AbstractTransfer;
use Spryker\Yves\Kernel\AbstractPlugin;
use Spryker\Yves\StepEngine\Dependency\Plugin\Handler\StepHandlerPluginInterface;
use Symfony\Component\HttpFoundation\Request;
/**
* @method \Pyz\Yves\PaymentMethods\PaymentMethodsFactory getFactory()
*/
class InvoiceHandlerPlugin extends AbstractPlugin implements StepHandlerPluginInterface
{
/**
* @param \Symfony\Component\HttpFoundation\Request $request
* @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
*
* @return \Generated\Shared\Transfer\QuoteTransfer
*/
public function addToDataClass(Request $request, QuoteTransfer $quoteTransfer)
{
$this->getFactory()->createInvoiceHandler()->addPaymentToQuote($request, $quoteTransfer);
}
}
Add an invoice twig template
Add the Twig template that’s rendered when the invoice payment method is selected under the configured path:
- In Yves, create the
invoice.twig
template file in thePaymentMethods/Theme/ then ApplicationConstants::YVES_THEME
config value directory. - Adjust the path according to the theme you are currently using.
Code sample
<div class="payment-subform paymentmethods-invoice-form">
{# Place the details regarding invoice here #}
{{ form_widget(form.paymentmethods_invoice) }}
{{ form_errors(form.paymentmethods_invoice) }}
</div>
Don’t forget to add the factory and the dependency provider for this newly added module in Yves.
Thank you!
For submitting the form