How to render layouts
Last updated on
25 March 2020
Getting the layout plugin manager
$layoutPluginManager = \Drupal::service('plugin.manager.core.layout');Listing available layouts
$layoutPluginManager = \Drupal::service('plugin.manager.core.layout');
$layoutDefinitions = $layoutPluginManager->getDefinitions();
$definedLayouts = [];
foreach ($layoutDefinitions as $key => $layoutDefinition) {
$definedLayouts[] = $layoutDefinition->getLabel();
}
return [
'#theme' => 'item_list',
'#items' => $definedLayouts,
];Instantiating a layout plugin
$layoutPluginManager = \Drupal::service('plugin.manager.core.layout');
// Provide any configuration to the layout plugin if necessary.
$layoutInstanceConfiguration = [];
$layoutInstance = $layoutPluginManager->createInstance('layout_twocol', $layoutInstanceConfiguration);Rendering a layout
$layoutPluginManager = \Drupal::service('plugin.manager.core.layout');
// Provide any configuration to the layout plugin if necessary.
$layoutInstanceConfiguration = [];
$layoutInstance = $layoutPluginManager->createInstance('layout_twocol', $layoutInstanceConfiguration);
// Build the content for your regions.
$regions = [
'top' => [
'#markup' => 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.',
],
'left' => [
'#markup' => 'Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est.',
],
'right' => [
'#markup' => 'At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est.',
],
'bottom' => [
'#markup' => 'At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.',
],
];
// This builds the render array.
return $layoutInstance->build($regions);Showing the configuration form for a layout
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Form\SubformState;
use Drupal\Core\Plugin\PluginFormInterface;
protected function getLayout($layout_id, $layout_settings, FormStateInterface $form_state) {
if (!$layout_plugin = $form_state->get('layout_plugin')) {
$layout_plugin = $this->layoutPluginManager->createInstance($layout_id, $layout_settings);
$form_state->set('layout_plugin', $layout_plugin);
}
return $layout_plugin;
}
public function buildForm(array $form, FormStateInterface $form_state) {
$form = parent::buildForm($form, $form_state);
// Retrieval of the layout ID and settings is dependent on how it is stored.
$layout_plugin = $this->getLayout($layout_id, $layout_settings, $form_state);
$form['layout'] = [
'#type' => 'select',
'#title' => $this->t('Select a layout'),
'#options' => $this->layoutPluginManager->getLayoutOptions(),
'#default_value' => $layout_plugin->getPluginId(),
];
if ($layout_plugin instanceof PluginFormInterface) {
$form['layout_settings'] = [];
$subform_state = SubformState::createForSubform($form['layout_settings'], $form, $form_state);
$form['layout_settings'] = $layout_plugin->buildConfigurationForm($form['layout_settings'], $subform_state);
}
}
public function validateForm(array &$form, FormStateInterface $form_state) {
parent::validateForm($form, $form_state);
$layout_plugin = $this->getLayout($layout_id, $layout_settings, $form_state);
if ($layout_plugin instanceof PluginFormInterface) {
$subform_state = SubformState::createForSubform($form['layout_settings'], $form, $form_state);
$layout_plugin->validateConfigurationForm($form['layout_settings'], $subform_state);
}
}
public function submitForm(array &$form, FormStateInterface $form_state) {
parent::submitForm($form, $form_state);
$layout_plugin = $this->getLayout($layout_id, $layout_settings, $form_state);
if ($layout_plugin instanceof PluginFormInterface) {
$subform_state = SubformState::createForSubform($form['layout_settings'], $form, $form_state);
$layout_plugin->submitConfigurationForm($form['layout_settings'], $subform_state);
}
// @todo This is where you store the updated layout information
$layout_id = $layout_plugin->getPluginId();
$layout_settings = $layout_plugin->getConfiguration();
}
Storing configuration for the selected layout
use \Drupal\block\Entity\Block;
use \Drupal\layout_builder\SectionComponent;
use \Drupal\layout_builder\Plugin\SectionStorage\OverridesSectionStorage;
use \Drupal\layout_builder\Section;
$block_1 = Block::load(1);
$block_2 = Block::load(2);
$entity_with_layout_enabled = Node::load(47);
$section_components[$block_1->uuid()] = new SectionComponent($block_1->uuid(), 'first', [
'id' => $block_1->getPluginId(),
]);
$section_components[$block_2->uuid()] = new SectionComponent($block_2->uuid(), 'second', [
'id' => $block_2->getPluginId(),
]);
$entity_with_layout_enabled->set(OverridesSectionStorage::FIELD_NAME, new Section('layout_twocol', [], $section_components))->save();Help improve this page
Page status: No known problems
You can:
You can:
- Log in, click Edit, and edit this page
- Log in, click Discuss, update the Page status value, and suggest an improvement
- Log in and create a Documentation issue with your suggestion