purge_users-8.x-2.0/src/Form/SettingsForm.php

src/Form/SettingsForm.php
<?php

namespace Drupal\purge_users\Form;

use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\user\RoleInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Form to configure purge methods and conditions.
 *
 * @package Drupal\purge_users\Form
 */
class SettingsForm extends ConfigFormBase {

  /**
   * The module handler.
   *
   * @var \Drupal\Core\Extension\ModuleHandlerInterface
   */
  protected $moduleHandler;

  /**
   * The entity type manager.
   *
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  protected $entityTypeManager;

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    $instance = parent::create($container);
    $instance->moduleHandler = $container->get('module_handler');
    $instance->entityTypeManager = $container->get('entity_type.manager');
    return $instance;
  }

  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'purge_users_config_form';
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $form = parent::buildForm($form, $form_state);
    $config = $this->config('purge_users.settings');
    $roles = $this->entityTypeManager->getStorage('user_role')->loadMultiple();
    unset($roles[RoleInterface::ANONYMOUS_ID]);
    $roles_array = array_map(function ($item) {
      return $item->label();
    }, $roles);
    $exclude_role_array = $roles_array;
    unset($exclude_role_array[RoleInterface::AUTHENTICATED_ID]);

    $form['never_loggedin_user'] = [
      '#type' => 'fieldset',
      '#title' => $this->t('Purge users who have never logged in for'),
      '#collapsible' => FALSE,
      '#collapsed' => FALSE,
    ];
    $form['never_loggedin_user']['user_never_lastlogin_value'] = [
      '#type' => 'number',
      '#title' => $this->t('Value'),
      '#default_value' => $config->get('user_never_lastlogin_value'),
      '#prefix' => '<div class="purge-interval-selector clearfix">',
      '#attributes' => ['class' => ['purge-value']],
      '#states' => [
        'required' => [
          ':input[name="enabled_never_loggedin_users"]' => ['checked' => TRUE],
        ],
      ],
    ];
    $form['never_loggedin_user']['user_never_lastlogin_period'] = [
      '#title' => $this->t('Period'),
      '#type' => 'select',
      '#options' => [
        'days' => $this->t('Days'),
        'month' => $this->t('Months'),
        'year' => $this->t('Year'),
      ],
      '#default_value' => $config->get('user_never_lastlogin_period'),
      '#attributes' => ['class' => ['purge-period']],
      '#suffix' => '</div>',
    ];
    $form['never_loggedin_user']['enabled_never_loggedin_users'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Enabled'),
      '#default_value' => $config->get('enabled_never_loggedin_users'),
    ];

    $form['not_loggedin_user'] = [
      '#type' => 'fieldset',
      '#title' => $this->t('Purge users who have not logged in for'),
      '#collapsible' => FALSE,
      '#collapsed' => FALSE,
    ];
    $form['not_loggedin_user']['user_lastlogin_value'] = [
      '#type' => 'number',
      '#title' => $this->t('Value'),
      '#default_value' => $config->get('user_lastlogin_value'),
      '#prefix' => '<div class="purge-interval-selector clearfix">',
      '#attributes' => ['class' => ['purge-value']],
      '#states' => [
        'required' => [
          ':input[name="enabled_loggedin_users"]' => ['checked' => TRUE],
        ],
      ],
    ];

    $form['not_loggedin_user']['user_lastlogin_period'] = [
      '#title' => $this->t('Period'),
      '#type' => 'select',
      '#options' => [
        'days' => $this->t('Days'),
        'month' => $this->t('Months'),
        'year' => $this->t('Year'),
      ],
      '#default_value' => $config->get('user_lastlogin_period'),
      '#attributes' => ['class' => ['purge-period']],
      '#suffix' => '</div>',
    ];

    $form['not_loggedin_user']['enabled_loggedin_users'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Enabled'),
      '#default_value' => $config->get('enabled_loggedin_users'),
    ];

    $form['not_active_user'] = [
      '#type' => 'fieldset',
      '#title' => $this->t('Purge users whose account has not been activated for'),
      '#collapsible' => FALSE,
      '#collapsed' => FALSE,
    ];
    $form['not_active_user']['user_inactive_value'] = [
      '#type' => 'number',
      '#title' => $this->t('Value'),
      '#default_value' => $config->get('user_inactive_value'),
      '#prefix' => '<div class="purge-interval-selector clearfix">',
      '#attributes' => ['class' => ['purge-value']],
      '#states' => [
        'required' => [
          ':input[name="enabled_inactive_users"]' => ['checked' => TRUE],
        ],
      ],
    ];

    $form['not_active_user']['user_inactive_period'] = [
      '#title' => $this->t('Period'),
      '#type' => 'select',
      '#options' => [
        'days' => $this->t('Days'),
        'month' => $this->t('Months'),
        'year' => $this->t('Year'),
      ],
      '#default_value' => $config->get('user_inactive_period'),
      '#attributes' => ['class' => ['purge-period']],
      '#suffix' => '</div>',
    ];

    $form['not_active_user']['enabled_inactive_users'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Enabled'),
      '#default_value' => $config->get('enabled_inactive_users'),
    ];

    $form['blocked_user'] = [
      '#type' => 'fieldset',
      '#title' => $this->t('Purge users who have been blocked for'),
      '#collapsible' => FALSE,
      '#collapsed' => FALSE,
    ];
    $form['blocked_user']['user_blocked_value'] = [
      '#type' => 'number',
      '#title' => $this->t('Value'),
      '#default_value' => $config->get('user_blocked_value'),
      '#prefix' => '<div class="purge-interval-selector clearfix">',
      '#attributes' => ['class' => ['purge-value']],
      '#states' => [
        'required' => [
          ':input[name="enabled_blocked_users"]' => ['checked' => TRUE],
        ],
      ],
    ];

    $form['blocked_user']['user_blocked_period'] = [
      '#title' => $this->t('Period'),
      '#type' => 'select',
      '#options' => [
        'days' => $this->t('Days'),
        'month' => $this->t('Months'),
        'year' => $this->t('Year'),
      ],
      '#default_value' => $config->get('user_blocked_period'),
      '#attributes' => ['class' => ['purge-period']],
      '#suffix' => '</div>',
    ];

    $form['blocked_user']['enabled_blocked_users'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Enabled'),
      '#default_value' => $config->get('enabled_blocked_users'),
    ];

    $form['limit_content_authors'] = [
      '#type' => 'fieldset',
      '#title' => $this->t('Content author limitation'),
      '#collapsible' => FALSE,
      '#collapsed' => FALSE,
    ];

    $form['limit_content_authors']['enabled_do_not_purge_authors'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Do not purge users who are authors of existing content'),
      '#description' => $this->t('WARNING: Only applies to standard node entities. Custom entities are not covered.'),
      '#default_value' => $config->get('enabled_do_not_purge_authors'),
    ];

    $form['limit_content_authors']['enabled_do_not_purge_commenters'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Do not purge users with existing comments'),
      '#default_value' => $config->get('enabled_do_not_purge_commenters'),
    ];

    $form['limit_roles'] = [
      '#type' => 'fieldset',
      '#title' => $this->t('Role limitation'),
      '#collapsible' => FALSE,
      '#collapsed' => FALSE,
    ];

    $form['limit_roles']['purge_included_users_roles'] = [
      '#title' => $this->t('Select roles to include in the purge'),
      '#description' => $this->t('Any user with one of the selected roles will be included, unless that user has a role among the one selected in the exclude roles field.'),
      '#type' => 'checkboxes',
      '#required' => TRUE,
      '#options' => $roles_array,
      '#default_value' => $config->get('purge_included_users_roles'),
    ];

    $form['limit_roles']['purge_excluded_users_roles'] = [
      '#title' => $this->t('Select roles to exclude from the purge'),
      '#description' => $this->t('Any user with one of the selected role will be excluded.'),
      '#type' => 'checkboxes',
      '#required' => TRUE,
      '#options' => $exclude_role_array,
      '#default_value' => $config->get('purge_excluded_users_roles'),
    ];

    $user_cancel_methods = user_cancel_methods();
    // Add the possibility to choose the site policy.
    $user_cancel_methods['#options']['user_cancel_site_policy'] = $this->t("Follow site's policy");

    $form['purge_user_cancel_method'] = [
      '#type' => 'radios',
      '#required' => TRUE,
      '#title' => $this->t('When cancelling a user account'),
      '#default_value' => $config->get('purge_user_cancel_method'),
      '#options' => $user_cancel_methods['#options'],
    ];

    $form['disregard_blocked_users'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Disregard inactive/blocked users'),
      '#default_value' => $config->get('disregard_blocked_users'),
      '#description' => $this->t('Do not look at inactive and blocked users. If you use a cancellation method that blocks users, this should normally be enabled, or blocked users will be included in the processing and make it unnecessarily heavy.'),
    ];

    $form['purge_on_cron'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Purge on cron'),
      '#default_value' => $config->get('purge_on_cron'),
    ];

    $form['user_notification'] = [
      '#type' => 'details',
      '#title' => $this->t('User Deletion Notification'),
      '#open' => FALSE,
    ];

    $form['user_notification']['inactive_user_notify_subject'] = [
      '#type' => 'textarea',
      '#title' => $this->t('Subject of user notification email'),
      '#default_value' => $config->get('inactive_user_notify_subject'),
      '#cols' => 1,
      '#rows' => 1,
      '#description' => $this->t('Customize the subject of the notification email sent to the user.'),
      '#required' => TRUE,
    ];

    $form['user_notification']['inactive_user_notify_text'] = [
      '#type' => 'textarea',
      '#title' => $this->t('Body of user notification email'),
      '#default_value' => $config->get('inactive_user_notify_text'),
      '#cols' => 70,
      '#rows' => 10,
      '#description' => $this->t('Customize the body of the notification email sent to the user.'),
      '#required' => TRUE,
    ];

    if ($this->moduleHandler->moduleExists('token')) {
      $form['user_notification']['token_help'] = [
        '#theme' => 'token_tree_link',
        '#token_types' => ['user'],
        '#show_restricted' => TRUE,
        '#show_nested' => FALSE,
      ];
    }

    $form['user_notification']['send_email_notification'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Enable'),
      '#description' => $this->t('Check to send email notification to purged users.'),
      '#default_value' => $config->get('send_email_notification'),
    ];

    $form['user_before_deletion'] = [
      '#type' => 'details',
      '#title' => $this->t('Notification User Before Deletion'),
      '#open' => FALSE,
    ];
    $form['user_before_deletion']['user_before_deletion_subject'] = [
      '#type' => 'textarea',
      '#title' => $this->t('Subject of user before deletion notification email'),
      '#default_value' => $config->get('user_before_deletion_subject'),
      '#cols' => 1,
      '#rows' => 1,
      '#description' => $this->t('Customize the subject of the notification email sent to the user.'),
      '#required' => TRUE,
    ];
    $form['user_before_deletion']['user_before_deletion_text'] = [
      '#type' => 'textarea',
      '#title' => $this->t('Body of user before deletion notification email'),
      '#default_value' => $config->get('user_before_deletion_text'),
      '#cols' => 70,
      '#rows' => 10,
      '#description' => $this->t('Customize the body of the notification email sent to the user.'),
      '#required' => TRUE,
    ];

    $form['user_before_deletion']['user_before_notification_value'] = [
      '#type' => 'textfield',
      '#title' => $this->t('Value'),
      '#default_value' => $config->get('user_before_notification_value'),
      '#prefix' => '<div class="purge-interval-selector clearfix">',
      '#attributes' => ['class' => ['purge-value']],
    ];
    $form['user_before_deletion']['user_before_notification_period'] = [
      '#title' => $this->t('Period'),
      '#type' => 'select',
      '#options' => [
        'days' => $this->t('Days'),
        'month' => $this->t('Months'),
        'year' => $this->t('Year'),
      ],
      '#default_value' => $config->get('user_before_notification_period'),
      '#attributes' => ['class' => ['purge-period']],
      '#suffix' => '</div>',
    ];

    $form['user_before_deletion']['send_email_user_before_notification'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Enable'),
      '#description' => $this->t('Check to send email notification before purging users.'),
      '#default_value' => $config->get('send_email_user_before_notification'),
    ];

    $form['actions']['purge_users_now'] = [
      '#type' => 'submit',
      '#value' => $this->t('Purge users now'),
      '#attributes' => [
        'class' => [
          'purge-now',
          'button button--primary',
        ],
      ],
      '#submit' => ['::purgeUsersNowSubmit'],
    ];
    // Attach library.
    $form['#attached']['library'][] = 'purge_users/styling';

    return parent::buildForm($form, $form_state);
  }

  /**
   * {@inheritdoc}
   */
  public function getEditableConfigNames() {
    return ['purge_users.settings'];
  }

