dateFormatter = $date_formatter; $this->moduleHandler = $module_handler; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container) { return new static( $container->get('entity.repository'), $container->get('entity_type.bundle.info'), $container->get('datetime.time'), $container->get('date.formatter'), $container->get('module_handler'), ); } /** * {@inheritdoc} */ protected function getNewRevisionDefault() { return TRUE; } /** * Function that returns an array of tab definitions to add. * * @return array * Array of tab definitions keyed by tab id. Each definition should * provide a location, title and weight. */ protected function getFieldGroups() { $entity_type = $this->entity->getEntityTypeId(); $bundle = $this->entity->bundle(); $field_groups = [ 'default' => [ 'location' => 'main', 'title' => 'Default', 'weight' => -50, ], 'meta' => [ 'location' => 'sidebar', 'title' => $this->t('Meta'), 'weight' => 0, ], 'location' => [ 'location' => 'main', 'title' => $this->t('Location'), 'weight' => 50, ], 'file' => [ 'location' => 'main', 'title' => $this->t('Files'), 'weight' => 150, ], 'revision' => [ 'location' => 'sidebar', 'title' => $this->t('Revision information'), 'weight' => 200, ], ] + $this->moduleHandler->invokeAll('farm_ui_theme_field_groups', [$entity_type, $bundle]); return $field_groups; } /** * {@inheritdoc} */ public function form(array $form, FormStateInterface $form_state) { $form = parent::form($form, $form_state); // Add process callback to alter form after GinContentFormHelper. $form['#process'][] = '::processContentForm'; // Only alter the form display if farm_ui_theme.use_field_group is TRUE // or if the form display is new and not saved. /** @var \Drupal\Core\Entity\Display\EntityFormDisplayInterface $form_display */ $form_display = $form_state->get('form_display'); if (!$form_display || !$form_display->getThirdPartySetting('farm_ui_theme', 'use_field_group', $form_display->isNew())) { return $form; } // Attach content form styles. $form['#attached']['library'][] = 'farm_ui_theme/content_form'; // Add field groups, and allow modules to alter them. $field_groups = $this->getFieldGroups(); if (!empty($field_groups)) { // Disable HTML5 validation on the form element since it does not work // with vertical tabs. $form['#attributes']['novalidate'] = 'novalidate'; // Vary field group titles based on entity and bundle. if (isset($field_groups['default'])) { $field_groups['default']['title'] = $this->entity->type->entity->label(); } // Create parent for all tabs. $form['tabs'] = [ '#type' => 'vertical_tabs', '#default_tab' => 'edit-setup', ]; // Create tabs. foreach ($field_groups as $tab_id => $tab_info) { $tab_id = "{$tab_id}_field_group"; $tab_group = $tab_info['location'] == 'sidebar' ? 'advanced' : 'tabs'; $form[$tab_id] = [ '#type' => 'details', '#title' => $tab_info['title'], '#group' => $tab_group, '#optional' => TRUE, '#weight' => $tab_info['weight'], '#open' => TRUE, ]; } // Set field group for each display component. foreach ($form_display->getComponents() as $field_id => $options) { if (isset($form[$field_id]) && $render = $form_display->getRenderer($field_id)) { $tab_id = $render->getThirdPartySetting('farm_ui_theme', 'field_group', 'default'); $form[$field_id]['#group'] = "{$tab_id}_field_group"; } } } // Add authoring information for existing entities. if (!$this->entity->isNew()) { $changed = $this->dateFormatter->format($this->entity->getChangedTime(), 'short', '', $this->currentUser()->getTimeZone(), ''); $created = $this->dateFormatter->format($this->entity->getCreatedTime(), 'short', '', $this->currentUser()->getTimeZone(), ''); $form['revision_field_group']['revision_meta'] = [ '#theme' => 'item_list', '#items' => [ $this->t('Author: @author', ['@author' => $this->entity->getOwner()->getAccountName()]), $this->t('Last saved: @timestamp', ['@timestamp' => $changed]), $this->t('Created: @timestamp', ['@timestamp' => $created]), ], ]; } return $form; } /** * Process function to update form after GinContentFormHelper. * * @param array $form * The form array to alter. * @param \Drupal\Core\Form\FormStateInterface $form_state * The form state. * * @return array * The form array. * * @see \Drupal\gin\GinContentFormHelper */ public function processContentForm(array $form, FormStateInterface $form_state): array { // Increase weight of Gin's meta group to bottom of the sidebar. // This group has special styling and includes additional action // buttons like Delete that should be included on the page. $form['meta']['#weight'] = 500; // Assign correct status group after GinContentFormHelper. if (isset($form['status']) && isset($form['meta_field_group'])) { $form['status']['#group'] = 'meta_field_group'; } // Else unset the status group that is set by GinContentFormHelper. else { unset($form['status']['#group']); } // Remove the sidebar if the display is not using field groups. /** @var \Drupal\Core\Entity\Display\EntityFormDisplayInterface $form_display */ $form_display = $form_state->get('form_display'); if (!$form_display || !$form_display->getThirdPartySetting('farm_ui_theme', 'use_field_group', $form_display->isNew())) { // Revert Gin changes to advanced and revision information. $form['advanced']['#type'] = 'vertical_tabs'; $form['revision_information']['#type'] = 'details'; $form['revision_information']['#group'] = 'advanced'; // Do not use the node_edit_form theme. // The template includes elements for the sidebar. unset($form['#theme']); unset($form['gin_actions']); unset($form['gin_sidebar']); // Remove gin sidebar and edit_form libraries. if (($index = array_search('gin/sidebar', $form['#attached']['library'])) !== FALSE) { unset($form['#attached']['library'][$index]); } if (($index = array_search('gin/edit_form', $form['#attached']['library'])) !== FALSE) { unset($form['#attached']['library'][$index]); } } return $form; } /** * {@inheritdoc} */ public function save(array $form, FormStateInterface $form_state) { $status = parent::save($form, $form_state); $entity_type_label = $this->entity->getEntityType()->getSingularLabel(); $entity_url = $this->entity->toUrl()->setAbsolute()->toString(); $this->messenger()->addMessage($this->t('Saved %entity_type_label: %label', ['%entity_type_label' => $entity_type_label, ':url' => $entity_url, '%label' => $this->entity->label()])); $form_state->setRedirectUrl($this->entity->toUrl()); return $status; } }