Issue #1987638 by vijaycs85, manu4543: Convert block_admin_display() to a new style controller.

8.0.x
Alex Pott 2013-06-19 21:55:29 +02:00
parent 16c9b52dbf
commit a82ea10ba3
8 changed files with 193 additions and 26 deletions

View File

@ -21,23 +21,6 @@ function block_admin_demo($theme = NULL) {
);
}
/**
* Page callback: Shows the block administration page.
*
* @param string $theme
* The theme to display the administration page for.
*
* @return array
* A render array for a page containing a list of blocks.
*
* @see block_menu()
*/
function block_admin_display($theme) {
return Drupal::entityManager()
->getListController('block')
->render($theme);
}
/**
* Page callback: Build the block instance add form.
*

View File

@ -117,10 +117,7 @@ function block_menu() {
$items['admin/structure/block'] = array(
'title' => 'Blocks',
'description' => 'Configure what block content appears in your site\'s sidebars and other regions.',
'page callback' => 'block_admin_display',
'page arguments' => array($default_theme),
'access arguments' => array('administer blocks'),
'file' => 'block.admin.inc',
'route_name' => 'block_admin_display',
);
$items['admin/structure/block/add/%/%'] = array(
'title' => 'Configure block',
@ -160,11 +157,8 @@ function block_menu() {
$theme = $themes[$key];
$items['admin/structure/block/list/' . $plugin_id] = array(
'title' => check_plain($theme->info['name']),
'page arguments' => array($key),
'type' => $key == $default_theme ? MENU_DEFAULT_LOCAL_TASK : MENU_LOCAL_TASK,
'access callback' => '_block_themes_access',
'access arguments' => array($key),
'file' => 'block.admin.inc',
'route_name' => 'block_admin_display.' . $plugin_id
);
$items['admin/structure/block/demo/' . $key] = array(
'title' => check_plain($theme->info['name']),

View File

@ -4,3 +4,11 @@ block_admin_block_delete:
_entity_form: 'block.delete'
requirements:
_permission: 'administer blocks'
block_admin_display:
pattern: '/admin/structure/block'
defaults:
_content: '\Drupal\block\Controller\BlockListController::listing'
entity_type: 'block'
requirements:
_permission: 'administer blocks'

View File

@ -9,3 +9,12 @@ services:
factory_method: get
factory_service: cache_factory
arguments: [block]
block.route_subscriber:
class: Drupal\block\Routing\RouteSubscriber
tags:
- { name: event_subscriber}
arguments: ['@plugin.manager.system.plugin_ui']
block.theme_access_check:
class: Drupal\block\Access\BlockThemeAccessCheck
tags:
- { name: access_check}

View File

@ -0,0 +1,34 @@
<?php
/**
* @file
* Contains \Drupal\block\Access\BlockThemeAccessCheck.
*/
namespace Drupal\block\Access;
use Drupal\Core\Access\AccessCheckInterface;
use Symfony\Component\Routing\Route;
use Symfony\Component\HttpFoundation\Request;
/**
* Checks access for displaying block page.
*/
class BlockThemeAccessCheck implements AccessCheckInterface {
/**
* {@inheritdoc}
*/
public function applies(Route $route) {
return array_key_exists('_block_themes_access', $route->getRequirements());
}
/**
* {@inheritdoc}
*/
public function access(Route $route, Request $request) {
$theme = $request->attributes->get('theme');
return user_access('administer blocks') && drupal_theme_access($theme);
}
}

View File

@ -0,0 +1,67 @@
<?php
/**
* @file
* Contains \Drupal\block\Controller\BlockListController.
*/
namespace Drupal\block\Controller;
use Drupal\Core\Entity\Controller\EntityListController;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Config\ConfigFactory;
use Drupal\Core\Entity\EntityManager;
/**
* Defines a controller to list blocks.
*/
class BlockListController extends EntityListController {
/**
* The configuration factory object.
*
* @var \Drupal\Core\Config\ConfigFactory
*/
protected $configFactory;
/**
* Creates an BlockListController object.
*
* @param \Drupal\Core\Entity\EntityManager $entity_manager
* The entity manager.
* @param \Drupal\Core\Config\ConfigFactory $config_factory
* Configuration factory object.
*/
public function __construct(EntityManager $entity_manager, ConfigFactory $config_factory) {
$this->entityManager = $entity_manager;
$this->configFactory = $config_factory;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('plugin.manager.entity'),
$container->get('config.factory')
);
}
/**
* Shows the block administration page.
*
* @param string $entity_type
* Entity type of list page.
* @param string|null $theme
* Theme key of block list.
*
* @return array
* A render array as expected by drupal_render().
*/
public function listing($entity_type, $theme = NULL) {
$default_theme = $theme ?: $this->configFactory->get('system.theme')->get('default');
return $this->entityManager->getListController($entity_type)->render($default_theme);
}
}

View File

@ -0,0 +1,72 @@
<?php
/**
* @file
* Contains \Drupal\block\Routing\RouteSubscriber.
*/
namespace Drupal\block\Routing;
use Drupal\Core\Routing\RouteBuildEvent;
use Drupal\Core\Routing\RoutingEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Routing\Route;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Component\Plugin\PluginManagerInterface;
/**
* Listens to the dynamic route events.
*/
class RouteSubscriber implements EventSubscriberInterface {
/**
* The injection plugin manager that should be passed into the route.
*
* @var \Drupal\Component\Plugin\PluginManagerInterface
*/
protected $pluginManager;
/**
* Constructs a RouteSubscriber object.
*
* @param \Drupal\Component\Plugin\PluginManagerInterface $plugin_manager
* The service container this object should use.
*/
public function __construct(PluginManagerInterface $plugin_manager) {
$this->pluginManager = $plugin_manager;
}
/**
* Implements EventSubscriberInterface::getSubscribedEvents().
*/
public static function getSubscribedEvents() {
$events[RoutingEvents::DYNAMIC] = 'routes';
return $events;
}
/**
* Generate dynamic routes for various block pages.
*
* @param \Drupal\Core\Routing\RouteBuildEvent $event
* The route building event.
*
* @return \Symfony\Component\Routing\RouteCollection
* The route collection that contains the new dynamic route.
*/
public function routes(RouteBuildEvent $event) {
$collection = $event->getRouteCollection();
foreach ($this->pluginManager->getDefinitions() as $plugin_id => $plugin) {
list($plugin_base, $key) = explode(':', $plugin_id);
if ($plugin_base == 'block_plugin_ui') {
$route = new Route('admin/structure/block/list/' . $plugin_id, array(
'_controller' => '\Drupal\block\Controller\BlockListController::listing',
'entity_type' => 'block',
'theme' => $key,
), array(
'_block_themes_access' => 'TRUE',
));
$collection->add('block_admin_display.' . $plugin_id, $route);
}
}
}
}

View File

@ -27,7 +27,7 @@ class BlockStorageUnitTest extends DrupalUnitTestBase {
*
* @var array
*/
public static $modules = array('block', 'block_test');
public static $modules = array('block', 'block_test', 'system');
/**
* The block storage controller.