View source
<?php
namespace Drupal\field_ui\Form;
use Drupal\Core\Entity\EntityForm;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\field\Entity\FieldConfig;
use Drupal\field_ui\FieldUI;
class FieldStorageConfigEditForm extends EntityForm {
protected $entity;
public function getEntityFromRouteMatch(RouteMatchInterface $route_match, $entity_type_id) {
$field_config = FieldConfig::load($route_match
->getRawParameter('field_config'));
return $field_config
->getFieldStorageDefinition();
}
public function buildForm(array $form, FormStateInterface $form_state, $field_config = NULL) {
if ($field_config) {
$field = FieldConfig::load($field_config);
$form_state
->set('field_config', $field);
$form_state
->set('entity_type_id', $field
->getTargetEntityTypeId());
$form_state
->set('bundle', $field
->getTargetBundle());
}
return parent::buildForm($form, $form_state);
}
public function form(array $form, FormStateInterface $form_state) {
$form = parent::form($form, $form_state);
$field_label = $form_state
->get('field_config')
->label();
$form['#title'] = $field_label;
$form['#prefix'] = '<p>' . $this
->t('These settings apply to the %field field everywhere it is used. These settings impact the way that data is stored in the database and cannot be changed once data has been created.', array(
'%field' => $field_label,
)) . '</p>';
if ($this->entity
->hasData()) {
$form['#prefix'] = '<div class="messages messages--error">' . $this
->t('There is data for this field in the database. The field settings can no longer be changed.') . '</div>' . $form['#prefix'];
}
$form['settings'] = array(
'#weight' => -10,
'#tree' => TRUE,
);
$ids = (object) array(
'entity_type' => $form_state
->get('entity_type_id'),
'bundle' => $form_state
->get('bundle'),
'entity_id' => NULL,
);
$entity = _field_create_entity_from_ids($ids);
$items = $entity
->get($this->entity
->getName());
$item = $items
->first() ?: $items
->appendItem();
$form['settings'] += $item
->storageSettingsForm($form, $form_state, $this->entity
->hasData());
$cardinality = $this->entity
->getCardinality();
$form['cardinality_container'] = array(
'#parents' => array(),
'#type' => 'fieldset',
'#title' => $this
->t('Allowed number of values'),
'#attributes' => array(
'class' => array(
'container-inline',
'fieldgroup',
'form-composite',
),
),
);
$form['cardinality_container']['cardinality'] = array(
'#type' => 'select',
'#title' => $this
->t('Allowed number of values'),
'#title_display' => 'invisible',
'#options' => array(
'number' => $this
->t('Limited'),
FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED => $this
->t('Unlimited'),
),
'#default_value' => $cardinality == FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED ? FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED : 'number',
);
$form['cardinality_container']['cardinality_number'] = array(
'#type' => 'number',
'#default_value' => $cardinality != FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED ? $cardinality : 1,
'#min' => 1,
'#title' => $this
->t('Limit'),
'#title_display' => 'invisible',
'#size' => 2,
'#states' => array(
'visible' => array(
':input[name="cardinality"]' => array(
'value' => 'number',
),
),
'disabled' => array(
':input[name="cardinality"]' => array(
'value' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED,
),
),
),
);
return $form;
}
protected function actions(array $form, FormStateInterface $form_state) {
$elements = parent::actions($form, $form_state);
$elements['submit']['#value'] = $this
->t('Save field settings');
return $elements;
}
public function validateForm(array &$form, FormStateInterface $form_state) {
parent::validateForm($form, $form_state);
if ($form_state
->getValue('cardinality') === 'number' && !$form_state
->getValue('cardinality_number')) {
$form_state
->setErrorByName('cardinality_number', $this
->t('Number of values is required.'));
}
}
public function buildEntity(array $form, FormStateInterface $form_state) {
if ($form_state
->getValue('cardinality') === 'number' && $form_state
->getValue('cardinality_number')) {
$form_state
->setValue('cardinality', $form_state
->getValue('cardinality_number'));
}
return parent::buildEntity($form, $form_state);
}
public function save(array $form, FormStateInterface $form_state) {
$field_label = $form_state
->get('field_config')
->label();
try {
$this->entity
->save();
drupal_set_message($this
->t('Updated field %label field settings.', array(
'%label' => $field_label,
)));
$request = $this
->getRequest();
if (($destinations = $request->query
->get('destinations')) && ($next_destination = FieldUI::getNextDestination($destinations))) {
$request->query
->remove('destinations');
$form_state
->setRedirectUrl($next_destination);
}
else {
$form_state
->setRedirectUrl(FieldUI::getOverviewRouteInfo($form_state
->get('entity_type_id'), $form_state
->get('bundle')));
}
} catch (\Exception $e) {
drupal_set_message($this
->t('Attempt to update field %label failed: %message.', array(
'%label' => $field_label,
'%message' => $e
->getMessage(),
)), 'error');
}
}
}