diff --git a/core/modules/layout/layout.admin.inc b/core/modules/layout/layout.admin.inc deleted file mode 100644 index 53ac47b..0000000 --- a/core/modules/layout/layout.admin.inc +++ /dev/null @@ -1,34 +0,0 @@ -getDefinition($key); - drupal_set_title(t('View template %name', array('%name' => $layout['title'])), PASS_THROUGH); - - // Render the layout in an admin context with region demonstrations. - $instance = layout_manager()->createInstance($key, array()); - $regions = $instance->getRegions(); - foreach ($regions as $region => $info) { - $regions[$region] = '
' . check_plain($info['label']) . '
'; - } - $build['demonstration'] = array( - '#markup' => $instance->renderLayout(TRUE, $regions), - ); - $build['#attached']['css'][] = drupal_get_path('module', 'layout') . '/css/layout.admin.css'; - return $build; -} diff --git a/core/modules/layout/layout.module b/core/modules/layout/layout.module index 17acc6d..9c40b54 100644 --- a/core/modules/layout/layout.module +++ b/core/modules/layout/layout.module @@ -16,30 +16,12 @@ function layout_menu() { ); $items['admin/structure/templates/manage/%'] = array( 'title' => 'View template', - 'page callback' => 'layout_page_view', - 'page arguments' => array(4), - 'access callback' => 'layout_user_access', - 'access arguments' => array(4), - 'file' => 'layout.admin.inc', + 'route_name' => 'layout_page_view', ); return $items; } /** - * Access callback: Checks the existence of a layout. - * - * @param string $key - * The key of the page layout being requested. - * - * @return bool - * TRUE if the current user can access page layout menu items; FALSE - * otherwise. - */ -function layout_user_access($key) { - return (user_access('administer layouts') && layout_manager()->getDefinition($key)); -} - -/** * Implements hook_permission(). */ function layout_permission() { diff --git a/core/modules/layout/layout.routing.yml b/core/modules/layout/layout.routing.yml index d1cd540..c400024 100644 --- a/core/modules/layout/layout.routing.yml +++ b/core/modules/layout/layout.routing.yml @@ -4,3 +4,9 @@ layout_page_list: _content: '\Drupal\layout\Controller\LayoutController::layoutPageList' requirements: _permission: 'administer layouts' +layout_page_view: + pattern: '/admin/structure/templates/manage/{key}' + defaults: + _content: '\Drupal\layout\Controller\LayoutController::layoutPageView' + requirements: + _layout_user_access: 'TRUE' diff --git a/core/modules/layout/layout.services.yml b/core/modules/layout/layout.services.yml index d387b77..c882dd9 100644 --- a/core/modules/layout/layout.services.yml +++ b/core/modules/layout/layout.services.yml @@ -2,3 +2,8 @@ services: plugin.manager.layout: class: Drupal\layout\Plugin\Type\LayoutManager arguments: ['@container.namespaces'] + access_check.layout: + class: Drupal\layout\Access\LayoutAccessCheck + arguments: ['@plugin.manager.layout'] + tags: + - { name: access_check } diff --git a/core/modules/layout/lib/Drupal/layout/Access/LayoutAccessCheck.php b/core/modules/layout/lib/Drupal/layout/Access/LayoutAccessCheck.php new file mode 100644 index 0000000..ea3f088 --- /dev/null +++ b/core/modules/layout/lib/Drupal/layout/Access/LayoutAccessCheck.php @@ -0,0 +1,51 @@ +layoutManager = $layout_manager; + } + + /** + * {@inheritdoc} + */ + public function applies(Route $route) { + return array_key_exists('_layout_user_access', $route->getRequirements()); + } + + /** + * {@inheritdoc} + */ + public function access(Route $route, Request $request) { + return user_access('administer layouts') && $this->layoutManager->getDefinition($request->attributes->get('key')) ? static::ALLOW : static::DENY; + } + +} diff --git a/core/modules/layout/lib/Drupal/layout/Controller/LayoutController.php b/core/modules/layout/lib/Drupal/layout/Controller/LayoutController.php index b9ad7f9..a572810 100644 --- a/core/modules/layout/lib/Drupal/layout/Controller/LayoutController.php +++ b/core/modules/layout/lib/Drupal/layout/Controller/LayoutController.php @@ -6,6 +6,7 @@ namespace Drupal\layout\Controller; +use Drupal\Component\Utility\String; use Drupal\Core\Controller\ControllerInterface; use Drupal\layout\Plugin\Type\LayoutManager; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -76,4 +77,31 @@ public function layoutPageList() { t('module'); t('theme'); } + + /** + * Demonstrates a layout template. + * + * @param string $key + * The key of the page layout being requested. + * + * @return array + * An array as expected by drupal_render(). + */ + public function layoutPageView($key) { + $layout = $this->layoutManager->getDefinition($key); + drupal_set_title(t('View template %name', array('%name' => $layout['title'])), PASS_THROUGH); + + // Render the layout in an admin context with region demonstrations. + $instance = $this->layoutManager->createInstance($key, array()); + $regions = $instance->getRegions(); + foreach ($regions as $region => $info) { + $regions[$region] = '
' . String::checkPlain($info['label']) . '
'; + } + $build['demonstration']['#markup'] = $instance->renderLayout(TRUE, $regions); + + // @todo Convert layout.admin.css to a library. + $build['#attached']['css'][] = drupal_get_path('module', 'layout') . '/layout.admin.css'; + return $build; + } + } diff --git a/core/modules/layout/lib/Drupal/layout/Tests/LayoutDerivativesTest.php b/core/modules/layout/lib/Drupal/layout/Tests/LayoutDerivativesTest.php index f41460c..e5af717 100644 --- a/core/modules/layout/lib/Drupal/layout/Tests/LayoutDerivativesTest.php +++ b/core/modules/layout/lib/Drupal/layout/Tests/LayoutDerivativesTest.php @@ -107,4 +107,5 @@ function testPageLayout() { // Ensure the CSS was added. $this->assertRaw('@import url("' . url('', array('absolute' => TRUE)) . drupal_get_path('theme', 'layout_test_theme') . '/layouts/static/two-col/two-col.css'); } + }