quick_clone-8.x-1.x-dev/src/Controller/CloneController.php
src/Controller/CloneController.php
<?php
namespace Drupal\quick_clone\Controller;
use DateTime;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Datetime\DrupalDateTime;
use Drupal\Core\Entity\EntityStorageException;
use Drupal\Core\Routing\TrustedRedirectResponse;
use Drupal\Core\Url;
use Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface;
use Drupal\node\NodeInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Class CloneController.
*/
class CloneController extends ControllerBase {
/**
* Quick_clone.
*
* @param int $id
* Id of the current node.
*
* @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
* @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
* @throws \Drupal\Core\Entity\EntityStorageException
*
* @return string
* Return Hello string.
*/
public function quickClone($id) {
$original_entity = $this->entityTypeManager()->getStorage('node')->load($id);
/** @var \Drupal\node\NodeInterface $original_entity */
if (!$original_entity instanceof NodeInterface) {
throw new EntityStorageException(sprintf('Node with id %d does not exist', $id));
}
$new_node = $original_entity->createDuplicate();
// Check for paragraph fields which need to be duplicated as well.
foreach ($new_node->getTranslationLanguages() as $langcode => $language) {
$translated_node = $new_node->getTranslation($langcode);
foreach ($translated_node->getFieldDefinitions() as $field_definition) {
$field_storage_definition = $field_definition->getFieldStorageDefinition();
$field_settings = $field_storage_definition->getSettings();
if (isset($field_settings['target_type']) && $field_settings['target_type'] === 'paragraph') {
// Each paragraph entity will be duplicated,
// so we won't be editing the same as the parent in every clone.
$field_name = $field_storage_definition->getName();
if (!$translated_node->get($field_name)->isEmpty()) {
foreach ($translated_node->get($field_name) as $value) {
if ($value->entity) {
$value->entity = $value->entity->createDuplicate();
}
}
}
}
}
$this->processNewNode($translated_node, $original_entity, $langcode);
$this->messenger->addMessage(
$this->t("Node @title has been created. <a href='/node/@id/edit' target='_blank'>Edit now</a>", [
'@id' => $translated_node->id(),
'@title' => $translated_node->getTitle(),
]
), 'status');
}
$url = URL::fromRoute('system.admin_content')->toString(TRUE);
return new TrustedRedirectResponse($url->getGeneratedUrl());
}
/**
* @param \Drupal\node\NodeInterface $translated_node
* @param \Drupal\node\NodeInterface $original_entity
* @param $langcode
*
* @return int
* @throws \Drupal\Core\Entity\EntityStorageException
*/
public function processNewNode(NodeInterface $translated_node, NodeInterface $original_entity, $langcode) {
$translated_node->setTitle($this->t('Clone of @title', ['@title' => $original_entity->getTitle()], ['langcode' => $langcode]));
$now = new DrupalDateTime('now');
$now->setTimezone(new \DateTimeZone(DateTimeItemInterface::STORAGE_TIMEZONE));
$translated_node->setCreatedTime($now->getTimestamp());
return $translated_node->save();
}
}
