taxonomy_menu_sync-1.0.4/src/Form/TaxonomyMenuSyncForm.php
src/Form/TaxonomyMenuSyncForm.php
<?php
namespace Drupal\taxonomy_menu_sync\Form;
use Drupal\Core\Entity\ContentEntityForm;
use Drupal\Core\Form\FormStateInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Create a new menu configurations.
*/
class TaxonomyMenuSyncForm extends ContentEntityForm {
/**
* @var \Drupal\taxonomy_menu_sync\TaxonomyMenuSyncHelper
*/
protected $localHelper;
/**
* {@inheritDoc}
*/
public static function create(ContainerInterface $container) {
$instance = parent::create($container);
$instance->localHelper = $container->get('taxonomy_menu_sync.helper');
return $instance;
}
/**
* {@inheritDoc}
*/
public function buildForm(array $form, FormStateInterface $form_state) {
$form = parent::buildForm($form, $form_state);
$target_menu = '';
$default_menu_list = $this->localHelper->getMenuList();
if (!$this->entity->get('target_menu')->isEmpty()) {
$default_target_menu = $this->entity->get('target_menu')->target_id;
$default_menu_list = [$default_target_menu => $default_menu_list[$default_target_menu]];
}
$target_menu_field = $form_state->getValue('target_menu');
if (!empty($target_menu_field) && !empty($target_menu = $target_menu_field[0]['target_id'])) {
$menus = $form['target_menu']['widget']['#options'];
$default_menu_list = [$target_menu => $menus[$target_menu]];
$target_menu_item_field = $form_state->getValue('target_menu_item');
if (!empty($target_menu_item_field) && !empty($target_menu_item = $target_menu_item_field[0]['value'])) {
$form['target_menu_item']['widget']['#default_value'] = $target_menu_item;
}
}
$form['target_menu_item']['widget']['#options'] = $this->getTargetMenuOptions($default_menu_list, $target_menu);
$form['target_menu_item']['widget']['#empty_option'] = '- Select a value -';
$form['target_menu_item']['widget']['#empty_value'] = '_none';
$form['target_menu']['widget']['#ajax'] = [
'callback' => [$this, 'ajaxCallbackTargetMenu'],
'wrapper' => 'taxonomy-menu-sync-target-menu-wrapper',
];
$form['target_menu_item']['#prefix'] = '<div id="taxonomy-menu-sync-target-menu-wrapper">';
$form['target_menu_item']['#suffix'] = '</div>';
return $form;
}
/**
* Update Target menu item field on Target menu change.
*/
public function ajaxCallbackTargetMenu(array $form, FormStateInterface $form_state) {
return $form['target_menu_item'];
}
/**
* {@inheritDoc}
*/
public function validateForm(array &$form, FormStateInterface $form_state) {
parent::validateForm($form, $form_state);
$form_values = $form_state->getValues();
$vocabulary = $form_values['source_vocabulary'][0]['target_id'] ?? '';
$term_id = $form_values['source_term'][0]['target_id'] ?? '';
if (!empty($vocabulary) && !empty($term_id)) {
if (!$this->localHelper->verifyTermId($vocabulary, $term_id)) {
$form_state->setErrorByName('source_term', $this->t('Invalid taxonomy term id, not associated with the %vocab vocabulary.', ['%vocab' => $vocabulary]));
}
}
}
/**
* {@inheritDoc}
*/
public function save(array $form, FormStateInterface $form_state) {
$status = parent::save($form, $form_state);
$entity = $this->entity;
if ($status == SAVED_UPDATED) {
$this->messenger()
->addMessage($this->t('Taxonomy menu sync %title has been updated.', ['%title' => $entity->toLink()->toString()]));
}
else {
$this->messenger()
->addMessage($this->t('Taxonomy menu sync %title has been added.', ['%title' => $entity->toLink()->toString()]));
}
$form_state->setRedirectUrl($this->entity->toUrl('collection'));
}
/**
* Get the menu item lists.
*
* @param array $menus
* An array of menu list.
* @param string $target_menu
* A string of target menu.
*
* @return array
* Menu item options.
*/
public function getTargetMenuOptions(array $menus, string $target_menu = ''): array {
$options = $this->localHelper->getMenuLinkContentList($menus);
$mapping = $this->entity->getMapping();
$menu = $this->entity->get('target_menu')->target_id;
$allow = empty($target_menu) || $menu === $target_menu;
if (!empty($mapping) && !empty($menu) && $allow) {
foreach ($mapping as $value) {
$unset_string = "$menu:menu_link_content:" . $value['uuid'] ?? '';
unset($options[$unset_string]);
}
}
return $options;
}
}
