visualn-8.x-1.x-dev/src/Plugin/VisualN/ResourceProvider/GeneratedResourceProvider.php

src/Plugin/VisualN/ResourceProvider/GeneratedResourceProvider.php
<?php

// @todo: rename class to GeneratedDataResourceProvider

namespace Drupal\visualn\Plugin\VisualN\ResourceProvider;

use Drupal\visualn\Core\ResourceProviderBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Component\Utility\NestedArray;
use Symfony\Component\HttpFoundation\Request;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\visualn\Manager\DataGeneratorManager;
use Drupal\visualn\Helpers\VisualNFormsHelper;
use Drupal\Core\Url;
use Drupal\visualn\Helpers\VisualN;

/**
 * Provides a 'VisualN Generated Resource Provider' VisualN resource provider.
 *
 * @VisualNResourceProvider(
 *  id = "visualn_generated_data",
 *  label = @Translation("Generated data"),
 * )
 */
class GeneratedResourceProvider extends ResourceProviderBase implements ContainerFactoryPluginInterface {

  const RAW_RESOURCE_FORMAT = 'visualn_generic_data_array';

  /**
   * Drupal\visualn\Manager\DataGeneratorManager definition.
   *
   * @var \Drupal\visualn\Manager\DataGeneratorManager
   */
  protected $visualNDataGeneratorManager;

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static(
      $configuration,
      $plugin_id,
      $plugin_definition,
      $container->get('plugin.manager.visualn.data_generator')
    );
  }

  /**
   * {@inheritdoc}
   */
  public function __construct(array $configuration, $plugin_id, $plugin_definition, DataGeneratorManager $plugin_manager_visualn_data_generator) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);

    $this->visualNDataGeneratorManager = $plugin_manager_visualn_data_generator;
  }

  /**
   * {@inheritdoc}
   */
  public function defaultConfiguration() {
    return [
      'data_generator_id' => '',
      'data_generator_config' => [],
    ] + parent::defaultConfiguration();
  }

  public function getResource() {
    if ($this->configuration['data_generator_id']) {
      $data_generator_id = $this->configuration['data_generator_id'];
      $data_generator_config = $this->configuration['data_generator_config'];
      $generator_plugin = $this->visualNDataGeneratorManager->createInstance($data_generator_id, $data_generator_config);
      $resource = $generator_plugin->generateResource();
    }
    else {
      // @todo: or return NULL or FASLE if data generator not defined
      //   or an "empty" resource
      $data = [];
      $raw_resource_plugin_id = static::RAW_RESOURCE_FORMAT;
      $raw_input = [
        'data' => $data,
      ];
      $resource = \Drupal::service('plugin.manager.visualn.raw_resource_format')
        ->createInstance($raw_resource_plugin_id, [])
        ->buildResource($raw_input);
    }


    return $resource;
  }



  /**
   * {@inheritdoc}
   */
  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
    $definitions = $this->visualNDataGeneratorManager->getDefinitions();
    $data_generators = [];
    foreach ($definitions as $definition) {
      $data_generators[$definition['id']] = $definition['label'];
    }

    $ajax_wrapper_id = implode('-', array_merge($form['#array_parents'], ['data_generator_id'])) .'-ajax-wrapper';

    $form['data_generator_id'] = [
      '#type' => 'select',
      '#title' => t('Data Generator'),
      '#options' => $data_generators,
      '#default_value' => $this->configuration['data_generator_id'],
      '#required' => TRUE,
      '#empty_option' => t('- Select Data Generator -'),
      '#empty_value' => '',
      '#ajax' => [
        'callback' => [get_called_class(), 'ajaxCallbackDataGenerator'],
        'wrapper' => $ajax_wrapper_id,
      ],
    ];
    $form['generator_container'] = [
      '#prefix' => '<div id="' . $ajax_wrapper_id . '">',
      '#suffix' => '</div>',
      '#type' => 'container',
      '#process' => [[$this, 'processGeneratorContainerSubform']],
    ];
    $form['generator_container']['#stored_configuration'] = [
      'data_generator_id' => $this->configuration['data_generator_id'],
      'data_generator_config' => $this->configuration['data_generator_config'],
    ];

    return $form;
  }

  /**
   * Return data generator configuration form via ajax request at style change.
   * Should have a different name since ajaxCallback can be used by base class.
   */
  public static function ajaxCallbackDataGenerator(array $form, FormStateInterface $form_state, Request $request) {
    $triggering_element = $form_state->getTriggeringElement();
    $visualn_style_id = $form_state->getValue($form_state->getTriggeringElement()['#parents']);
    $triggering_element_parents = array_slice($triggering_element['#array_parents'], 0, -1);
    $element = NestedArray::getValue($form, $triggering_element_parents);

    return $element['generator_container'];
  }

  // @todo: this should be static since may not work on field settings form (see fetcher field widget for example)
  //public static function processGeneratorContainerSubform(array $element, FormStateInterface $form_state, $form) {
  public function processGeneratorContainerSubform(array $element, FormStateInterface $form_state, $form) {
    $stored_configuration = $element['#stored_configuration'];
    $configuration = [
      'data_generator_id' => $stored_configuration['data_generator_id'],
      'data_generator_config' => $stored_configuration['data_generator_config'],
    ];
    $element = VisualNFormsHelper::doProcessGeneratorContainerSubform($element, $form_state, $form, $configuration);
    return $element;
  }

}

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

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