sitewide_alerts-1.0.0/src/Form/TwitterSettingsForm.php

src/Form/TwitterSettingsForm.php
<?php

namespace Drupal\sitewide_alerts\Form;

use Drupal\Core\Cache\Cache;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\Cache\CacheFactoryInterface;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Entity\EntityDisplayRepository;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Language\LanguageManagerInterface;
use Drupal\Core\State\StateInterface;
use Drupal\Core\Url;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Twitter Settings Form.
 *
 * @package Drupal\sitewide_alerts\Form
 */
class TwitterSettingsForm extends ConfigFormBase {

  /**
   * The cache backend.
   */
  protected CacheBackendInterface $cache;

  /**
   * The state.
   */
  protected StateInterface $state;

  /**
   * The entity type manager.
   */
  protected EntityTypeManagerInterface $entityTypeManager;

  /**
   * The current language id.
   */
  protected string $language;

  /**
   * The language manager.
   */
  protected LanguageManagerInterface $languageManager;

  /**
   * The entity display repository.
   */
  protected EntityDisplayRepository $entityDisplayRepository;

  /**
   * The constructor.
   *
   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
   *   The config factory.
   * @param \Drupal\Core\Cache\CacheFactoryInterface $cache_factory
   *   The cache factory.
   * @param \Drupal\Core\State\StateInterface $state
   *   The state.
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
   *   The entity type manager.
   * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
   *   The language manager.
   * @param \Drupal\Core\Entity\EntityDisplayRepository $entity_display_repository
   *   The entity display repository.
   */
  public function __construct(
    ConfigFactoryInterface $config_factory,
    CacheFactoryInterface $cache_factory,
    StateInterface $state,
    EntityTypeManagerInterface $entity_type_manager,
    LanguageManagerInterface $language_manager,
    EntityDisplayRepository $entity_display_repository
  ) {
    parent::__construct($config_factory);
    $this->cache = $cache_factory->get('render');
    $this->state = $state;
    $this->entityTypeManager = $entity_type_manager;
    $this->language = $language_manager->getCurrentLanguage()->getId();
    $this->languageManager = $language_manager;
    $this->entityDisplayRepository = $entity_display_repository;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('config.factory'),
      $container->get('cache_factory'),
      $container->get('state'),
      $container->get('entity_type.manager'),
      $container->get('language_manager'),
      $container->get('entity_display.repository')
    );
  }

  /**
   * {@inheritdoc}
   */
  public function getFormId(): string {
    return 'twitter_settings_form';
  }

  /**
   * {@inheritdoc}
   */
  protected function getEditableConfigNames(): array {
    return ['sitewide_alerts.settings'];
  }

  /**
   * Get state configuration.
   *
   * @return array
   *   Returns an array of state configuration.
   */
  private function getStateConfig(): array {
    $state_keys = [
      'twitter_key_name.' . $this->language,
      'twitter_access_token.' . $this->language,
      'twitter_secret_token.' . $this->language,
    ];
    return $this->state->getMultiple($state_keys);
  }

  /**
   * Set state configuration data.
   *
   * @param array $data
   *   The array of state config.
   */
  private function setStateConfig(array $data): void {
    $this->state->setMultiple($data);
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $state_config = $this->getStateConfig();

    $form['twitter'] = [
      '#type' => 'details',
      '#open' => TRUE,
      '#title' => $this->t('Twitter Settings <em>(@language)</em>', [
        '@language' => $this->languageManager->getCurrentLanguage()
          ->getName(),
      ]),
      '#description' => $this->t('Must be configured per language. If using multiple languages, multiple credentials keys will/may be required.'),
    ];

    $key_collection_url = Url::fromRoute('entity.key.collection')->toString();
    $form['twitter']['keys'] = [
      '#type' => 'fieldset',
      '#title' => $this->t('Keys'),
      '#description' => $this->t('Use keys managed by the key module. <a href=":keys">Manage keys</a>', [
        ':keys' => $key_collection_url,
      ]),
      '#tree' => FALSE,
    ];

    $form['twitter']['keys']['twitter_key_name'] = [
      '#type' => 'key_select',
      '#title' => $this->t('Twitter app credentials key'),
      '#description' => $this->t('Select key to be used for Twitter app credentials.<br>Credentials can be found on the <a href="https://developer.twitter.com/en/portal/dashboard" target="_blank">Twitter developer dashboard</a>.'),
      '#empty_option' => $this->t('- Select Key -'),
      '#default_value' => !empty($state_config['twitter_key_name.' . $this->language]) ? $state_config['twitter_key_name.' . $this->language] : '',
    ];

    $auth_config_url = Url::fromRoute('sitewide_alerts.twitter_authorize_form')
      ->toString();
    $form['twitter']['auth'] = [
      '#type' => 'fieldset',
      '#title' => $this->t('Authorization'),
      '#description' => $this->t('Manage account authorization tokens associated with app. <a href=":auth">Manage authorization</a>.', [':auth' => $auth_config_url]),
      '#tree' => FALSE,
    ];

    $twitter_oauth_access_token = !empty($state_config['twitter_access_token.' . $this->language]) ? $state_config['twitter_access_token.' . $this->language] : '';
    $twitter_oauth_secret_token = !empty($state_config['twitter_secret_token.' . $this->language]) ? $state_config['twitter_secret_token.' . $this->language] : '';
    if (!empty($twitter_oauth_access_token) && !empty($twitter_oauth_secret_token)) {
      $form['twitter']['auth']['twitter_access_token'] = [
        '#type' => 'textfield',
        '#title' => $this->t('Twitter user access token'),
        '#default_value' => $this->maskToken($twitter_oauth_access_token),
        '#disabled' => TRUE,
      ];
      $form['twitter']['auth']['twitter_secret_token'] = [
        '#type' => 'textfield',
        '#title' => $this->t('Twitter user secret token'),
        '#default_value' => $this->maskToken($twitter_oauth_secret_token),
        '#disabled' => TRUE,
      ];
    }

    $form['actions']['submit'] = [
      '#type' => 'submit',
      '#value' => $this->t('Save'),
      '#button_type' => 'primary',
    ];

    return $form;
  }

  /**
   * Mask token.
   *
   * @param string $token
   *   The token.
   *
   * @return string
   *   The masked token.
   */
  private function maskToken(string $token): string {
    return substr_replace($token, str_repeat('*', strlen($token) - 4), 0, -4);
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    parent::submitForm($form, $form_state);

    // Set state config.
    $this->setStateConfig([
      'twitter_key_name.' . $this->language => $form_state->getValue('twitter_key_name'),
    ]);

    // Invalidate cache tags.
    Cache::invalidateTags(['sitewide_alerts']);
  }

}

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

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