public function FormAlter::alterEntityViewDisplayForm in Dashboards with Layout Builder 2.0.x
The actual form elements.
File
- src/
Form/ FormAlter.php, line 112
Class
- FormAlter
- Supplement form UI to add setting for which blocks & layouts are available.
Namespace
Drupal\dashboards\FormCode
public function alterEntityViewDisplayForm(&$form, FormStateInterface $form_state, $form_id) {
$entity = $form_state
->getFormObject()
->getEntity();
$is_enabled = $entity
->isLayoutBuilderEnabled();
if ($is_enabled) {
$form['#entity_builders'][] = [
$this,
'entityFormEntityBuild',
];
// Block settings.
$form['layout']['layout_builder_restrictions']['allowed_blocks'] = [
'#type' => 'details',
'#title' => $this
->t('Blocks available for placement (all layouts & regions)'),
'#states' => [
'disabled' => [
':input[name="layout[enabled]"]' => [
'checked' => FALSE,
],
],
'invisible' => [
':input[name="layout[enabled]"]' => [
'checked' => FALSE,
],
],
],
];
$third_party_settings = $entity
->getThirdPartySetting('layout_builder_restrictions', 'entity_view_mode_restriction', []);
$whitelisted_blocks = isset($third_party_settings['whitelisted_blocks']) ? $third_party_settings['whitelisted_blocks'] : [];
$blacklisted_blocks = isset($third_party_settings['blacklisted_blocks']) ? $third_party_settings['blacklisted_blocks'] : [];
$restricted_categories = isset($third_party_settings['restricted_categories']) ? $third_party_settings['restricted_categories'] : [];
$allowed_block_categories = $entity
->getThirdPartySetting('layout_builder_restrictions', 'allowed_block_categories', []);
foreach ($this
->getBlockDefinitions() as $category => $data) {
$title = $data['label'];
if (!empty($data['translated_label'])) {
$title = $data['translated_label'];
}
$category_form = [
'#type' => 'fieldset',
'#title' => $title,
'#parents' => [
'layout_builder_restrictions',
'allowed_blocks',
],
];
// Check whether this is a newly available category that has been
// restricted previously.
$category_is_restricted = !empty($allowed_block_categories) && !in_array($category, $allowed_block_categories);
// The category is 'restricted' if it's already been specified as such,
// or if the default behavior for new categories indicate such.
if (in_array($category, array_keys($whitelisted_blocks))) {
$category_setting = 'whitelisted';
}
elseif (in_array($category, array_keys($blacklisted_blocks))) {
$category_setting = 'blacklisted';
}
elseif ($category_is_restricted) {
$category_setting = 'restrict_all';
}
elseif (in_array($category, $restricted_categories)) {
$category_setting = 'restrict_all';
}
else {
$category_setting = 'all';
}
$category_form['restriction_behavior'] = [
'#type' => 'radios',
'#options' => [
"all" => $this
->t('Allow all existing & new %category blocks.', [
'%category' => $data['label'],
]),
"restrict_all" => $this
->t('Restrict all existing & new %category blocks.', [
'%category' => $data['label'],
]),
"whitelisted" => $this
->t('Allow specific %category blocks:', [
'%category' => $data['label'],
]),
"blacklisted" => $this
->t('Restrict specific %category blocks:', [
'%category' => $data['label'],
]),
],
'#default_value' => $category_setting,
'#parents' => [
'layout_builder_restrictions',
'allowed_blocks',
$category,
'restriction',
],
];
$category_form['available_blocks'] = [
'#type' => 'container',
'#states' => [
'invisible' => [
[
':input[name="layout_builder_restrictions[allowed_blocks][' . $category . '][restriction]"]' => [
'value' => "all",
],
],
[
':input[name="layout_builder_restrictions[allowed_blocks][' . $category . '][restriction]"]' => [
'value' => "restrict_all",
],
],
],
],
];
foreach ($data['definitions'] as $block_id => $block) {
$enabled = FALSE;
if ($category_setting == 'whitelisted' && isset($whitelisted_blocks[$category]) && in_array($block_id, $whitelisted_blocks[$category])) {
$enabled = TRUE;
}
elseif ($category_setting == 'blacklisted' && isset($blacklisted_blocks[$category]) && in_array($block_id, $blacklisted_blocks[$category])) {
$enabled = TRUE;
}
$category_form['available_blocks'][$block_id] = [
'#type' => 'checkbox',
'#title' => $block['admin_label'],
'#default_value' => $enabled,
'#parents' => [
'layout_builder_restrictions',
'allowed_blocks',
$category,
'available_blocks',
$block_id,
],
];
}
if ($category == 'Custom blocks' || $category == 'Custom block types') {
$category_form['description'] = [
'#type' => 'container',
'#children' => $this
->t('<p>In the event both <em>Custom Block Types</em> and <em>Custom Blocks</em> restrictions are enabled, <em>Custom Block Types</em> restrictions are disregarded.</p>'),
'#states' => [
'visible' => [
':input[name="layout_builder_restrictions[allowed_blocks][' . $category . '][restriction]"]' => [
'value' => "restricted",
],
],
],
];
}
$form['layout']['layout_builder_restrictions']['allowed_blocks'][$category] = $category_form;
}
// Layout settings.
$allowed_layouts = isset($third_party_settings['allowed_layouts']) ? $third_party_settings['allowed_layouts'] : [];
$layout_form = [
'#type' => 'details',
'#title' => $this
->t('Layouts available for sections'),
'#parents' => [
'layout_builder_restrictions',
'allowed_layouts',
],
'#states' => [
'disabled' => [
':input[name="layout[enabled]"]' => [
'checked' => FALSE,
],
],
'invisible' => [
':input[name="layout[enabled]"]' => [
'checked' => FALSE,
],
],
],
];
$layout_form['layout_restriction'] = [
'#type' => 'radios',
'#options' => [
"all" => $this
->t('Allow all existing & new layouts.'),
"restricted" => $this
->t('Allow only specific layouts:'),
],
'#default_value' => !empty($allowed_layouts) ? "restricted" : "all",
];
$definitions = $this
->getLayoutDefinitions();
/**
* @var $definition LayoutPluginDefinition
**/
foreach ($definitions as $plugin_id => $definition) {
$enabled = FALSE;
if (!empty($allowed_layouts) && in_array($plugin_id, $allowed_layouts)) {
$enabled = TRUE;
}
$layout_form['layouts'][$plugin_id] = [
'#type' => 'checkbox',
'#default_value' => $enabled,
'#description' => [
$definition
->getIcon(60, 80, 1, 3),
[
'#type' => 'container',
'#children' => $definition
->getLabel() . ' (' . $plugin_id . ')',
],
],
'#states' => [
'invisible' => [
':input[name="layout_builder_restrictions[allowed_layouts][layout_restriction]"]' => [
'value' => "all",
],
],
],
];
}
$form['layout']['layout_builder_restrictions']['allowed_layouts'] = $layout_form;
}
}