EntityMenuLinkCloneForm.php in Menu Link Clone 8
File
src/Form/EntityMenuLinkCloneForm.php
View source
<?php
namespace Drupal\menu_link_clone\Form;
use Drupal\Core\Form\FormStateInterface;
use Drupal\entity_clone\Form\EntityCloneForm;
use Drupal\menu_link_content\Entity\MenuLinkContent;
use Drupal\Core\Url;
class EntityMenuLinkCloneForm extends EntityCloneForm {
protected $entityTypeDefinition;
public function buildForm(array $form, FormStateInterface $form_state) {
$form = parent::buildForm($form, $form_state);
$form['clone_links'] = [
'#type' => 'checkbox',
'#title' => t('Clone with Links'),
'#required' => FALSE,
'#default_value' => FALSE,
'#weight' => 0,
];
return $form;
}
public function submitForm(array &$form, FormStateInterface $form_state) {
parent::submitForm($form, $form_state);
$cloneLink = $form_state
->getValue('clone_links');
if ($cloneLink) {
$sourceMenuId = $this->entity
->id();
$destMenuId = $form_state
->getValue('id');
$sourceMenuExistence = $this
->menuLinksAvailabilityCheck($sourceMenuId);
if (!$sourceMenuExistence) {
$this->messenger
->addMessage($this->stringTranslationManager
->translate('Menu links are not available in ' . $this->entity
->label() . ' created by admin.'));
}
else {
$result = $this
->cloneMenuLinks($sourceMenuId, $destMenuId);
if ($result) {
$this->messenger
->addMessage($this->stringTranslationManager
->translate('Links are cloned successfully for ' . $form_state
->getValue('label') . '.'));
}
else {
$this->messenger
->addMessage($this->stringTranslationManager
->translate('Unsuccessfull to clone links for ' . $form_state
->getValue('label') . ', Please try again or contact to site admin.'));
}
}
}
$response = Url::fromUserInput('/admin/structure/menu');
$form_state
->setRedirectUrl($response);
}
protected function cloneMenuLinks($source_menu_name, $target_menu_name) {
$result = FALSE;
$menuLinkIds = $this
->getMenuItemIds($source_menu_name);
if ($menuLinkIds['status']) {
$menuLinks = MenuLinkContent::loadMultiple($menuLinkIds['items']);
$data = $this
->resetLinkItems($menuLinks);
$data = $this
->setUuidForMenuItems($data, $target_menu_name);
$data = $this
->createMenuLinkClone($data);
if ($data) {
$result = TRUE;
}
}
return $result;
}
protected function genUuid() {
$uuid_service = \Drupal::service('uuid');
$uuid = $uuid_service
->generate();
return $uuid;
}
protected function getMenuItemIds($menu_id) {
$result = [];
$menuLinkIds = \Drupal::entityQuery('menu_link_content')
->condition('menu_name', $menu_id)
->execute();
if (isset($menuLinkIds) && !empty($menuLinkIds)) {
$result['status'] = TRUE;
$result['items'] = $menuLinkIds;
}
else {
$result['status'] = FALSE;
$result['items'] = [];
}
return $result;
}
protected function menuLinksAvailabilityCheck($source_menu_id) {
$result = FALSE;
if (isset($source_menu_id) && !empty($source_menu_id)) {
$menuLinkIds = $this
->getMenuItemIds($source_menu_id);
if ($menuLinkIds['status']) {
$result = TRUE;
}
}
return $result;
}
protected function resetLinkItems($menu_links_object_multiple) {
$result = [];
foreach ($menu_links_object_multiple as $link) {
if (!empty($link)) {
$linkArray = $link
->toArray();
foreach ($linkArray as $key => $linkArrayItem) {
$linkData[$key] = reset($linkArrayItem);
}
$result[$link
->id()] = $linkData;
}
}
return $result;
}
protected function setUuidForMenuItems($menu_links_object_multiple, $target_menu_name) {
$uuid_map = [];
foreach ($menu_links_object_multiple as $id => $menu) {
$uuid = $menu['uuid']['value'];
$new_uuid = $this
->genUuid();
$uuid_map['menu_link_content:' . $uuid] = 'menu_link_content:' . $new_uuid;
$menu_links_object_multiple[$id]['uuid'] = $new_uuid;
unset($menu_links_object_multiple[$id]['id']);
$menu_links_object_multiple[$id]['menu_name'] = $target_menu_name;
if (isset($menu_links_object_multiple[$id]['parent']['value']) && !empty($menu_links_object_multiple[$id]['parent']['value'])) {
$menu_links_object_multiple[$id]['parent']['value'] = $uuid_map[$menu_links_object_multiple[$id]['parent']['value']];
}
}
return $menu_links_object_multiple;
}
protected function createMenuLinkClone($menu_links_object_multiple) {
$result = FALSE;
foreach ($menu_links_object_multiple as $id => $menu) {
unset($menu['revision_id']);
unset($menu['bundle']);
$save_menu = MenuLinkContent::create($menu);
$save_menu
->save();
if ($save_menu) {
$result = TRUE;
}
}
return $result;
}
}