diff --git a/core/modules/node/lib/Drupal/node/NodeFormController.php b/core/modules/node/lib/Drupal/node/NodeFormController.php index 08ecf08..05cc6c6 100644 --- a/core/modules/node/lib/Drupal/node/NodeFormController.php +++ b/core/modules/node/lib/Drupal/node/NodeFormController.php @@ -26,6 +26,18 @@ class NodeFormController extends EntityFormController { * Overrides Drupal\Core\Entity\EntityFormController::prepareEntity(). */ protected function prepareEntity(EntityInterface $node) { + + // @todo decide how to get a fresh one. + // @todo the actual node is override in ::form as trying + // to overide here doesn't work. + $tempstore_id = drupal_container()->get('request')->query->get('tempstore_id'); + if ($tempstore_id) { + $node->tempstore_id = $tempstore_id; + } + else { + $node->tempstore_id = $node->uuid; + } + // Set up default values, if required. $node_options = variable_get('node_options_' . $node->type, array('status', 'promote')); // If this is a new node, fill in the default values. @@ -57,13 +69,11 @@ protected function prepareEntity(EntityInterface $node) { */ public function form(array $form, array &$form_state, EntityInterface $node) { $user_config = config('user.settings'); - // Some special stuff when previewing a node. - if (isset($form_state['node_preview'])) { - $form['#prefix'] = $form_state['node_preview']; - $node->in_preview = TRUE; - } - else { - unset($node->in_preview); + + // @todo can we do this somewhere different ? + $tempstore_id = drupal_container()->get('request')->query->get('tempstore_id'); + if (!empty($tempstore_id) && ($data = node_tempstore_load($tempstore_id))) { + $node = $data; } // Override the default CSS class name, since the user-defined node type @@ -346,9 +356,9 @@ public function submit(array $form, array &$form_state) { * A reference to a keyed array containing the current state of the form. */ public function preview(array $form, array &$form_state) { - drupal_set_title(t('Preview'), PASS_THROUGH); - $form_state['node_preview'] = node_preview($this->getEntity($form_state)); - $form_state['rebuild'] = TRUE; + $entity = $this->getEntity($form_state); + drupal_container()->get('user.tempstore')->get('node')->set($entity->tempstore_id, $entity); + $form_state['redirect'] = 'node/preview/' . $entity->tempstore_id; } /** @@ -383,6 +393,9 @@ public function save(array $form, array &$form_state) { $form_state['rebuild'] = TRUE; } + // Remove from cache. + drupal_container()->get('user.tempstore')->get('node')->delete($node->tempstore_id); + // Clear the page and block caches. cache_invalidate_tags(array('content' => TRUE)); } diff --git a/core/modules/node/lib/Drupal/node/Plugin/Core/Entity/Node.php b/core/modules/node/lib/Drupal/node/Plugin/Core/Entity/Node.php index 216cfc9..29835a7 100644 --- a/core/modules/node/lib/Drupal/node/Plugin/Core/Entity/Node.php +++ b/core/modules/node/lib/Drupal/node/Plugin/Core/Entity/Node.php @@ -206,6 +206,13 @@ class Node extends Entity implements ContentEntityInterface { public $revision_uid; /** + * The node tempstore id. + * + * @var integer + */ + public $tempstore_id; + + /** * Implements Drupal\Core\Entity\EntityInterface::id(). */ public function id() { diff --git a/core/modules/node/node.module b/core/modules/node/node.module index 90f9bc5..700d6e7 100644 --- a/core/modules/node/node.module +++ b/core/modules/node/node.module @@ -158,10 +158,6 @@ function node_theme() { 'variables' => array('content' => NULL), 'file' => 'node.pages.inc', ), - 'node_preview' => array( - 'variables' => array('node' => NULL), - 'file' => 'node.pages.inc', - ), 'node_admin_overview' => array( 'variables' => array('name' => NULL, 'type' => NULL), ), @@ -944,6 +940,23 @@ function node_load($nid = NULL, $reset = FALSE) { } /** + * Load the node from the tempstore. + * + * @param int $tempstore_id + * The id of a tempstore object. + * + * @return Drupal\node\Node|false + * A fully-populated node entity, or FALSE if the node is not found. + */ +function node_tempstore_load($tempstore_id) { + $node = drupal_container()->get('user.tempstore')->get('node')->get($tempstore_id); + if ($node) { + return $node; + } + return FALSE; +} + +/** * Loads a node revision from the database. * * @param int $nid @@ -1741,6 +1754,13 @@ function node_menu() { 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10, ); + // @todo real access check. + $items['node/preview/%node_tempstore'] = array( + 'page callback' => 'node_preview', + 'page arguments' => array(2), + 'access callback' => TRUE, + 'file' => 'node.pages.inc', + ); $items['node/%node/edit'] = array( 'title' => 'Edit', 'page callback' => 'node_page_edit', @@ -2257,6 +2277,97 @@ function node_page_view(Node $node) { } /** + * Implements hook_page_build(). + */ +function node_page_build(&$page) { + + // Add 'Back to content edit editing' link on preview page. + $node = menu_get_object('node_tempstore', 2); + if ($node) { + + $link = 'node/add/' . $node->bundle(); + if (!empty($node->nid)) { + $link = 'node/' . $node->nid . '/edit'; + } + + $view_mode = drupal_container()->get('request')->query->get('view_mode'); + if (empty($view_mode)) { + $view_mode = 'full'; + } + + $page['page_top']['node-preview'] = array( + '#type' => 'container', + '#attributes' => array('class' => array('node-preview-container')), + ); + + $page['page_top']['node-preview']['backlink'] = array( + '#type' => 'link', + '#title' => t('Back to content editing'), + '#href' => $link, + // Add the "overlay-restore" class to indicate this link should restore + // the context in which the preview demonstration page was opened. + '#options' => array('query' => array('tempstore_id' => $node->tempstore_id) ,'attributes' => array('class' => array('node-preview-backlink', 'overlay-restore'))), + '#prefix' => '