You are here

UserSettings.php in Notify 8

Same filename and directory in other branches
  1. 2.0.x src/Form/UserSettings.php
  2. 1.0.x src/Form/UserSettings.php

Namespace

Drupal\notify\Form

File

src/Form/UserSettings.php
View source
<?php

namespace Drupal\notify\Form;

use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Messenger\MessengerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;
use Drupal\Core\Form\FormStateInterface;
if (!defined('NOTIFY_NODE_TYPE')) {
  define('NOTIFY_NODE_TYPE', 'notify_node_type_');
}

/**
 * Defines a form that configures forms module settings.
 */
class UserSettings extends ConfigFormBase {

  /**
   * Drupal\Core\Messenger\MessengerInterface definition.
   *
   * @var \Drupal\Core\Messenger\MessengerInterface
   */
  protected $messenger;

  /**
   * Class constructor.
   *
   * @param ConfigFactoryInterface $config_factory
   *   The config factory.
   * @param MessengerInterface $messenger
   *   The core messenger service.
   */
  public function __construct(ConfigFactoryInterface $config_factory, MessengerInterface $messenger) {
    parent::__construct($config_factory);
    $this->messenger = $messenger;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static($container
      ->get('config.factory'), $container
      ->get('messenger'));
  }

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

  /**
   * {@inheritdoc}
   */
  protected function getEditableConfigNames() {
    return [
      'notify.settings',
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state, Request $request = NULL) {
    $config = $this
      ->config('notify.settings');
    $userprofile = \Drupal::routeMatch()
      ->getParameter('user');
    $account = \Drupal\user\Entity\User::load($userprofile);
    if (!is_object($account)) {
      return;
    }
    $result = \Drupal::database()
      ->select('users', 'u');
    $result
      ->leftjoin('users_field_data', 'v', 'u.uid = v.uid');
    $result
      ->leftjoin('notify', 'n', 'u.uid = n.uid');
    $result
      ->fields('u', [
      'uid',
    ]);
    $result
      ->fields('v', [
      'name',
      'mail',
    ]);
    $result
      ->fields('n', [
      'node',
      'teasers',
      'comment',
      'status',
    ]);
    $result
      ->condition('u.uid', $userprofile);
    $result->allowRowCount = TRUE;
    $notify = $result
      ->execute()
      ->fetchObject();

    // Internal error.
    if (!is_object($notify)) {
      $notify = NULL;
    }
    $form = [];
    if (!$notify->mail) {
      $url = '/user/' . $userprofile . '/edit';
      $this->messenger
        ->addMessage($this
        ->t('Your e-mail address must be specified on your <a href="@url">my account</a> page.', [
        '@url' => $url,
      ]), 'error');
    }
    $form['notify_page_master'] = [
      '#type' => 'fieldset',
      '#title' => $this
        ->t('Master switch'),
    ];

    // If user existed before notify was enabled, these are not set in db.
    if (!isset($notify->status)) {
      $notify->status = 0;
      $notify->node = 0;
      $notify->teasers = 0;
      $notify->comment = 0;
    }
    if (\Drupal::service('module_handler')
      ->moduleExists('advanced_help')) {
      $output = theme('advanced_help_topic', [
        'module' => 'notify',
        'topic' => 'users',
      ]);
    }
    else {
      $output = '';
    }
    $form['notify_page_master']['status'] = [
      '#type' => 'radios',
      '#title' => $this
        ->t('Notify status'),
      '#default_value' => $notify->status,
      '#options' => [
        $this
          ->t('Disabled'),
        $this
          ->t('Enabled'),
      ],
      '#description' => $output . '&nbsp;' . $this
        ->t('The master switch overrides all other settings for Notify.  You can use it to suspend notifications without having to disturb any of your settings under &#8220;Detailed settings&#8221; and &#8220;Subscriptions&#8221;.'),
    ];
    $form['notify_page_detailed'] = [
      '#type' => 'fieldset',
      '#title' => $this
        ->t('Detailed settings'),
      '#collapsible' => TRUE,
      '#collapsed' => FALSE,
      '#description' => $this
        ->t('These settings will only be effective if the master switch is set to &#8220;Enabled&#8221;.'),
    ];
    $form['notify_page_detailed']['node'] = [
      '#type' => 'radios',
      '#title' => $this
        ->t('Notify new content'),
      '#default_value' => $notify->node,
      '#options' => [
        $this
          ->t('Disabled'),
        $this
          ->t('Enabled'),
      ],
      '#description' => $this
        ->t('Include new posts in the notification mail.'),
    ];
    $form['notify_page_detailed']['comment'] = [
      '#type' => 'radios',
      '#access' => \Drupal::service('module_handler')
        ->moduleExists('comment'),
      '#title' => $this
        ->t('Notify new comments'),
      '#default_value' => $notify->comment,
      '#options' => [
        $this
          ->t('Disabled'),
        $this
          ->t('Enabled'),
      ],
      '#description' => $this
        ->t('Include new comments in the notification mail.'),
    ];
    $form['notify_page_detailed']['teasers'] = [
      '#type' => 'radios',
      '#title' => $this
        ->t('How much to include?'),
      '#default_value' => $notify->teasers,
      '#options' => [
        $this
          ->t('Title only'),
        $this
          ->t('Title + Teaser/Excerpt'),
        $this
          ->t('Title + Body'),
        $this
          ->t('Title + Body + Fields'),
      ],
      '#description' => $this
        ->t('Select the amount of each item to include in the notification e-mail.'),
    ];
    $set = 'notify_page_nodetype';
    $form[$set] = [
      '#type' => 'fieldset',
      '#title' => $this
        ->t('Subscriptions'),
      '#collapsible' => TRUE,
      '#collapsed' => TRUE,
      '#description' => $this
        ->t('Tick the content types you want to subscribe to.'),
    ];
    $alltypes = \Drupal\node\Entity\NodeType::loadMultiple();
    $enatypes = [];
    foreach (\Drupal\node\Entity\NodeType::loadMultiple() as $type => $object) {
      if ($config
        ->get(NOTIFY_NODE_TYPE . $type)) {
        $enatypes[] = [
          $type,
          $object
            ->label(),
        ];
      }
    }
    if (\Drupal::currentUser()
      ->hasPermission('administer notify queue') || empty($enatypes)) {
      $enatypes = [];
      foreach ($alltypes as $type => $obj) {
        $enatypes[] = [
          $type,
          $obj
            ->label(),
        ];
      }
    }

    //TODO: FIX '_notify_user_has_subscriptions' LATER ON
    $exists = _notify_user_has_subscriptions($userprofile);
    if ($exists) {

      // Custom subscriptions exists, use those.
      foreach ($enatypes as $type) {
        $field = \Drupal::database()
          ->select('notify_subscriptions', 'n')
          ->fields('n', [
          'uid',
          'type',
        ])
          ->condition('uid', $userprofile)
          ->condition('type', $type[0])
          ->execute()
          ->fetchObject();
        $default = $field ? TRUE : FALSE;
        $form[$set][NOTIFY_NODE_TYPE . $type[0]] = [
          '#type' => 'checkbox',
          '#title' => $type[1],
          '#return_value' => 1,
          '#default_value' => $default,
        ];
      }
    }
    else {

      // No custom subscriptions, so inherit default.
      foreach ($enatypes as $type) {
        $form[$set][NOTIFY_NODE_TYPE . $type[0]] = [
          '#type' => 'checkbox',
          '#title' => $type[1],
          '#return_value' => 1,
          '#default_value' => TRUE,
        ];
      }
    }
    $form['uid'] = [
      '#type' => 'value',
      '#value' => $userprofile,
    ];
    return parent::buildForm($form, $form_state);
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    $values = $form_state
      ->getValues();
    $uid = $values['uid'];
    \Drupal::database()
      ->delete('notify')
      ->condition('uid', $uid)
      ->execute();
    $id = \Drupal::database()
      ->insert('notify')
      ->fields([
      'uid' => $uid,
      'status' => $values['status'],
      'node' => $values['node'],
      'teasers' => $values['teasers'],
      'comment' => $values['comment'],
    ])
      ->execute();
    $subscriptions = [];

    // Remember that this is a custom subscriber.
    $subscriber = _notify_user_has_subscriptions($uid);
    if (!$subscriber) {
      \Drupal::database()
        ->insert('notify_subscriptions')
        ->fields([
        'uid' => $uid,
        'type' => 'magic custom subscription',
      ])
        ->execute();
    }
    foreach ($values as $key => $value) {
      if (preg_match("/^" . NOTIFY_NODE_TYPE . "/", $key)) {
        $key = substr($key, 17);
        $id = \Drupal::database()
          ->select('notify_subscriptions', 'n')
          ->fields('n', [
          'id',
          'uid',
          'type',
        ])
          ->condition('uid', $uid)
          ->condition('type', $key)
          ->execute()
          ->fetchObject();
        if ($id) {
          $id = $id->id;
          if (!$value) {
            \Drupal::database()
              ->delete('notify_subscriptions')
              ->condition('id', $id)
              ->execute();
          }
        }
        else {
          if ($value) {
            \Drupal::database()
              ->insert('notify_subscriptions')
              ->fields([
              'uid' => $uid,
              'type' => $key,
            ])
              ->execute();
          }
        }
      }
    }
    $this->messenger
      ->addMessage($this
      ->t('Notify settings saved.'));
  }

}

Classes

Namesort descending Description
UserSettings Defines a form that configures forms module settings.