Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 8 |
CRAP | |
0.00% |
0 / 81 |
| DraggableListBuilder | |
0.00% |
0 / 1 |
|
0.00% |
0 / 8 |
462 | |
0.00% |
0 / 81 |
| __construct | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 5 |
|||
| buildHeader | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 6 |
|||
| buildRow | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 14 |
|||
| render | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 5 |
|||
| buildForm | |
0.00% |
0 / 1 |
42 | |
0.00% |
0 / 38 |
|||
| validateForm | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
| submitForm | |
0.00% |
0 / 1 |
20 | |
0.00% |
0 / 7 |
|||
| formBuilder | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 5 |
|||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\Core\Config\Entity\DraggableListBuilder. | |
| */ | |
| namespace Drupal\Core\Config\Entity; | |
| use Drupal\Core\Entity\EntityInterface; | |
| use Drupal\Core\Entity\EntityStorageInterface; | |
| use Drupal\Core\Entity\EntityTypeInterface; | |
| use Drupal\Core\Form\FormInterface; | |
| use Drupal\Core\Form\FormStateInterface; | |
| /** | |
| * Defines a class to build a draggable listing of configuration entities. | |
| */ | |
| abstract class DraggableListBuilder extends ConfigEntityListBuilder implements FormInterface { | |
| /** | |
| * The key to use for the form element containing the entities. | |
| * | |
| * @var string | |
| */ | |
| protected $entitiesKey = 'entities'; | |
| /** | |
| * The entities being listed. | |
| * | |
| * @var \Drupal\Core\Entity\EntityInterface[] | |
| */ | |
| protected $entities = array(); | |
| /** | |
| * Name of the entity's weight field or FALSE if no field is provided. | |
| * | |
| * @var string|bool | |
| */ | |
| protected $weightKey = FALSE; | |
| /** | |
| * The form builder. | |
| * | |
| * @var \Drupal\Core\Form\FormBuilderInterface | |
| */ | |
| protected $formBuilder; | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function __construct(EntityTypeInterface $entity_type, EntityStorageInterface $storage) { | |
| parent::__construct($entity_type, $storage); | |
| // Check if the entity type supports weighting. | |
| if ($this->entityType->hasKey('weight')) { | |
| $this->weightKey = $this->entityType->getKey('weight'); | |
| } | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function buildHeader() { | |
| $header = array(); | |
| if (!empty($this->weightKey)) { | |
| $header['weight'] = t('Weight'); | |
| } | |
| return $header + parent::buildHeader(); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function buildRow(EntityInterface $entity) { | |
| $row = array(); | |
| if (!empty($this->weightKey)) { | |
| // Override default values to markup elements. | |
| $row['#attributes']['class'][] = 'draggable'; | |
| $row['#weight'] = $entity->get($this->weightKey); | |
| // Add weight column. | |
| $row['weight'] = array( | |
| '#type' => 'weight', | |
| '#title' => t('Weight for @title', array('@title' => $entity->label())), | |
| '#title_display' => 'invisible', | |
| '#default_value' => $entity->get($this->weightKey), | |
| '#attributes' => array('class' => array('weight')), | |
| ); | |
| } | |
| return $row + parent::buildRow($entity); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function render() { | |
| if (!empty($this->weightKey)) { | |
| return $this->formBuilder()->getForm($this); | |
| } | |
| return parent::render(); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function buildForm(array $form, FormStateInterface $form_state) { | |
| $form[$this->entitiesKey] = array( | |
| '#type' => 'table', | |
| '#header' => $this->buildHeader(), | |
| '#empty' => t('There is no @label yet.', array('@label' => $this->entityType->getLabel())), | |
| '#tabledrag' => array( | |
| array( | |
| 'action' => 'order', | |
| 'relationship' => 'sibling', | |
| 'group' => 'weight', | |
| ), | |
| ), | |
| ); | |
| $this->entities = $this->load(); | |
| $delta = 10; | |
| // Change the delta of the weight field if have more than 20 entities. | |
| if (!empty($this->weightKey)) { | |
| $count = count($this->entities); | |
| if ($count > 20) { | |
| $delta = ceil($count / 2); | |
| } | |
| } | |
| foreach ($this->entities as $entity) { | |
| $row = $this->buildRow($entity); | |
| if (isset($row['label'])) { | |
| $row['label'] = array('#markup' => $row['label']); | |
| } | |
| if (isset($row['weight'])) { | |
| $row['weight']['#delta'] = $delta; | |
| } | |
| $form[$this->entitiesKey][$entity->id()] = $row; | |
| } | |
| $form['actions']['#type'] = 'actions'; | |
| $form['actions']['submit'] = array( | |
| '#type' => 'submit', | |
| '#value' => t('Save order'), | |
| '#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]->get($this->weightKey) != $value['weight']) { | |
| // Save entity only when its weight was changed. | |
| $this->entities[$id]->set($this->weightKey, $value['weight']); | |
| $this->entities[$id]->save(); | |
| } | |
| } | |
| } | |
| /** | |
| * Returns the form builder. | |
| * | |
| * @return \Drupal\Core\Form\FormBuilderInterface | |
| * The form builder. | |
| */ | |
| protected function formBuilder() { | |
| if (!$this->formBuilder) { | |
| $this->formBuilder = \Drupal::formBuilder(); | |
| } | |
| return $this->formBuilder; | |
| } | |
| } |