devel_wizard-2.x-dev/templates/spell/batch_handler/devel-wizard.batch-handler.handler.php.twig

templates/spell/batch_handler/devel-wizard.batch-handler.handler.php.twig
<?php

declare(strict_types=1);

namespace {{ handler.classNamespace }};

use Drupal\Core\Batch\BatchBuilder;
use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
use Drupal\Core\Messenger\MessengerInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\StringTranslation\TranslationInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Batch handler for {{ object }} items.
 *
 * @code
 * $batch_builder = {{ handler.className }}::build(10);
 * batch_set($batch_builder->toArray());
 * @endcode
 */
class {{ handler.className }} implements ContainerInjectionInterface {

  use StringTranslationTrait;

  protected MessengerInterface $messenger;

  public static function build(int $num_of_loops): BatchBuilder {
    $batch_builder = new BatchBuilder();
    $batch_builder
      ->setTitle(t('My custom batch process'))
      ->setFinishCallback([static::class, 'finish'])
      ->addOperation(
        [static::class, 'process'],
        [
          $num_of_loops,
        ],
      );

    return $batch_builder;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('string_translation'),
      $container->get('messenger'),
    );
  }

  public function __construct(
    TranslationInterface $stringTranslation,
    MessengerInterface $messenger,
  ) {
    $this->setStringTranslation($stringTranslation);
    $this->messenger = $messenger;
  }

  /**
   * @see \DrushBatchContext
   */
  public static function process(int $num_of_loops, array|\ArrayObject &$context): void {
    $handler = static::create(\Drupal::getContainer());
    $handler->doProcess($num_of_loops, $context);
  }

  public static function finish(bool $success, array $results, array $operations): void {
    $handler = static::create(\Drupal::getContainer());
    $handler->doFinish($success, $results, $operations);
  }

  protected function doProcess(int $num_of_loops, array|\ArrayObject &$context): void {
    if (empty($context['sandbox']['initialized'])) {
      $context['sandbox']['current_loop'] = 0;
      $context['sandbox']['initialized'] = TRUE;
    }

    // Do something.
    sleep(2);
    if ($context['sandbox']['current_loop'] === 1) {
      $context['sandbox']['results']['messages'][] = [
        'message' => 'My msg 02',
        'type' => 'warning',
      ];
    }

    if ($context['sandbox']['current_loop'] === 4) {
      $context['sandbox']['results']['messages'][] = [
        'message' => 'My msg 04',
        'type' => 'status',
      ];
    }

    $context['sandbox']['current_loop']++;
    $context['message'] = $this->t(
      'Do something @current/@total',
      [
        '@total' => $num_of_loops,
        '@current' => $context['sandbox']['current_loop'],
      ],
    );
    $context['finished'] = $context['sandbox']['current_loop'] / $num_of_loops;

    if ($context['finished'] >= 1) {
      $context['results']['messages'] = $context['sandbox']['results']['messages'] ?? [];
    }
  }

  /**
   * @link https://www.drupal.org/project/drupal/issues/604902#comment-4197954
   */
  protected function doFinish(bool $success, array $results, array $operations): void {
    if (!$success) {
      $this->messenger->addError($this->t('Something went wrong'));
    }

    foreach ($results['messages'] ?? [] as $msg) {
      $this->messenger->addMessage($msg['message'], $msg['type']);
    }
  }

}

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

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