arch-8.x-1.x-dev/modules/payment/src/Form/PaymentMethodForm.php
modules/payment/src/Form/PaymentMethodForm.php
<?php
namespace Drupal\arch_payment\Form;
use Drupal\arch\ConfigurableArchPluginInterface;
use Drupal\arch_payment\PaymentMethodInterface;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Default payment method configure form.
*
* @package Drupal\arch_payment\Form
*/
class PaymentMethodForm extends FormBase implements PaymentMethodFormInterface {
/**
* Payment method.
*
* @var \Drupal\arch_payment\PaymentMethodInterface
*/
protected $paymentMethod;
/**
* Currency storage.
*
* @var \Drupal\Core\Entity\EntityStorageInterface|null
*/
protected $currencyStorage;
/**
* PaymentMethodForm constructor.
*
* @param \Drupal\Core\Entity\EntityStorageInterface|null $currencyStorage
* Currency storage.
*/
public function __construct(
EntityStorageInterface $currencyStorage,
) {
$this->currencyStorage = $currencyStorage;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('entity_type.manager')->getStorage('currency')
);
}
/**
* {@inheritdoc}
*/
public function getFormId() {
return 'payment_method_configure';
}
/**
* {@inheritdoc}
*/
public function buildForm(array $form, FormStateInterface $form_state, ?PaymentMethodInterface $payment_method = NULL) {
$form = [];
$this->paymentMethod = $payment_method;
$form['#payment_method'] = $payment_method;
$form['#title'] = $this->t('Configure "<em>@title</em>" payment method', [
'@title' => $payment_method->getAdminLabel(),
]);
$form['settings'] = [
'#tree' => TRUE,
];
$form['settings']['status'] = [
'#type' => 'checkbox',
'#default_value' => $payment_method->isActive(),
'#title' => $this->t('Enabled', [], ['context' => 'arch_payment_method']),
'#weight' => -100,
];
$form['fees'] = [
'#type' => 'vertical_tabs',
'#group' => 'settings',
];
$form['default'] = [
'#tree' => TRUE,
'#type' => 'details',
'#group' => 'fees',
'#parents' => [
'settings',
'fees',
'default',
],
'#title' => $this->t('Payment fee', [], ['context' => 'arch_payment_method']),
] + $this->paymentFee($form_state);
if ($this->paymentMethod instanceof ConfigurableArchPluginInterface) {
$this->paymentMethod->configFormAlter($form, $form_state);
}
$form['actions'] = [
'#type' => 'actions',
];
$form['actions']['submit'] = [
'#type' => 'submit',
'#value' => $this->t('Save'),
];
return $form;
}
/**
* {@inheritdoc}
*/
public function validateForm(array &$form, FormStateInterface $form_state) {
parent::validateForm($form, $form_state);
if ($this->paymentMethod instanceof ConfigurableArchPluginInterface) {
$this->paymentMethod->configFormValidate($form, $form_state);
}
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
if ($this->paymentMethod instanceof ConfigurableArchPluginInterface) {
$this->paymentMethod->configFormPreSubmit($form, $form_state);
}
$enabled = $form_state->getValue(['settings', 'status']);
if ($enabled) {
$this->paymentMethod->enable();
}
else {
$this->paymentMethod->disable();
}
$settings = $form_state->getValue('settings');
$skipp = ['status'];
foreach ($settings as $key => $value) {
if (in_array($key, $skipp)) {
continue;
}
$this->paymentMethod->setSetting($key, $value);
}
if ($this->paymentMethod instanceof ConfigurableArchPluginInterface) {
$this->paymentMethod->configFormPostSubmit($form, $form_state);
}
}
/**
* Default payment fee settings.
*
* @param \Drupal\Core\Form\FormStateInterface $formState
* Form state data.
*
* @return array
* Array of default payment fee settings.
*/
public function paymentFee(FormStateInterface $formState) {
$feesDefaultValues = $this->paymentMethod->getSetting('fees');
$defaultValues = $feesDefaultValues['default'];
$paymentFee = [
'fee' => [
'#type' => 'number',
'#title' => $this->t('Default payment fee', [], ['context' => 'arch_payment_method']),
'#step' => 0.1,
'#min' => 0,
'#default_value' => ($defaultValues['fee'] ?? 0),
'#description' => $this->t('You can set a payment fee for this payment method. The step is in 0.1 format.'),
],
'currency' => [
'#type' => 'textfield',
'#title' => $this->t('Currency', [], ['context' => 'arch_payment_method']),
'#default_value' => ($defaultValues['currency'] ?? 'XXX'),
'#description' => $this->t('Currency of the payment fee.'),
],
'vat_rate' => [
'#type' => 'number',
'#title' => $this->t('VAT Rate', [], ['context' => 'arch_payment_method']),
'#step' => 1,
'#min' => 0,
'#max' => 100,
'#default_value' => ($defaultValues['vat_rate'] ?? 0),
],
];
if (!empty($this->currencyStorage)) {
$options = [];
foreach ($this->currencyStorage->loadMultiple() as $currency) {
$options[$currency->id()] = $currency->label();
}
$paymentFee['currency']['#type'] = 'select';
$paymentFee['currency']['#options'] = $options;
}
return $paymentFee;
}
}
