You are here

public function LayoutBuilderStyleForm::form in Layout Builder Styles 8

Gets the actual form array to be built.

Overrides EntityForm::form

See also

\Drupal\Core\Entity\EntityForm::processForm()

\Drupal\Core\Entity\EntityForm::afterBuild()

File

src/Form/LayoutBuilderStyleForm.php, line 70

Class

LayoutBuilderStyleForm
Class LayoutBuilderStyleForm.

Namespace

Drupal\layout_builder_styles\Form

Code

public function form(array $form, FormStateInterface $form_state) {
  $form = parent::form($form, $form_state);

  /** @var \Drupal\layout_builder_styles\LayoutBuilderStyleInterface $style */
  $style = $this->entity;
  $form['label'] = [
    '#type' => 'textfield',
    '#title' => $this
      ->t('Label'),
    '#maxlength' => 255,
    '#default_value' => $style
      ->label(),
    '#required' => TRUE,
  ];
  $form['id'] = [
    '#type' => 'machine_name',
    '#default_value' => $style
      ->id(),
    '#machine_name' => [
      'exists' => '\\Drupal\\layout_builder_styles\\Entity\\LayoutBuilderStyle::load',
    ],
    '#disabled' => !$style
      ->isNew(),
  ];
  $form['classes'] = [
    '#title' => $this
      ->t('CSS classes'),
    '#type' => 'textarea',
    '#default_value' => $style
      ->getClasses(),
    '#description' => $this
      ->t('Enter one per line.'),
    '#required' => TRUE,
  ];

  // For now we only support block styles.
  $form['type'] = [
    '#title' => $this
      ->t('Type'),
    '#type' => 'radios',
    '#default_value' => $style
      ->getType(),
    '#description' => $this
      ->t('Determines if this style applies to sections or blocks.'),
    '#required' => TRUE,
    '#options' => [
      LayoutBuilderStyleInterface::TYPE_COMPONENT => $this
        ->t('Block'),
      LayoutBuilderStyleInterface::TYPE_SECTION => $this
        ->t('Section'),
    ],
  ];
  $blockDefinitions = $this->blockManager
    ->getDefinitions();
  $blockDefinitions = $this->blockManager
    ->getGroupedDefinitions($blockDefinitions);

  // Remove individual reusable blocks from list.
  unset($blockDefinitions['Custom']);
  if (isset($blockDefinitions['Inline blocks'])) {

    // Relabel the inline block type listing as generic "Custom block types".
    // This category will apply to inline blocks & reusable blocks.
    $blockDefinitions['Custom block types'] = $blockDefinitions['Inline blocks'];
    unset($blockDefinitions['Inline blocks']);
    ksort($blockDefinitions);
  }
  $form['block_restrictions'] = [
    '#type' => 'details',
    '#title' => $this
      ->t('Block restrictions'),
    '#description' => $this
      ->t('Optionally limit this style to the following block(s).'),
    '#states' => [
      'visible' => [
        'input[name="type"]' => [
          'value' => LayoutBuilderStyleInterface::TYPE_COMPONENT,
        ],
      ],
    ],
  ];
  foreach ($blockDefinitions as $category => $blocks) {
    $category_form = [
      '#type' => 'details',
      '#title' => $category,
      '#collapsible' => TRUE,
      '#collapsed' => TRUE,
    ];
    foreach ($blocks as $blockId => $block) {
      $machine_name = $blockId;
      $category_form[$blockId] = [
        '#type' => 'checkbox',
        '#title' => $block['admin_label'] . ' <small>(' . $machine_name . ')</small>',
        '#default_value' => in_array($blockId, $style
          ->getBlockRestrictions()),
        '#parents' => [
          'block_restrictions',
          $blockId,
        ],
      ];
      if ($category == 'Custom block types') {
        $machine_name = str_replace('inline_block:', '', $machine_name);
        $category_form[$blockId]['#title'] = $block['admin_label'] . ' <small>(' . $machine_name . ')</small>';
        $category_form[$blockId]['#description'] = $this
          ->t('Block type selections effect both re-usable and inline blocks.');
      }
    }
    $form['block_restrictions'][$category] = $category_form;
  }
  $form['layout_restrictions'] = [
    '#type' => 'details',
    '#title' => $this
      ->t('Layout restrictions'),
    '#description' => $this
      ->t('Optionally limit this style to the following layout(s).'),
    '#states' => [
      'visible' => [
        'input[name="type"]' => [
          'value' => LayoutBuilderStyleInterface::TYPE_SECTION,
        ],
      ],
    ],
  ];
  $section_definitions = $this->layoutManager
    ->getFilteredDefinitions('layout_builder', []);
  foreach ($section_definitions as $section_id => $definition) {
    $form['layout_restrictions'][$section_id] = [
      '#type' => 'checkbox',
      '#title' => $definition
        ->getLabel(),
      '#default_value' => in_array($section_id, $style
        ->getLayoutRestrictions()),
      '#parents' => [
        'layout_restrictions',
        $section_id,
      ],
      '#description' => [
        $definition
          ->getIcon(60, 80, 1, 3),
        [
          '#type' => 'container',
          '#children' => $definition
            ->getLabel() . ' (' . $section_id . ')',
        ],
      ],
    ];
  }
  return $form;
}