diff --git a/core/modules/node/lib/Drupal/node/NodeFormController.php b/core/modules/node/lib/Drupal/node/NodeFormController.php index 5145a57..0c909d8 100644 --- a/core/modules/node/lib/Drupal/node/NodeFormController.php +++ b/core/modules/node/lib/Drupal/node/NodeFormController.php @@ -318,7 +318,7 @@ protected function actions(array $form, array &$form_state) { public function validate(array $form, array &$form_state) { $node = $this->buildEntity($form, $form_state); - if (isset($node->nid) && (node_last_changed($node->nid) > $node->changed)) { + if (isset($node->nid) && (node_last_changed($node->nid, $this->getFormLangcode($form_state)) > $node->changed)) { form_set_error('changed', t('The content on this page has either been modified by another user, or you have already submitted modifications using this form. As a result, your changes cannot be saved.')); } diff --git a/core/modules/node/lib/Drupal/node/Plugin/views/filter/UidRevision.php b/core/modules/node/lib/Drupal/node/Plugin/views/filter/UidRevision.php index cd00f81..9ca7d89 100644 --- a/core/modules/node/lib/Drupal/node/Plugin/views/filter/UidRevision.php +++ b/core/modules/node/lib/Drupal/node/Plugin/views/filter/UidRevision.php @@ -27,7 +27,7 @@ public function query($group_by = FALSE) { $args = array_values($this->value); $this->query->add_where_expression($this->options['group'], "$this->tableAlias.uid IN($placeholder) OR - ((SELECT COUNT(*) FROM {node_field_revision} npr WHERE npr.revision_uid IN($placeholder) AND npr.nid = $this->tableAlias.nid) > 0)", array($placeholder => $args), + ((SELECT COUNT(DISTINCT vid) FROM {node_field_revision} npr WHERE npr.revision_uid IN($placeholder) AND npr.nid = $this->tableAlias.nid) > 0)", array($placeholder => $args), $args); } diff --git a/core/modules/node/node.module b/core/modules/node/node.module index d609cb2..35e5e1a 100644 --- a/core/modules/node/node.module +++ b/core/modules/node/node.module @@ -1489,14 +1489,14 @@ function node_user_predelete($account) { // Delete nodes (current revisions). // @todo Introduce node_mass_delete() or make node_mass_update() more flexible. $nodes = db_select('node_field_data', 'n') - ->distinct(TRUE) + ->distinct() ->fields('n', array('nid')) ->condition('uid', $account->uid) ->execute() ->fetchCol(); node_delete_multiple($nodes); // Delete old revisions. - $revisions = db_query('SELECT vid FROM {node_field_revision} WHERE uid = :uid', array(':uid' => $account->uid))->fetchCol(); + $revisions = db_query('SELECT DISTINCT vid FROM {node_field_revision} WHERE uid = :uid', array(':uid' => $account->uid))->fetchCol(); foreach ($revisions as $revision) { node_revision_delete($revision); } @@ -1596,7 +1596,7 @@ function _node_revision_access(EntityInterface $node, $op = 'view', $account = N // different revisions so there is no need for a separate database check. // Also, if you try to revert to or delete the default revision, that's // not good. - if ($node->isDefaultRevision() && (db_query('SELECT COUNT(vid) FROM {node_field_revision} WHERE nid = :nid AND default_langcode = 1', array(':nid' => $node->nid))->fetchField() == 1 || $op == 'update' || $op == 'delete')) { + if ($node->isDefaultRevision() && (db_query('SELECT COUNT(*) FROM {node_field_revision} WHERE nid = :nid AND default_langcode = 1', array(':nid' => $node->nid))->fetchField() == 1 || $op == 'update' || $op == 'delete')) { $access[$cid] = FALSE; } elseif (user_access('administer nodes', $account)) { @@ -1842,12 +1842,16 @@ function node_page_title(EntityInterface $node) { * * @param $nid * The ID of a node. + * @param $langcode + * (optional) The language the node has been last modified in. Defaults to the + * node language. * * @return * A unix timestamp indicating the last time the node was changed. */ -function node_last_changed($nid) { - return db_query('SELECT changed FROM {node_field_data} WHERE nid = :nid ORDER BY changed DESC LIMIT 1', array(':nid' => $nid))->fetch()->changed; +function node_last_changed($nid, $langcode = NULL) { + $language_clause = isset($langcode) ? 'langcode = :langcode' : 'default_langcode = 1'; + return db_query('SELECT changed FROM {node_field_data} WHERE nid = :nid AND ' . $language_clause, array(':nid' => $nid, ':langcode' => $langcode))->fetch()->changed; } /** @@ -1861,14 +1865,7 @@ function node_last_changed($nid) { */ function node_revision_list(EntityInterface $node) { $revisions = array(); - $result = db_query('SELECT nr.vid, nr.title, nr.log, nr.revision_uid AS uid, n.vid AS current_vid, nr.revision_timestamp, u.name ' . - 'FROM {node_field_revision} nr ' . - 'LEFT JOIN {node} n ON n.vid = nr.vid ' . - 'INNER JOIN {users} u ON u.uid = nr.revision_uid ' . - 'WHERE nr.nid = :nid ' . - 'ORDER BY nr.vid DESC', - array(':nid' => $node->nid) - ); + $result = db_query('SELECT nr.vid, nr.title, nr.log, nr.revision_uid AS uid, n.vid AS current_vid, nr.revision_timestamp, u.name FROM {node_field_revision} nr LEFT JOIN {node} n ON n.vid = nr.vid INNER JOIN {users} u ON u.uid = nr.revision_uid WHERE nr.nid = :nid AND nr.default_langcode = 1 ORDER BY nr.vid DESC', array(':nid' => $node->nid)); foreach ($result as $revision) { $revisions[$revision->vid] = $revision; } @@ -1905,6 +1902,7 @@ function node_get_recent($number = 10) { } } $nids = $query + ->distinct() ->fields('n', array('nid')) ->orderBy('n.changed', 'DESC') ->range(0, $number) @@ -2062,6 +2060,9 @@ function node_block_access($block) { * format_xml_elements(). A list of channel elements can be found at the * @link http://cyber.law.harvard.edu/rss/rss.html RSS 2.0 Specification. @endlink * The link should be an absolute URL. + * @param $langcode + * (optional) The language the node has been last modified in. Defaults to the + * node language. * * @todo Convert taxonomy_term_feed() to a view, so this method is not needed * anymore. @@ -2078,9 +2079,10 @@ function node_feed($nids = FALSE, $channel = array()) { if ($nids === FALSE) { $nids = db_select('node_field_data', 'n') - ->fields('n', array('nid', 'created')) + ->fields('n', array('nid')) ->condition('n.promote', 1) ->condition('n.status', 1) + // TODO Should we filter this by language (more performant)? ->groupBy('n.nid') ->orderBy('n.created', 'DESC') ->range(0, $rss_config->get('items.limit')) diff --git a/core/modules/node/node.pages.inc b/core/modules/node/node.pages.inc index 30f1162..9aa4982 100644 --- a/core/modules/node/node.pages.inc +++ b/core/modules/node/node.pages.inc @@ -379,7 +379,7 @@ function node_revision_delete_confirm_submit($form, &$form_state) { watchdog('content', '@type: deleted %title revision %revision.', array('@type' => $node_revision->type, '%title' => $node_revision->label(), '%revision' => $node_revision->vid)); drupal_set_message(t('Revision from %revision-date of @type %title has been deleted.', array('%revision-date' => format_date($node_revision->revision_timestamp), '@type' => node_get_type_label($node_revision), '%title' => $node_revision->label()))); $form_state['redirect'] = 'node/' . $node_revision->nid; - if (db_query('SELECT COUNT(vid) FROM {node_field_revision} WHERE nid = :nid', array(':nid' => $node_revision->nid))->fetchField() > 1) { + if (db_query('SELECT COUNT(DISTINCT vid) FROM {node_field_revision} WHERE nid = :nid', array(':nid' => $node_revision->nid))->fetchField() > 1) { $form_state['redirect'] .= '/revisions'; } }