'menu_local_action', '#link' => $item, ); } } } /** * Implements hook_menu(). */ function custom_block_menu() { $items['admin/structure/custom-blocks'] = array( 'title' => 'Custom block types', 'description' => 'Manage custom block types.', 'page callback' => 'custom_block_type_list', 'access arguments' => array('administer blocks'), 'file' => 'custom_block.admin.inc', ); $items['admin/structure/custom-blocks/add'] = array( 'title' => 'Add custom block type', 'page callback' => 'custom_block_type_add', 'access arguments' => array('administer blocks'), 'type' => MENU_LOCAL_ACTION, 'weight' => 1, 'file' => 'custom_block.admin.inc', ); $items['admin/structure/custom-blocks/manage/%custom_block_type'] = array( 'title' => 'Edit custom block type', 'title callback' => 'entity_page_label', 'title arguments' => array(4), 'page callback' => 'custom_block_type_edit', 'page arguments' => array(4), 'access arguments' => array('administer blocks'), 'file' => 'custom_block.admin.inc', ); $items['admin/structure/custom-blocks/manage/%custom_block_type/edit'] = array( 'title' => 'Edit', 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10, ); $items['admin/structure/custom-blocks/manage/%custom_block_type/delete'] = array( 'title' => 'Delete', 'page callback' => 'drupal_get_form', 'page arguments' => array('custom_block_type_delete_form', 4), 'access arguments' => array('administer blocks'), 'type' => MENU_LOCAL_TASK, 'weight' => 10, 'file' => 'custom_block.admin.inc', ); $items['block/add'] = array( 'title' => 'Add custom block', 'route_name' => 'custom_block_add_page', ); $items['block/add/%custom_block_type'] = array( 'title callback' => 'entity_page_label', 'title arguments' => array(2), 'page callback' => 'custom_block_add', 'page arguments' => array(2), 'access arguments' => array('administer blocks'), 'description' => 'Add custom block', 'file' => 'custom_block.pages.inc', ); // There has to be a base-item in order for contextual links to work. $items['block/%custom_block'] = array( 'title' => 'Edit', 'page callback' => 'custom_block_edit', 'page arguments' => array(1), 'access callback' => 'entity_page_access', 'access arguments' => array(1, 'update'), 'file' => 'custom_block.pages.inc', ); $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', 'page callback' => 'drupal_get_form', 'page arguments' => array('custom_block_delete_form', 1), 'access callback' => 'entity_page_access', 'access arguments' => array(1, 'delete'), 'weight' => 1, 'type' => MENU_LOCAL_TASK, 'context' => MENU_CONTEXT_INLINE, 'file' => 'custom_block.pages.inc', ); return $items; } /** * Implements hook_theme(). */ function custom_block_theme($existing, $type, $theme, $path) { return array( 'custom_block_block' => array( 'variables' => array('body' => NULL, 'format' => NULL), ), 'custom_block_add_list' => array( 'variables' => array('content' => NULL), 'file' => 'custom_block.pages.inc', ), ); } /** * Returns HTML for a custom block. * * @ingroup themeable */ function theme_custom_block_block($variables) { $body = $variables['body']; $format = $variables['format']; return check_markup($body, $format); } /** * Loads a custom block type. * * @param int $id * The ID of the custom block type to load. * * @return Drupal\custom_block\Plugin\Core\Entity\CustomBlockType|false * A CustomBlockType object or FALSE if the requested $id does not exist. */ 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\Plugin\Core\Entity\CustomBlock|false * A CustomBlock object or FALSE if the requested $id does not exist. */ 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 = config($config_name); $bundles['custom_block'][$config->get('id')]['label'] = $config->get('label'); } return $bundles; } /** * Implements hook_entity_view_mode_info(). */ function custom_block_entity_view_mode_info() { $view_modes['custom_block']['full'] = array( 'label' => t('Full'), ); return $view_modes; } /** * 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. $field = field_info_field('block_body'); $instance = field_info_instance('custom_block', 'block_body', $block_type_id); if (empty($field)) { $field = array( 'field_name' => 'block_body', 'type' => 'text_with_summary', 'entity_types' => array('custom_block'), ); $field = field_create_field($field); } if (empty($instance)) { $instance = array( 'field_name' => 'block_body', 'entity_type' => 'custom_block', 'bundle' => $block_type_id, 'label' => $label, 'widget' => array('type' => 'text_textarea_with_summary'), 'settings' => array('display_summary' => FALSE), ); $instance = field_create_instance($instance); // Assign display settings for 'default' view mode. entity_get_display('custom_block', $block_type_id, 'default') ->setComponent('block_body', array( 'label' => 'hidden', 'type' => 'text_default', )) ->save(); } return $instance; } /** * Implements hook_form_FORM_ID_alter() for block_plugin_ui(). */ function custom_block_form_block_plugin_ui_alter(&$form, $form_state) { foreach ($form['left']['plugin_library']['#rows'] as $plugin_id => &$row) { // @todo Clean up when http://drupal.org/node/1874498 lands. if (strpos($plugin_id, ':') === FALSE) { continue; } list($base, $derivative) = explode(':', $plugin_id); if ($base !== 'custom_block') { continue; } $custom_block = entity_load_by_uuid('custom_block', $derivative); $row['1']['data']['#links']['edit'] = array( 'title' => t('Edit'), 'href' => 'block/' . $custom_block->id() . '/edit' ); } } /** * Implements hook_admin_paths(). */ function custom_block_admin_paths() { $paths = array( 'block/add' => TRUE, 'block/add/*' => TRUE, 'block/*/edit' => TRUE, 'block/*/delete' => TRUE, 'admin/structure/custom-blocks/*' => TRUE, ); return $paths; }