diff --git a/lib/Drupal/views/Tests/ViewStorageTest.php b/lib/Drupal/views/Tests/ViewStorageTest.php index 1a150be023fbd0745bafaddb7938789af0622d13..824268881b233cd1d798308d78929fcf2d84761d 100644 --- a/lib/Drupal/views/Tests/ViewStorageTest.php +++ b/lib/Drupal/views/Tests/ViewStorageTest.php @@ -175,10 +175,6 @@ protected function createTests() { $this->assertIdentical($values[$property], $created->{$property}, format_string('Property value: @property matches configuration value.', array('@property' => $property))); } - // Test created displays. - foreach ($created->display as $key => $display) { - } - // Check the uuid of the loaded View. $created->set('name', 'glossary_new'); $created->save(); @@ -252,7 +248,7 @@ protected function displayTests() { // Ensure the right display_plugin is created/instantiated. $this->assertEqual($new_display['display_plugin'], 'page', 'New page display "test" uses the right display plugin.'); - $this->assertTrue($view->executable->displayHandlers[$new_display['id']] instanceof Page, 'New page display "test" uses the right display plugin.'); + $this->assertTrue($view->getExecutable()->displayHandlers[$new_display['id']] instanceof Page, 'New page display "test" uses the right display plugin.'); $view->set('name', 'frontpage_new'); @@ -371,18 +367,18 @@ protected function displayMethodTests() { $display = $view->newDisplay('page'); $this->assertTrue($display instanceof \Drupal\views\Plugin\views\display\Page); - $this->assertTrue($view->executable->displayHandlers['page_1'] instanceof \Drupal\views\Plugin\views\display\Page); - $this->assertTrue($view->executable->displayHandlers['page_1']->default_display instanceof \Drupal\views\Plugin\views\display\DefaultDisplay); + $this->assertTrue($view->getExecutable()->displayHandlers['page_1'] instanceof \Drupal\views\Plugin\views\display\Page); + $this->assertTrue($view->getExecutable()->displayHandlers['page_1']->default_display instanceof \Drupal\views\Plugin\views\display\DefaultDisplay); $display = $view->newDisplay('page'); $this->assertTrue($display instanceof \Drupal\views\Plugin\views\display\Page); - $this->assertTrue($view->executable->displayHandlers['page_2'] instanceof \Drupal\views\Plugin\views\display\Page); - $this->assertTrue($view->executable->displayHandlers['page_2']->default_display instanceof \Drupal\views\Plugin\views\display\DefaultDisplay); + $this->assertTrue($view->getExecutable()->displayHandlers['page_2'] instanceof \Drupal\views\Plugin\views\display\Page); + $this->assertTrue($view->getExecutable()->displayHandlers['page_2']->default_display instanceof \Drupal\views\Plugin\views\display\DefaultDisplay); $display = $view->newDisplay('feed'); $this->assertTrue($display instanceof \Drupal\views\Plugin\views\display\Feed); - $this->assertTrue($view->executable->displayHandlers['feed_1'] instanceof \Drupal\views\Plugin\views\display\Feed); - $this->assertTrue($view->executable->displayHandlers['feed_1']->default_display instanceof \Drupal\views\Plugin\views\display\DefaultDisplay); + $this->assertTrue($view->getExecutable()->displayHandlers['feed_1'] instanceof \Drupal\views\Plugin\views\display\Feed); + $this->assertTrue($view->getExecutable()->displayHandlers['feed_1']->default_display instanceof \Drupal\views\Plugin\views\display\DefaultDisplay); // Tests item related methods(). $view = $this->controller->create(array('base_table' => 'views_test_data')); diff --git a/lib/Drupal/views/ViewExecutable.php b/lib/Drupal/views/ViewExecutable.php index c38ac6ebf3ceed7d1123ec2de635bfe91f9be126..794b8bfa9a6983258b92cfe19c52e5de5e51dd73 100644 --- a/lib/Drupal/views/ViewExecutable.php +++ b/lib/Drupal/views/ViewExecutable.php @@ -1818,12 +1818,6 @@ public function createDuplicate() { /** * Safely clone a view. * - * Because views are complicated objects within objects, and PHP loves to - * do references to everything, if a View is not properly and safely - * cloned it will still have references to the original view, and can - * actually cause the original view to point to objects in the cloned - * view. This gets ugly fast. - * * This will completely wipe a view clean so it can be considered fresh. * * @return Drupal\views\ViewExecutable @@ -1831,17 +1825,7 @@ public function createDuplicate() { */ public function cloneView() { $clone = clone $this->storage; - - $keys = array('executable', 'current_display', 'display_handler', 'displayHandlers', 'build_info', 'built', 'executed', 'attachment_before', 'attachment_after', 'field', 'argument', 'filter', 'sort', 'relationship', 'header', 'footer', 'empty', 'query', 'inited', 'style_plugin', 'plugin_name', 'exposed_data', 'exposed_input', 'exposed_widgets', 'many_to_one_tables', 'feed_icon'); - foreach ($keys as $key) { - unset($clone->$key); - } - $clone = $clone->getExecutable(); - $clone->built = $clone->executed = FALSE; - $clone->build_info = array(); - $clone->attachment_before = ''; - $clone->attachment_after = ''; - $clone->result = array(); + $clone = $clone->getExecutable(TRUE); return $clone; } diff --git a/lib/Drupal/views/ViewStorage.php b/lib/Drupal/views/ViewStorage.php index 70151fa9224bd6fdf2716b95f27085a5ab7ebe5c..676855ea0626ebc3d81bacf9d25235ffd6498241 100644 --- a/lib/Drupal/views/ViewStorage.php +++ b/lib/Drupal/views/ViewStorage.php @@ -94,20 +94,18 @@ class ViewStorage extends ConfigEntityBase implements ViewStorageInterface { public $disabled = FALSE; /** - * Stores a reference to the executable version of this view. + * The UUID for this entity. * - * @var Drupal\views\ViewExecutable + * @var string */ - public $executable; + public $uuid = NULL; /** - * A copy of the original entity. - * - * @todo This should be moved to Drupal\Core\Entity\Entity. + * Stores a reference to the executable version of this view. * - * @var Drupal\Core\Entity\EntityInterface + * @var Drupal\views\ViewExecutable */ - public $original; + protected $executable; /** * The module implementing this view. @@ -129,11 +127,14 @@ public function setExecutable(ViewExecutable $executable) { /** * Retrieves the executable version of this view. * + * @param bool $reset + * Get a new Drupal\views\ViewExecutable instance. + * * @return Drupal\views\ViewExecutable * The executable version of this view. */ - public function getExecutable() { - if (!isset($this->executable)) { + public function getExecutable($reset = FALSE) { + if (!isset($this->executable) || $reset) { $this->setExecutable(new ViewExecutable($this)); } return $this->executable; @@ -150,8 +151,7 @@ public function getExecutable() { * @see Drupal\views\ViewExecutable::initDisplay() */ public function initDisplay($reset = FALSE) { - $this->getExecutable(); - $this->executable->initDisplay($reset); + $this->getExecutable()->initDisplay($reset); } /** @@ -323,8 +323,7 @@ protected function generateDisplayId($plugin_id) { */ public function &newDisplay($plugin_id = 'page', $title = NULL, $id = NULL) { $id = $this->addDisplay($plugin_id, $title, $id); - $this->getExecutable(); - return $this->executable->newDisplay($id); + return $this->getExecutable()->newDisplay($id); } /** diff --git a/lib/Drupal/views/ViewStorageController.php b/lib/Drupal/views/ViewStorageController.php index 42d40c5043de0d3f49a65649dcea8e60e55bb540..00077a4d15b1ee63c09fd698c152d86fd4417388 100644 --- a/lib/Drupal/views/ViewStorageController.php +++ b/lib/Drupal/views/ViewStorageController.php @@ -58,87 +58,12 @@ protected function attachLoad(&$queried_entities, $revision_id = FALSE) { } /** - * Overrides Drupal\config\ConfigStorageController::save(). - * - * This currently replaces the reflection code with a static array of - * properties to be set on the config object. This can be removed when the - * view storage is isolated so the ReflectionClass can work. + * Overrides Drupal\config\ConfigStorageController::postSave(). */ - public function save(EntityInterface $entity) { - $prefix = $this->entityInfo['config prefix'] . '.'; - - // Load the stored entity, if any, and rename it. - if ($entity->getOriginalID()) { - $id = $entity->getOriginalID(); - } - else { - $id = $entity->id(); - } - $config = config($prefix . $id); - $config->setName($prefix . $entity->id()); - - if (!$config->isNew() && !isset($entity->original)) { - $entity->original = entity_load_unchanged($this->entityType, $id); - } - - $this->preSave($entity); - $this->invokeHook('presave', $entity); - - // @todo This temp measure will be removed once we have a better way or - // separation of storage and the executed view. - $config_properties = array ( - 'disabled', - 'api_version', - 'name', - 'description', - 'tag', - 'base_table', - 'human_name', - 'core', - 'display', - 'uuid', - 'module', - ); - - foreach ($config_properties as $property) { - if ($property == 'display') { - $displays = array(); - foreach ($entity->display as $key => $display) { - $displays[$key] = array( - 'display_options' => $display['display_options'], - 'display_plugin' => $display['display_plugin'], - 'id' => $display['id'], - 'display_title' => $display['display_title'], - 'position' => isset($display['position']) ? $display['position'] : 0, - ); - } - $config->set('display', $displays); - } - else { - $config->set($property, $entity->$property); - } - } - - if (!$config->isNew()) { - $return = SAVED_NEW; - $config->save(); - $this->postSave($entity, TRUE); - $this->invokeHook('update', $entity); - } - else { - $return = SAVED_UPDATED; - $config->save(); - $entity->enforceIsNew(FALSE); - $this->postSave($entity, FALSE); - $this->invokeHook('insert', $entity); - } - + public function postSave(EntityInterface $entity, $update) { + parent::postSave($entity, $update); // Clear caches. views_invalidate_cache(); - - unset($entity->original); - - return $return; } /** diff --git a/views.module b/views.module index 737ab4e70fb3ede3de1094075538b3892e327bd0..52b7674c1ac834d88ebcbeec5a8d6b264c503166 100644 --- a/views.module +++ b/views.module @@ -698,7 +698,7 @@ function views_block_info() { } $view->initDisplay(); - foreach ($view->executable->displayHandlers as $display) { + foreach ($view->getExecutable()->displayHandlers as $display) { if (isset($display) && !empty($display->definition['uses_hook_block'])) { $result = $display->executeHookBlockList();