You are here

public function AnonymousPublishingClAdminSettings::buildForm in Anonymous Publishing 8

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

modules/anonymous_publishing_cl/src/Form/AnonymousPublishingClAdminSettings.php, line 37

Class

AnonymousPublishingClAdminSettings
This class defines the admin setting form for this module, available at : admin/config/people/anonymous_publishing_cl

Namespace

Drupal\anonymous_publishing_cl\Form

Code

public function buildForm(array $form, FormStateInterface $form_state) {
  $settings = $this
    ->config('anonymous_publishing_cl.settings');

  // Retrieve an anonymous user: helpfull to control permissions on anons.
  $anonymous_user = new AnonymousUserSession();

  /* -----
   * Pre-requisite checks: will this module control comment too ?
   * Yes: if anons can post comments,
   * No: otherwise.
   */

  // Validate that currently setted content types can also enable comment
  // management.
  $enabled_content_types = $settings
    ->get('allowed_content_types');
  if (!empty($enabled_content_types)) {
    foreach ($enabled_content_types as $enabled_content_type => $activated) {

      // 1. Case where managing comment is enabled but anon user has not the
      //    proper comment permission.
      if ('comment' == $enabled_content_type && $activated) {
        $anon_can_post_comment = $anonymous_user
          ->hasPermission('post comments');
        if ($activated && !$anon_can_post_comment) {
          $this
            ->messenger()
            ->addWarning(t('The module is set to manage comments, but anonymous users are not allowed to post comments.'));
        }
      }
      else {
        $anon_can_create_content_of_this_type = $anonymous_user
          ->hasPermission('create ' . $enabled_content_type . ' content');
        if ($activated && !$anon_can_create_content_of_this_type) {
          $this
            ->messenger()
            ->addWarning(t('The module is set to to manage @ctypes, but anonymous users are not allowed to create @ctypes.', [
            '@ctype' => $enabled_content_type,
          ]));
        }
      }
    }
  }
  else {
    $enabled_content_types = [];
    $content_types = node_type_get_names();
    foreach ($content_types as $content_type => $activated) {
      $enabled_content_types[$content_type] = 0;
    }
  }
  $content_types = node_type_get_names();
  if (\Drupal::moduleHandler()
    ->moduleExists('comment')) {
    $content_types['comment'] = t('Comment');
    $ctext = '(+ Comment)';
  }
  else {
    $ctext = '';
  }

  /* -----
   * Build the settings form.
   */
  $form['allowed_content_types'] = [
    '#type' => 'checkboxes',
    '#multiple' => TRUE,
    '#title' => t('Content types @comments where anonymous publishing is managed by this submodule:', array(
      '@comments' => $ctext,
    )),
    '#default_value' => $enabled_content_types,
    '#options' => $content_types,
    '#description' => t('Note: You also need to use node permissions to enable anonymous publishing for the anonymous user role if you want this role to be able to create content.'),
  ];
  $anonymous_publishing_cl_options = $settings
    ->get('general_options');
  $anonymous_publishing_cl_options_values = array();
  foreach ($anonymous_publishing_cl_options as $option => $value) {
    $anonymous_publishing_cl_options_values[$option] = $value ? $option : '';
  }
  $form['general_options'] = [
    '#type' => 'checkboxes',
    '#multiple' => TRUE,
    '#title' => t('Options:'),
    '#default_value' => $anonymous_publishing_cl_options_values,
    '#options' => array(
      'sactivate' => t('Allow self-activation.'),
      'sactstick' => t('Make self-activation sticky.'),
      'sactcomm' => t('Skip comment approval (set on @link).', array(
        '@link' => Link::createFromRoute(t('Administration » People » Permissions'), 'user.admin_permissions')
          ->toString(),
      )),
      'modmail' => t('Send email to administrator when anonymous content is created.'),
      'blockip' => t('Use IP-address for blocking.'),
      'aregist' => t('Allow registered emails to be used for anonymous posts.'),
    ),
    '#description' => t('Check the options you want to enable.'),
  ];
  $form['general_options']['sactcomm'] = [
    '#disabled' => TRUE,
    '#default_value' => $anonymous_user
      ->hasPermission('skip comment approval'),
  ];
  $form['verification_persistency'] = array(
    '#type' => 'radios',
    '#title' => t('Verification persistency:'),
    '#options' => array(
      'persist' => t('Make verification persistent.'),
      'ip_duration' => t('Verification persists as long as the same IP is used.'),
      'every_post' => t('Require verification for each posting.'),
    ),
    '#description' => t('This determines whether users need to re-verify.'),
    '#default_value' => $settings
      ->get('verification_persistency'),
  );

  // NOTE: Period is set on privacy tab, -1 = Indefinitely.
  $period = $settings
    ->get('retain_period');
  if (-1 == $period) {
    $form['user_alias'] = array(
      '#type' => 'radios',
      '#title' => t('To whom should anonymous postings be attributed:'),
      '#options' => array(
        'anon' => t('Use "@anon" (the default alias for anonymous users).', array(
          '@anon' => \Drupal::config('user.settings')
            ->get('anonymous'),
        )),
        'alias' => t('Use an autogenerated persistent alias (format "user<em>N</em>").'),
        'byline' => t('Allow the anonymous publisher to set the byline.'),
      ),
      '#description' => t('This determines what string to use as byline for anonymous posts.'),
      '#default_value' => $settings
        ->get('user_alias'),
    );
    $form['byline_guidance'] = array(
      '#type' => 'textfield',
      '#title' => t('Guidelines for the byline:'),
      '#size' => 60,
      '#maxlength' => Email::EMAIL_MAX_LENGTH,
      '#default_value' => $settings
        ->get('byline_guidance'),
      '#description' => t('If you want to provide guidance users who set their own byline, you can do it here.'),
    );
  }
  else {
    $form['user_alias'] = [
      '#markup' => '<p><b>' . t('To access the settings for the byline, you must set the retention period to "Indefinitely" (on the <em>Privacy</em> tab)') . '</b></p>',
    ];
  }
  $default_mail = $settings
    ->get('notification_email_destination') ? $settings
    ->get('notification_email_destination') : $this
    ->config('system.site')
    ->get('mail');
  $form['notification_email_destination'] = array(
    '#type' => 'email',
    '#title' => t("Administrator's email address:"),
    '#size' => 60,
    '#maxlength' => Email::EMAIL_MAX_LENGTH,
    '#default_value' => $default_mail,
    '#description' => t('Address to use when the "Send email to administrator…" option is checked.'),
  );
  $form['email_weight'] = array(
    '#type' => 'number',
    '#title' => t('Verification email address field weight:'),
    '#size' => 3,
    '#maxlength' => 3,
    '#default_value' => $settings
      ->get('email_weight'),
    '#description' => t('Weight of verification email address field on create content form.'),
  );
  $form['autodelhours'] = array(
    '#type' => 'number',
    '#title' => t('Number of hours to retain unverified anonymous posts before auto-deletions removes them:'),
    '#size' => 3,
    '#maxlength' => 3,
    '#default_value' => $settings
      ->get('autodelhours'),
    '#description' => t('Non-verified content will be automatically deleted after this time. Type "-1" for no limit.'),
  );
  $form['flood_limit'] = array(
    '#type' => 'number',
    '#title' => t('Number of anonymous posts allowed from a single user email/ip allowed within an hour:'),
    '#size' => 3,
    '#maxlength' => 2,
    '#default_value' => $settings
      ->get('flood_limit'),
    '#description' => t('Type "-1" for no limit.'),
  );
  return parent::buildForm($form, $form_state);
}