Newer
Older
Dries Buytaert
committed
<?php
/**
* @file
* Allows the creaation of custom blocks through the user interface.
*/
use Drupal\custom_block\Entity\CustomBlockType;
use Drupal\custom_block\Entity\CustomBlock;
Dries Buytaert
committed
Alex Pott
committed
/**
* Implements hook_help().
*/
function custom_block_help($path, $arg) {
switch ($path) {
case 'admin/help#custom_block':
return t('Allows the creation of custom blocks through the user interface.');
Dries Buytaert
committed
case 'admin/structure/block/custom-blocks':
Alex Pott
committed
$output = '<p>' . t('This page lists user-created blocks. These blocks are derived from block types. A block type can consist of different fields and display settings. From the block types tab you can manage these fields as well as create new block types.') . '</p>';
return $output;
Dries Buytaert
committed
case 'admin/structure/block/custom-blocks/types':
Alex Pott
committed
$output = '<p>' . t('This page lists block types. A block type can consist of different fields and display settings. From here you can manage these fields as well as create new block types.') . '</p>';
return $output;
}
}
Dries Buytaert
committed
/**
catch
committed
* Implements hook_menu_local_tasks().
Dries Buytaert
committed
*/
Angie Byron
committed
function custom_block_menu_local_tasks(&$data, $route_name) {
if ($route_name == 'custom_block.list') {
Alex Pott
committed
// @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.
Dries Buytaert
committed
$item['localized_options']['query']['destination'] = 'admin/structure/block/custom-blocks';
Alex Pott
committed
$data['actions']['block/add'] = array(
'#theme' => 'menu_local_action',
'#link' => $item,
);
}
}
Dries Buytaert
committed
$routes = array_map(function ($theme) {
return "block.admin_display_$theme";
}, array_keys(list_themes()));
Angie Byron
committed
if (in_array($route_name, $routes)) {
// @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.
Angie Byron
committed
$item['localized_options']['query']['theme'] = \Drupal::request()->attributes->get('theme');
$data['actions']['block/add'] = array(
'#theme' => 'menu_local_action',
'#link' => $item,
);
Dries Buytaert
committed
}
}
}
Dries Buytaert
committed
/**
* Implements hook_menu().
*/
function custom_block_menu() {
Dries Buytaert
committed
$items['admin/structure/block/custom-blocks'] = array(
'title' => 'Custom block library',
Alex Pott
committed
'description' => 'Manage custom blocks.',
'route_name' => 'custom_block.list',
Dries Buytaert
committed
'type' => MENU_LOCAL_TASK | MENU_NORMAL_ITEM,
Alex Pott
committed
);
Dries Buytaert
committed
$items['admin/structure/block/custom-blocks/list'] = array(
Alex Pott
committed
'title' => 'Blocks',
'type' => MENU_DEFAULT_LOCAL_TASK,
);
Dries Buytaert
committed
$items['admin/structure/block/custom-blocks/types'] = array(
Alex Pott
committed
'title' => 'Types',
'route_name' => 'custom_block.type_list',
Alex Pott
committed
'type' => MENU_LOCAL_TASK,
Dries Buytaert
committed
);
Dries Buytaert
committed
$items['admin/structure/block/custom-blocks/types/add'] = array(
'route_name' => 'custom_block.type_add',
'type' => MENU_SIBLING_LOCAL_TASK,
Dries Buytaert
committed
'weight' => 1,
);
Dries Buytaert
committed
$items['admin/structure/block/custom-blocks/manage/%custom_block_type'] = array(
Dries Buytaert
committed
'title' => 'Edit custom block type',
'title callback' => 'entity_page_label',
Dries Buytaert
committed
'title arguments' => array(5),
'route_name' => 'custom_block.type_edit',
Dries Buytaert
committed
);
Dries Buytaert
committed
$items['admin/structure/block/custom-blocks/manage/%custom_block_type/edit'] = array(
Dries Buytaert
committed
'title' => 'Edit',
'type' => MENU_DEFAULT_LOCAL_TASK,
'weight' => -10,
);
$items['block/add'] = array(
'title' => 'Add custom block',
'route_name' => 'custom_block.add_page',
Dries Buytaert
committed
);
$items['block/add/%custom_block_type'] = array(
'title' => 'Add custom block',
Dries Buytaert
committed
'description' => 'Add custom block',
'route_name' => 'custom_block.add_form'
Dries Buytaert
committed
);
// There has to be a base-item in order for contextual links to work.
$items['block/%custom_block'] = array(
'title' => 'Edit',
'route_name' => 'custom_block.edit',
Dries Buytaert
committed
);
$items['block/%custom_block/edit'] = array(
'title' => 'Edit',
'weight' => 0,
'type' => MENU_DEFAULT_LOCAL_TASK,
'context' => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE,
);
$items['block/%custom_block/delete'] = array(
'title' => 'Delete',
'weight' => 1,
'type' => MENU_LOCAL_TASK,
'context' => MENU_CONTEXT_INLINE,
'route_name' => 'custom_block.delete',
Dries Buytaert
committed
);
Dries Buytaert
committed
return $items;
}
/**
* Implements hook_theme().
*/
function custom_block_theme($existing, $type, $theme, $path) {
return array(
Dries Buytaert
committed
'custom_block_add_list' => array(
'variables' => array('content' => NULL),
'file' => 'custom_block.pages.inc',
'template' => 'custom-block-add-list',
Dries Buytaert
committed
),
Dries Buytaert
committed
);
}
Dries Buytaert
committed
/**
* Loads a custom block type.
*
* @param int $id
* The ID of the custom block type to load.
*
* @return \Drupal\custom_block\Entity\CustomBlockType|null
Dries Buytaert
committed
* A CustomBlockType object or NULL if the requested $id does not exist.
Dries Buytaert
committed
*/
function custom_block_type_load($id) {
return entity_load('custom_block_type', $id);
}
/**
* Loads a custom block.
*
* @param int $id
* The id of the custom block.
*
* @return \Drupal\custom_block\Entity\CustomBlock|null
Dries Buytaert
committed
* A CustomBlock object or NULL if the requested $id does not exist.
Dries Buytaert
committed
*/
function custom_block_load($id) {
return entity_load('custom_block', $id);
}
/**
* Implements hook_entity_info_alter().
*/
function custom_block_entity_info_alter(&$types) {
// Add a translation handler for fields if the language module is enabled.
if (module_exists('language')) {
$types['custom_block']['translation']['custom_block'] = TRUE;
}
}
/**
* Implements hook_entity_bundle_info().
*/
function custom_block_entity_bundle_info() {
$bundles = array();
foreach (config_get_storage_names_with_prefix('custom_block.type.') as $config_name) {
$config = \Drupal::config($config_name);
Alex Pott
committed
$bundles['custom_block'][$config->get('id')]['label'] = $config->get('label');
Dries Buytaert
committed
}
return $bundles;
}
/**
* Adds the default body field to a custom block type.
*
* @param string $block_type_id
* Id of the block type.
* @param string $label
* (optional) The label for the body instance. Defaults to 'Block body'
*
* @return array()
* Body field instance.
*/
function custom_block_add_body_field($block_type_id, $label = 'Block body') {
// Add or remove the body field, as needed.
Alex Pott
committed
$field = field_info_field('custom_block', 'body');
$instance = field_info_instance('custom_block', 'body', $block_type_id);
Dries Buytaert
committed
if (empty($field)) {
$field = entity_create('field_entity', array(
Alex Pott
committed
'name' => 'body',
'entity_type' => 'custom_block',
Dries Buytaert
committed
'type' => 'text_with_summary',
));
$field->save();
Dries Buytaert
committed
}
if (empty($instance)) {
$instance = entity_create('field_instance', array(
Alex Pott
committed
'field_name' => 'body',
Dries Buytaert
committed
'entity_type' => 'custom_block',
'bundle' => $block_type_id,
'label' => $label,
'settings' => array('display_summary' => FALSE),
));
$instance->save();
Dries Buytaert
committed
Alex Pott
committed
// Assign widget settings for the 'default' form mode.
entity_get_form_display('custom_block', $block_type_id, 'default')
Alex Pott
committed
->setComponent('body', array(
Alex Pott
committed
'type' => 'text_textarea_with_summary',
))
->save();
Dries Buytaert
committed
// Assign display settings for 'default' view mode.
entity_get_display('custom_block', $block_type_id, 'default')
Alex Pott
committed
->setComponent('body', array(
Dries Buytaert
committed
'label' => 'hidden',
'type' => 'text_default',
))
->save();
}
return $instance;
}
/**
* Implements hook_admin_paths().
*/
function custom_block_admin_paths() {
$paths = array(
'block/add' => TRUE,
'block/add/*' => TRUE,
'block/*' => TRUE,
Dries Buytaert
committed
'block/*/delete' => TRUE,
Dries Buytaert
committed
'admin/structure/block/custom-blocks/*' => TRUE,
Dries Buytaert
committed
);
return $paths;
}