arch-8.x-1.x-dev/modules/payment/src/Form/OverviewForm.php
modules/payment/src/Form/OverviewForm.php
<?php
namespace Drupal\arch_payment\Form;
use Drupal\arch_payment\PaymentMethodInterface;
use Drupal\arch_payment\PaymentMethodManagerInterface;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Url;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Payment overview form.
*
* @package Drupal\arch_payment\Form
*/
class OverviewForm extends FormBase {
/**
* The payment method plugins listed.
*
* @var \Drupal\arch_payment\PaymentMethodInterface[]
*/
protected $methods = [];
/**
* Payment method manager.
*
* @var \Drupal\arch_payment\PaymentMethodManagerInterface
*/
protected $paymentMethodManager;
/**
* OverviewForm constructor.
*
* @param \Drupal\arch_payment\PaymentMethodManagerInterface $payment_method_manager
* Shipping method manager.
*/
public function __construct(
PaymentMethodManagerInterface $payment_method_manager,
) {
$this->paymentMethodManager = $payment_method_manager;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('plugin.manager.payment_method')
);
}
/**
* {@inheritdoc}
*/
public function getFormId() {
return 'payment_method_list';
}
/**
* {@inheritdoc}
*/
public function buildForm(array $form, FormStateInterface $form_state) {
$form['methods'] = [
'#type' => 'table',
'#header' => $this->buildHeader(),
'#empty' => $this->t('There are no @label yet.', [
'@label' => $this->t('payment methods', [], ['context' => 'arch_payment']),
]),
'#tabledrag' => [
[
'action' => 'order',
'relationship' => 'sibling',
'group' => 'weight',
],
],
'#attributes' => [
'id' => 'payment-methods',
],
];
$this->methods = $this->load();
$delta = 10;
$count = count($this->methods);
if ($count > 20) {
$delta = ceil($count / 2);
}
uasort($this->methods, function (PaymentMethodInterface $a, PaymentMethodInterface $b) {
if ($a->getWeight() == $b->getWeight()) {
return 0;
}
return ($a->getWeight() < $b->getWeight()) ? -1 : 1;
});
// Change the delta of the weight field if have more than 20 entities.
foreach ($this->methods as $method) {
$row = $this->buildRow($method);
if (isset($row['weight'])) {
$row['weight']['#delta'] = $delta;
}
$form['methods'][$method->getPluginId()] = $row;
}
$form['actions']['#type'] = 'actions';
$form['actions']['submit'] = [
'#type' => 'submit',
'#value' => $this->t('Save'),
'#button_type' => 'primary',
];
return $form;
}
/**
* {@inheritdoc}
*/
public function validateForm(array &$form, FormStateInterface $form_state) {
// No validation.
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
foreach ($form_state->getValue('methods') as $id => $value) {
if (
isset($this->methods[$id])
&& $this->methods[$id]->getWeight() != $value['weight']
) {
$this->methods[$id]->setWeight($value['weight']);
}
}
}
/**
* Build table header.
*/
public function buildHeader() {
$header = [
'drag' => NULL,
'label' => $this->t('Method name', [], ['context' => 'arch_payment']),
'weight' => $this->t('Weight'),
'status' => $this->t('Status', [], ['context' => 'arch_payment']),
'operations' => $this->t('Operations'),
];
return $header;
}
/**
* Build table row.
*/
public function buildRow(PaymentMethodInterface $method) {
$row = [
'drag' => NULL,
'label' => NULL,
'weight' => NULL,
'status' => NULL,
'operations' => NULL,
];
$row['drag'] = [
'data' => NULL,
'class' => [],
];
// Override default values to markup elements.
$row['#attributes']['class'][] = 'draggable';
$row['#weight'] = $method->getWeight();
// Add weight column.
$row['weight'] = [
'#type' => 'weight',
'#title' => $this->t('Weight for @title', ['@title' => $method->getAdminLabel()]),
'#title_display' => 'invisible',
'#default_value' => $method->getWeight(),
'#attributes' => ['class' => ['weight']],
];
$row['label'] = [
'#markup' => $method->getAdminLabel(),
];
$row['status'] = [
'#markup' => $method->isActive() ? $this->t('Enabled') : $this->t('Disabled'),
];
$row['operations']['data'] = [
'#type' => 'operations',
'#links' => $this->getOperations($method),
];
return $row;
}
/**
* Builds a renderable list of operation links for the payment method.
*
* @param \Drupal\arch_payment\PaymentMethodInterface $method
* The method plugin on which the linked operations will be performed.
*
* @return array
* A renderable array of operation links.
*/
protected function getOperations(PaymentMethodInterface $method) {
$operations = [];
$config_url = Url::fromRoute(
'arch_payment.configure_plugin',
['payment_method' => $method->getPluginId()],
['query' => $this->getRedirectDestination()->getAsArray()]
);
$operations['configure'] = [
'title' => $this->t('Configure'),
'weight' => -10,
'url' => $config_url,
];
if ($method->isActive()) {
$operations['disable'] = [
'title' => $this->t('Disable'),
'weight' => 1,
'url' => Url::fromRoute(
'arch_payment.disable_method',
['payment_method' => $method->getPluginId()],
['query' => $this->getRedirectDestination()->getAsArray()]
),
];
}
else {
$operations['enable'] = [
'title' => $this->t('Enable'),
'weight' => 2,
'url' => Url::fromRoute(
'arch_payment.enable_method',
['payment_method' => $method->getPluginId()],
['query' => $this->getRedirectDestination()->getAsArray()]
),
];
}
uasort($operations, '\Drupal\Component\Utility\SortArray::sortByWeightElement');
return $operations;
}
/**
* List of payment methods.
*
* @return \Drupal\arch_payment\PaymentMethodInterface[]
* Payment method plugin list.
*/
protected function load() {
/** @var \Drupal\arch_payment\PaymentMethodInterface[] $methods */
$methods = $this->paymentMethodManager->getAllPaymentMethods();
return $methods;
}
}
