View source
<?php
namespace Drupal\taxonomy;
use Drupal\Core\Entity\ContentEntityForm;
use Drupal\Core\Entity\EntityConstraintViolationListInterface;
use Drupal\Core\Form\FormStateInterface;
class TermForm extends ContentEntityForm {
public function form(array $form, FormStateInterface $form_state) {
$term = $this->entity;
$vocab_storage = $this->entityTypeManager
->getStorage('taxonomy_vocabulary');
$taxonomy_storage = $this->entityTypeManager
->getStorage('taxonomy_term');
$vocabulary = $vocab_storage
->load($term
->bundle());
$parent = array_keys($taxonomy_storage
->loadParents($term
->id()));
$form_state
->set([
'taxonomy',
'parent',
], $parent);
$form_state
->set([
'taxonomy',
'vocabulary',
], $vocabulary);
$form['relations'] = [
'#type' => 'details',
'#title' => $this
->t('Relations'),
'#open' => $taxonomy_storage
->getVocabularyHierarchyType($vocabulary
->id()) == VocabularyInterface::HIERARCHY_MULTIPLE,
'#weight' => 10,
];
if (!$this
->config('taxonomy.settings')
->get('override_selector')) {
$exclude = [];
if (!$term
->isNew()) {
$parent = array_keys($taxonomy_storage
->loadParents($term
->id()));
$children = $taxonomy_storage
->loadTree($vocabulary
->id(), $term
->id());
foreach ($children as $child) {
$exclude[] = $child->tid;
}
$exclude[] = $term
->id();
}
$tree = $taxonomy_storage
->loadTree($vocabulary
->id());
$options = [
'<' . $this
->t('root') . '>',
];
if (empty($parent)) {
$parent = [
0,
];
}
foreach ($tree as $item) {
if (!in_array($item->tid, $exclude)) {
$options[$item->tid] = str_repeat('-', $item->depth) . $item->name;
}
}
$form['relations']['parent'] = [
'#type' => 'select',
'#title' => $this
->t('Parent terms'),
'#options' => $options,
'#default_value' => $parent,
'#multiple' => TRUE,
];
}
$form['relations']['weight'] = [
'#type' => 'textfield',
'#title' => $this
->t('Weight'),
'#size' => 6,
'#default_value' => $term
->getWeight(),
'#description' => $this
->t('Terms are displayed in ascending order by weight.'),
'#required' => TRUE,
];
$form['vid'] = [
'#type' => 'value',
'#value' => $vocabulary
->id(),
];
$form['tid'] = [
'#type' => 'value',
'#value' => $term
->id(),
];
return parent::form($form, $form_state);
}
protected function actions(array $form, FormStateInterface $form_state) {
$element = parent::actions($form, $form_state);
if (!$this
->getRequest()->query
->has('destination')) {
$element['overview'] = [
'#type' => 'submit',
'#value' => $this
->t('Save and go to list'),
'#weight' => 20,
'#submit' => array_merge($element['submit']['#submit'], [
'::overview',
]),
];
}
return $element;
}
public function overview(array $form, FormStateInterface $form_state) : void {
$vocabulary = $this->entityTypeManager
->getStorage('taxonomy_vocabulary')
->load($form_state
->getValue('vid'));
$form_state
->setRedirectUrl($vocabulary
->toUrl('overview-form'));
}
public function validateForm(array &$form, FormStateInterface $form_state) {
parent::validateForm($form, $form_state);
if ($form_state
->hasValue('weight') && !is_numeric($form_state
->getValue('weight'))) {
$form_state
->setErrorByName('weight', $this
->t('Weight value must be numeric.'));
}
}
public function buildEntity(array $form, FormStateInterface $form_state) {
$term = parent::buildEntity($form, $form_state);
$term
->setName(trim($term
->getName()));
$term->parent = array_values($form_state
->getValue('parent'));
return $term;
}
protected function getEditedFieldNames(FormStateInterface $form_state) {
return array_merge([
'parent',
'weight',
], parent::getEditedFieldNames($form_state));
}
protected function flagViolations(EntityConstraintViolationListInterface $violations, array $form, FormStateInterface $form_state) {
foreach ($violations
->getByField('parent') as $violation) {
$form_state
->setErrorByName('parent', $violation
->getMessage());
}
foreach ($violations
->getByField('weight') as $violation) {
$form_state
->setErrorByName('weight', $violation
->getMessage());
}
parent::flagViolations($violations, $form, $form_state);
}
public function save(array $form, FormStateInterface $form_state) {
$term = $this->entity;
$result = $term
->save();
$edit_link = $term
->toLink($this
->t('Edit'), 'edit-form')
->toString();
$view_link = $term
->toLink()
->toString();
switch ($result) {
case SAVED_NEW:
$this
->messenger()
->addStatus($this
->t('Created new term %term.', [
'%term' => $view_link,
]));
$this
->logger('taxonomy')
->notice('Created new term %term.', [
'%term' => $term
->getName(),
'link' => $edit_link,
]);
break;
case SAVED_UPDATED:
$this
->messenger()
->addStatus($this
->t('Updated term %term.', [
'%term' => $view_link,
]));
$this
->logger('taxonomy')
->notice('Updated term %term.', [
'%term' => $term
->getName(),
'link' => $edit_link,
]);
break;
}
$current_parent_count = count($form_state
->getValue('parent'));
if ($current_parent_count == 1 && $form_state
->hasValue([
'parent',
0,
])) {
$form_state
->setValue('parent', []);
}
$form_state
->setValue('tid', $term
->id());
$form_state
->set('tid', $term
->id());
}
}