You are here

public function SchedulerAdminForm::buildForm in Scheduler 2.x

Same name and namespace in other branches
  1. 8 src/Form/SchedulerAdminForm.php \Drupal\scheduler\Form\SchedulerAdminForm::buildForm()

Form constructor.

Parameters

array $form: An associative array containing the structure of the form.

\Drupal\Core\Form\FormStateInterface $form_state: The current state of the form.

Return value

array The form structure.

Overrides ConfigFormBase::buildForm

File

src/Form/SchedulerAdminForm.php, line 75

Class

SchedulerAdminForm
Main administration form for the Scheduler module.

Namespace

Drupal\scheduler\Form

Code

public function buildForm(array $form, FormStateInterface $form_state) {
  $form['description'] = [
    '#markup' => '<p>' . $this
      ->t('Most of the Scheduler options are set independently for each entity type and bundle. These can be accessed from the <a href="@link">admin structure</a> page or directly by using the drop-button', [
      '@link' => Url::fromRoute('system.admin_structure')
        ->toString(),
    ]) . '</p>',
  ];

  // Build a drop-button with links to configure all supported entity types.
  $plugins = $this->schedulerManager
    ->getPlugins();
  $links = [];
  $links[] = [
    'title' => $this
      ->t('Entity Types'),
    'url' => Url::fromRoute('system.admin_structure'),
  ];
  foreach ($plugins as $entityTypeId => $plugin) {
    $publishing_enabled_types = $this->schedulerManager
      ->getEnabledTypes($entityTypeId, 'publish');
    $unpublishing_enabled_types = $this->schedulerManager
      ->getEnabledTypes($entityTypeId, 'unpublish');

    // When all is running normally, $plugin->getTypes() will give a non-empty
    // array of values, but we need to protect against this being empty.
    if (!($types = $plugin
      ->getTypes())) {

      // When a module is enabled via drush there is no automatic clear cache.
      // Thus moduleHandler()->moduleExists({module}) can return false when
      // the module is actually enabled. This means we get nothing for
      // plugin->getTypes() and processing should stop with a useful exception
      // message, instead of letting Core give a confusing exception.
      $type_definition = $this->entityTypeManager
        ->getDefinition($entityTypeId . '_type', FALSE);
      if (!$type_definition) {
        throw new \Exception(sprintf('Invalid or empty entity type definition for %s module. Do a full cache clear via admin/config/development/performance or drush cr.', $plugin
          ->dependency()));
      }

      // Some modules may not create a default entity type during installation
      // or the entity type definitions may have been deleted. This is not an
      // exception, but will cause an error if we do not stop this loop.
      $message_parms = [
        '%module' => $plugin
          ->dependency(),
        '%plugin_label' => $plugin
          ->label(),
      ];
      $this
        ->logger('scheduler')
        ->warning('No entity types returned by %module module for use in %plugin_label', $message_parms);
      $this
        ->messenger()
        ->addWarning($this
        ->t('No entity types returned by %module module for use in %plugin_label', $message_parms));
      continue;
    }
    $bundle_id = reset($types)
      ->bundle();
    $collection_label = $this->entityTypeManager
      ->getStorage($bundle_id)
      ->getEntityType()
      ->get('label_collection');

    // Cater for incomplete config entity with no collection label.
    $collection_label = is_object($collection_label) ? $collection_label
      ->__toString() : $collection_label;
    $links[] = [
      'title' => "-- {$collection_label} --",
    ];
    foreach ($types as $id => $type) {
      $text = [];
      in_array($id, $publishing_enabled_types) ? $text[] = $this
        ->t('publishing') : NULL;
      in_array($id, $unpublishing_enabled_types) ? $text[] = $this
        ->t('unpublishing') : NULL;
      $links[] = [
        'title' => $type
          ->label() . (!empty($text) ? ' (' . implode(', ', $text) . ')' : ''),
        // Example: the route 'entity.media_type.edit_form' with parameter
        // media_type={typeid} has url /admin/structure/media/manage/{typeid}.
        'url' => Url::fromRoute("entity.{$bundle_id}.edit_form", [
          $bundle_id => $type
            ->id(),
        ]),
      ];
    }
  }
  $form['entity_type_links'] = [
    '#type' => 'dropbutton',
    '#links' => $links,
  ];
  $form['description2'] = [
    '#markup' => '<p>' . $this
      ->t('The settings below are common to all entity types.') . '</p>',
  ];

  // Options for setting date-only with default time.
  $form['date_only_fieldset'] = [
    '#type' => 'fieldset',
    '#title' => $this
      ->t('Date only'),
    '#collapsible' => FALSE,
  ];
  $form['date_only_fieldset']['allow_date_only'] = [
    '#type' => 'checkbox',
    '#title' => $this
      ->t('Allow users to enter only a date and provide a default time.'),
    '#default_value' => $this
      ->setting('allow_date_only'),
    '#description' => $this
      ->t('When only a date is entered the time will default to a specified value, but the user can change this if required.'),
  ];
  $form['date_only_fieldset']['default_time'] = [
    '#type' => 'textfield',
    '#title' => $this
      ->t('Default time'),
    '#default_value' => $this
      ->setting('default_time'),
    '#size' => 20,
    '#maxlength' => 8,
    '#description' => $this
      ->t('Provide a default time in @format format that will be used if the user does not enter a value.', [
      '@format' => $this
        ->setting('hide_seconds') ? 'HH:MM' : 'HH:MM:SS',
    ]),
    '#states' => [
      'visible' => [
        ':input[name="allow_date_only"]' => [
          'checked' => TRUE,
        ],
      ],
    ],
  ];

  // Options for configuring the time input field.
  $form['time_fieldset'] = [
    '#type' => 'fieldset',
    '#title' => $this
      ->t('Time settings'),
    '#collapsible' => FALSE,
  ];
  $form['time_fieldset']['hide_seconds'] = [
    '#type' => 'checkbox',
    '#title' => $this
      ->t('Hide the seconds.'),
    '#default_value' => $this
      ->setting('hide_seconds'),
    '#description' => $this
      ->t('When entering a time, only show hours and minutes in the input field.'),
  ];

  // Attach library for admin css file.
  $form['#attached']['library'][] = 'scheduler/admin';
  return parent::buildForm($form, $form_state);
}