commerce_shipping-8.x-2.0-rc2/src/ShippingMethodListBuilder.php
src/ShippingMethodListBuilder.php
<?php namespace Drupal\commerce_shipping; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\EntityListBuilder; use Drupal\Core\Entity\EntityTypeInterface; use Drupal\Core\Form\FormInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Site\Settings; use Symfony\Component\DependencyInjection\ContainerInterface; /** * Defines the list builder for shipping methods. */ class ShippingMethodListBuilder extends EntityListBuilder implements FormInterface { /** * The key to use for the form element containing the entities. * * @var string */ protected $entitiesKey = 'methods'; /** * The entities being listed. * * @var \Drupal\commerce_shipping\Entity\ShippingMethodInterface[] */ protected $entities = []; /** * Whether tabledrag is enabled. * * @var bool */ protected $hasTableDrag = TRUE; /** * The form builder. * * @var \Drupal\Core\Form\FormBuilderInterface */ protected $formBuilder; /** * The module handler. * * @var \Drupal\Core\Extension\ModuleHandlerInterface */ protected $moduleHandler; /** * {@inheritdoc} */ public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) { $instance = parent::createInstance($container, $entity_type); $instance->formBuilder = $container->get('form_builder'); $instance->moduleHandler = $container->get('module_handler'); return $instance; } /** * {@inheritdoc} */ public function getFormId() { return 'commerce_shipping_methods'; } /** * {@inheritdoc} */ public function load() { $entity_ids = $this->getEntityIds(); $entities = $this->storage->loadMultiple($entity_ids); // Sort the entities using the entity class's sort() method. uasort($entities, [$this->entityType->getClass(), 'sort']); return $entities; } /** * {@inheritdoc} */ public function buildHeader() { $header['name'] = $this->t('Name'); $header['status'] = $this->t('Enabled'); if ($this->hasTableDrag) { $header['weight'] = $this->t('Weight'); } return $header + parent::buildHeader(); } /** * {@inheritdoc} */ public function buildRow(EntityInterface $entity) { /** @var \Drupal\commerce_shipping\Entity\ShippingMethodInterface $entity */ if ($this->hasTableDrag) { $row['#attributes']['class'][] = 'draggable'; } $row['#weight'] = $entity->getWeight(); $row['name'] = $entity->label(); $row['status'] = $entity->isEnabled() ? $this->t('Enabled') : $this->t('Disabled'); if ($this->hasTableDrag) { $row['weight'] = [ '#type' => 'weight', '#title' => $this->t('Weight for @title', ['@title' => $entity->label()]), '#title_display' => 'invisible', '#default_value' => $entity->getWeight(), '#attributes' => ['class' => ['weight']], ]; } return $row + parent::buildRow($entity); } /** * {@inheritdoc} */ public function render() { $build = $this->formBuilder->getForm($this); // Only add the pager if a limit is specified. if ($this->limit) { $build['pager'] = [ '#type' => 'pager', ]; } if (!Settings::get('commerce_show_partner_banners', TRUE)) { return $build; } // Additional markup added to promote Shipstation services. $build['shipping_resources'] = [ '#theme' => 'commerce_shipping_resources', '#weight' => -99, '#attached' => [ 'library' => 'commerce_shipping/resources', ], ]; if ($this->moduleHandler->moduleExists('commerce_shipstation')) { $build['shipping_resources']['#theme'] = 'commerce_shipping_resources_installed'; } return $build; } /** * {@inheritdoc} */ public function buildForm(array $form, FormStateInterface $form_state) { $this->entities = $this->load(); if (count($this->entities) <= 1) { $this->hasTableDrag = FALSE; } $delta = 10; // Dynamically expand the allowed delta based on the number of entities. $count = count($this->entities); if ($count > 20) { $delta = ceil($count / 2); } $form[$this->entitiesKey] = [ '#type' => 'table', '#header' => $this->buildHeader(), '#empty' => $this->t('There are no @label yet.', ['@label' => $this->entityType->getPluralLabel()]), ]; foreach ($this->entities as $entity) { $row = $this->buildRow($entity); if (isset($row['name'])) { $row['name'] = ['#markup' => $row['name']]; } if (isset($row['status'])) { $row['status'] = ['#markup' => $row['status']]; } if (isset($row['weight'])) { $row['weight']['#delta'] = $delta; } $form[$this->entitiesKey][$entity->id()] = $row; } if ($this->hasTableDrag) { $form[$this->entitiesKey]['#tabledrag'][] = [ 'action' => 'order', 'relationship' => 'sibling', 'group' => 'weight', ]; $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($this->entitiesKey) as $id => $value) { if (isset($this->entities[$id]) && $this->entities[$id]->getWeight() != $value['weight']) { // Save entity only when its weight was changed. $this->entities[$id]->setWeight($value['weight']); $this->entities[$id]->save(); } } } }