  /**
   * {@inheritdoc}
   */
  public function validateForm(array &$form, FormStateInterface $form_state) {
    $login_never_value = $form_state->getValue(['user_never_lastlogin_value']);
    $login_never_period = $form_state->getValue(['user_never_lastlogin_period']);
    $login_value = $form_state->getValue(['user_lastlogin_value']);
    $login_period = $form_state->getValue(['user_lastlogin_period']);
    $inactive_value = $form_state->getValue(['user_inactive_value']);
    $inactive_period = $form_state->getValue(['user_inactive_period']);
    $block_value = $form_state->getValue(['user_blocked_value']);
    $block_period = $form_state->getValue(['user_blocked_period']);
    $user_before_notification_period = $form_state->getValue(['user_before_notification_period']);
    $user_before_notification_value = $form_state->getValue(['user_before_notification_value']);
    $enable_blocked = $form_state->getValue(['enabled_blocked_users']);
    $enable_loggedin = $form_state->getValue(['enabled_loggedin_users']);
    $enable_never_loggedin = $form_state->getValue(['enabled_never_loggedin_users']);
    $enable_inactive = $form_state->getValue(['enabled_inactive_users']);
    $disregard_blocked = $form_state->getValue(['disregard_blocked_users']);

    // Validate to set purge period more than 10 days.
    if ($login_never_period == 'days' && !empty($login_never_value) && $login_never_value < 1 || $login_period == 'days' && !empty($login_value) && $login_value < 1 || $inactive_period == 'days' && !empty($inactive_value) && $inactive_value < 1 || $block_period == 'days' && !empty($block_value) && $block_value < 1 || $user_before_notification_period == 'days' && !empty($user_before_notification_value) && $user_before_notification_value < 1) {
      $form_state->setErrorByName('Period limit', $this->t('Purge period should be more than 10 days.'));
    }
    // Make sure one of the fieldset is checked.
    if (!$enable_loggedin && !$enable_inactive && !$enable_blocked && !$enable_never_loggedin) {
      $form_state->setErrorByName('Enable fieldset', $this->t('Please enable one of the Conditions:  Never logged in users, Not logged in users, Inactive users or Blocked users.'));
    }
    // Check if we don't both enable blocked users and disregard them.
    if ($enable_blocked && $disregard_blocked) {
      $form_state->setErrorByName('disregard_blocked_users', $this->t('You can not both purge blocked users and disregard them.'));
    }
    // Check if the don't both check for inactive users and disregard them.
    if ($enable_inactive && $disregard_blocked) {
      $form_state->setErrorByName('disregard_blocked_users', $this->t('You can not both purge inactive users and disregard them.'));
    }
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    parent::submitForm($form, $form_state);
    $this->setConfigFromForm($form_state);
    if ($form_state->getValue('purge_on_cron') == 1) {
      $this->messenger()
        ->addMessage($this->t('Purge users operation is scheduled for next cron.'));
    }
    if ($form_state->getValue('send_email_user_before_notification') == 1) {
      $this->messenger()->addMessage($this->t('Notification before purging users is enabled.'));
    }
  }

