You are here

class ScannerConfirmForm in Search and Replace Scanner 8

Form for configure messages.

Hierarchy

Expanded class hierarchy of ScannerConfirmForm

1 string reference to 'ScannerConfirmForm'
scanner.routing.yml in ./scanner.routing.yml
scanner.routing.yml

File

src/Form/ScannerConfirmForm.php, line 15

Namespace

Drupal\scanner\Form
View source
class ScannerConfirmForm extends ConfirmFormBase {
  use StringTranslationTrait;

  /**
   * The Private temporary storage factory.
   *
   * @var \Drupal\Core\TempStore\PrivateTempStoreFactory
   */
  private $tempStore;

  /**
   * {@inheritdoc}
   */
  public function __construct(PrivateTempStoreFactory $tempStore) {
    $this->tempStore = $tempStore;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static($container
      ->get('tempstore.private'));
  }

  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'scanner_confirm_form';
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $store = $this->tempStore
      ->get('scanner');
    $form = parent::buildForm($form, $form_state);
    $msg = '<span>' . 'Search for' . ':</span> <strong>' . $store
      ->get('search') . '</strong></span><br/><span>' . 'Replace with' . ':</span><strong> ' . $store
      ->get('replace') . '</strong></span>';
    $form['description'] = [
      '#type' => 'markup',
      '#markup' => $msg,
    ];
    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    $scannerStore = $this->tempStore
      ->get('scanner');
    foreach ([
      'search',
      'replace',
      'mode',
      'wholeword',
      'regex',
      'preceded',
      'followed',
      'published',
      'language',
    ] as $value) {
      $values[$value] = $scannerStore
        ->get($value);
    }
    $fields = \Drupal::config('scanner.admin_settings')
      ->get('fields_of_selected_content_type');
    $operations = [];

    // Build an array of batch operation jobs. Batch job will need the field
    // and the filter values the users entered in the form.
    foreach ($fields as $field) {
      $operations[] = [
        '\\Drupal\\scanner\\Form\\ScannerConfirmForm::batchReplace',
        [
          $field,
          $values,
        ],
      ];
    }
    $batch = [
      'title' => $this
        ->t('Scanner Replace Batch'),
      'operations' => $operations,
      'finished' => '\\Drupal\\scanner\\Form\\ScannerConfirmForm::batchFinished',
      'progress_message' => $this
        ->t('Processed @current out of @total'),
    ];
    batch_set($batch);

    // Redirect to the scanner page after the batch is done.
    $form_state
      ->setRedirect('scanner.admin_content');
  }

  /**
   * Process the replacement.
   */
  public static function batchReplace($field, $values, &$context) {
    $pluginManager = \Drupal::service('plugin.manager.scanner');
    list($fieldname) = explode(':', $field);
    try {
      $plugin = $pluginManager
        ->createInstance('scanner_entity');

      // This process can take a while so we want to extend the execution time
      // if it's less then 300 (5 minutes).
      if (ini_get('max_execution_time') < 300) {
        ini_set('max_execution_time', 300);
      }
    } catch (PluginException $e) {

      // The instance could not be found so fail gracefully and let the user
      // know.
      \Drupal::logger('scanner')
        ->error($e
        ->getMessage());
      \Drupal::messenger()
        ->addError($this
        ->t('An error occured @e:', [
        '@e' => $e
          ->getMessage(),
      ]));
    }
    $results_data = '';
    if (isset($context['results']['data'])) {
      $results_data = $context['results']['data'];
    }
    if (is_string($results_data)) {
      $results = $plugin
        ->replace($field, $values, []);
    }
    else {
      $results = $plugin
        ->replace($field, $values, $results_data);
    }
    if (!empty($results)) {
      $entityKeys = array_keys($results);
      foreach ($entityKeys as $entityKey) {
        $context['results']['data'][$entityKey] = $results[$entityKey];
      }
      $context['results']['inputs'] = [
        'search' => $values['search'],
        'replace' => $values['replace'],
      ];
      $context['message'] = 'Searching through field: ' . $fieldname;
    }
  }

  /**
   * The batch process has finished.
   *
   * @param bool $success
   *   Indicates whether the batch process finish successfully.
   * @param array $results
   *   Contains the output from the batch operations.
   * @param array $operations
   *   A list of operations that were processed.
   */
  public static function batchFinished($success, $results, $operations) {
    $count = 0;
    $messenger = \Drupal::messenger();
    if ($success) {
      if (!empty($results['data'])) {
        foreach ($results['data'] as $value) {
          if (count($value) == 2) {
            $count++;
          }
          else {

            // Something went wrong.
            \Drupal::logger('scanner')
              ->error('An issue has occured during the replace operation.');
          }
        }
        $results['count'] = $count;
        $messenger
          ->addMessage(t('@count entities processed.', [
          '@count' => $count,
        ]));
        $connection = \Drupal::service('database');

        // Insert to row into the scanner table so that the
        // action can be undone in the future.
        $connection
          ->insert('scanner')
          ->fields([
          'undo_data' => serialize($results['data']),
          'undone' => 0,
          'searched' => $results['inputs']['search'],
          'replaced' => $results['inputs']['replace'],
          'count' => $count,
          'time' => \Drupal::time()
            ->getRequestTime(),
        ])
          ->execute();
      }
    }
    else {
      $message = t('There were some errors.');
      $messenger
        ->addMessage($message);
    }
  }

  /**
   * {@inheritdoc}
   */
  public function getCancelUrl() {
    $this->tempStore
      ->get('scanner')
      ->set('scanner_op', '');
    return new Url('scanner.admin_content');
  }

  /**
   * {@inheritdoc}
   */
  public function getQuestion() {
    return $this
      ->t('Are you sure you want to make the following replacement?');
  }

}

