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; | |
} | |
} |