Issue #2822881 by Jo Fitzgerald, tstoeckler: Improve Entity URI checking in menu link migration
parent
2ccc8338e6
commit
562a549b8d
|
@ -20,7 +20,7 @@ process:
|
|||
plugin: skip_on_empty
|
||||
method: row
|
||||
'link/uri':
|
||||
plugin: d7_internal_uri
|
||||
plugin: link_uri
|
||||
source:
|
||||
- link_path
|
||||
'link/options': options
|
||||
|
|
|
@ -63,6 +63,9 @@ class LinkUri extends ProcessPluginBase implements ContainerFactoryPluginInterfa
|
|||
$path = ltrim($path, '/');
|
||||
|
||||
if (parse_url($path, PHP_URL_SCHEME) === NULL) {
|
||||
if ($path == '<front>') {
|
||||
$path = '';
|
||||
}
|
||||
$path = 'internal:/' . $path;
|
||||
|
||||
// Convert entity URIs to the entity scheme, if the path matches a route
|
||||
|
|
|
@ -2,42 +2,12 @@
|
|||
|
||||
namespace Drupal\menu_link_content\Plugin\migrate\process\d7;
|
||||
|
||||
use Drupal\migrate\MigrateExecutableInterface;
|
||||
use Drupal\migrate\ProcessPluginBase;
|
||||
use Drupal\migrate\Row;
|
||||
use Drupal\menu_link_content\Plugin\migrate\process\LinkUri;
|
||||
|
||||
/**
|
||||
* Process a path into an 'internal:' URI.
|
||||
* Processes an internal uri into an 'internal:' or 'entity:' URI.
|
||||
*
|
||||
* @MigrateProcessPlugin(
|
||||
* id = "d7_internal_uri"
|
||||
* )
|
||||
* @deprecated in Drupal 8.2.0, will be removed before Drupal 9.0.0. Use
|
||||
* \Drupal\menu_link_content\Plugin\migrate\process\LinkUri instead.
|
||||
*/
|
||||
class InternalUri extends ProcessPluginBase {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
|
||||
list($path) = $value;
|
||||
$path = ltrim($path, '/');
|
||||
|
||||
if (parse_url($path, PHP_URL_SCHEME) == NULL) {
|
||||
// If $path is the node page (i.e. node/[nid]) then return entity path.
|
||||
if (preg_match('/^node\/\d+$/', $path)) {
|
||||
// "entity: URI"s enable the menu link to appear in the Menu Settings
|
||||
// section on the node edit page. Other entities (e.g. taxonomy terms,
|
||||
// users) do not have the Menu Settings section.
|
||||
return 'entity:' . $path;
|
||||
}
|
||||
elseif ($path == '<front>') {
|
||||
return 'internal:/';
|
||||
}
|
||||
else {
|
||||
return 'internal:/' . $path;
|
||||
}
|
||||
}
|
||||
return $path;
|
||||
}
|
||||
|
||||
}
|
||||
class InternalUri extends LinkUri {}
|
||||
|
|
|
@ -5,6 +5,7 @@ namespace Drupal\Tests\menu_link_content\Kernel\Migrate\d7;
|
|||
use Drupal\Core\Menu\MenuTreeParameters;
|
||||
use Drupal\menu_link_content\Entity\MenuLinkContent;
|
||||
use Drupal\menu_link_content\MenuLinkContentInterface;
|
||||
use Drupal\node\Entity\Node;
|
||||
use Drupal\Tests\migrate_drupal\Kernel\d7\MigrateDrupal7TestBase;
|
||||
|
||||
/**
|
||||
|
@ -18,7 +19,7 @@ class MigrateMenuLinkTest extends MigrateDrupal7TestBase {
|
|||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static $modules = array('link', 'menu_ui', 'menu_link_content');
|
||||
public static $modules = array('link', 'menu_ui', 'menu_link_content', 'node');
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
|
@ -26,6 +27,13 @@ class MigrateMenuLinkTest extends MigrateDrupal7TestBase {
|
|||
protected function setUp() {
|
||||
parent::setUp();
|
||||
$this->installEntitySchema('menu_link_content');
|
||||
$this->installEntitySchema('node');
|
||||
$node = Node::create([
|
||||
'nid' => 3,
|
||||
'title' => 'node link test',
|
||||
'type' => 'article',
|
||||
]);
|
||||
$node->save();
|
||||
$this->executeMigrations(['d7_menu', 'd7_menu_links']);
|
||||
\Drupal::service('router.builder')->rebuild();
|
||||
}
|
||||
|
|
|
@ -117,6 +117,10 @@ class LinkUriTest extends UnitTestCase {
|
|||
$expected = 'internal:/test';
|
||||
$tests['without_scheme'] = [$value, $expected];
|
||||
|
||||
$value = ['<front>'];
|
||||
$expected = 'internal:/';
|
||||
$tests['front'] = [$value, $expected];
|
||||
|
||||
$url = Url::fromRoute('route_name');
|
||||
$tests['with_route'] = [$value, $expected, $url];
|
||||
|
||||
|
|
|
@ -1,73 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\menu_link_content\Unit\Plugin\migrate\process\d7;
|
||||
|
||||
use Drupal\menu_link_content\Plugin\migrate\process\d7\InternalUri;
|
||||
use Drupal\migrate\MigrateExecutableInterface;
|
||||
use Drupal\migrate\Row;
|
||||
use Drupal\Tests\UnitTestCase;
|
||||
|
||||
/**
|
||||
* Tests \Drupal\menu_link_content\Plugin\migrate\process\d7\InternalUri.
|
||||
*
|
||||
* @group menu_link_content
|
||||
*
|
||||
* @coversDefaultClass \Drupal\menu_link_content\Plugin\migrate\process\d7\InternalUri
|
||||
*/
|
||||
class InternalUriTest extends UnitTestCase {
|
||||
|
||||
/**
|
||||
* The 'd7_internal_uri' process plugin being tested.
|
||||
*
|
||||
* @var \Drupal\menu_link_content\Plugin\migrate\process\d7\InternalUri
|
||||
*/
|
||||
protected $processPlugin;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
$this->processPlugin = new InternalUri([], 'd7_internal_uri', []);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests InternalUri::transform().
|
||||
*
|
||||
* @param array $value
|
||||
* The value to pass to InternalUri::transform().
|
||||
* @param string $expected
|
||||
* The expected return value of InternalUri::transform().
|
||||
*
|
||||
* @dataProvider providerTestTransform
|
||||
*
|
||||
* @covers ::transform
|
||||
*/
|
||||
public function testTransform(array $value, $expected) {
|
||||
$migrate_executable = $this->prophesize(MigrateExecutableInterface::class);
|
||||
$row = $this->prophesize(Row::class);
|
||||
|
||||
$actual = $this->processPlugin->transform($value, $migrate_executable->reveal(), $row->reveal(), 'link/uri');
|
||||
$this->assertEquals($expected, $actual);
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides test cases for InternalUriTest::testTransform().
|
||||
*
|
||||
* @return array
|
||||
* An array of test cases, each which the following values:
|
||||
* - The value array to pass to InternalUri::transform().
|
||||
* - The expected path returned by InternalUri::transform().
|
||||
*/
|
||||
public function providerTestTransform() {
|
||||
$tests = [];
|
||||
$tests['with_scheme'] = [['http://example.com'], 'http://example.com'];
|
||||
$tests['leading_slash'] = [['/test'], 'internal:/test'];
|
||||
$tests['without_scheme'] = [['test'], 'internal:/test'];
|
||||
$tests['front'] = [['<front>'], 'internal:/'];
|
||||
$tests['node'] = [['node/27'], 'entity:node/27'];
|
||||
return $tests;
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue