summaryrefslogtreecommitdiffstats
path: root/core/modules/node
diff options
context:
space:
mode:
Diffstat (limited to 'core/modules/node')
-rw-r--r--core/modules/node/node.module40
-rw-r--r--core/modules/node/src/Tests/NodeFieldMultilingualTestCase.php6
-rw-r--r--core/modules/node/src/Tests/NodePostSettingsTest.php4
-rw-r--r--core/modules/node/src/Tests/NodeTitleTest.php5
-rw-r--r--core/modules/node/templates/node.html.twig58
5 files changed, 58 insertions, 55 deletions
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index 38e047b..32d3295 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -579,7 +579,7 @@ function node_is_page(NodeInterface $node) {
function node_preprocess_html(&$variables) {
// If on an individual node page, add the node type to body classes.
if (($node = \Drupal::request()->attributes->get('node')) && $node instanceof NodeInterface) {
- $variables['attributes']['class'][] = drupal_html_class('node-type-' . $node->getType());
+ $variables['attributes']['class'][] = drupal_html_class('node--type-' . $node->getType());
}
}
@@ -642,9 +642,9 @@ function template_preprocess_node(&$variables) {
'#account' => $node->getOwner(),
'#link_options' => array('attributes' => array('rel' => 'author')),
);
- $variables['name'] = drupal_render($username);
+ $variables['author_name'] = drupal_render($username);
- $variables['node_url'] = $node->url('canonical', array(
+ $variables['url'] = $node->url('canonical', array(
'language' => $node->language(),
));
$variables['label'] = $variables['elements']['title'];
@@ -660,23 +660,17 @@ function template_preprocess_node(&$variables) {
// Display post information only on certain node types.
// Avoid loading the entire node type config entity here that may not exist.
$node_type_config = \Drupal::config('node.type.' . $node->bundle());
+ // Used by RDF to add attributes around the author and date submitted.
+ $variables['author_attributes'] = new Attribute();
// 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'
// view mode on the User entity. Note that the 'compact' view mode might
// not be configured, so remember to always check the theme setting first.
- $variables['user_picture'] = user_view($node->getOwner(), 'compact');
+ $variables['author_picture'] = user_view($node->getOwner(), 'compact');
}
- else {
- $variables['user_picture'] = array();
- }
- }
- else {
- $variables['submitted'] = '';
- $variables['user_picture'] = '';
}
// Add article ARIA role.
@@ -684,23 +678,22 @@ function template_preprocess_node(&$variables) {
// Gather node classes.
$variables['attributes']['class'][] = 'node';
- $variables['attributes']['class'][] = drupal_html_class('node-' . $node->bundle());
+ $variables['attributes']['class'][] = drupal_html_class('node--type-' . $node->bundle());
if ($node->isPromoted()) {
- $variables['attributes']['class'][] = 'promoted';
+ $variables['attributes']['class'][] = 'node--promoted';
}
if ($node->isSticky()) {
- $variables['attributes']['class'][] = 'sticky';
+ $variables['attributes']['class'][] = 'node--sticky';
}
if (!$node->isPublished()) {
- $variables['attributes']['class'][] = 'unpublished';
+ $variables['attributes']['class'][] = 'node--unpublished';
}
if ($variables['view_mode']) {
- $variables['attributes']['class'][] = drupal_html_class('view-mode-' . $variables['view_mode']);
+ $variables['attributes']['class'][] = drupal_html_class('node--view-mode-' . $variables['view_mode']);
}
if (isset($variables['preview'])) {
- $variables['attributes']['class'][] = 'preview';
+ $variables['attributes']['class'][] = 'node--preview';
}
- $variables['content_attributes']['class'][] = 'content';
}
/**
@@ -1213,9 +1206,9 @@ function node_form_system_themes_admin_form_submit($form, &$form_state) {
*
* Next, all implementations of hook_node_access() will be called. Each
* implementation may explicitly allow, explicitly deny, or ignore the access
- * request. If at least one module says to deny the request, it will be rejected.
- * If no modules deny the request and at least one says to allow it, the request
- * will be permitted.
+ * request. If at least one module says to deny the request, it will be
+ * rejected. If no modules deny the request and at least one says to allow it,
+ * the request will be permitted.
*
* If all modules ignore the access request, then the node_access table is used
* to determine access. All node access modules are queried using
@@ -1550,7 +1543,8 @@ function node_access_rebuild($batch_mode = FALSE) {
// Try to allocate enough time to rebuild node grants
drupal_set_time_limit(240);
- // Rebuild newest nodes first so that recent content becomes available quickly.
+ // Rebuild newest nodes first so that recent content becomes available
+ // quickly.
$entity_query = \Drupal::entityQuery('node');
$entity_query->sort('nid', 'DESC');
$nids = $entity_query->execute();
diff --git a/core/modules/node/src/Tests/NodeFieldMultilingualTestCase.php b/core/modules/node/src/Tests/NodeFieldMultilingualTestCase.php
index fd83b93..42dfafb 100644
--- a/core/modules/node/src/Tests/NodeFieldMultilingualTestCase.php
+++ b/core/modules/node/src/Tests/NodeFieldMultilingualTestCase.php
@@ -133,9 +133,9 @@ class NodeFieldMultilingualTestCase extends WebTestBase {
// Check if node body is showed.
$this->drupalGet('node/' . $node->id());
- $body = $this->xpath('//article[@id=:id]//div[@class=:class]/descendant::p', array(
- ':id' => 'node-' . $node->id(),
- ':class' => 'content',
+ $body = $this->xpath('//article[contains(concat(" ", normalize-space(@class), " "), :node-class)]//div[contains(concat(" ", normalize-space(@class), " "), :content-class)]/descendant::p', array(
+ ':node-class' => ' node ',
+ ':content-class' => 'node__content',
));
$this->assertEqual(current($body), $node->body->value, 'Node body found.');
}
diff --git a/core/modules/node/src/Tests/NodePostSettingsTest.php b/core/modules/node/src/Tests/NodePostSettingsTest.php
index a7478a8..7cfaa7e 100644
--- a/core/modules/node/src/Tests/NodePostSettingsTest.php
+++ b/core/modules/node/src/Tests/NodePostSettingsTest.php
@@ -45,7 +45,7 @@ class NodePostSettingsTest extends NodeTestBase {
// Check that the post information is displayed.
$node = $this->drupalGetNodeByTitle($edit['title[0][value]']);
- $elements = $this->xpath('//*[contains(@class,:class)]', array(':class' => 'submitted'));
+ $elements = $this->xpath('//div[contains(@class, :class)]', array(':class' => 'node__submitted'));
$this->assertEqual(count($elements), 1, 'Post information is displayed.');
$node->delete();
@@ -61,7 +61,7 @@ class NodePostSettingsTest extends NodeTestBase {
$this->drupalPostForm('node/add/page', $edit, t('Save'));
// Check that the post information is displayed.
- $elements = $this->xpath('//*[contains(@class,:class)]', array(':class' => 'submitted'));
+ $elements = $this->xpath('//div[contains(@class, :class)]', array(':class' => 'node__submitted'));
$this->assertEqual(count($elements), 0, 'Post information is not displayed.');
}
}
diff --git a/core/modules/node/src/Tests/NodeTitleTest.php b/core/modules/node/src/Tests/NodeTitleTest.php
index 9b503ff..784125c 100644
--- a/core/modules/node/src/Tests/NodeTitleTest.php
+++ b/core/modules/node/src/Tests/NodeTitleTest.php
@@ -42,7 +42,8 @@ class NodeTitleTest extends NodeTestBase {
*/
function testNodeTitle() {
// Create "Basic page" content with title.
- // Add the node to the frontpage so we can test if teaser links are clickable.
+ // Add the node to the frontpage so we can test if teaser links are
+ // clickable.
$settings = array(
'title' => $this->randomName(8),
'promote' => 1,
@@ -60,7 +61,7 @@ class NodeTitleTest extends NodeTestBase {
$this->assertEqual(current($this->xpath($xpath)), $node->label(), 'Node breadcrumb is equal to node title.', 'Node');
// Test node title in comment preview.
- $this->assertEqual(current($this->xpath('//article[@id=:id]/h2/a/span', array(':id' => 'node-' . $node->id()))), $node->label(), 'Node preview title is equal to node title.', 'Node');
+ $this->assertEqual(current($this->xpath('//article[contains(concat(" ", normalize-space(@class), " "), :node-class)]/h2/a/span', array(':node-class' => ' node--type-' . $node->bundle() . ' '))), $node->label(), 'Node preview title is equal to node title.', 'Node');
// Test node title is clickable on teaser list (/node).
$this->drupalGet('node');
diff --git a/core/modules/node/templates/node.html.twig b/core/modules/node/templates/node.html.twig
index c1ac815..c80eecb 100644
--- a/core/modules/node/templates/node.html.twig
+++ b/core/modules/node/templates/node.html.twig
@@ -5,11 +5,11 @@
*
* Available variables:
* - node: Full node entity.
- * - id: The node ID
+ * - id: The node ID.
* - bundle: The type of the node, for example, "page" or "article".
* - authorid: The user ID of the node author.
- * - createdtime: Formatted creation date. Preprocess functions can reformat it by
- * calling format_date() with the desired parameters on
+ * - createdtime: Formatted creation date. Preprocess functions can
+ * reformat it by calling format_date() with the desired parameters on
* $variables['node']->getCreatedTime().
* - promoted: Whether the node is promoted to the front page.
* - sticky: Whether the node is 'sticky'. Sticky nodes are ordered above
@@ -20,31 +20,32 @@
* or print a subset such as {{ content.field_example }}. Use
* {{ content|without('field_example') %} to temporarily suppress the printing
* of a given child element.
- * - user_picture: The node author's information as loaded from the 'compact'
- * view mode for the user entity.
+ * - author_picture: The node author user entity, rendered using the "compact"
+ * view mode.
+ * - metadata: Metadata for this node.
* - date: Formatted creation date. Preprocess functions can reformat it by
* calling format_date() with the desired parameters on
* $variables['created'].
- * - name: Themed username of node author output from theme_username().
- * - node_url: Direct URL of the current node.
+ * - author_name: Themed username of node author output from theme_username().
+ * - url: Direct URL of the current node.
* - display_submitted: Whether submission information should be displayed.
- * - submitted: Submission information created from name and date during
- * template_preprocess_node().
* - attributes: HTML attributes for the containing element.
* The attributes.class element may contain one or more of the following
* classes:
* - node: The current template type (also known as a "theming hook").
- * - node-[type]: The current node type. For example, if the node is a
- * "Article" it would result in "node-article". Note that the machine
+ * - node--[type]: The current node type. For example, if the node is a
+ * "Article" it would result in "node--article". Note that the machine
* name will often be in a short form of the human readable label.
- * - view-mode-[view_mode]: The View Mode of the node; for example, a teaser
- * would result in: "view-mode-teaser", and full: "view-mode-full".
- * - preview: Whether a node is in preview mode.
+ * - node--view-mode-[view_mode]: The View Mode of the node; for example, a
+ * teaser would result in: "node--view-mode-teaser", and
+ * full: "node--view-mode-full".
+ * - node--preview: Whether a node is in preview mode.
* The following are controlled through the node publishing options.
- * - promoted: Appears on nodes promoted to the front page.
- * - sticky: Appears on nodes ordered above other non-sticky nodes in teaser
- * listings.
- * - unpublished: Appears on unpublished nodes visible only to site admins.
+ * - node--promoted: Appears on nodes promoted to the front page.
+ * - node--sticky: Appears on nodes ordered above other non-sticky nodes in
+ * teaser listings.
+ * - node--unpublished: Appears on unpublished nodes visible only to site
+ * admins.
* - title_prefix: Additional output populated by modules, intended to be
* displayed in front of the main title tag that appears in the template.
* - title_suffix: Additional output populated by modules, intended to be
@@ -76,27 +77,34 @@
* @ingroup themeable
*/
#}
-<article id="node-{{ node.id }}" class="{{ attributes.class }} clearfix"{{ attributes|without('id', 'class') }}>
+<article{{ attributes }}>
{{ title_prefix }}
{% if not page %}
<h2{{ title_attributes }}>
- <a href="{{ node_url }}" rel="bookmark">{{ label }}</a>
+ <a href="{{ url }}" rel="bookmark">{{ label }}</a>
</h2>
{% endif %}
{{ title_suffix }}
{% if display_submitted %}
- <footer>
- {{ user_picture }}
- <p class="submitted">{{ submitted }}</p>
+ <footer class="node__meta">
+ {{ author_picture }}
+ <div class="node__submitted {{ author_attributes.class }}"{{ author_attributes|without('class') }}>
+ {% trans %}Submitted by {{ author_name|passthrough }} on {{ date }}{% endtrans %}
+ {{ metadata }}
+ </div>
</footer>
{% endif %}
- <div{{ content_attributes }}>
+ <div class="node__content {{ content_attributes.class }}"{{ content_attributes|without('class') }}>
{{ content|without('links') }}
</div>
- {{ content.links }}
+ {% if content.links %}
+ <div class="node__links">
+ {{ content.links }}
+ </div>
+ {% endif %}
</article>