  /**
   * Submit handler for mass-account cancellation form.
   *
   * @see purge_users_config_form()
   */
  public function purgeUsersNowSubmit($form, FormStateInterface $form_state) {
    // Save form submissions.
    $this->setConfigFromForm($form_state);
    // If there is any user to purge.
    $ids_to_purge = purge_users_get_user_ids();
    $ids_to_notify = purge_users_get_user_ids('notification_users');
    if (!$ids_to_purge && !$ids_to_notify) {
      $this->messenger()->addMessage($this->t(
        'No user account found in the system to purge or notify.'));
      return;
    }

    $form_state->setRedirect('purge_users.confirm');
  }

  /**
   * Apply the form values to the config.
   *
   * @param \Drupal\Core\Form\FormStateInterface $form_state
   *   The form to get the settings from.
   */
  protected function setConfigFromForm(FormStateInterface $form_state) {
    $config = $this->config('purge_users.settings');
    $config->set('user_never_lastlogin_value', $form_state->getValue('user_never_lastlogin_value'))
      ->set('user_never_lastlogin_period', $form_state->getValue('user_never_lastlogin_period'))
      ->set('user_lastlogin_value', $form_state->getValue('user_lastlogin_value'))
      ->set('user_lastlogin_period', $form_state->getValue('user_lastlogin_period'))
      ->set('user_inactive_value', $form_state->getValue('user_inactive_value'))
      ->set('user_inactive_period', $form_state->getValue('user_inactive_period'))
      ->set('user_blocked_value', $form_state->getValue('user_blocked_value'))
      ->set('user_blocked_period', $form_state->getValue('user_blocked_period'))
      ->set('enabled_never_loggedin_users', $form_state->getValue('enabled_never_loggedin_users'))
      ->set('enabled_loggedin_users', $form_state->getValue('enabled_loggedin_users'))
      ->set('enabled_inactive_users', $form_state->getValue('enabled_inactive_users'))
      ->set('enabled_blocked_users', $form_state->getValue('enabled_blocked_users'))
      ->set('purge_included_users_roles', $form_state->getValue('purge_included_users_roles'))
      ->set('purge_excluded_users_roles', $form_state->getValue('purge_excluded_users_roles'))
      ->set('enabled_do_not_purge_commenters', $form_state->getValue('enabled_do_not_purge_commenters'))
      ->set('enabled_do_not_purge_authors', $form_state->getValue('enabled_do_not_purge_authors'))
      ->set('purge_on_cron', $form_state->getValue('purge_on_cron'))
      ->set('inactive_user_notify_subject', $form_state->getValue('inactive_user_notify_subject'))
      ->set('inactive_user_notify_text', $form_state->getValue('inactive_user_notify_text'))
      ->set('send_email_notification', $form_state->getValue('send_email_notification'))
      ->set('purge_user_cancel_method', $form_state->getValue('purge_user_cancel_method'))
      ->set('disregard_blocked_users', $form_state->getValue('disregard_blocked_users'))
      ->set('user_before_deletion_subject', $form_state->getValue('user_before_deletion_subject'))
      ->set('user_before_deletion_text', $form_state->getValue('user_before_deletion_text'))
      ->set('send_email_user_before_notification', $form_state->getValue('send_email_user_before_notification'))
      ->set('user_before_notification_value', $form_state->getValue('user_before_notification_value'))
      ->set('user_before_notification_period', $form_state->getValue('user_before_notification_period'))
      ->save();
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc