ajax_wrapper-1.0.1/src/Element/AjaxWrapperElement.php

src/Element/AjaxWrapperElement.php
<?php

namespace Drupal\ajax_wrapper\Element;

use Drupal\Component\Utility\Html;
use Drupal\Core\Render\Element\RenderElementBase;
use Drupal\Core\Url;

/**
 * Provides a render element for adding Ajax to a render element.
 *
 * Holds an array whose values control the Ajax behavior of the element.
 *
 * @ingroup ajax
 *
 * @RenderElement("ajax_wrapper")
 */
class AjaxWrapperElement extends RenderElementBase {

  /**
   * {@inheritdoc}
   */
  public function getInfo() {
    return [
      '#pre_render' => [
        static::class . '::preRenderAjaxWrapper',
      ],
      '#type' => 'ajax_wrapper',
      '#id' => 'ajax-wrapper',
      '#theme' => 'ajax_wrapper',
      '#ajax_wrapper_classes' => [
        'ajax-wrapper-classes',
      ],
      '#ajax_wrapper_attributes' => [],
      '#ajax_callback' => [],
      '#attached' => [
        'library' => 'ajax_wrapper/ajax_wrapper',
      ],
    ];
  }

  /**
   * Pre render the ajax wrapper functionality.
   *
   * @param array $element
   *   The ajax wrapper element.
   *
   * @return array
   *   Array containing the ajax wrapper.
   */
  public static function preRenderAjaxWrapper(array $element) {
    if (empty($element['#ajax_callback'])) {
      throw new \Exception('You must specify an ajax callback');
    }

    // First, just render the callback as we would normally.
    $callback = reset($element['#ajax_callback']);
    $callbackFunction = $callback[0] ?? NULL;
    $callbackArguments = $callback[1] ?? [];

    if (empty($element['#ajax_wrapper_content'])) {
      /** @var \Drupal\ajax_wrapper\Utility\AjaxWrapperCallbackUtility */
      $callbackUtility = \Drupal::service('ajax_wrapper.utility.callback');

      $result = $callbackUtility->doCallback(
        $callbackFunction, $callbackArguments, 'callback'
      );

      $element['#ajax_wrapper_content'] = $result;
    }

    if (empty($element['#ajax_url'])) {
      $element['#ajax_url'] = Url::fromRoute(
        'ajax_wrapper.refresh'
      )->toString();
    }

    // Attach the attributes.
    $element['#ajax_wrapper_attributes']['id'] = $element['#id'];

    // Attached the javascript Drupal settings.
    $element['#attached']['drupalSettings']['ajax_wrapper_settings'][] = [
      'wrapper_id' => $element['#id'] ?? Html::getUniqueId('ajax_wrapper'),
      'wrapper_classes' => $element['#ajax_wrapper_classes'] ?? [],
      'method' => $element['#ajax_method'] ?? 'html',
      'ajax_url' => $element['#ajax_url'],
      'callback' => [
        'function' => $callbackFunction,
        'arguments' => $callbackArguments,
      ],
    ];

    return $element;
  }

}

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

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