address_suggestion-1.0.3/src/Controller/AddressSuggestion.php

src/Controller/AddressSuggestion.php
<?php

namespace Drupal\address_suggestion\Controller;

use Drupal\address_suggestion\AddressProviderManager;
use Drupal\Component\Utility\Xss;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Session\AccountProxyInterface;
use Drupal\Core\State\StateInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;

/**
 * Defines a route controller for watches autocomplete form elements.
 */
class AddressSuggestion extends ControllerBase {

  /**
   * {@inheritDoc}
   */
  protected $providerManager;

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

  /**
   * The state service.
   *
   * @var \Drupal\Core\State\StateInterface
   */
  protected $state;

  /**
   * The state service.
   *
   * @var \Drupal\Core\Session\AccountProxyInterface
   */
  protected $account;

  /**
   * {@inheritDoc}
   */
  public function __construct(AddressProviderManager $provider_manager, EntityTypeManagerInterface $entity_type_manager, StateInterface $state = NULL, AccountProxyInterface $account) {
    $this->providerManager = $provider_manager;
    $this->entityTypeManager = $entity_type_manager;
    $this->state = $state;
    $this->account = $account;
  }

  /**
   * {@inheritDoc}
   */
  public static function create(ContainerInterface $container) {
    return new self(
      $container->get('plugin.manager.address_provider'),
      $container->get('entity_type.manager'),
      $container->get('state'),
      $container->get('current_user'),
    );
  }

  /**
   * Handler for the autocomplete request.
   */
  public function handleAutocomplete(Request $request, $entity_type, $bundle, $field_name) {
    $results = [];
    $input = Xss::filter($request->query->get('q'));

    if (empty($input)) {
      return new JsonResponse($results);
    }
    $form_mode = 'default';
    $form_display = $this->entityTypeManager->getStorage('entity_form_display')
      ->load($entity_type . '.' . $bundle . '.' . $form_mode)
      ->getComponent($field_name);
    $settings = $form_display['settings'] ?? [];
    if (empty($settings["hide"])) {
      $country = $this->state->get(
        $stateField = implode('|', [$entity_type, $bundle, $field_name])
      );
    }
    if (!empty($country)) {
      $settings['country'] = $country;
      $settings['countryName'] = $this->state->get($stateField . '|Country');
    }
    $results = $this->getProviderResults($input, $settings);
    return new JsonResponse($results);
  }

  /**
   * Get Provider Results.
   *
   * {@inheritDoc}
   */
  public function getProviderResults($string, $settings = []) {
    $plugin_id = $settings['provider'];
    $plugin = $this->providerManager->createInstance($plugin_id);
    $addressProvider = $this->providerManager->getDefinitions()[$plugin_id];
    if (!empty($addressProvider["api"])) {
      $settings['api'] = $addressProvider["api"];
    }
    return $plugin->processQuery($string, $settings);
  }

  /**
   * Get ckeditor configuration for provider.
   *
   * {@inheritDoc}
   */
  public function ckeditor(Request $request, $format = 'basic_html') {
    $results = ['error' => 'Permission required'];
    $permission = $this->account->hasPermission('use text format ' . $format);
    $token = $request->query->get('token');
    if (!empty($token)) {
      $token = Xss::filter($token);
    }
    $editor = $this->entityTypeManager->getStorage('editor')->load($format);
    $editorPlugins = $editor->getSettings()['plugins'];
    $editorToken = $editorPlugins['address_suggestion_plugin']['token'] ?? '';
    if ($editorToken != $token) {
      $permission = FALSE;
    }
    if (!$permission) {
      return new JsonResponse([
        'data' => $results,
        'method' => 'GET',
        'status' => 403,
      ]);
    }
    $input = Xss::filter($request->query->get('q'));
    $ckeditor = editor_load($format);
    $ckeditor_settings = $ckeditor->getSettings();
    if (!empty($ckeditor_settings['plugins']) && $ckeditor_settings['plugins']['address_suggestion_plugin']) {
      $settings = $ckeditor_settings['plugins']['address_suggestion_plugin'];
      $results = $this->getProviderResults($input, $settings);
    }
    return new JsonResponse($results);
  }

}

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

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