View source
<?php
namespace Drupal\payment\Controller;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Render\RendererInterface;
use Drupal\Core\StringTranslation\TranslationInterface;
use Drupal\payment\Plugin\Payment\Status\PaymentStatusManagerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class ListPaymentStatuses extends ControllerBase {
protected $paymentStatusManager;
protected $renderer;
public function __construct(TranslationInterface $string_translation, RendererInterface $renderer, PaymentStatusManagerInterface $payment_status_manager) {
$this->paymentStatusManager = $payment_status_manager;
$this->renderer = $renderer;
$this->stringTranslation = $string_translation;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('string_translation'), $container
->get('renderer'), $container
->get('plugin.manager.payment.status'));
}
public function execute() {
return [
'#header' => [
$this
->t('Title'),
$this
->t('Description'),
$this
->t('Operations'),
],
'#type' => 'table',
] + $this
->buildListingLevel($this
->buildHierarchy(), 0);
}
protected function buildListingLevel(array $hierarchy, $depth) {
$rows = [];
foreach ($hierarchy as $plugin_id => $children) {
$definition = $this->paymentStatusManager
->getDefinition($plugin_id);
$operations_provider = $this->paymentStatusManager
->getOperationsProvider($plugin_id);
$indentation = [
'#theme' => 'indentation',
'#size' => $depth,
];
$rows[$plugin_id] = [
'label' => [
'#markup' => $this->renderer
->render($indentation) . $definition['label'],
],
'description' => [
'#markup' => $definition['description'],
],
'operations' => [
'#type' => 'operations',
'#links' => $operations_provider ? $operations_provider
->getOperations($plugin_id) : [],
],
];
$rows = array_merge($rows, $this
->buildListingLevel($children, $depth + 1));
}
return $rows;
}
protected function buildHierarchy(array $limit_plugin_ids = NULL) {
static $hierarchy = NULL;
if (is_null($hierarchy)) {
$parents = [];
$children = [];
$definitions = $this->paymentStatusManager
->getDefinitions();
if (is_array($limit_plugin_ids)) {
$definitions = array_intersect_key($definitions, array_flip($limit_plugin_ids));
}
uasort($definitions, array(
$this,
'sort',
));
foreach ($definitions as $plugin_id => $definition) {
if (!empty($definition['parent_id'])) {
$children[$definition['parent_id']][] = $plugin_id;
}
else {
$parents[] = $plugin_id;
}
}
$hierarchy = $this
->buildHierarchyLevel($parents, $children);
}
return $hierarchy;
}
protected function buildHierarchyLevel(array $parent_plugin_ids, array $child_plugin_ids) {
$hierarchy = [];
foreach ($parent_plugin_ids as $plugin_id) {
$hierarchy[$plugin_id] = isset($child_plugin_ids[$plugin_id]) ? $this
->buildHierarchyLevel($child_plugin_ids[$plugin_id], $child_plugin_ids) : [];
}
return $hierarchy;
}
protected function sort(array $definition_a, array $definition_b) {
return strcmp($definition_a['label'], $definition_b['label']);
}
}