美文网首页Drupal
Drupal 9 批处理

Drupal 9 批处理

作者: 又起风了_ | 来源:发表于2022-03-24 17:21 被阅读0次

有时程序在处理大量数据时,运行的时间比较长,这样很容易发生超时现象。这时候就可以使用批处理来解决这个问题。

1.定义表单路由

d9_base.form.test_batch:
  path: '/test/batch'
  defaults:
    _form: 'Drupal\d9_base\Form\TestBatchForm'
    _title: 'Test Batch Form'
  requirements:
    _permission: 'access content'

2.创建表单

<?php

namespace Drupal\d9_base\Form;


use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;

class TestBatchForm extends FormBase
{
  /**
   * Returns a unique string identifying the form.
   *
   * The returned ID should be a unique string that can be a valid PHP function
   * name, since it's used in hook implementation names such as
   * hook_form_FORM_ID_alter().
   *
   * @return string
   *   The unique string identifying the form.
   */
  public function getFormId()
  {
    return 'test_batch_form';
  }

  /**
   * @inheritDoc
   */
  public function buildForm(array $form, FormStateInterface $form_state)
  {
    $form['update_node_title'] = [
      '#type' => 'submit',
      '#value' => $this->t('Update All Node Title'),
    ];

    return $form;
  }

  /**
   * @inheritDoc
   */
  public function submitForm(array &$form, FormStateInterface $form_state)
  {
    $nids = \Drupal::entityQuery('node')->execute();
    $operations = [
      ['test_batch_progress', [$nids, 'products']],//进程1
      ['test_batch_multi_progress', []],//进程2
    ];
    $batch = [
      'title' => $this->t('Updating Node ...'),
      'operations' => $operations,
      'finished' => 'test_batch_finished',//结束时调用
    ];
    batch_set($batch);
  }

}

3.在.module文件中分别实现test_batch_progresstest_batch_multi_progresstest_batch_finished三个方法

function test_batch_progress($nids, $type, &$context) {
  $context['message'] = 'Update Node title ...';
  $nodes = \Drupal\node\Entity\Node::loadMultiple($nids);
  foreach ($nodes as $node) {
    if ($node->getType() != $type)//这里只是为了演示传递两个参数$nids和$type的方法,实践中不会有这么2的操作
      continue;
    $title = $node->getTitle();
    $node->setTitle($title . '111');
    $node->save();
    $results[] = $node->id();
  }
  $context['results'] = $results;
}

function test_batch_multi_progress(&$context) {
  if (empty($context['sandbox'])) {
    $context['sandbox']['progress'] = 0;
    $context['sandbox']['current_id'] = 0;
    $context['sandbox']['max'] = \Drupal::database()
      ->query('SELECT COUNT(DISTINCT [nid]) FROM {node}')
      ->fetchField();
  }

  $limit = 2;//每次两条记录
  $result = \Drupal::database()
    ->select('node', 'n')
    ->fields('n', ['nid'])
    ->condition('n.nid', $context['sandbox']['current_id'], '>')
    ->orderBy('n.nid')
    ->range(0, 2)
    ->execute();
  $nids = $result->fetchCol();
  $nodes = \Drupal\node\Entity\Node::loadMultiple($nids);
  foreach ($nodes as $node) {
    $title = $node->getTitle();
    $node->setTitle($title . '2222');
    $node->save();
    $results[] = $node->id();
    $context['sandbox']['progress']++;
    $context['sandbox']['current_id'] = $node->id();
    $context['message'] = \Drupal\Component\Utility\Html::escape($node->getTitle());
  }

  if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
    $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
  }

}

function test_batch_finished($success, $results, $operations) {

  if ($success) {
    $message = \Drupal::translation()->formatPlural(
      count($results),
      'One post processed.', '@count posts processed.'
    );
  } else {
      $message = t('Finished with an error.');
  }

  \Drupal::messenger()->addStatus($message);
}

相关文章

  • Drupal 9 批处理

    有时程序在处理大量数据时,运行的时间比较长,这样很容易发生超时现象。这时候就可以使用批处理来解决这个问题。 1.定...

  • Drupal 9 小版本更新

    以下内容只涉及Drupal9小版本的更新,如需大版本的升级(如Drupal7或8升级到Drupal9),请参考官方...

  • Drupal 手册 -think in drupal

    Drupal 手册 drupal主题化介绍drupal OG首页主题化drupal主题化概述对一个Drupal主题...

  • 什么是Drupal?为什么选择Drupal

    ​Drupal开发,Drupal建站,Drupal二次开发?为什么是Drupal?尤其是Drupal企业建站呢?D...

  • 初学员对drupal开发入门

    国内首套系统全面的Drupal职业课程,由资深Drupal工程师为您提供全面Drupal基础开发、Drupal模块...

  • drupal 7/8在页面中添加 css/js文件

    drupal7: 加载 css文件 drupal_add_css(drupal_get_path('modul...

  • 第一部分 Drupal简介

    回首页 第一部分 Drupal简介 Drupal overview A tour of Drupal fundam...

  • Drupal 9 理解服务

    从D8开始,Drupal就引入了服务的概念,在Drupal中服务可以是任何对象,通过服务容器进行管理。引入服务是为...

  • Drupal 9 Devel Kint

    在Drupal9中,Devel模块中已经集成了Kint,但是想要启用Kint,还需要单独安装Kint。只需执行以下...

  • Drupal8核心主题以及相互关系

    Drupal核心主题 四个Drupal 8核心主题位于core / themes文件夹中。 作为Drupal 8移...

网友评论

    本文标题:Drupal 9 批处理

    本文链接:https://www.haomeiwen.com/subject/vtskjrtx.html