You are here

public function SettingsForm::buildForm in Entity Share Cron 3.0.x

Same name and namespace in other branches
  1. 8.2 src/Form/SettingsForm.php \Drupal\entity_share_cron\Form\SettingsForm::buildForm()
  2. 8 src/Form/SettingsForm.php \Drupal\entity_share_cron\Form\SettingsForm::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/SettingsForm.php, line 82

Class

SettingsForm
Module settings form.

Namespace

Drupal\entity_share_cron\Form

Code

public function buildForm(array $form, FormStateInterface $form_state) {
  $config = $this
    ->config('entity_share_cron.settings');
  $form['cron_interval'] = [
    '#type' => 'number',
    '#title' => $this
      ->t('Execution interval'),
    '#description' => $this
      ->t('Minimum interval between consecutive executions in seconds.'),
    '#min' => 60,
    '#step' => 60,
    '#default_value' => $config
      ->get('cron_interval'),
  ];
  $form['page_limit'] = [
    '#type' => 'number',
    '#title' => $this
      ->t('Page limit'),
    '#description' => $this
      ->t('Maximum number of pages to import for each channels on each cron run. 0 to import all the pages in one cron execution.'),
    '#min' => 0,
    '#default_value' => $config
      ->get('page_limit'),
  ];
  $form['remotes'] = [
    '#type' => 'fieldset',
    '#title' => $this
      ->t('Enabled remotes and channels'),
    '#description' => $this
      ->t('Only selected remotes and channels will be synchronized on Cron executions. For each channel you may select which operations can be performed on synchronization.'),
    '#tree' => TRUE,
  ];
  $remotes_config = $config
    ->get('remotes');

  /** @var \Drupal\entity_share_client\Entity\RemoteInterface[] $remotes */
  $remotes = $this->entityTypeManager
    ->getStorage('remote')
    ->loadMultiple();
  foreach ($remotes as $remote_id => $remote) {
    $remote_config = isset($remotes_config[$remote_id]) ? $remotes_config[$remote_id] : [];

    // Adds a checkbox to enable/disable remote synchronization.
    $form['remotes'][$remote_id] = [
      '#type' => 'container',
    ];
    $remote_enabled_default = !empty($remote_config['enabled']);
    $form['remotes'][$remote_id]['enabled'] = [
      '#type' => 'checkbox',
      '#title' => $remote
        ->label(),
      '#default_value' => $remote_enabled_default,
      '#ajax' => [
        'callback' => [
          $this,
          'remoteCheckboxCallback',
        ],
        'wrapper' => "channels-{$remote_id}",
      ],
    ];
    $form['remotes'][$remote_id]['channels'] = [
      '#type' => 'container',
      '#prefix' => "<div id='channels-{$remote_id}' class='channels-container'>",
      '#suffix' => '</div>',
    ];
    $remote_enabled = $form_state
      ->getValue([
      'remotes',
      $remote_id,
      'enabled',
    ]);
    if (!isset($remote_enabled) && $remote_enabled_default || $remote_enabled) {
      try {
        $channels = $this->remoteManager
          ->getChannelsInfos($remote);
      } catch (ClientException $exception) {
        $channels = [];
        watchdog_exception('entity_share_cron', $exception);
        $this
          ->messenger()
          ->addError($this
          ->t('Could not get channels from remote %remote.', [
          '%remote' => $remote
            ->label(),
        ]));
      }
      $import_config_default_value = NULL;
      $import_config_options = $this
        ->getImportConfigOptions();
      if (count($import_config_options) == 1) {
        $import_config_default_value = key($import_config_options);
      }
      foreach ($channels as $channel_id => $channel_info) {

        // Channel settings.
        $channel_config = isset($remote_config['channels'][$channel_id]) ? $remote_config['channels'][$channel_id] : [];
        $form['remotes'][$remote_id]['channels'][$channel_id] = [
          '#type' => 'container',
        ];
        $form['remotes'][$remote_id]['channels'][$channel_id]['enabled'] = [
          '#type' => 'checkbox',
          '#title' => $channel_info['label'],
          '#default_value' => !empty($channel_config['enabled']),
        ];
        $form['remotes'][$remote_id]['channels'][$channel_id]['import_config'] = [
          '#type' => 'select',
          '#title' => $this
            ->t('Import configuration'),
          '#options' => $import_config_options,
          '#default_value' => isset($channel_config['import_config']) ? $channel_config['import_config'] : $import_config_default_value,
          '#states' => [
            'visible' => [
              ':input[name="remotes[' . $remote_id . '][channels][' . $channel_id . '][enabled]"]' => [
                'checked' => TRUE,
              ],
            ],
          ],
        ];
        $form['remotes'][$remote_id]['channels'][$channel_id]['operations'] = [
          '#type' => 'details',
          '#title' => $this
            ->t('Operations'),
          '#open' => TRUE,
          '#attributes' => [
            'class' => [
              'channel-operations',
            ],
          ],
          '#states' => [
            'visible' => [
              ':input[name="remotes[' . $remote_id . '][channels][' . $channel_id . '][enabled]"]' => [
                'checked' => TRUE,
              ],
            ],
          ],
        ];
        $form['remotes'][$remote_id]['channels'][$channel_id]['operations']['create'] = [
          '#type' => 'checkbox',
          '#title' => $this
            ->t('Create'),
          '#default_value' => isset($channel_config['operations']['create']) ? $channel_config['operations']['create'] : TRUE,
        ];
        $form['remotes'][$remote_id]['channels'][$channel_id]['operations']['update'] = [
          '#type' => 'checkbox',
          '#title' => $this
            ->t('Update'),
          '#default_value' => isset($channel_config['operations']['update']) ? $channel_config['operations']['update'] : TRUE,
        ];
      }
    }
  }
  $form['#attached']['library'][] = 'entity_share_cron/settings_form';
  return parent::buildForm($form, $form_state);
}