eav_field-2.x-dev/src/Plugin/DevelGenerate/EavAttributeDevelGenerate.php

src/Plugin/DevelGenerate/EavAttributeDevelGenerate.php
<?php

namespace Drupal\eav_field\Plugin\DevelGenerate;

use Drupal\Component\Utility\Random;
use Drupal\Core\Form\FormStateInterface;
use Drupal\devel_generate\DevelGenerateBase;
use Drupal\eav_field\Entity\EavAttribute;

/**
 * @DevelGenerate(
 *   id = "eav_attribute",
 *   label = @Translation("EAV attributes"),
 *   description = @Translation("Generate a given number of EAV attributes."),
 *   url = "eav_attribute",
 *   permission = "administer devel_generate",
 *   settings = {
 *     "num" = 10,
 *     "kill" = FALSE,
 *     "category" = NULL,
 *     "terms" = NULL,
 *   },
 * )
 */
class EavAttributeDevelGenerate extends DevelGenerateBase {

  /**
   * {@inheritDoc}
   */
  public function settingsForm(array $form, FormStateInterface $form_state): array {
    $form['num'] = [
      '#type' => 'number',
      '#title' => $this->t('Number of attributes'),
      '#default_value' => $this->getSetting('num'),
      '#required' => TRUE,
      '#min' => 0,
    ];

    $form['category'] = [
      '#type' => 'select',
      '#title' => $this->t('Category'),
      '#options' => [
        'none' => $this->t('None'),
        'random' => $this->t('Random'),
        'selected' => $this->t('Selected terms'),
        'random_selected' => $this->t('Random from selected terms'),
      ],
    ];

    $form['terms'] = [
      '#type' => 'select',
      '#title' => $this->t('Terms'),
      '#options' => $this->getTermsOptions(),
      '#default_value' => $this->getSetting('category'),
      '#multiple' => TRUE,
      '#size' => 10,
      '#states' => [
        'visible' => [
          ':input[name="category"]' => [
            ['value' => 'selected'],
            ['value' => 'random_selected'],
          ],
        ],
      ],
    ];

    $form['kill'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Delete all existing attributes'),
      '#default_value' => $this->getSetting('kill'),
    ];

    return $form;
  }

  /**
   * {@inheritDoc}
   */
  protected function generateElements(array $values): void {
    if ($values['kill']) {
      $attribute_storage = \Drupal::entityTypeManager()->getStorage('eav_attribute');
      $attributes = $attribute_storage->loadMultiple();
      $attribute_storage->delete($attributes);

      $this->setMessage($this->formatPlural(count($attributes), '@count item deleted', '@count items deleted.'));
    }

    $categories_ids = [];
    if ($values['category'] == 'random') {
      $categories_ids = array_keys($this->getTermsOptions());
    }

    $random_utility = new Random();

    for ($i = 1; $i <= $values['num']; $i++) {
      $attribute_label = ucfirst($random_utility->word(random_int(5, 10)));

      $attribute_category = NULL;
      if ($values['category'] == 'random') {
        $attribute_category = $categories_ids[array_rand($categories_ids)];
      }
      elseif ($values['category'] == 'selected') {
        $attribute_category = $values['terms'];
      }
      elseif ($values['category'] == 'random_selected') {
        $attribute_category = $values['terms'][array_rand($values['terms'])];
      }

      $attribute = EavAttribute::create([
        'label' => $attribute_label,
        'machine_name' => strtolower($attribute_label),
        'category' => $attribute_category,
      ]);

      $attribute->save();
    }
    $this->setMessage($this->formatPlural($values['num'], 'Created @count item', 'Created @count items'));
  }

  /**
   * {@inheritDoc}
   */
  public function validateDrushParams(array $args, array $options = []) {

  }

  /**
   * Return terms options.
   */
  protected function getTermsOptions(): array {
    $attribute_storage = \Drupal::entityTypeManager()->getStorage('eav_attribute');
    $attribute_category_field = $attribute_storage->getCategoryFieldDefinition();
    $dummy_attribute = EavAttribute::create([]);
    return $attribute_category_field
      ->getFieldStorageDefinition()
      ->getOptionsProvider('target_id', $dummy_attribute)
      ->getSettableOptions(\Drupal::currentUser());
  }

}

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

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