arch-8.x-1.x-dev/modules/product/src/Form/ProductRevisionRevertForm.php
modules/product/src/Form/ProductRevisionRevertForm.php
<?php namespace Drupal\arch_product\Form; use Drupal\arch_product\Entity\ProductInterface; use Drupal\Component\Datetime\TimeInterface; use Drupal\Core\Datetime\DateFormatterInterface; use Drupal\Core\Entity\EntityStorageInterface; use Drupal\Core\Form\ConfirmFormBase; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\StringTranslation\StringTranslationTrait; use Drupal\Core\Url; use Symfony\Component\DependencyInjection\ContainerInterface; /** * Provides a form for reverting a product revision. * * @internal */ class ProductRevisionRevertForm extends ConfirmFormBase { use StringTranslationTrait; /** * The product revision. * * @var \Drupal\arch_product\Entity\ProductInterface */ protected $revision; /** * The product storage. * * @var \Drupal\arch_product\Entity\Storage\ProductStorageInterface */ protected $productStorage; /** * The date formatter service. * * @var \Drupal\Core\Datetime\DateFormatterInterface */ protected $dateFormatter; /** * The time service. * * @var \Drupal\Component\Datetime\TimeInterface */ protected $time; /** * Constructs a new ProductRevisionRevertForm. * * @param \Drupal\Core\Entity\EntityStorageInterface $product_storage * The product storage. * @param \Drupal\Core\Datetime\DateFormatterInterface $date_formatter * The date formatter service. * @param \Drupal\Component\Datetime\TimeInterface $time * The time service. */ public function __construct( EntityStorageInterface $product_storage, DateFormatterInterface $date_formatter, TimeInterface $time, ) { $this->productStorage = $product_storage; $this->dateFormatter = $date_formatter; $this->time = $time; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container) { return new static( $container->get('entity_type.manager')->getStorage('product'), $container->get('date.formatter'), $container->get('datetime.time') ); } /** * {@inheritdoc} */ public function getFormId() { return 'product_revision_revert_confirm'; } /** * {@inheritdoc} */ public function getQuestion() { return $this->t( 'Are you sure you want to revert to the revision from %revision-date?', ['%revision-date' => $this->dateFormatter->format($this->revision->getRevisionCreationTime())] ); } /** * {@inheritdoc} */ public function getCancelUrl() { return new Url('entity.product.version_history', ['product' => $this->revision->id()]); } /** * {@inheritdoc} */ public function getConfirmText() { return $this->t('Revert'); } /** * {@inheritdoc} */ public function getDescription() { return ''; } /** * {@inheritdoc} */ public function buildForm(array $form, FormStateInterface $form_state, $product_revision = NULL) { $this->revision = $this->productStorage->loadRevision($product_revision); $form = parent::buildForm($form, $form_state); return $form; } /** * {@inheritdoc} */ public function submitForm(array &$form, FormStateInterface $form_state) { // The revision timestamp will be updated when the revision is saved. Keep // the original one for the confirmation message. $original_revision_timestamp = $this->revision->getRevisionCreationTime(); $this->revision = $this->prepareRevertedRevision($this->revision, $form_state); $this->revision->revision_log = $this->t('Copy of the revision from %date.', ['%date' => $this->dateFormatter->format($original_revision_timestamp)]); $this->revision->setRevisionUserId($this->currentUser()->id()); $this->revision->setRevisionCreationTime($this->time->getRequestTime()); $this->revision->setChangedTime($this->time->getRequestTime()); $this->revision->save(); $this->logger('product')->notice( '@type: reverted %title revision %revision.', [ '@type' => $this->revision->bundle(), '%title' => $this->revision->label(), '%revision' => $this->revision->getRevisionId(), ] ); $this->messenger() ->addStatus($this->t( '@type %title has been reverted to the revision from %revision-date.', [ '@type' => arch_product_get_type_label($this->revision), '%title' => $this->revision->label(), '%revision-date' => $this->dateFormatter->format($original_revision_timestamp), ] ) ); $form_state->setRedirect( 'entity.product.version_history', ['product' => $this->revision->id()] ); } /** * Prepares a revision to be reverted. * * @param \Drupal\arch_product\Entity\ProductInterface $revision * The revision to be reverted. * @param \Drupal\Core\Form\FormStateInterface $form_state * The current state of the form. * * @return \Drupal\arch_product\Entity\ProductInterface * The prepared revision ready to be stored. */ protected function prepareRevertedRevision(ProductInterface $revision, FormStateInterface $form_state) { $revision->setNewRevision(); $revision->isDefaultRevision(TRUE); return $revision; } }