tempStoreFactory = $temp_store_factory; $this->currentUser = $current_user; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container) { return new static( $container->get('entity.manager'), $container->get('tempstore.private'), $container->get('entity_type.bundle.info'), $container->get('datetime.time'), $container->get('current_user') ); } /** * {@inheritdoc} */ public function form(array $form, FormStateInterface $form_state) { // Try to restore from temp store, this must be done before calling // parent::form(). $store = $this->tempStoreFactory->get('node_preview'); // Attempt to load from preview when the uuid is present unless we are // rebuilding the form. $request_uuid = \Drupal::request()->query->get('uuid'); if (!$form_state->isRebuilding() && $request_uuid && $preview = $store->get($request_uuid)) { /** @var $preview \Drupal\Core\Form\FormStateInterface */ $form_state->setStorage($preview->getStorage()); $form_state->setUserInput($preview->getUserInput()); // Rebuild the form. $form_state->setRebuild(); // The combination of having user input and rebuilding the form means // that it will attempt to cache the form state which will fail if it is // a GET request. $form_state->setRequestMethod('POST'); $this->entity = $preview->getFormObject()->getEntity(); $this->entity->in_preview = NULL; $form_state->set('has_been_previewed', TRUE); } /** @var \Drupal\node\NodeInterface $node */ $node = $this->entity; if ($this->operation == 'edit') { $form['#title'] = $this->t('Edit @type @title', [ '@type' => node_get_type_label($node), '@title' => $node->label() ]); } // Changed must be sent to the client, for later overwrite error checking. $form['changed'] = [ '#type' => 'hidden', '#default_value' => $node->getChangedTime(), ]; $form = parent::form($form, $form_state); $form['advanced']['#attributes']['class'][] = 'entity-meta'; $form['meta'] = [ '#type' => 'details', '#group' => 'advanced', '#weight' => -10, '#title' => $this->t('Status'), '#attributes' => ['class' => ['entity-meta__header']], '#tree' => TRUE, '#access' => $this->currentUser->hasPermission('administer nodes'), ]; $form['meta']['published'] = [ '#type' => 'item', '#markup' => $node->isPublished() ? $this->t('Published') : $this->t('Not published'), '#access' => !$node->isNew(), '#wrapper_attributes' => ['class' => ['entity-meta__title']], ]; $form['meta']['changed'] = [ '#type' => 'item', '#title' => $this->t('Last saved'), '#markup' => !$node->isNew() ? format_date($node->getChangedTime(), 'short') : $this->t('Not saved yet'), '#wrapper_attributes' => ['class' => ['entity-meta__last-saved']], ]; $form['meta']['author'] = [ '#type' => 'item', '#title' => $this->t('Author'), '#markup' => $node->getOwner()->getUsername(), '#wrapper_attributes' => ['class' => ['entity-meta__author']], ]; $form['status']['#group'] = 'footer'; // Node author information for administrators. $form['author'] = [ '#type' => 'details', '#title' => t('Authoring information'), '#group' => 'advanced', '#attributes' => [ 'class' => ['node-form-author'], ], '#attached' => [ 'library' => ['node/drupal.node'], ], '#weight' => 90, '#optional' => TRUE, ]; if (isset($form['uid'])) { $form['uid']['#group'] = 'author'; } if (isset($form['created'])) { $form['created']['#group'] = 'author'; } // Node options for administrators. $form['options'] = [ '#type' => 'details', '#title' => t('Promotion options'), '#group' => 'advanced', '#attributes' => [ 'class' => ['node-form-options'], ], '#attached' => [ 'library' => ['node/drupal.node'], ], '#weight' => 95, '#optional' => TRUE, ]; if (isset($form['promote'])) { $form['promote']['#group'] = 'options'; } if (isset($form['sticky'])) { $form['sticky']['#group'] = 'options'; } $form['#attached']['library'][] = 'node/form'; return $form; } /** * Entity builder updating the node status with the submitted value. * * @param string $entity_type_id * The entity type identifier. * @param \Drupal\node\NodeInterface $node * The node updated with the submitted values. * @param array $form * The complete form array. * @param \Drupal\Core\Form\FormStateInterface $form_state * The current state of the form. * * @see \Drupal\node\NodeForm::form() * * @deprecated in Drupal 8.4.x, will be removed before Drupal 9.0.0. * The "Publish" button was removed. */ public function updateStatus($entity_type_id, NodeInterface $node, array $form, FormStateInterface $form_state) { $element = $form_state->getTriggeringElement(); if (isset($element['#published_status'])) { $node->setPublished($element['#published_status']); } } /** * {@inheritdoc} */ protected function actions(array $form, FormStateInterface $form_state) { $element = parent::actions($form, $form_state); $node = $this->entity; $preview_mode = $node->type->entity->getPreviewMode(); $element['submit']['#access'] = $preview_mode != DRUPAL_REQUIRED || $form_state->get('has_been_previewed'); $element['preview'] = [ '#type' => 'submit', '#access' => $preview_mode != DRUPAL_DISABLED && ($node->access('create') || $node->access('update')), '#value' => t('Preview'), '#weight' => 20, '#submit' => ['::submitForm', '::preview'], ]; $element['delete']['#access'] = $node->access('delete'); $element['delete']['#weight'] = 100; return $element; } /** * Form submission handler for the 'preview' action. * * @param $form * An associative array containing the structure of the form. * @param $form_state * The current state of the form. */ public function preview(array $form, FormStateInterface $form_state) { $store = $this->tempStoreFactory->get('node_preview'); $this->entity->in_preview = TRUE; $store->set($this->entity->uuid(), $form_state); $route_parameters = [ 'node_preview' => $this->entity->uuid(), 'view_mode_id' => 'full', ]; $options = []; $query = $this->getRequest()->query; if ($query->has('destination')) { $options['query']['destination'] = $query->get('destination'); $query->remove('destination'); } $form_state->setRedirect('entity.node.preview', $route_parameters, $options); } /** * {@inheritdoc} */ public function save(array $form, FormStateInterface $form_state) { $node = $this->entity; $insert = $node->isNew(); $node->save(); $node_link = $node->link($this->t('View')); $context = ['@type' => $node->getType(), '%title' => $node->label(), 'link' => $node_link]; $t_args = ['@type' => node_get_type_label($node), '%title' => $node->link($node->label())]; if ($insert) { $this->logger('content')->notice('@type: added %title.', $context); drupal_set_message(t('@type %title has been created.', $t_args)); } else { $this->logger('content')->notice('@type: updated %title.', $context); drupal_set_message(t('@type %title has been updated.', $t_args)); } if ($node->id()) { $form_state->setValue('nid', $node->id()); $form_state->set('nid', $node->id()); if ($node->access('view')) { $form_state->setRedirect( 'entity.node.canonical', ['node' => $node->id()] ); } else { $form_state->setRedirect(''); } // Remove the preview entry from the temp store, if any. $store = $this->tempStoreFactory->get('node_preview'); $store->delete($node->uuid()); } else { // In the unlikely case something went wrong on save, the node will be // rebuilt and node form redisplayed the same way as in preview. drupal_set_message(t('The post could not be saved.'), 'error'); $form_state->setRebuild(); } } }