arch-8.x-1.x-dev/modules/order/src/OrderMail/Controller/ListController.php
modules/order/src/OrderMail/Controller/ListController.php
<?php namespace Drupal\arch_order\OrderMail\Controller; use Drupal\arch_order\OrderMail\OrderMailInterface; use Drupal\arch_order\OrderMail\OrderMailManagerInterface; use Drupal\Core\Controller\ControllerBase; use Drupal\Core\DependencyInjection\ContainerInjectionInterface; use Drupal\Core\Url; use Symfony\Component\DependencyInjection\ContainerInterface; /** * Returns responses for order routes. */ class ListController extends ControllerBase implements ContainerInjectionInterface { /** * Mail manager service. * * @var \Drupal\arch_order\OrderMail\OrderMailManagerInterface */ protected $mailManager; /** * Constructs an MailController object. * * @param \Drupal\arch_order\OrderMail\OrderMailManagerInterface $mail_manager * Mail manager service. */ public function __construct( OrderMailManagerInterface $mail_manager, ) { $this->mailManager = $mail_manager; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container) { return new static( $container->get('arch_order_mail') ); } /** * List view. * * @return array * Page render array. */ public function main() { $content = [ 'table' => [], ]; $content['table'] = [ '#type' => 'table', '#header' => $this->buildTableHeader(), '#empty' => $this->t( 'There are no @label yet.', ['@label' => 'mails'], ['context' => 'arch_order_mail'] ), ]; foreach ($this->load() as $item) { $content['table'][] = $this->buildTableRow($item) + [ '#attributes' => [ 'style' => (!$item->isEnabled() ? 'background:#efefef;font-style:italic' : ''), ], ]; } return $content; } /** * Build table header. * * @return array * Render array. */ private function buildTableHeader() { $header = [ 'label' => $this->t('Mail name', [], ['context' => 'arch_order_mail']), 'status' => $this->t('Status', [], ['context' => 'arch_order_mail']), 'sendto' => $this->t('Send to', [], ['context' => 'arch_order_mail']), 'operations' => $this->t('Operations'), ]; return $header; } /** * Build table row. * * @param \Drupal\arch_order\OrderMail\OrderMailInterface $mail * Mail plugin. * * @return array * Render array. */ private function buildTableRow(OrderMailInterface $mail) { $row = []; $row['label'] = [ '#type' => 'inline_template', '#template' => '<label>{{ label }}</label><div> <i style="font-size:11px">{{ description }}</i></div>', '#context' => [ 'label' => $mail->getPluginDefinition()['label'], 'description' => $mail->getPluginDefinition()['description'], ], ]; $row['status'] = [ '#markup' => $mail->isEnabled() ? $this->t('Enabled') : '<b>' . $this->t('Disabled')->render() . '</b>', ]; $sendto = $mail->getPluginDefinition()['sendTo']; $row['sendto'] = [ '#markup' => ($sendto == 'method' ? 'Individual' : ucfirst($sendto)), ]; $row['operations'] = [ '#type' => 'operations', '#links' => $this->getOperations($mail), ]; return $row; } /** * Builds a renderable list of operation links for the mail. * * @param \Drupal\arch_order\OrderMail\OrderMailInterface $mail * The mail plugin on which the linked operations will be performed. * * @return array * A renderable array of operation links. */ private function getOperations(OrderMailInterface $mail) { $operations = []; $view_url = Url::fromRoute( 'arch_order_mail.view', ['plugin_id' => $mail->getPluginId()] ); $operations['view'] = [ 'title' => $this->t('View'), 'url' => $view_url, ]; return $operations; } /** * List of mails. * * @return \Drupal\arch_order\OrderMail\OrderMailInterface[] * Mail plugin list. */ protected function load() { /** @var \Drupal\arch_order\OrderMail\OrderMailInterface[] $list */ $list = $this->mailManager->getAll(); ksort($list); return $list; } }