diff --git a/core/modules/views/src/Plugin/views/display/PathPluginBase.php b/core/modules/views/src/Plugin/views/display/PathPluginBase.php index 2087805..53b34a0 100644 --- a/core/modules/views/src/Plugin/views/display/PathPluginBase.php +++ b/core/modules/views/src/Plugin/views/display/PathPluginBase.php @@ -129,7 +129,7 @@ protected function defineOptions() { protected function getRoute($view_id, $display_id) { $defaults = array( '_controller' => 'Drupal\views\Routing\ViewPageController::handle', - '_title_callback' => get_class($this) . '::getTitle', + '_title_callback' => 'Drupal\views\Routing\ViewPageController::getTitle', 'view_id' => $view_id, 'display_id' => $display_id, '_view_display_show_admin_links' => $this->getOption('show_admin_links'), @@ -533,18 +533,4 @@ public function remove() { } } - /** - * Title callback. - * - * Using callback as direct call to getTitle(() in route definition causing - * issues with configuration translation system. - * - * @see https://www.drupal.org/node/2650434 - * - * @return false|string - */ - public function getTitle() { - return $this->view->getTitle(); - } - } diff --git a/core/modules/views/src/Routing/ViewPageController.php b/core/modules/views/src/Routing/ViewPageController.php index dc9153c..2df32d8 100644 --- a/core/modules/views/src/Routing/ViewPageController.php +++ b/core/modules/views/src/Routing/ViewPageController.php @@ -4,6 +4,9 @@ use Drupal\Core\Routing\RouteMatchInterface; use Drupal\views\Plugin\views\display\Page; +use Drupal\views\ViewExecutableFactory; +use Symfony\Component\DependencyInjection\ContainerInterface; +use Drupal\Core\Entity\EntityManagerInterface; /** * Defines a page controller to execute and render a view. @@ -11,6 +14,43 @@ class ViewPageController { /** + * The entity manager. + * + * @var \Drupal\Core\Entity\EntityManagerInterface + */ + protected $entityManager; + + /** + * The view executable factory. + * + * @var \Drupal\views\ViewExecutableFactory + */ + protected $viewExecutableFactory; + + /** + * Constructs a new ViewPageController. + * + * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager + * The entity manager + * @param \Drupal\views\ViewExecutableFactory $view_executable_factory + * The view executable factory + */ + public function __construct(EntityManagerInterface $entity_manager, ViewExecutableFactory $view_executable_factory) { + $this->entityManager = $entity_manager; + $this->viewExecutableFactory = $view_executable_factory; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container) { + return new static( + $container->get('entity.manager'), + $container->get('views.executable') + ); + } + + /** * Handler a response for a given view and display. * * @param string $view_id @@ -61,4 +101,22 @@ public function handle($view_id, $display_id, RouteMatchInterface $route_match) } } + /** + * Title callback. + * + * Using callback as direct call to getTitle(() in route definition causing + * issues with configuration translation system. + * + * @see https://www.drupal.org/node/2650434 + * + * @return false|string + */ + public function getTitle($view_id, $display_id, RouteMatchInterface $route_match) { + $view_entity = $this->entityManager->getStorage('view')->load($view_id); + $view = $this->viewExecutableFactory->get($view_entity); + $view->setDisplay($display_id); + $view->initDisplay(); + return $view->getTitle(); + } + } diff --git a/core/modules/views/tests/src/Unit/Plugin/display/PathPluginBaseTest.php b/core/modules/views/tests/src/Unit/Plugin/display/PathPluginBaseTest.php index 9241a35..0b9d0a8 100644 --- a/core/modules/views/tests/src/Unit/Plugin/display/PathPluginBaseTest.php +++ b/core/modules/views/tests/src/Unit/Plugin/display/PathPluginBaseTest.php @@ -108,7 +108,7 @@ public function testCollectRoutes() { $this->assertEquals('test_id', $route->getDefault('view_id')); $this->assertEquals('page_1', $route->getDefault('display_id')); $this->assertSame(FALSE, $route->getOption('returns_response')); - $this->assertEquals('my views title', $route->getDefault('_title')); + $this->assertEquals('Drupal\views\Routing\ViewPageController::getTitle', $route->getDefault('_title_callback')); } /** @@ -135,7 +135,7 @@ public function testCollectRoutesWithDisplayReturnResponse() { $this->pathPlugin->collectRoutes($collection); $route = $collection->get('view.test_id.page_1'); $this->assertSame(TRUE, $route->getOption('returns_response')); - $this->assertEquals('my views title', $route->getDefault('_title')); + $this->assertEquals('Drupal\views\Routing\ViewPageController::getTitle', $route->getDefault('_title_callback')); } /** @@ -163,7 +163,7 @@ public function testCollectRoutesWithArguments() { $this->assertEquals('test_id', $route->getDefault('view_id')); $this->assertEquals('page_1', $route->getDefault('display_id')); $this->assertEquals(array('arg_0' => 'arg_0'), $route->getOption('_view_argument_map')); - $this->assertEquals('my views title', $route->getDefault('_title')); + $this->assertEquals('Drupal\views\Routing\ViewPageController::getTitle', $route->getDefault('_title_callback')); } /** @@ -194,7 +194,7 @@ public function testCollectRoutesWithArgumentsNotSpecifiedInPath() { $this->assertEquals('test_id', $route->getDefault('view_id')); $this->assertEquals('page_1', $route->getDefault('display_id')); $this->assertEquals(array('arg_0' => 'arg_0'), $route->getOption('_view_argument_map')); - $this->assertEquals('my views title', $route->getDefault('_title')); + $this->assertEquals('Drupal\views\Routing\ViewPageController::getTitle', $route->getDefault('_title_callback')); } /** @@ -220,7 +220,7 @@ public function testCollectRoutesWithSpecialRouteName() { $this->assertTrue($route instanceof Route); $this->assertEquals('test_id', $route->getDefault('view_id')); $this->assertEquals('page_1', $route->getDefault('display_id')); - $this->assertEquals('my views title', $route->getDefault('_title')); + $this->assertEquals('Drupal\views\Routing\ViewPageController::getTitle', $route->getDefault('_title_callback')); } /** @@ -250,7 +250,7 @@ public function testAlterRoute() { $this->assertTrue($route instanceof Route); $this->assertEquals('test_id', $route->getDefault('view_id')); $this->assertEquals('page_1', $route->getDefault('display_id')); - $this->assertEquals('my views title', $route->getDefault('_title')); + $this->assertEquals('Drupal\views\Routing\ViewPageController::getTitle', $route->getDefault('_title_callback')); // Ensure that the test_route_2 is not overridden. $route = $collection->get('test_route_2'); @@ -295,7 +295,7 @@ public function testAlterRestRoute() { $this->assertTrue($route instanceof Route); $this->assertEquals('test_id', $route->getDefault('view_id')); $this->assertEquals('page_1', $route->getDefault('display_id')); - $this->assertEquals('my views title', $route->getDefault('_title')); + $this->assertEquals('Drupal\views\Routing\ViewPageController::getTitle', $route->getDefault('_title_callback')); } /** @@ -326,7 +326,6 @@ public function testAlterRouteWithAlterCallback() { $this->assertEquals('test_id', $route->getDefault('view_id')); $this->assertEquals('\Drupal\Tests\views\Unit\Plugin\display\TestController::testTitle', $route->getDefault('_title_callback')); $this->assertEquals('page_1', $route->getDefault('display_id')); - $this->assertEquals('my views title', $route->getDefault('_title')); // Ensure that the test_route_2 is not overridden. $route = $collection->get('test_route_2'); @@ -367,7 +366,7 @@ public function testCollectRoutesWithNamedParameters() { $this->assertEquals('/test_route/{node}/example', $route->getPath()); $this->assertEquals('test_id', $route->getDefault('view_id')); $this->assertEquals('page_1', $route->getDefault('display_id')); - $this->assertEquals('my views title', $route->getDefault('_title')); + $this->assertEquals('Drupal\views\Routing\ViewPageController::getTitle', $route->getDefault('_title_callback')); $this->assertEquals(array('arg_0' => 'node'), $route->getOption('_view_argument_map')); } @@ -405,7 +404,7 @@ public function testAlterRoutesWithParameters() { // Ensure that the path did not changed and placeholders are respected. $this->assertEquals('/test_route/{parameter}', $route->getPath()); $this->assertEquals(array('arg_0' => 'parameter'), $route->getOption('_view_argument_map')); - $this->assertEquals('my views title', $route->getDefault('_title')); + $this->assertEquals('Drupal\views\Routing\ViewPageController::getTitle', $route->getDefault('_title_callback')); } /** @@ -443,7 +442,7 @@ public function testAlterRoutesWithParametersAndUpcasting() { // Ensure that the path did not changed and placeholders are respected kk. $this->assertEquals('/test_route/{parameter}', $route->getPath()); $this->assertEquals(['arg_0' => 'parameter'], $route->getOption('_view_argument_map')); - $this->assertEquals('my views title', $route->getDefault('_title')); + $this->assertEquals('Drupal\views\Routing\ViewPageController::getTitle', $route->getDefault('_title_callback')); } /** @@ -478,7 +477,7 @@ public function testAlterRoutesWithOptionalParameters() { // Ensure that the path did not changed and placeholders are respected. $this->assertEquals('/test_route/{parameter}/{arg_1}', $route->getPath()); $this->assertEquals(array('arg_0' => 'parameter'), $route->getOption('_view_argument_map')); - $this->assertEquals('my views title', $route->getDefault('_title')); + $this->assertEquals('Drupal\views\Routing\ViewPageController::getTitle', $route->getDefault('_title_callback')); } /**