diff --git a/core/modules/block/block.module b/core/modules/block/block.module index 5be7c27..75cf58c 100644 --- a/core/modules/block/block.module +++ b/core/modules/block/block.module @@ -59,10 +59,6 @@ function block_help($path, $arg) { $output .= '
' . t('When working with blocks, remember that all themes do not implement the same regions, or display regions in the same way. Blocks are positioned on a per-theme basis. Users with the Administer blocks permission can disable blocks. Disabled blocks are listed on the Blocks administration page, but are not displayed in any region.', array('@block' => 'http://drupal.org/documentation/modules/block', '@blocks' => url('admin/structure/block'))) . '
'; $output .= '
' . t('Controlling visibility') . '
'; $output .= '
' . t('Blocks can be configured to be visible only on certain pages, only to users of certain roles, or only on pages displaying certain content types. Some dynamic blocks, such as those generated by modules, will be displayed only on certain pages.', array('@content-type' => url('admin/structure/types'), '@user' => url('user'))) . '
'; - if (module_exists('custom_block')) { - $output .= '
' . t('Creating custom blocks') . '
'; - $output .= '
' . t('Users with the Administer blocks permission can add custom blocks, which are then listed on the Blocks administration page. Once created, custom blocks behave just like default and module-generated blocks.', array('@blocks' => url('admin/structure/block'), '@block-add' => url('admin/structure/block/list/' . config('system.theme')->get('default') . '/add/custom_blocks'))) . '
'; - } $output .= ''; return $output; } diff --git a/core/modules/block/custom_block/custom_block.module b/core/modules/block/custom_block/custom_block.module index 2752ee8..4b3dad973 100644 --- a/core/modules/block/custom_block/custom_block.module +++ b/core/modules/block/custom_block/custom_block.module @@ -8,6 +8,37 @@ use Drupal\custom_block\Plugin\Core\Entity\CustomBlockType; use Drupal\custom_block\Plugin\Core\Entity\CustomBlock; + +/** + * Implements hook_help(). + */ +function custom_block_help($path, $arg) { + switch ($path) { + case 'admin/help#custom_block': + $output = ''; + $output .= '

' . t('About') . '

'; + $output .= '

' . t('The Custom Block module allows you to create boxes of content, which can be placed in regions throughout the website. The Custom Blocks administration page lets you view the custom block content on your site.', array('@blocks' => url('admin/structure/custom-blocks'))) . '

'; + $output .= '

' . t('Uses') . '

'; + $output .= '
'; + $output .= '
' . t('Creating custom block types') . '
'; + $output .= '
' . t('You can create different custom block types, each with different fields and display settings from the Custom block types administration pages.', array('@types' => url('admin/structure/custom-blocks/types'))) . '
'; + $output .= '
' . t('Creating custom blocks') . '
'; + $output .= '
' . t('Users with the Administer blocks permission can add custom blocks, which are then listed on the Blocks administration page. Once created, custom blocks behave just like default and module-generated blocks.', array('@blocks' => url('admin/structure/block'), '@block-add' => url('admin/structure/block/list/' . config('system.theme')->get('default') . '/add/custom_blocks'))) . '
'; + $output .= '
'; + return $output; + + case 'admin/structure/custom-blocks': + case 'admin/structure/custom-blocks/list': + $output = '

This page provides a list of all custom-block content on your site. From here you can add, edit or delete custom block content.

'; + return $output; + + case 'admin/structure/custom-blocks/types': + $output = '

This page provides a list of all custom-block types on your site. Each custom-block type can consists of different fields and display settings. From here you can manage the fields on each custom-block type as well as create new custom-block types.

'; + return $output; + + } +} + /** * Implements hook_menu_local_tasks(). */ @@ -25,6 +56,19 @@ function custom_block_menu_local_tasks(&$data, $router_item, $root_path) { ); } } + if ($router_item['route_name'] == 'custom_block_list') { + // @todo Move to a LocalAction plugin when https://drupal.org/node/2045267 + // allows local actions to work with query strings. + $item = menu_get_item('block/add'); + if ($item['access']) { + // Add a destination parameter. + $item['localized_options']['query']['destination'] = 'admin/structure/custom-blocks'; + $data['actions']['block/add/o'] = array( + '#theme' => 'menu_local_action', + '#link' => $item, + ); + } + } } /** @@ -32,11 +76,20 @@ function custom_block_menu_local_tasks(&$data, $router_item, $root_path) { */ function custom_block_menu() { $items['admin/structure/custom-blocks'] = array( - 'title' => 'Custom block types', - 'description' => 'Manage custom block types.', + 'title' => 'Custom blocks', + 'description' => 'Manage custom blocks.', + 'route_name' => 'custom_block_list', + ); + $items['admin/structure/custom-blocks/list'] = array( + 'title' => 'Blocks', + 'type' => MENU_DEFAULT_LOCAL_TASK, + ); + $items['admin/structure/custom-blocks/types'] = array( + 'title' => 'Types', 'route_name' => 'custom_block_type_list', + 'type' => MENU_LOCAL_TASK, ); - $items['admin/structure/custom-blocks/add'] = array( + $items['admin/structure/custom-blocks/types/add'] = array( 'route_name' => 'custom_block_type_add', 'type' => MENU_SIBLING_LOCAL_TASK, 'weight' => 1, @@ -93,21 +146,6 @@ function custom_block_menu() { } /** - * Implements hook_local_actions(). - */ -function custom_block_local_actions() { - return array( - array( - 'route_name' => 'custom_block_type_add', - 'title' => t('Add custom block type'), - 'appears_on' => array( - 'custom_block_type_list', - ), - ), - ); -} - -/** * Implements hook_theme(). */ function custom_block_theme($existing, $type, $theme, $path) { diff --git a/core/modules/block/custom_block/custom_block.pages.inc b/core/modules/block/custom_block/custom_block.pages.inc index ae7de30..68f3b78 100644 --- a/core/modules/block/custom_block/custom_block.pages.inc +++ b/core/modules/block/custom_block/custom_block.pages.inc @@ -73,5 +73,5 @@ function custom_block_delete_form_submit($form, &$form_state) { drupal_set_message(t('Custom block %label has been deleted.', array('%label' => $block->label()))); watchdog('custom_block', 'Custom block %label has been deleted.', array('%label' => $block->label()), WATCHDOG_NOTICE); - $form_state['redirect'] = 'admin/structure/block'; + $form_state['redirect'] = 'admin/structure/custom-blocks'; } diff --git a/core/modules/block/custom_block/custom_block.routing.yml b/core/modules/block/custom_block/custom_block.routing.yml index 02bad13..52e1575 100644 --- a/core/modules/block/custom_block/custom_block.routing.yml +++ b/core/modules/block/custom_block/custom_block.routing.yml @@ -1,5 +1,5 @@ custom_block_type_list: - pattern: '/admin/structure/custom-blocks' + pattern: '/admin/structure/custom-blocks/types' defaults: _entity_list: 'custom_block_type' requirements: @@ -35,7 +35,7 @@ custom_block_edit: custom_block: \d+ custom_block_type_add: - pattern: '/admin/structure/custom-blocks/add' + pattern: '/admin/structure/custom-blocks/types/add' defaults: _entity_form: 'custom_block_type.add' requirements: @@ -47,3 +47,10 @@ custom_block_type_edit: _entity_form: 'custom_block_type.edit' requirements: _entity_access: 'custom_block_type.update' + +custom_block_list: + pattern: '/admin/structure/custom-blocks' + defaults: + _entity_list: 'custom_block' + requirements: + _permission: 'administer blocks' diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockFormController.php b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockFormController.php index cde78ae..20d748d 100644 --- a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockFormController.php +++ b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockFormController.php @@ -191,7 +191,7 @@ public function save(array $form, array &$form_state) { } } else { - $form_state['redirect'] = 'admin/structure/block'; + $form_state['redirect'] = 'admin/structure/custom-blocks'; } } else { diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockListController.php b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockListController.php new file mode 100644 index 0000000..d4b37da --- /dev/null +++ b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockListController.php @@ -0,0 +1,61 @@ +uri(); + $operations['edit']['href'] = $uri['path']; + $operations['edit']['query']['destination'] = 'admin/structure/custom-blocks'; + } + return $operations; + } + + /** + * {@inheritdoc} + */ + public function render() { + $build = parent::render(); + // Override the default 'There is no Custom Block yet' to 'There are no + // Custom Blocks yet'. + $build['#empty'] = t('There are no @labels yet.', array('@label' => $this->entityInfo['label'])); + return $build; + } + +} diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeFormController.php b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeFormController.php index a98730e..06e92a5 100644 --- a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeFormController.php +++ b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeFormController.php @@ -101,7 +101,7 @@ public function save(array $form, array &$form_state) { watchdog('custom_block', 'Custom block type %label has been added.', array('%label' => $block_type->label()), WATCHDOG_NOTICE, l(t('Edit'), $uri['path'] . '/edit')); } - $form_state['redirect'] = 'admin/structure/custom-blocks'; + $form_state['redirect'] = 'admin/structure/custom-blocks/types'; } /** diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeListController.php b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeListController.php index aaf2676..e7b9c25 100644 --- a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeListController.php +++ b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeListController.php @@ -66,4 +66,13 @@ public function buildRow(EntityInterface $entity) { return $row; } + /** + * {@inheritdoc} + */ + public function render() { + // @todo Remove this once https://drupal.org/node/1981644 is in. + drupal_set_title(t('Custom block types')); + return parent::render(); + } + } diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/Form/CustomBlockTypeDeleteForm.php b/core/modules/block/custom_block/lib/Drupal/custom_block/Form/CustomBlockTypeDeleteForm.php index 7e595d2..4b7c220 100644 --- a/core/modules/block/custom_block/lib/Drupal/custom_block/Form/CustomBlockTypeDeleteForm.php +++ b/core/modules/block/custom_block/lib/Drupal/custom_block/Form/CustomBlockTypeDeleteForm.php @@ -60,7 +60,7 @@ public function getQuestion() { * {@inheritdoc} */ public function getCancelPath() { - return 'admin/structure/custom-blocks'; + return 'admin/structure/custom-blocks/types'; } /** @@ -90,7 +90,7 @@ public function buildForm(array $form, array &$form_state, Request $request = NU */ public function submit(array $form, array &$form_state) { $this->entity->delete(); - $form_state['redirect'] = 'admin/structure/custom-blocks'; + $form_state['redirect'] = 'admin/structure/custom-blocks/types'; drupal_set_message(t('Custom block type %label has been deleted.', array('%label' => $this->entity->label()))); watchdog('custom_block', 'Custom block type %label has been deleted.', array('%label' => $this->entity->label()), WATCHDOG_NOTICE); } diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/Core/Entity/CustomBlock.php b/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/Core/Entity/CustomBlock.php index 6bc0f4d..97722f6 100644 --- a/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/Core/Entity/CustomBlock.php +++ b/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/Core/Entity/CustomBlock.php @@ -24,6 +24,7 @@ * controllers = { * "storage" = "Drupal\custom_block\CustomBlockStorageController", * "access" = "Drupal\custom_block\CustomBlockAccessController", + * "list" = "Drupal\custom_block\CustomBlockListController", * "render" = "Drupal\custom_block\CustomBlockRenderController", * "form" = { * "add" = "Drupal\custom_block\CustomBlockFormController", diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/Menu/LocalAction/CustomBlockTypeAdd.php b/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/Menu/LocalAction/CustomBlockTypeAdd.php new file mode 100644 index 0000000..5549b03 --- /dev/null +++ b/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/Menu/LocalAction/CustomBlockTypeAdd.php @@ -0,0 +1,24 @@ + $edit['info'], 'region' => 'sidebar_first', ); - $this->drupalPost(NULL, $instance, t('Save block')); + $block = entity_load('custom_block', 1); + $url = 'admin/structure/block/add/custom_block:' . $block->uuid() . '/' . \Drupal::config('system.theme')->get('default'); + $this->drupalPost($url, $instance, t('Save block')); $block = custom_block_load(1); diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockFieldTest.php b/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockFieldTest.php index da5ac4f..7c1d7d5 100644 --- a/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockFieldTest.php +++ b/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockFieldTest.php @@ -99,13 +99,15 @@ public function testBlockFields() { $this->field['field_name'] . '[und][0][title]' => 'Example.com' ); $this->drupalPost(NULL, $edit, t('Save')); + $block = entity_load('custom_block', 1); + $url = 'admin/structure/block/add/custom_block:' . $block->uuid() . '/' . \Drupal::config('system.theme')->get('default'); // Place the block. $instance = array( 'machine_name' => drupal_strtolower($edit['info']), 'settings[label]' => $edit['info'], 'region' => 'sidebar_first', ); - $this->drupalPost(NULL, $instance, t('Save block')); + $this->drupalPost($url, $instance, t('Save block')); // Navigate to home page. $this->drupalGet(''); $this->assertLinkByHref('http://example.com'); diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockListTest.php b/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockListTest.php new file mode 100644 index 0000000..8488718 --- /dev/null +++ b/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockListTest.php @@ -0,0 +1,118 @@ + 'Custom Block listing', + 'description' => 'Tests the listing of custom blocks.', + 'group' => 'Custom Block', + ); + } + + /** + * Tests the custom block listing page. + */ + public function testListing() { + $this->drupalLogin($this->drupalCreateUser(array('administer blocks'))); + $this->drupalGet('admin/structure/custom-blocks'); + + // Test for the page title. + $this->assertTitle('Custom blocks | Drupal'); + + // Test for the table. + $element = $this->xpath('//div[@class="l-content"]//table'); + $this->assertTrue($element, 'Configuration entity list table found.'); + + // Test the table header. + $elements = $this->xpath('//div[@class="l-content"]//table/thead/tr/th'); + $this->assertEqual(count($elements), 2, 'Correct number of table header cells found.'); + + // Test the contents of each th cell. + $expected_items = array('Label', 'Operations'); + foreach ($elements as $key => $element) { + $this->assertIdentical((string) $element[0], $expected_items[$key]); + } + + // Add a new entity using the operations link. + $this->assertLink('Add custom block'); + $this->clickLink('Add custom block'); + $this->assertResponse(200); + $edit = array(); + $langcode = Language::LANGCODE_NOT_SPECIFIED; + $edit['info'] = 'Antelope'; + $edit["block_body[$langcode][0][value]"] = $this->randomName(16); + $this->drupalPost(NULL, $edit, t('Save')); + + // Confirm that once the user returns to the listing, the text of the label + // (versus elsewhere on the page). + $this->assertFieldByXpath('//td', 'Antelope', "Label found for added block."); + + // Check the number of table row cells. + $elements = $this->xpath('//div[@class="l-content"]//table/tbody/tr[@class="odd"]/td'); + $this->assertEqual(count($elements), 2, 'Correct number of table row cells found.'); + // Check the contents of each row cell. The first cell contains the label, + // the second contains the machine name, and the third contains the + // operations list. + $this->assertIdentical((string) $elements[0], 'Antelope'); + + // Edit the entity using the operations link. + $blocks = $this->container + ->get('plugin.manager.entity') + ->getStorageController('custom_block') + ->loadByProperties(array('info' => 'Antelope')); + $block = reset($blocks); + if (!empty($block)) { + $this->assertLinkByHref('block/' . $block->id()); + $this->clickLink('Edit'); + $this->assertResponse(200); + $this->assertTitle(t('Edit custom block Antelope | Drupal')); + $edit = array('info' => 'Albatross'); + $this->drupalPost(NULL, $edit, t('Save')); + } + else { + $this->fail('Did not find Albatross block in the database.'); + } + + // Confirm that once the user returns to the listing, the text of the label + // (versus elsewhere on the page). + $this->assertFieldByXpath('//td', 'Albatross', "Label found for updated 'Albatross' entity."); + + // Delete the added entity using the operations link. + $this->assertLinkByHref('block/' . $block->id() . '/delete'); + $this->clickLink('Delete'); + $this->assertResponse(200); + $this->assertTitle(t('Are you sure you want to delete Albatross? | Drupal')); + $this->drupalPost(NULL, array(), t('Delete')); + + // Verify that the text of the label and machine name does not appear in + // the list (though it may appear elsewhere on the page). + $this->assertNoFieldByXpath('//td', 'Albatross', "No label found for deleted 'Albatross' entity."); + + // Confirm that the empty text is displayed. + $this->assertText(t('There are no Custom Blocks yet.')); + } + +} diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockTypeTest.php b/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockTypeTest.php index 37dbf79..4e8c7d6 100644 --- a/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockTypeTest.php +++ b/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockTypeTest.php @@ -61,7 +61,7 @@ public function testCustomBlockTypeCreation() { 'id' => 'foo', 'label' => 'title for foo', ); - $this->drupalPost('admin/structure/custom-blocks/add', $edit, t('Save')); + $this->drupalPost('admin/structure/custom-blocks/types/add', $edit, t('Save')); $block_type = entity_load('custom_block_type', 'foo'); $this->assertTrue($block_type, 'The new block type has been created.');