View source
<?php
namespace Drupal\content_type_clone\Form;
use Drupal\node\Entity\NodeType;
use Drupal\node\Entity\Node;
use Drupal\field\Entity\FieldConfig;
use Drupal\field\Entity\FieldStorageConfig;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Drupal\content_type_clone\Helpers\ContentTypeCloneHelper;
class CloneContentType {
public static function cloneContentType(array $values, array &$context) {
if (!isset($context['sandbox']['progress'])) {
$context['sandbox']['progress'] = 0;
}
$sourceContentType = NodeType::load($values['source_machine_name']);
$targetContentType = $sourceContentType
->createDuplicate();
$targetContentType
->set('uuid', \Drupal::service('uuid')
->generate());
$targetContentType
->set('name', $values['target_name']);
$targetContentType
->set('type', $values['target_machine_name']);
$targetContentType
->set('originalId', $values['target_machine_name']);
$targetContentType
->set('description', $values['target_description']);
$targetContentType
->save();
$context['sandbox']['progress']++;
$context['sandbox']['current_item'] = $values['source_machine_name'];
$context['message'] = t('Content type @source successfully cloned.', [
'@source' => $values['source_machine_name'],
]);
$context['results']['source'][] = $values['source_machine_name'];
$context['results']['target'][] = $values['target_machine_name'];
}
public static function cloneContentTypeField(array $data, array &$context) {
$sourceFieldName = $data['field']
->getName();
$targetFieldConfig = $data['field']
->createDuplicate();
$targetFieldConfig
->set('entity_type', 'node');
$targetFieldConfig
->set('bundle', $data['values']['target_machine_name']);
$targetFieldConfig
->save();
ContentTypeCloneHelper::copyFieldDisplay('form', 'default', $data);
ContentTypeCloneHelper::copyFieldDisplay('view', 'default', $data);
$context['sandbox']['progress']++;
$context['sandbox']['current_item'] = $sourceFieldName;
$context['message'] = t('Field @source successfully cloned.', [
'@source' => $sourceFieldName,
]);
$context['results']['fields'][] = $sourceFieldName;
}
public static function copyContentTypeNode($nid, array $values, array &$context) {
$sourceNode = Node::load($nid);
$sourceNodeName = $sourceNode
->getTitle();
if (!empty($sourceNodeName)) {
$targetNode = $sourceNode
->createDuplicate();
$targetNode
->set('type', $values['target_machine_name']);
trim($values['title_pattern']);
if (\Drupal::moduleHandler()
->moduleExists('token') && !empty($values['title_pattern'])) {
$targetNode
->set('title', \Drupal::token()
->replace($values['title_pattern'], array(
'node' => $targetNode,
)));
}
$targetNode
->save();
if ((int) $values['delete_source_nodes'] == 1) {
$sourceNode
->delete();
}
}
$context['sandbox']['progress']++;
$context['sandbox']['current_item'] = $sourceNodeName;
$context['message'] = t('Node @source successfully cloned.', [
'@source' => $sourceNodeName,
]);
$context['results']['nodes'][] = $sourceNodeName;
}
public static function cloneContentTypeFinishedCallback($success, array $results, array $operations) {
if ($success) {
$message = t('"@source" content type and @fields field(s) cloned successfuly to "@target" with @nodes node(s).', array(
'@source' => $results['source'][0],
'@fields' => count($results['fields']),
'@target' => $results['target'][0],
'@nodes' => count($results['nodes']),
));
}
else {
$message = t('Finished with an error.');
}
drupal_set_message($message, 'status', TRUE);
$response = new RedirectResponse('admin/structure/types');
$response
->send();
}
}