View source
<?php
namespace Drupal\yamlform\Form;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Form\ConfirmFormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\yamlform\YamlFormInterface;
use Drupal\yamlform\YamlFormRequestInterface;
use Drupal\yamlform\YamlFormSubmissionStorageInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
abstract class YamlFormSubmissionsDeleteFormBase extends ConfirmFormBase {
protected $batchLimit = 1000;
protected $yamlform;
protected $sourceEntity;
protected $submissionStorage;
protected $requestHandler;
public function __construct(YamlFormSubmissionStorageInterface $yamlform_submission_storage, YamlFormRequestInterface $request_handler) {
$this->submissionStorage = $yamlform_submission_storage;
$this->requestHandler = $request_handler;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('entity.manager')
->getStorage('yamlform_submission'), $container
->get('yamlform.request'));
}
public function getConfirmText() {
return $this
->t('Clear');
}
public function buildForm(array $form, FormStateInterface $form_state) {
list($this->yamlform, $this->sourceEntity) = $this->requestHandler
->getYamlFormEntities();
return parent::buildForm($form, $form_state);
}
public function submitForm(array &$form, FormStateInterface $form_state) {
$form_state
->setRedirectUrl($this
->getCancelUrl());
if ($this->submissionStorage
->getTotal($this->yamlform, $this->sourceEntity) < $this
->getBatchLimit()) {
$this->submissionStorage
->deleteAll($this->yamlform, $this->sourceEntity);
drupal_set_message($this
->getFinishedMessage());
}
else {
$this
->batchSet($this->yamlform, $this->sourceEntity);
}
}
public function getFinishedMessage() {
return $this
->t('Form submissions cleared.');
}
public function batchSet(YamlFormInterface $yamlform = NULL, EntityInterface $entity = NULL) {
$parameters = [
$yamlform,
$entity,
$this->submissionStorage
->getMaxSubmissionId($yamlform, $entity),
];
$batch = [
'title' => $this
->t('Clear submissions'),
'init_message' => $this
->t('Clearing submission data'),
'error_message' => $this
->t('The submissions could not be cleared because an error occurred.'),
'operations' => [
[
[
$this,
'batchProcess',
],
$parameters,
],
],
'finished' => [
$this,
'batchFinish',
],
];
batch_set($batch);
}
public function getBatchLimit() {
return $this
->config('yamlform.settings')
->get('batch.default_batch_delete_size') ?: $this->batchLimit;
}
public function batchProcess(YamlFormInterface $yamlform = NULL, EntityInterface $entity = NULL, $max_sid, &$context) {
$this->submissionStorage = \Drupal::entityTypeManager()
->getStorage('yamlform_submission');
if (empty($context['sandbox'])) {
$context['sandbox']['progress'] = 0;
$context['sandbox']['max'] = $this->submissionStorage
->getTotal($yamlform, $entity);
$context['results']['yamlform'] = $yamlform;
$context['results']['entity'] = $entity;
}
$context['sandbox']['progress'] += $this->submissionStorage
->deleteAll($yamlform, $entity, $this
->getBatchLimit(), $max_sid);
$context['message'] = $this
->t('Deleting @count of @total submissions...', [
'@count' => $context['sandbox']['progress'],
'@total' => $context['sandbox']['max'],
]);
if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
$context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
}
}
public function batchFinish($success = FALSE, array $results, array $operations) {
if (!$success) {
drupal_set_message($this
->t('Finished with an error.'));
}
else {
drupal_set_message($this
->getFinishedMessage());
}
}
}