trait FieldLayoutEntityDisplayFormTrait
Same name in other branches
- 9 core/modules/field_layout/src/Form/FieldLayoutEntityDisplayFormTrait.php \Drupal\field_layout\Form\FieldLayoutEntityDisplayFormTrait
- 8.9.x core/modules/field_layout/src/Form/FieldLayoutEntityDisplayFormTrait.php \Drupal\field_layout\Form\FieldLayoutEntityDisplayFormTrait
- 11.x core/modules/field_layout/src/Form/FieldLayoutEntityDisplayFormTrait.php \Drupal\field_layout\Form\FieldLayoutEntityDisplayFormTrait
Provides shared code for entity display forms.
Both EntityViewDisplayEditForm and EntityFormDisplayEditForm must maintain their parent hierarchy, while being identically enhanced by Field Layout. This trait contains the code they both share.
Hierarchy
- trait \Drupal\field_layout\Form\FieldLayoutEntityDisplayFormTrait
File
-
core/
modules/ field_layout/ src/ Form/ FieldLayoutEntityDisplayFormTrait.php, line 17
Namespace
Drupal\field_layout\FormView source
trait FieldLayoutEntityDisplayFormTrait {
/**
* The field layout plugin manager.
*
* @var \Drupal\Core\Layout\LayoutPluginManagerInterface
*/
protected $layoutPluginManager;
/**
* Overrides \Drupal\field_ui\Form\EntityDisplayFormBase::getRegions().
*/
public function getRegions() {
$regions = [];
$layout_definition = $this->layoutPluginManager
->getDefinition($this->getEntity()
->getLayoutId());
foreach ($layout_definition->getRegions() as $name => $region) {
$regions[$name] = [
'title' => $region['label'],
'message' => $this->t('No field is displayed.'),
];
}
$regions['hidden'] = [
'title' => $this->t('Disabled', [], [
'context' => 'Plural',
]),
'message' => $this->t('No field is hidden.'),
];
return $regions;
}
/**
* Overrides \Drupal\field_ui\Form\EntityDisplayFormBase::form().
*/
public function form(array $form, FormStateInterface $form_state) {
$form = parent::form($form, $form_state);
$form['field_layouts'] = [
'#type' => 'details',
'#title' => $this->t('Layout settings'),
];
$layout_plugin = $this->getLayout($this->getEntity(), $form_state);
$form['field_layouts']['field_layout'] = [
'#type' => 'select',
'#title' => $this->t('Select a layout'),
'#options' => $this->layoutPluginManager
->getLayoutOptions(),
'#default_value' => $layout_plugin->getPluginId(),
'#ajax' => [
'callback' => '::settingsAjax',
'wrapper' => 'field-layout-settings-wrapper',
'trigger_as' => [
'name' => 'field_layout_change',
],
],
];
$form['field_layouts']['submit'] = [
'#type' => 'submit',
'#name' => 'field_layout_change',
'#value' => $this->t('Change layout'),
'#submit' => [
'::settingsAjaxSubmit',
],
'#attributes' => [
'class' => [
'js-hide',
],
],
'#ajax' => [
'callback' => '::settingsAjax',
'wrapper' => 'field-layout-settings-wrapper',
],
];
$form['field_layouts']['settings_wrapper'] = [
'#type' => 'container',
'#id' => 'field-layout-settings-wrapper',
'#tree' => TRUE,
];
$form['field_layouts']['settings_wrapper']['icon'] = $layout_plugin->getPluginDefinition()
->getIcon();
if ($layout_plugin instanceof PluginFormInterface) {
$form['field_layouts']['settings_wrapper']['layout_settings'] = [];
$subform_state = SubformState::createForSubform($form['field_layouts']['settings_wrapper']['layout_settings'], $form, $form_state);
$form['field_layouts']['settings_wrapper']['layout_settings'] = $layout_plugin->buildConfigurationForm($form['field_layouts']['settings_wrapper']['layout_settings'], $subform_state);
}
return $form;
}
/**
* Gets the layout plugin for the currently selected field layout.
*
* @param \Drupal\field_layout\Display\EntityDisplayWithLayoutInterface $entity
* The current form entity.
* @param \Drupal\Core\Form\FormStateInterface $form_state
* The current state of the form.
*
* @return \Drupal\Core\Layout\LayoutInterface
* The layout plugin.
*/
protected function getLayout(EntityDisplayWithLayoutInterface $entity, FormStateInterface $form_state) {
if (!($layout_plugin = $form_state->get('layout_plugin'))) {
$stored_layout_id = $entity->getLayoutId();
// Use selected layout if it exists, falling back to the stored layout.
$layout_id = $form_state->getValue('field_layout', $stored_layout_id);
// If the current layout is the stored layout, use the stored layout
// settings. Otherwise leave the settings empty.
$layout_settings = $layout_id === $stored_layout_id ? $entity->getLayoutSettings() : [];
$layout_plugin = $this->layoutPluginManager
->createInstance($layout_id, $layout_settings);
$form_state->set('layout_plugin', $layout_plugin);
}
return $layout_plugin;
}
/**
* Ajax callback for the field layout settings form.
*/
public static function settingsAjax($form, FormStateInterface $form_state) {
return $form['field_layouts']['settings_wrapper'];
}
/**
* Submit handler for the non-JS case.
*/
public function settingsAjaxSubmit($form, FormStateInterface $form_state) {
$form_state->set('layout_plugin', NULL);
$form_state->setRebuild();
}
/**
* Overrides \Drupal\field_ui\Form\EntityDisplayFormBase::validateForm().
*/
public function validateForm(array &$form, FormStateInterface $form_state) {
parent::validateForm($form, $form_state);
$layout_plugin = $this->getLayout($this->getEntity(), $form_state);
if ($layout_plugin instanceof PluginFormInterface) {
$subform_state = SubformState::createForSubform($form['field_layouts']['settings_wrapper']['layout_settings'], $form, $form_state);
$layout_plugin->validateConfigurationForm($form['field_layouts']['settings_wrapper']['layout_settings'], $subform_state);
}
}
/**
* Overrides \Drupal\field_ui\Form\EntityDisplayFormBase::submitForm().
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
parent::submitForm($form, $form_state);
$entity = $this->getEntity();
$layout_plugin = $this->getLayout($entity, $form_state);
if ($layout_plugin instanceof PluginFormInterface) {
$subform_state = SubformState::createForSubform($form['field_layouts']['settings_wrapper']['layout_settings'], $form, $form_state);
$layout_plugin->submitConfigurationForm($form['field_layouts']['settings_wrapper']['layout_settings'], $subform_state);
}
$entity->setLayout($layout_plugin);
}
/**
* Gets the form entity.
*
* @return \Drupal\field_layout\Display\EntityDisplayWithLayoutInterface
* The current form entity.
*/
public abstract function getEntity();
}
Members
Title Sort descending | Modifiers | Object type | Summary |
---|---|---|---|
FieldLayoutEntityDisplayFormTrait::$layoutPluginManager | protected | property | The field layout plugin manager. |
FieldLayoutEntityDisplayFormTrait::form | public | function | Overrides \Drupal\field_ui\Form\EntityDisplayFormBase::form(). |
FieldLayoutEntityDisplayFormTrait::getEntity | abstract public | function | Gets the form entity. |
FieldLayoutEntityDisplayFormTrait::getLayout | protected | function | Gets the layout plugin for the currently selected field layout. |
FieldLayoutEntityDisplayFormTrait::getRegions | public | function | Overrides \Drupal\field_ui\Form\EntityDisplayFormBase::getRegions(). |
FieldLayoutEntityDisplayFormTrait::settingsAjax | public static | function | Ajax callback for the field layout settings form. |
FieldLayoutEntityDisplayFormTrait::settingsAjaxSubmit | public | function | Submit handler for the non-JS case. |
FieldLayoutEntityDisplayFormTrait::submitForm | public | function | Overrides \Drupal\field_ui\Form\EntityDisplayFormBase::submitForm(). |
FieldLayoutEntityDisplayFormTrait::validateForm | public | function | Overrides \Drupal\field_ui\Form\EntityDisplayFormBase::validateForm(). |
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.