t('Forum name'); $form['name']['#description'] = $this->t('Short but meaningful name for this collection of threaded discussions.'); // Change the description. $form['description']['#description'] = $this->t('Description and guidelines for discussions within this forum.'); // Re-use the weight field. $form['weight'] = $form['relations']['weight']; // Remove the remaining relations fields. unset($form['relations']); // Our parent field is different to the taxonomy term. $form['parent']['#tree'] = TRUE; $form['parent'][0] = $this->forumParentSelect($this->entity->id(), $this->t('Parent')); $form['#theme_wrappers'] = ['form__forum']; $this->forumFormType = $this->t('forum'); return $form; } /** * {@inheritdoc} */ public function buildEntity(array $form, FormStateInterface $form_state) { $term = parent::buildEntity($form, $form_state); // Assign parents from forum parent select field. $term->parent = [$form_state->getValue(['parent', 0])]; return $term; } /** * {@inheritdoc} */ public function save(array $form, FormStateInterface $form_state) { $term = $this->entity; $term_storage = $this->entityManager->getStorage('taxonomy_term'); $status = $term_storage->save($term); $route_name = $this->urlStub == 'container' ? 'entity.taxonomy_term.forum_edit_container_form' : 'entity.taxonomy_term.forum_edit_form'; $route_parameters = ['taxonomy_term' => $term->id()]; $link = $this->l($this->t('Edit'), new Url($route_name, $route_parameters)); $view_link = $term->link($term->getName()); switch ($status) { case SAVED_NEW: $this->messenger()->addStatus($this->t('Created new @type %term.', ['%term' => $view_link, '@type' => $this->forumFormType])); $this->logger('forum')->notice('Created new @type %term.', ['%term' => $term->getName(), '@type' => $this->forumFormType, 'link' => $link]); $form_state->setValue('tid', $term->id()); break; case SAVED_UPDATED: $this->messenger()->addStatus($this->t('The @type %term has been updated.', ['%term' => $term->getName(), '@type' => $this->forumFormType])); $this->logger('forum')->notice('Updated @type %term.', ['%term' => $term->getName(), '@type' => $this->forumFormType, 'link' => $link]); break; } $form_state->setRedirect('forum.overview'); return $term; } /** * {@inheritdoc} */ protected function actions(array $form, FormStateInterface $form_state) { $actions = parent::actions($form, $form_state); if (!$this->entity->isNew() && $this->entity->hasLinkTemplate('forum-delete-form')) { $actions['delete']['#url'] = $this->entity->urlInfo('forum-delete-form'); } else { unset($actions['delete']); } return $actions; } /** * Returns a select box for available parent terms. * * @param int $tid * ID of the term that is being added or edited. * @param string $title * Title for the select box. * * @return array * A select form element. */ protected function forumParentSelect($tid, $title) { $taxonomy_storage = $this->entityManager->getStorage('taxonomy_term'); $parents = $taxonomy_storage->loadParents($tid); if ($parents) { $parent = array_shift($parents); $parent = $parent->id(); } else { $parent = 0; } $vid = $this->config('forum.settings')->get('vocabulary'); $children = $taxonomy_storage->loadTree($vid, $tid, NULL, TRUE); // A term can't be the child of itself, nor of its children. foreach ($children as $child) { $exclude[] = $child->tid; } $exclude[] = $tid; $tree = $taxonomy_storage->loadTree($vid, 0, NULL, TRUE); $options[0] = '<' . $this->t('root') . '>'; if ($tree) { foreach ($tree as $term) { if (!in_array($term->id(), $exclude)) { $options[$term->id()] = str_repeat(' -- ', $term->depth) . $term->getName(); } } } $description = $this->t('Forums may be placed at the top (root) level, or inside another container or forum.'); return [ '#type' => 'select', '#title' => $title, '#default_value' => $parent, '#options' => $options, '#description' => $description, '#required' => TRUE, ]; } }