Drupal 8: Make a redirect to "Edit" mode after replication any node

10 Jul.2017
Redirect to edit mode after cloning the node.

While Replicating Nodes using Replicate and Replicate UI Module, I found that the module will publish a node immediately (shows  "view" mode) after replication. What I would like is when it is replicated the replicated node opens in edit mode so that a content manager can make the necessary changes before publishing it. Otherwise, it creates too many steps for them to go through.

For our project, I've implemented this with a custom event subscriber, which unpublishes any replicated node and makes the redirect to edit mode.

File
alex_tweaks.services.yml
services:
  alex_tweaks.replicate_node_edit:
    class: Drupal\alex_tweaks\EventSubscriber\ReplicateSetNodeEdit
    tags:
      - { name: event_subscriber }
File
src/EventSubscriber/ReplicateSetNodeEdit.php
<?php
 
namespace Drupal\alex_tweaks\EventSubscriber;
 
use Drupal\node\Entity\Node;
use Drupal\replicate\Events\ReplicateAlterEvent;
use Drupal\replicate\Events\AfterSaveEvent;
use Drupal\replicate\Events\ReplicatorEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
 
/**
 * Makes replicated nodes unpublished and redirect to edit mode.
 */
class ReplicateSetNodeEdit implements EventSubscriberInterface {
 
  /**
   * Sets the status of a replicated node to unpublished.
   *
   * @param \Drupal\replicate\Events\ReplicateAlterEvent $event
   *  The event fired by the replicator.
   */
  public function setUnpublished(ReplicateAlterEvent $event) {
    $cloned_entity = $event->getEntity();
 
    if (!$cloned_entity instanceof Node) {
      return;
    }
 
    $cloned_entity->set('status', Node::NOT_PUBLISHED);
  }
 
  /**
   * Make a redirect to "edit" mode.
   *
   * @param \Drupal\replicate\Events\AfterSaveEvent $event
   *  The event fired by the replicator.
   */
  public function makeRedirect(AfterSaveEvent $event) {
    $cloned_entity = $event->getEntity();
 
    if (!$cloned_entity instanceof Node) {
      return;
    }
 
    $response = new RedirectResponse('/node/' . $cloned_entity->id() . '/edit');
    $response->send();
 
  }
 
  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents() {
    $events = [];
    $events[ReplicatorEvents::REPLICATE_ALTER][] = 'setUnpublished';
    $events[ReplicatorEvents::AFTER_SAVE][] = 'makeRedirect';
 
    return $events;
  }
 
}