diff --git a/core/modules/edit/lib/Drupal/edit/Form/EditFieldForm.php b/core/modules/edit/lib/Drupal/edit/Form/EditFieldForm.php index 78ece73..1c356b2 100644 --- a/core/modules/edit/lib/Drupal/edit/Form/EditFieldForm.php +++ b/core/modules/edit/lib/Drupal/edit/Form/EditFieldForm.php @@ -119,7 +119,7 @@ protected function init(array &$form_state, EntityInterface $entity, $field_name if ($entity->entityType() == 'node') { $node_type_settings = $this->nodeTypeStorage->load($entity->bundle())->getModuleSettings('node'); $options = (isset($node_type_settings['options'])) ? $node_type_settings['options'] : array(); - $entity->setNewRevision(in_array('revision', $options)); + $entity->setNewRevision(!empty($options['revision'])); $entity->log = NULL; } diff --git a/core/modules/edit/lib/Drupal/edit/Tests/EditLoadingTest.php b/core/modules/edit/lib/Drupal/edit/Tests/EditLoadingTest.php index a8cc0b1..b8c31aa 100644 --- a/core/modules/edit/lib/Drupal/edit/Tests/EditLoadingTest.php +++ b/core/modules/edit/lib/Drupal/edit/Tests/EditLoadingTest.php @@ -245,7 +245,9 @@ public function testUserWithPermission() { // then again retrieve the field form, fill it, submit it (so it ends up // in TempStore) and then save the entity. Now there should be two // revisions. - $this->container->get('config.factory')->get('node.type.article')->set('settings.node.options', array('status', 'revision'))->save(); + $node_type = entity_load('node_type', 'article'); + $node_type->settings['node']['options']['revision'] = TRUE; + $node_type->save(); // Retrieve field form. $post = array('nocssjs' => 'true', 'reset' => 'true'); diff --git a/core/modules/forum/config/node.type.forum.yml b/core/modules/forum/config/node.type.forum.yml index 7258f39..18a8c59 100644 --- a/core/modules/forum/config/node.type.forum.yml +++ b/core/modules/forum/config/node.type.forum.yml @@ -9,7 +9,7 @@ settings: node: preview: 1 options: - status: status + status: true # Not promoted to front page. promote: false sticky: false diff --git a/core/modules/node/config/schema/node.schema.yml b/core/modules/node/config/schema/node.schema.yml index e8895cc..f2a8296 100644 --- a/core/modules/node/config/schema/node.schema.yml +++ b/core/modules/node/config/schema/node.schema.yml @@ -61,16 +61,16 @@ node.settings.node: label: 'Publishing options' mapping: status: - type: string + type: boolean label: 'Published' promote: - type: string + type: boolean label: 'Promoted to front page' sticky: - type: string + type: boolean label: 'Sticky at top of lists' revision: - type: string + type: boolean label: 'Create new revision' submitted: type: boolean diff --git a/core/modules/node/lib/Drupal/node/Entity/NodeType.php b/core/modules/node/lib/Drupal/node/Entity/NodeType.php index 33105d9..cec3461 100644 --- a/core/modules/node/lib/Drupal/node/Entity/NodeType.php +++ b/core/modules/node/lib/Drupal/node/Entity/NodeType.php @@ -7,6 +7,7 @@ namespace Drupal\node\Entity; +use Drupal\Component\Utility\NestedArray; use Drupal\Core\Config\Entity\ConfigEntityBase; use Drupal\Core\Entity\EntityStorageControllerInterface; use Drupal\node\NodeTypeInterface; @@ -209,4 +210,26 @@ public static function postDelete(EntityStorageControllerInterface $storage_cont } } + /** + * {@inheritdoc} + */ + public static function preCreate(EntityStorageControllerInterface $storage_controller, array &$values) { + parent::preCreate($storage_controller, $values); + + // Ensure default values are set. + if (!isset($values['settings']['node'])) { + $values['settings']['node'] = array(); + } + $values['settings']['node'] = NestedArray::mergeDeep(array( + 'options' => array( + 'status' => TRUE, + 'promote' => TRUE, + 'sticky' => FALSE, + 'revision' => FALSE, + ), + 'preview' => DRUPAL_OPTIONAL, + 'submitted' => TRUE, + ), $values['settings']['node']); + } + } diff --git a/core/modules/node/lib/Drupal/node/NodeFormController.php b/core/modules/node/lib/Drupal/node/NodeFormController.php index 32c197a..3fb7584 100644 --- a/core/modules/node/lib/Drupal/node/NodeFormController.php +++ b/core/modules/node/lib/Drupal/node/NodeFormController.php @@ -44,7 +44,7 @@ protected function prepareEntity() { foreach (array('status', 'promote', 'sticky') as $key) { // Multistep node forms might have filled in something already. if ($node->$key->isEmpty()) { - $node->$key = (int) in_array($key, $this->settings['options']); + $node->$key = (int) !empty($this->settings['options'][$key]); } } $node->setAuthorId(\Drupal::currentUser()->id()); @@ -56,7 +56,7 @@ protected function prepareEntity() { $node->log = NULL; } // Always use the default revision setting. - $node->setNewRevision(in_array('revision', $this->settings['options'])); + $node->setNewRevision(!empty($this->settings['options']['revision'])); } /** diff --git a/core/modules/node/lib/Drupal/node/NodeTypeFormController.php b/core/modules/node/lib/Drupal/node/NodeTypeFormController.php index 6d7d7b0..1c31b3f 100644 --- a/core/modules/node/lib/Drupal/node/NodeTypeFormController.php +++ b/core/modules/node/lib/Drupal/node/NodeTypeFormController.php @@ -8,7 +8,7 @@ namespace Drupal\node; use Drupal\Core\Entity\EntityFormController; -use Symfony\Component\DependencyInjection\ContainerInterface; +use Drupal\Component\Utility\MapArray; use Drupal\Component\Utility\String; /** @@ -31,13 +31,8 @@ public function form(array $form, array &$form_state) { } $node_settings = $type->getModuleSettings('node'); - // Ensure default settings. - $node_settings += array( - 'options' => array('status', 'promote'), - 'preview' => DRUPAL_OPTIONAL, - 'submitted' => TRUE, - ); - + // Prepare node options to be used for 'checkboxes' form element. + $node_settings['options'] = MapArray::copyValuesToKeys(array_keys(array_filter($node_settings['options']))); $form['name'] = array( '#title' => t('Name'), '#type' => 'textfield', diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeCreationTest.php b/core/modules/node/lib/Drupal/node/Tests/NodeCreationTest.php index 71e07de..cfe59d0 100644 --- a/core/modules/node/lib/Drupal/node/Tests/NodeCreationTest.php +++ b/core/modules/node/lib/Drupal/node/Tests/NodeCreationTest.php @@ -55,6 +55,19 @@ function testNodeCreation() { // Check that the node exists in the database. $node = $this->drupalGetNodeByTitle($edit['title[0][value]']); $this->assertTrue($node, 'Node found in database.'); + + // Verify that pages do not show submitted information by default. + $submitted_by = t('Submitted by !username on !datetime', array('!username' => $this->loggedInUser->getUsername(), '!datetime' => format_date($node->getCreatedTime()))); + $this->drupalGet('node/' . $node->id()); + $this->assertNoText($submitted_by); + + // Change the node type setting to show submitted by information. + $node_type = entity_load('node_type', 'page'); + $node_type->settings['node']['submitted'] = TRUE; + $node_type->save(); + + $this->drupalGet('node/' . $node->id()); + $this->assertText($submitted_by); } /** diff --git a/core/modules/node/lib/Drupal/node/Tests/NodePostSettingsTest.php b/core/modules/node/lib/Drupal/node/Tests/NodePostSettingsTest.php index 1759837..a7478a8 100644 --- a/core/modules/node/lib/Drupal/node/Tests/NodePostSettingsTest.php +++ b/core/modules/node/lib/Drupal/node/Tests/NodePostSettingsTest.php @@ -61,6 +61,7 @@ function testPagePostInfo() { $this->drupalPostForm('node/add/page', $edit, t('Save')); // Check that the post information is displayed. - $this->assertNoRaw('', 'Post information is not displayed.'); + $elements = $this->xpath('//*[contains(@class,:class)]', array(':class' => 'submitted')); + $this->assertEqual(count($elements), 0, 'Post information is not displayed.'); } } diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeTestBase.php b/core/modules/node/lib/Drupal/node/Tests/NodeTestBase.php index bb06621..dcb0518 100644 --- a/core/modules/node/lib/Drupal/node/Tests/NodeTestBase.php +++ b/core/modules/node/lib/Drupal/node/Tests/NodeTestBase.php @@ -34,7 +34,13 @@ function setUp() { // Create Basic page and Article node types. if ($this->profile != 'standard') { - $this->drupalCreateContentType(array('type' => 'page', 'name' => 'Basic page')); + $this->drupalCreateContentType(array('type' => 'page', 'name' => 'Basic page', 'settings' => array( + // Set proper default options for the page content type. + 'node' => array( + 'options' => array('promote' => FALSE), + 'submitted' => FALSE, + ), + ))); $this->drupalCreateContentType(array('type' => 'article', 'name' => 'Article')); } $this->accessController = \Drupal::entityManager()->getAccessController('node'); diff --git a/core/modules/node/node.module b/core/modules/node/node.module index 8d1b07c..893b8dd 100644 --- a/core/modules/node/node.module +++ b/core/modules/node/node.module @@ -692,10 +692,11 @@ function template_preprocess_node(&$variables) { field_attach_preprocess($node, $variables['content'], $variables); // Display post information only on certain node types. - // Avoid loading the entire node type config entity here. - $submitted = \Drupal::config('node.type.' . $node->bundle())->get('settings.node.submitted') ?: TRUE; - if ($submitted) { - $variables['display_submitted'] = TRUE; + // Avoid loading the entire node type config entity here that may not exist. + $node_type_config = \Drupal::config('node.type.' . $node->bundle()); + // Display submitted by default. + $variables['display_submitted'] = $node_type_config->isNew() || $node_type_config->get('settings.node.submitted'); + if ($variables['display_submitted']) { $variables['submitted'] = t('Submitted by !username on !datetime', array('!username' => $variables['name'], '!datetime' => $variables['date'])); if (theme_get_setting('features.node_user_picture')) { // To change user picture settings (e.g. image style), edit the 'compact' @@ -708,7 +709,6 @@ function template_preprocess_node(&$variables) { } } else { - $variables['display_submitted'] = FALSE; $variables['submitted'] = ''; $variables['user_picture'] = ''; } diff --git a/core/modules/rdf/lib/Drupal/rdf/Tests/StandardProfileTest.php b/core/modules/rdf/lib/Drupal/rdf/Tests/StandardProfileTest.php index 6f5065ec..a761cc3 100644 --- a/core/modules/rdf/lib/Drupal/rdf/Tests/StandardProfileTest.php +++ b/core/modules/rdf/lib/Drupal/rdf/Tests/StandardProfileTest.php @@ -282,6 +282,13 @@ protected function doArticleRdfaTests() { * displayed in teaser view, so it is tested in the front page tests. */ protected function doPageRdfaTests() { + // The standard profile hides the created date on pages. Revert display to + // true for testing. + // @todo Clean-up standard profile defaults. + $node_type = entity_load('node_type', 'page'); + $node_type->settings['node']['submitted'] = TRUE; + $node_type->save(); + // Feed the HTML into the parser. $uri_info = $this->page->uri(); $path = $uri_info['path']; diff --git a/core/profiles/standard/config/node.type.article.yml b/core/profiles/standard/config/node.type.article.yml index dd2394f..a3e10b2 100644 --- a/core/profiles/standard/config/node.type.article.yml +++ b/core/profiles/standard/config/node.type.article.yml @@ -9,10 +9,10 @@ settings: node: preview: '1' options: - status: status - promote: promote - sticky: '0' - revision: '0' - submitted: '1' + status: true + promote: true + sticky: false + revision: false + submitted: true status: '1' langcode: en diff --git a/core/profiles/standard/config/node.type.page.yml b/core/profiles/standard/config/node.type.page.yml index 48a919a..d41ae94 100644 --- a/core/profiles/standard/config/node.type.page.yml +++ b/core/profiles/standard/config/node.type.page.yml @@ -9,10 +9,10 @@ settings: node: preview: '1' options: - status: status - promote: '0' - sticky: '0' - revision: '0' - submitted: '0' + status: true + promote: false + sticky: false + revision: false + submitted: false status: '1' langcode: en