Members

Namesort descending Modifiers Type Description Overrides
ConfirmFormBase::getCancelText public function Returns a caption for the link which cancels the action. Overrides ConfirmFormInterface::getCancelText 1
ConfirmFormBase::getConfirmText public function Returns a caption for the button that confirms the action. Overrides ConfirmFormInterface::getConfirmText 20
ConfirmFormBase::getDescription public function Returns additional text to display as a description. Overrides ConfirmFormInterface::getDescription 11
ConfirmFormBase::getFormName public function Returns the internal name used to refer to the confirmation item. Overrides ConfirmFormInterface::getFormName
DependencySerializationTrait::$_entityStorages protected property An array of entity type IDs keyed by the property name of their storages.
DependencySerializationTrait::$_serviceIds protected property An array of service IDs keyed by property name used for serialization.
DependencySerializationTrait::__sleep public function 1
DependencySerializationTrait::__wakeup public function 2
FormBase::$configFactory protected property The config factory. 1
FormBase::$requestStack protected property The request stack. 1
FormBase::$routeMatch protected property The route match.
FormBase::config protected function Retrieves a configuration object.
FormBase::configFactory protected function Gets the config factory for this form. 1
FormBase::container private function Returns the service container.
FormBase::currentUser protected function Gets the current user.
FormBase::getRequest protected function Gets the request object.
FormBase::getRouteMatch protected function Gets the route match.
FormBase::logger protected function Gets the logger for a specific channel.
FormBase::redirect protected function Returns a redirect response object for the specified route. Overrides UrlGeneratorTrait::redirect
FormBase::resetConfigFactory public function Resets the configuration factory.
FormBase::setConfigFactory public function Sets the config factory for this form.
FormBase::setRequestStack public function Sets the request stack object to use.
FormBase::validateForm public function Form validation handler. Overrides FormInterface::validateForm 62
LinkGeneratorTrait::$linkGenerator protected property The link generator. 1
LinkGeneratorTrait::getLinkGenerator Deprecated protected function Returns the link generator.
LinkGeneratorTrait::l Deprecated protected function Renders a link to a route given a route name and its parameters.
LinkGeneratorTrait::setLinkGenerator Deprecated public function Sets the link generator service.
LoggerChannelTrait::$loggerFactory protected property The logger channel factory service.
LoggerChannelTrait::getLogger protected function Gets the logger for a specific channel.
LoggerChannelTrait::setLoggerFactory public function Injects the logger channel factory.
MessengerTrait::$messenger protected property The messenger. 29
MessengerTrait::messenger public function Gets the messenger. 29
MessengerTrait::setMessenger public function Sets the messenger.
RedirectDestinationTrait::$redirectDestination protected property The redirect destination service. 1
RedirectDestinationTrait::getDestinationArray protected function Prepares a 'destination' URL query parameter for use with \Drupal\Core\Url.
RedirectDestinationTrait::getRedirectDestination protected function Returns the redirect destination service.
RedirectDestinationTrait::setRedirectDestination public function Sets the redirect destination service.
ScannerConfirmForm::$tempStore private property The Private temporary storage factory.
ScannerConfirmForm::batchFinished public static function The batch process has finished.
ScannerConfirmForm::batchReplace public static function Process the replacement.
ScannerConfirmForm::buildForm public function Form constructor. Overrides ConfirmFormBase::buildForm
ScannerConfirmForm::create public static function Instantiates a new instance of this class. Overrides FormBase::create
ScannerConfirmForm::getCancelUrl public function Returns the route to go to if the user cancels the action. Overrides ConfirmFormInterface::getCancelUrl
ScannerConfirmForm::getFormId public function Returns a unique string identifying the form. Overrides FormInterface::getFormId
ScannerConfirmForm::getQuestion public function Returns the question to ask the user. Overrides ConfirmFormInterface::getQuestion
ScannerConfirmForm::submitForm public function Form submission handler. Overrides FormInterface::submitForm
ScannerConfirmForm::__construct public function
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.
UrlGeneratorTrait::$urlGenerator protected property The url generator.
UrlGeneratorTrait::getUrlGenerator Deprecated protected function Returns the URL generator service.
UrlGeneratorTrait::setUrlGenerator Deprecated public function Sets the URL generator service.
UrlGeneratorTrait::url Deprecated protected function Generates a URL or path for a specific route based on the given parameters.