cloudinary-8.x-1.x-dev/modules/cloudinary_sdk/src/Form/CloudinarySdkSettingsForm.php

modules/cloudinary_sdk/src/Form/CloudinarySdkSettingsForm.php
<?php

namespace Drupal\cloudinary_sdk\Form;

use Cloudinary\Api\Admin\AdminApi;
use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\cloudinary_sdk\CloudinarySdkConstantsInterface;
use Drupal\Core\Link;
use Drupal\Core\Url;

/**
 * Define a config form for Cloudinary SDK.
 */
class CloudinarySdkSettingsForm extends ConfigFormBase {

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

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

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $config = $this->config('cloudinary_sdk.settings');
    // Make sure Cloudinary SDK installed.
    // If not, display messages and disable API settings.
    [$status, $version, $error_message] = cloudinary_sdk_check(TRUE);

    if ($status == CloudinarySdkConstantsInterface::CLOUDINARY_SDK_NOT_LOADED) {
      $this->messenger()
        ->addError($this->t('Please make sure the Cloudinary SDK library is installed in the libraries directory.'));
      if ($error_message) {
        $this->messenger()->addError($error_message);
      }
      return $form;
    }
    elseif ($status == CloudinarySdkConstantsInterface::CLOUDINARY_SDK_OLD_VERSION) {
      $this->messenger()
        ->addWarning($this->t('Please make sure the Cloudinary SDK library installed is @version or greater. Current version is @current_version.', [
          '@version' => CloudinarySdkConstantsInterface::CLOUDINARY_SDK_MINIMUM_VERSION,
          '@current_version' => $version,
        ]));
      return $form;
    }

    // Build API settings form.
    $form['settings'] = [
      '#type' => 'fieldset',
      '#title' => $this->t('API Settings'),
      '#collapsible' => TRUE,
      '#collapsed' => TRUE,
      '#description' => $this->t('You should enable "Auto-create folders" on cloudinary account. In order to check the validity of the API, system will be auto ping your Cloudinary account after change API settings.'),
    ];

    $form['settings']['cloudinary_sdk_cloud_name'] = [
      '#type' => 'textfield',
      '#title' => $this->t('Cloud name'),
      '#required' => TRUE,
      '#default_value' => $config->get('cloudinary_sdk_cloud_name'),
      '#description' => $this->t('Cloud name of Cloudinary.'),
    ];

    $form['settings']['cloudinary_sdk_upload_prefix'] = [
      '#type' => 'textfield',
      '#title' => $this->t('API endpoint'),
      '#required' => TRUE,
      '#default_value' => $config->get('cloudinary_sdk_upload_prefix'),
      '#description' => $this->t('API endpoint of Cloudinary. Get more details by checking official @documentation.', [
        '@documentation' => Link::fromTextAndUrl(
          $this->t('documentation'),
          Url::fromUri('https://cloudinary.com/documentation/image_upload_api_reference#alternative_data_centers_and_endpoints_premium_feature')
            ->setOption('attributes', ['target' => '_blank'])
        )->toString(),
      ]),
    ];

    $form['settings']['cloudinary_sdk_api_key'] = [
      '#type' => 'textfield',
      '#title' => $this->t('API key'),
      '#required' => TRUE,
      '#default_value' => $config->get('cloudinary_sdk_api_key'),
      '#description' => $this->t('API key of Cloudinary.'),
    ];

    $form['settings']['cloudinary_sdk_api_secret'] = [
      '#type' => 'password',
      '#title' => $this->t('API secret'),
      '#required' => !$config->get('cloudinary_sdk_api_secret'),
      '#description' => $this->t('API secret of Cloudinary.'),
    ];

    if ($config->get('cloudinary_sdk_api_secret')) {
      $form['settings']['cloudinary_sdk_api_secret']['#description'] = $this->t('Required if you want to change the API secret.');
    }

    $form['settings']['cloudinary_sdk_cname'] = [
      '#type' => 'textfield',
      '#title' => $this->t('CNAME'),
      '#default_value' => $config->get('cloudinary_sdk_cname'),
      '#description' => $this->t('Change the default delivery URL. Provide host name without schema e.g. <strong>demo.cloudinary.be</strong><br>Get more details by checking official @documentation.', [
        '@documentation' => Link::fromTextAndUrl(
          $this->t('documentation'),
          Url::fromUri('https://cloudinary.com/documentation/advanced_url_delivery_options#private_cdns_and_cnames')
            ->setOption('attributes', ['target' => '_blank'])
        )->toString(),
      ]),
    ];

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

  /**
   * {@inheritdoc}
   */
  public function validateForm(array &$form, FormStateInterface $form_state) {
    $config = $this->config('cloudinary_sdk.settings');
    $cloud_name = trim($form_state->getValue('cloudinary_sdk_cloud_name'));
    $api_key = trim($form_state->getValue('cloudinary_sdk_api_key'));
    $api_secret = trim($form_state->getValue('cloudinary_sdk_api_secret'));
    $upload_prefix = trim($form_state->getValue('cloudinary_sdk_upload_prefix'));
    $cname = trim($form_state->getValue('cloudinary_sdk_cname'));

    if (!$api_secret) {
      $api_secret = $config->get('cloudinary_sdk_api_secret') ?? '';
    }

    // Validate the API settings with ping.
    if ($cloud_name && $api_key && $api_secret && $upload_prefix) {
      $key = $cloud_name . $api_key . $api_secret . $upload_prefix . $cname;
      $old_key = $config->get('cloudinary_sdk_cloud_name');
      $old_key .= $config->get('cloudinary_sdk_api_key');
      $old_key .= $config->get('cloudinary_sdk_api_secret');
      $old_key .= $config->get('cloudinary_sdk_upload_prefix');
      $old_key .= $config->get('cloudinary_sdk_cname') ?? '';

      // Return if no changes.
      if ($key == $old_key) {
        return;
      }

      $config = [
        'cloud' => [
          'cloud_name' => $cloud_name,
          'api_key' => $api_key,
          'api_secret' => $api_secret,
        ],
        'url' => array_filter([
          'secure_distribution' => $cname,
          'private_cdn' => !empty($cname),
        ]),
        'api' => [
          'upload_prefix' => $upload_prefix,
        ],
      ];

      // Init cloudinary sdk with new API settings.
      cloudinary_sdk_init($config);

      try {
        (new AdminApi())->ping();
      }
      catch (\Exception $e) {
        $this->logger('cloudinary_sdk')->error($e->getMessage());
        $form_state->setErrorByName('', $e->getMessage());
      }
    }
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    $config = $this->config('cloudinary_sdk.settings');

    $fields = [
      'cloudinary_sdk_cloud_name',
      'cloudinary_sdk_upload_prefix',
      'cloudinary_sdk_api_key',
      'cloudinary_sdk_cname',
    ];

    foreach ($fields as $field) {
      $config->set($field, $form_state->getValue($field));
    }

    $secret = $form_state->getValue('cloudinary_sdk_api_secret');

    if (!$secret) {
      $secret = $config->get('cloudinary_sdk_api_secret');
    }

    $config->set('cloudinary_sdk_api_secret', $secret);
    $config->save();

    parent::submitForm($form, $form_state);
  }

}

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

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