Update to Drupal 8.0.6. For more information, see https://www.drupal.org/drupal-8.0.6-release-notes
This commit is contained in:
parent
4297c64508
commit
b11a755ba8
159 changed files with 2340 additions and 543 deletions
|
@ -108,10 +108,10 @@ function _node_mass_update_helper(NodeInterface $node, array $updates, $langcode
|
|||
* @param bool $revisions
|
||||
* (optional) TRUE if $nodes contains an array of revision IDs instead of
|
||||
* node IDs. Defaults to FALSE; will be ignored if $load is FALSE.
|
||||
* @param array $context
|
||||
* @param array|\ArrayAccess $context.
|
||||
* An array of contextual key/values.
|
||||
*/
|
||||
function _node_mass_update_batch_process(array $nodes, array $updates, $load, $revisions, array &$context) {
|
||||
function _node_mass_update_batch_process(array $nodes, array $updates, $load, $revisions, &$context) {
|
||||
if (!isset($context['sandbox']['progress'])) {
|
||||
$context['sandbox']['progress'] = 0;
|
||||
$context['sandbox']['max'] = count($nodes);
|
||||
|
|
|
@ -1046,18 +1046,29 @@ function node_query_node_access_alter(AlterableInterface $query) {
|
|||
|
||||
$tables = $query->getTables();
|
||||
$base_table = $query->getMetaData('base_table');
|
||||
// If the base table is not given, default to node if present.
|
||||
// If the base table is not given, default to one of the node base tables.
|
||||
if (!$base_table) {
|
||||
/** @var \Drupal\Core\Entity\Sql\DefaultTableMapping $table_mapping */
|
||||
$table_mapping = \Drupal::entityTypeManager()->getStorage('node')->getTableMapping();
|
||||
$node_base_tables = $table_mapping->getTableNames();
|
||||
|
||||
foreach ($tables as $table_info) {
|
||||
if (!($table_info instanceof SelectInterface)) {
|
||||
$table = $table_info['table'];
|
||||
// If the node table is in the query, it wins immediately.
|
||||
// Ensure that 'node' and 'node_field_data' are always preferred over
|
||||
// 'node_revision' and 'node_field_revision'.
|
||||
if ($table == 'node' || $table == 'node_field_data') {
|
||||
$base_table = $table;
|
||||
break;
|
||||
}
|
||||
// If one of the node base tables are in the query, add it to the list
|
||||
// of possible base tables to join against.
|
||||
if (in_array($table, $node_base_tables)) {
|
||||
$base_table = $table;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Bail out if the base table is missing.
|
||||
if (!$base_table) {
|
||||
throw new Exception(t('Query tagged for node access but there is no node table, specify the base_table using meta data.'));
|
||||
|
|
|
@ -14,7 +14,7 @@ use Drupal\user\PrivateTempStoreFactory;
|
|||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
|
||||
/**
|
||||
* Form controller for the node edit forms.
|
||||
* Form handler for the node edit forms.
|
||||
*/
|
||||
class NodeForm extends ContentEntityForm {
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ use Drupal\Core\Language\LanguageManagerInterface;
|
|||
use Drupal\Core\Session\AccountInterface;
|
||||
|
||||
/**
|
||||
* Defines a controller class that handles the node grants system.
|
||||
* Defines a storage handler class that handles the node grants system.
|
||||
*
|
||||
* This is used to build node query access.
|
||||
*
|
||||
|
|
|
@ -12,7 +12,7 @@ use Drupal\Core\Session\AccountInterface;
|
|||
use Drupal\Core\Language\LanguageInterface;
|
||||
|
||||
/**
|
||||
* Defines the controller class for nodes.
|
||||
* Defines the storage handler class for nodes.
|
||||
*
|
||||
* This extends the base storage class, adding required special handling for
|
||||
* node entities.
|
||||
|
|
|
@ -15,7 +15,7 @@ use Drupal\language\Entity\ContentLanguageSettings;
|
|||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
|
||||
/**
|
||||
* Form controller for node type forms.
|
||||
* Form handler for node type forms.
|
||||
*/
|
||||
class NodeTypeForm extends BundleEntityFormBase {
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@ use Drupal\Core\Entity\EntityViewBuilder;
|
|||
use Drupal\node\Entity\Node;
|
||||
|
||||
/**
|
||||
* Render controller for nodes.
|
||||
* View builder handler for nodes.
|
||||
*/
|
||||
class NodeViewBuilder extends EntityViewBuilder {
|
||||
|
||||
|
|
|
@ -231,7 +231,7 @@ class NodeSearch extends ConfigurableSearchPluginBase implements AccessibleInter
|
|||
->select('search_index', 'i', array('target' => 'replica'))
|
||||
->extend('Drupal\search\SearchQuery')
|
||||
->extend('Drupal\Core\Database\Query\PagerSelectExtender');
|
||||
$query->join('node_field_data', 'n', 'n.nid = i.sid');
|
||||
$query->join('node_field_data', 'n', 'n.nid = i.sid AND n.langcode = i.langcode');
|
||||
$query->condition('n.status', 1)
|
||||
->addTag('node_access')
|
||||
->searchExpression($keys, $this->getPluginId());
|
||||
|
@ -429,8 +429,23 @@ class NodeSearch extends ConfigurableSearchPluginBase implements AccessibleInter
|
|||
// per cron run.
|
||||
$limit = (int) $this->searchSettings->get('index.cron_limit');
|
||||
|
||||
$result = $this->database->queryRange("SELECT n.nid, MAX(sd.reindex) FROM {node} n LEFT JOIN {search_dataset} sd ON sd.sid = n.nid AND sd.type = :type WHERE sd.sid IS NULL OR sd.reindex <> 0 GROUP BY n.nid ORDER BY MAX(sd.reindex) is null DESC, MAX(sd.reindex) ASC, n.nid ASC", 0, $limit, array(':type' => $this->getPluginId()), array('target' => 'replica'));
|
||||
$nids = $result->fetchCol();
|
||||
$query = db_select('node', 'n', array('target' => 'replica'));
|
||||
$query->addField('n', 'nid');
|
||||
$query->leftJoin('search_dataset', 'sd', 'sd.sid = n.nid AND sd.type = :type', array(':type' => $this->getPluginId()));
|
||||
$query->addExpression('CASE MAX(sd.reindex) WHEN NULL THEN 0 ELSE 1 END', 'ex');
|
||||
$query->addExpression('MAX(sd.reindex)', 'ex2');
|
||||
$query->condition(
|
||||
$query->orConditionGroup()
|
||||
->where('sd.sid IS NULL')
|
||||
->condition('sd.reindex', 0, '<>')
|
||||
);
|
||||
$query->orderBy('ex', 'DESC')
|
||||
->orderBy('ex2')
|
||||
->orderBy('n.nid')
|
||||
->groupBy('n.nid')
|
||||
->range(0, $limit);
|
||||
|
||||
$nids = $query->execute()->fetchCol();
|
||||
if (!$nids) {
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
|
|||
class Type extends StringArgument {
|
||||
|
||||
/**
|
||||
* NodeType storage controller.
|
||||
* NodeType storage handler.
|
||||
*
|
||||
* @var \Drupal\Core\Entity\EntityStorageInterface
|
||||
*/
|
||||
|
|
|
@ -57,6 +57,30 @@ class MigrateNodeTest extends MigrateNodeTestBase {
|
|||
$this->assertIdentical('test rev 3', $node->body->value);
|
||||
$this->assertIdentical('filtered_html', $node->body->format);
|
||||
|
||||
// Test that link fields are migrated.
|
||||
$this->assertIdentical('http://groups.drupal.org/', $node->field_test_link->uri);
|
||||
$this->assertIdentical('Drupal Groups', $node->field_test_link->title);
|
||||
$this->assertIdentical([], $node->field_test_link->options['attributes']);
|
||||
|
||||
// Rerun migration with invalid link attributes and a different URL and
|
||||
// title. If only the attributes are changed the error does not occur.
|
||||
Database::getConnection('default', 'migrate')
|
||||
->update('content_type_story')
|
||||
->fields([
|
||||
'field_test_link_url' => 'https://www.drupal.org/node/2127611',
|
||||
'field_test_link_title' => 'Migrate API in Drupal 8',
|
||||
'field_test_link_attributes' => '',
|
||||
])
|
||||
->condition('nid', '2')
|
||||
->condition('vid', '3')
|
||||
->execute();
|
||||
|
||||
$this->rerunMigration();
|
||||
$node = Node::load(2);
|
||||
$this->assertIdentical('https://www.drupal.org/node/2127611', $node->field_test_link->uri);
|
||||
$this->assertIdentical('Migrate API in Drupal 8', $node->field_test_link->title);
|
||||
$this->assertIdentical([], $node->field_test_link->options['attributes']);
|
||||
|
||||
// Test that we can re-import using the EntityContentBase destination.
|
||||
$title = $this->rerunMigration();
|
||||
$node = Node::load(2);
|
||||
|
|
|
@ -72,6 +72,24 @@ class NodeQueryAlterTest extends NodeTestBase {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests 'node_access' query alter with revision-enabled nodes.
|
||||
*/
|
||||
public function testNodeQueryAlterWithRevisions() {
|
||||
// Execute a query that only deals with the 'node_revision' table.
|
||||
try {
|
||||
$query = \Drupal::entityTypeManager()->getStorage('node')->getQuery();
|
||||
$result = $query
|
||||
->allRevisions()
|
||||
->execute();
|
||||
|
||||
$this->assertEqual(count($result), 4, 'User with access can see correct nodes');
|
||||
}
|
||||
catch (\Exception $e) {
|
||||
$this->fail('Altered query is malformed');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests 'node_access' query alter, for user without access.
|
||||
*
|
||||
|
|
|
@ -14,6 +14,10 @@ use Drupal\simpletest\WebTestBase;
|
|||
/**
|
||||
* Ensures that node types translation work correctly.
|
||||
*
|
||||
* Note that the child site is installed in French; therefore, when making
|
||||
* assertions on translated text it is important to provide a langcode. This
|
||||
* ensures the asserts pass regardless of the Drupal version.
|
||||
*
|
||||
* @group node
|
||||
*/
|
||||
class NodeTypeTranslationTest extends WebTestBase {
|
||||
|
@ -105,12 +109,16 @@ class NodeTypeTranslationTest extends WebTestBase {
|
|||
// Check the name is translated without admin theme for editing.
|
||||
$this->drupalPostForm('admin/appearance', array('use_admin_theme' => '0'), t('Save configuration'));
|
||||
$this->drupalGet("$langcode/node/add/$type");
|
||||
$this->assertRaw(t('Create @name', array('@name' => $translated_name)));
|
||||
// This is a Spanish page, so ensure the text asserted is translated in
|
||||
// Spanish and not French by adding the langcode option.
|
||||
$this->assertRaw(t('Create @name', array('@name' => $translated_name), array('langcode' => $langcode)));
|
||||
|
||||
// Check the name is translated with admin theme for editing.
|
||||
$this->drupalPostForm('admin/appearance', array('use_admin_theme' => '1'), t('Save configuration'));
|
||||
$this->drupalGet("$langcode/node/add/$type");
|
||||
$this->assertRaw(t('Create @name', array('@name' => $translated_name)));
|
||||
// This is a Spanish page, so ensure the text asserted is translated in
|
||||
// Spanish and not French by adding the langcode option.
|
||||
$this->assertRaw(t('Create @name', array('@name' => $translated_name), array('langcode' => $langcode)));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -128,17 +136,19 @@ class NodeTypeTranslationTest extends WebTestBase {
|
|||
|
||||
// Assert that the title label is displayed on the translation form with the right value.
|
||||
$this->drupalGet("admin/structure/types/manage/$type/translate/$langcode/add");
|
||||
$this->assertRaw(t('Label'));
|
||||
$this->assertRaw(t('Edited title'));
|
||||
$this->assertText('Edited title');
|
||||
|
||||
// Translate the title label.
|
||||
$this->drupalPostForm(NULL, array("translation[config_names][core.base_field_override.node.$type.title][label]" => 'Translated title'), t('Save translation'));
|
||||
|
||||
// Assert that the right title label is displayed on the node add form.
|
||||
// Assert that the right title label is displayed on the node add form. The
|
||||
// translations are created in this test; therefore, the assertions do not
|
||||
// use t(). If t() were used then the correct langcodes would need to be
|
||||
// provided.
|
||||
$this->drupalGet("node/add/$type");
|
||||
$this->assertRaw(t('Edited title'));
|
||||
$this->assertText('Edited title');
|
||||
$this->drupalGet("$langcode/node/add/$type");
|
||||
$this->assertRaw(t('Translated title'));
|
||||
$this->assertText('Translated title');
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Reference in a new issue