first import
This commit is contained in:
12
sites/all/modules/panels/panels_mini/panels_mini.info
Normal file
12
sites/all/modules/panels/panels_mini/panels_mini.info
Normal file
@@ -0,0 +1,12 @@
|
||||
name = Mini panels
|
||||
description = Create mini panels that can be used as blocks by Drupal and panes by other panel modules.
|
||||
package = "Panels"
|
||||
dependencies[] = panels
|
||||
core = 7.x
|
||||
files[] = plugins/export_ui/panels_mini_ui.class.php
|
||||
; Information added by drupal.org packaging script on 2013-03-02
|
||||
version = "7.x-3.3+39-dev"
|
||||
core = "7.x"
|
||||
project = "panels"
|
||||
datestamp = "1362187383"
|
||||
|
124
sites/all/modules/panels/panels_mini/panels_mini.install
Normal file
124
sites/all/modules/panels/panels_mini/panels_mini.install
Normal file
@@ -0,0 +1,124 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Implementation of hook_schema().
|
||||
*/
|
||||
function panels_mini_schema() {
|
||||
// This should always point to our 'current' schema. This makes it relatively easy
|
||||
// to keep a record of schema as we make changes to it.
|
||||
return panels_mini_schema_1();
|
||||
}
|
||||
|
||||
/**
|
||||
* Schema version 1 for Panels in D6.
|
||||
*/
|
||||
function panels_mini_schema_1() {
|
||||
$schema = array();
|
||||
|
||||
$schema['panels_mini'] = array(
|
||||
'export' => array(
|
||||
'identifier' => 'mini',
|
||||
'load callback' => 'panels_mini_load',
|
||||
'load all callback' => 'panels_mini_load_all',
|
||||
'save callback' => 'panels_mini_save',
|
||||
'delete callback' => 'panels_mini_delete',
|
||||
'export callback' => 'panels_mini_export',
|
||||
'api' => array(
|
||||
'owner' => 'panels_mini',
|
||||
'api' => 'panels_default',
|
||||
'minimum_version' => 1,
|
||||
'current_version' => 1,
|
||||
),
|
||||
),
|
||||
'fields' => array(
|
||||
'pid' => array(
|
||||
'type' => 'serial',
|
||||
'not null' => TRUE,
|
||||
'no export' => TRUE,
|
||||
'description' => 'The primary key for uniqueness.',
|
||||
),
|
||||
'name' => array(
|
||||
'type' => 'varchar',
|
||||
'length' => '255',
|
||||
'description' => 'The unique name of the mini panel.',
|
||||
),
|
||||
'category' => array(
|
||||
'type' => 'varchar',
|
||||
'length' => '64',
|
||||
'description' => 'The category this mini panel appears in on the add content pane.',
|
||||
),
|
||||
'did' => array(
|
||||
'type' => 'int',
|
||||
'no export' => TRUE,
|
||||
'description' => 'The display ID of the panel.',
|
||||
),
|
||||
'admin_title' => array(
|
||||
'type' => 'varchar',
|
||||
'length' => '128',
|
||||
'description' => 'The administrative title of the mini panel.',
|
||||
),
|
||||
'admin_description' => array(
|
||||
'type' => 'text',
|
||||
'size' => 'big',
|
||||
'description' => 'Administrative title of this mini panel.',
|
||||
'object default' => '',
|
||||
),
|
||||
'requiredcontexts' => array(
|
||||
'type' => 'text',
|
||||
'size' => 'big',
|
||||
'serialize' => TRUE,
|
||||
'object default' => array(),
|
||||
'description' => 'An array of required contexts.',
|
||||
),
|
||||
'contexts' => array(
|
||||
'type' => 'text',
|
||||
'size' => 'big',
|
||||
'serialize' => TRUE,
|
||||
'object default' => array(),
|
||||
'description' => 'An array of contexts embedded into the panel.',
|
||||
),
|
||||
'relationships' => array(
|
||||
'type' => 'text',
|
||||
'size' => 'big',
|
||||
'serialize' => TRUE,
|
||||
'object default' => array(),
|
||||
'description' => 'An array of relationships embedded into the panel.',
|
||||
),
|
||||
),
|
||||
'primary key' => array('pid'),
|
||||
'unique keys' => array(
|
||||
'name' => array('name'),
|
||||
),
|
||||
);
|
||||
|
||||
return $schema;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of hook_uninstall().
|
||||
*/
|
||||
function panels_mini_uninstall() {
|
||||
$panels_exists = db_table_exists('panels_display');
|
||||
|
||||
$result = db_query("SELECT * FROM {panels_mini}");
|
||||
$deltas = array();
|
||||
foreach ($result as $panel_mini) {
|
||||
// Delete all associated displays.
|
||||
if (!function_exists('panels_delete_display')) {
|
||||
require_once drupal_get_path('module', 'panels') .'/panels.module';
|
||||
}
|
||||
if ($panels_exists) {
|
||||
panels_delete_display($panel_mini->did);
|
||||
}
|
||||
|
||||
$deltas[] = $panel_mini->pid;
|
||||
}
|
||||
|
||||
if ($deltas) {
|
||||
// Delete all configured blocks.
|
||||
db_delete('block')
|
||||
->condition('module', 'panels_mini')
|
||||
->condition('delta', $deltas)
|
||||
->execute();
|
||||
}
|
||||
}
|
482
sites/all/modules/panels/panels_mini/panels_mini.module
Normal file
482
sites/all/modules/panels/panels_mini/panels_mini.module
Normal file
@@ -0,0 +1,482 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file panels_mini.module
|
||||
*
|
||||
* This module provides mini panels which are basically panels that can be
|
||||
* used within blocks or other panels.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Implementation of hook_permission().
|
||||
*/
|
||||
function panels_mini_permission() {
|
||||
return array(
|
||||
'create mini panels' => array(
|
||||
'title' => t('Create mini panels'),
|
||||
'description' => t('Create new mini panels'),
|
||||
),
|
||||
'administer mini panels' => array(
|
||||
'title' => t('Administer mini panels'),
|
||||
'description' => t('Edit and delete mini panels'),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of hook_menu().
|
||||
*/
|
||||
function panels_mini_menu() {
|
||||
// Safety: go away if CTools is not at an appropriate version.
|
||||
if (!defined('PANELS_REQUIRED_CTOOLS_API') || !module_invoke('ctools', 'api_version', PANELS_REQUIRED_CTOOLS_API)) {
|
||||
return array();
|
||||
}
|
||||
|
||||
$items['admin/structure/mini-panels/settings'] = array(
|
||||
'title' => 'Settings',
|
||||
'page callback' => 'panels_mini_settings',
|
||||
'access arguments' => array('create mini panels'),
|
||||
'type' => MENU_LOCAL_TASK,
|
||||
);
|
||||
|
||||
// Also provide settings on the main panel UI
|
||||
$items['admin/structure/panels/settings/panels-mini'] = array(
|
||||
'title' => 'Mini panels',
|
||||
'page callback' => 'panels_mini_settings',
|
||||
'access arguments' => array('create mini panels'),
|
||||
'type' => MENU_LOCAL_TASK,
|
||||
);
|
||||
|
||||
return $items;
|
||||
}
|
||||
|
||||
/**
|
||||
* Settings for mini panels.
|
||||
*/
|
||||
function panels_mini_settings() {
|
||||
ctools_include('common', 'panels');
|
||||
return drupal_get_form('panels_common_settings', 'panels_mini');
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Allow the rest of the system access to mini panels
|
||||
|
||||
/**
|
||||
* Implementation of hook_block_info().
|
||||
*/
|
||||
function panels_mini_block_info() {
|
||||
// Safety: go away if CTools is not at an appropriate version.
|
||||
if (!defined('PANELS_REQUIRED_CTOOLS_API') || !module_invoke('ctools', 'api_version', PANELS_REQUIRED_CTOOLS_API)) {
|
||||
return array();
|
||||
}
|
||||
|
||||
$blocks = array();
|
||||
|
||||
$minis = panels_mini_load_all();
|
||||
foreach ($minis as $panel_mini) {
|
||||
if (empty($panel_mini->disabled) && (module_exists('page_manager') || empty($panel_mini->requiredcontexts))) {
|
||||
$blocks[$panel_mini->name] = array(
|
||||
'info' => t('Mini panel: "@title"', array('@title' => $panel_mini->admin_title)),
|
||||
'cache' => DRUPAL_NO_CACHE,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return $blocks;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of hook_block_view().
|
||||
*
|
||||
* @see panels_mini_panels_mini_content_type_render().
|
||||
*/
|
||||
function panels_mini_block_view($delta = 0) {
|
||||
// static recursion protection.
|
||||
static $viewing = array();
|
||||
if (!empty($viewing[$delta])) {
|
||||
return;
|
||||
}
|
||||
$viewing[$delta] = TRUE;
|
||||
|
||||
$panel_mini = panels_mini_load($delta);
|
||||
if (empty($panel_mini)) {
|
||||
// Bail out early if the specified mini panel doesn't exist.
|
||||
return;
|
||||
}
|
||||
|
||||
ctools_include('context');
|
||||
|
||||
$contexts = array();
|
||||
if (module_exists('page_manager') && $current_page = page_manager_get_current_page()) {
|
||||
if (!empty($current_page['contexts'])) {
|
||||
$contexts = ctools_context_match_required_contexts($panel_mini->requiredcontexts, $current_page['contexts']);
|
||||
}
|
||||
}
|
||||
|
||||
$panel_mini->context = $panel_mini->display->context = ctools_context_load_contexts($panel_mini, FALSE, $contexts);
|
||||
$panel_mini->display->css_id = panels_mini_get_id($panel_mini->name);
|
||||
|
||||
$block = array();
|
||||
|
||||
$block['content'] = panels_render_display($panel_mini->display);
|
||||
$block['subject'] = $panel_mini->display->get_title();
|
||||
|
||||
unset($viewing[$delta]);
|
||||
return $block;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of hook_block_configure().
|
||||
*/
|
||||
function panels_mini_block_configure($delta = 0) {
|
||||
return array(
|
||||
'admin_shortcut' => array(
|
||||
'#markup' => l(t('Manage this mini-panel'), 'admin/structure/mini-panels/list/' . $delta . '/edit')
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements hook_block_list_alter().
|
||||
*
|
||||
* Remove the block if the required contexts are not available.
|
||||
*/
|
||||
function panels_mini_block_list_alter(&$blocks) {
|
||||
if (module_exists('page_manager')) {
|
||||
$current_page = page_manager_get_current_page();
|
||||
}
|
||||
foreach ($blocks as $key => $block) {
|
||||
if ($block->module != 'panels_mini') {
|
||||
// This block was added by a contrib module, leave it in the list.
|
||||
continue;
|
||||
}
|
||||
|
||||
$panel_mini = panels_mini_load($block->delta);
|
||||
if (empty($panel_mini)) {
|
||||
// Bail out early if the specified mini panel doesn't exist.
|
||||
unset($blocks[$key]);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!empty($panel_mini->requiredcontexts)) {
|
||||
if (!$current_page || empty($current_page['contexts'])) {
|
||||
unset($blocks[$key]);
|
||||
continue;
|
||||
}
|
||||
else {
|
||||
$required = array();
|
||||
foreach ($panel_mini->requiredcontexts as $context) {
|
||||
$info = ctools_get_context($context['name']);
|
||||
$required[] = new ctools_context_required($context['identifier'], $info['context name']);
|
||||
}
|
||||
if (!ctools_context_match_requirements($current_page['contexts'], $required)) {
|
||||
unset($blocks[$key]);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Statically store all used IDs to ensure all mini panels get a unique id.
|
||||
*/
|
||||
function panels_mini_get_id($name) {
|
||||
$id_cache = &drupal_static(__FUNCTION__, array());
|
||||
|
||||
$id = 'mini-panel-' . $name;
|
||||
if (!empty($id_cache[$name])) {
|
||||
$id .= "-" . $id_cache[$name]++;
|
||||
}
|
||||
else {
|
||||
$id_cache[$name] = 1;
|
||||
}
|
||||
|
||||
return $id;
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Database functions.
|
||||
|
||||
/**
|
||||
* Create a new page with defaults appropriately set from schema.
|
||||
*/
|
||||
function panels_mini_new($set_defaults = TRUE) {
|
||||
ctools_include('export');
|
||||
return ctools_export_new_object('panels_mini', $set_defaults);
|
||||
}
|
||||
|
||||
/**
|
||||
* Load a single mini panel.
|
||||
*/
|
||||
function panels_mini_load($name) {
|
||||
$cache = &drupal_static('panels_mini_load_all', array());
|
||||
|
||||
// We use array_key_exists because failed loads will be NULL and
|
||||
// isset() will try to load it again.
|
||||
if (!array_key_exists($name, $cache)) {
|
||||
ctools_include('export');
|
||||
$result = ctools_export_load_object('panels_mini', 'names', array($name));
|
||||
if (isset($result[$name])) {
|
||||
if (empty($result[$name]->display)) {
|
||||
$result[$name]->display = panels_load_display($result[$name]->did);
|
||||
if (!empty($result[$name]->title) && empty($result[$name]->display->title)) {
|
||||
$result[$name]->display->title = $result[$name]->title;
|
||||
}
|
||||
}
|
||||
$cache[$name] = $result[$name];
|
||||
if (!empty($result[$name]->title) && empty($result[$name]->admin_title)) {
|
||||
$cache[$name]->admin_title = $result[$name]->title;
|
||||
}
|
||||
}
|
||||
else {
|
||||
$cache[$name] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($cache[$name])) {
|
||||
return $cache[$name];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Load all mini panels.
|
||||
*/
|
||||
function panels_mini_load_all($reset = FALSE) {
|
||||
$cache = &drupal_static('panels_mini_load_all', array());
|
||||
static $all_loaded = FALSE;
|
||||
|
||||
// We check our own private static because individual minis could have
|
||||
// been loaded prior to load all and we need to know that.
|
||||
if (!$all_loaded || $reset) {
|
||||
$all_loaded = TRUE;
|
||||
if ($reset) {
|
||||
$cache = array();
|
||||
}
|
||||
|
||||
ctools_include('export');
|
||||
$minis = ctools_export_load_object('panels_mini');
|
||||
$dids = array();
|
||||
foreach ($minis as $mini) {
|
||||
if (empty($cache[$mini->name])) {
|
||||
if (!empty($mini->did)) {
|
||||
$dids[$mini->did] = $mini->name;
|
||||
}
|
||||
else {
|
||||
// Translate old style titles into new titles.
|
||||
if (!empty($mini->title) && empty($mini->display->title)) {
|
||||
$mini->display->title = $mini->title;
|
||||
}
|
||||
}
|
||||
// Translate old style titles into new titles.
|
||||
if (isset($mini->title) && empty($mini->admin_title)) {
|
||||
$mini->admin_title = $mini->title;
|
||||
}
|
||||
$cache[$mini->name] = $mini;
|
||||
}
|
||||
}
|
||||
|
||||
$displays = panels_load_displays(array_keys($dids));
|
||||
foreach ($displays as $did => $display) {
|
||||
if (!empty($cache[$dids[$did]]->title) && empty($display->title)) {
|
||||
$display->title = $cache[$dids[$did]]->title;
|
||||
}
|
||||
$cache[$dids[$did]]->display = $display;
|
||||
}
|
||||
}
|
||||
|
||||
// Strip out NULL entries that may have been added by panels_mini_load().
|
||||
return array_filter($cache);
|
||||
}
|
||||
|
||||
/**
|
||||
* Write a mini panel to the database.
|
||||
*/
|
||||
function panels_mini_save(&$mini) {
|
||||
if (!empty($mini->display)) {
|
||||
$display = panels_save_display($mini->display);
|
||||
$mini->did = $display->did;
|
||||
}
|
||||
|
||||
$update = (isset($mini->pid) && $mini->pid != 'new') ? array('pid') : array();
|
||||
drupal_write_record('panels_mini', $mini, $update);
|
||||
|
||||
return $mini;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a mini panel.
|
||||
*/
|
||||
function panels_mini_delete($mini) {
|
||||
db_delete('panels_mini')
|
||||
->condition('name', $mini->name)
|
||||
->execute();
|
||||
|
||||
if (db_table_exists('block') && $mini->type != t('Overridden')) {
|
||||
// Also remove from block table as long as there isn't a default that may appear.
|
||||
db_delete('block')
|
||||
->condition('delta', $mini->name)
|
||||
->condition('module', 'panels_mini')
|
||||
->execute();
|
||||
}
|
||||
return panels_delete_display($mini->did);
|
||||
}
|
||||
|
||||
/**
|
||||
* Export a mini panel.
|
||||
*/
|
||||
function panels_mini_export($mini, $indent = '') {
|
||||
ctools_include('export');
|
||||
$output = ctools_export_object('panels_mini', $mini, $indent);
|
||||
// Export the primary display
|
||||
$display = !empty($mini->display) ? $mini->display : panels_load_display($mini->did);
|
||||
$output .= panels_export_display($display, $indent);
|
||||
$output .= $indent . '$mini->display = $display' . ";\n";
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the block version of mini panels from being available content types.
|
||||
*/
|
||||
function panels_mini_ctools_block_info($module, $delta, &$info) {
|
||||
$info = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of hook_ctools_plugin_directory() to let the system know
|
||||
* we implement task and task_handler plugins.
|
||||
*/
|
||||
function panels_mini_ctools_plugin_directory($module, $plugin) {
|
||||
if ($module == 'ctools' && ($plugin == 'content_types' || $plugin == 'export_ui')) {
|
||||
return 'plugins/' . $plugin;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the display cache for the panels_mini plugin.
|
||||
*/
|
||||
function _panels_mini_panels_cache_get($key) {
|
||||
ctools_include('export-ui');
|
||||
$plugin = ctools_get_export_ui('panels_mini');
|
||||
$handler = ctools_export_ui_get_handler($plugin);
|
||||
if (!$handler) {
|
||||
return;
|
||||
}
|
||||
|
||||
$item = $handler->edit_cache_get($key);
|
||||
if (!$item) {
|
||||
$item = ctools_export_crud_load($handler->plugin['schema'], $key);
|
||||
}
|
||||
|
||||
return array($handler, $item);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get display edit cache for the panels mini export UI
|
||||
*
|
||||
* The key is the second half of the key in this form:
|
||||
* panels_mini:TASK_NAME:HANDLER_NAME;
|
||||
*/
|
||||
function panels_mini_panels_cache_get($key) {
|
||||
ctools_include('common', 'panels');
|
||||
list($handler, $item) = _panels_mini_panels_cache_get($key);
|
||||
if (isset($item->mini_panels_display_cache)) {
|
||||
return $item->mini_panels_display_cache;
|
||||
}
|
||||
|
||||
$cache = new stdClass();
|
||||
$cache->display = $item->display;
|
||||
$cache->display->context = ctools_context_load_contexts($item);
|
||||
$cache->display->cache_key = 'panels_mini:' . $key;
|
||||
$cache->content_types = panels_common_get_allowed_types('panels_mini', $cache->display->context);
|
||||
$cache->display_title = TRUE;
|
||||
|
||||
// @TODO support locking
|
||||
$cache->locked = FALSE;
|
||||
|
||||
return $cache;
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a display edit in progress in the page cache.
|
||||
*/
|
||||
function panels_mini_panels_cache_set($key, $cache) {
|
||||
list($handler, $item) = _panels_mini_panels_cache_get($key);
|
||||
$item->mini_panels_display_cache = $cache;
|
||||
$handler->edit_cache_set_key($item, $key);
|
||||
}
|
||||
|
||||
/**
|
||||
* Save all changes made to a display using the panels mini UI cache.
|
||||
*/
|
||||
function panels_mini_panels_cache_clear($key, $cache) {
|
||||
list($handler, $item) = _panels_mini_panels_cache_get($key);
|
||||
$handler->edit_cache_clear($item);
|
||||
}
|
||||
|
||||
/**
|
||||
* Save all changes made to a display using the panels mini UI cache.
|
||||
*/
|
||||
function panels_mini_panels_cache_save($key, $cache) {
|
||||
list($handler, $item) = _panels_mini_panels_cache_get($key);
|
||||
$item->display = $cache->display;
|
||||
panels_mini_save($item);
|
||||
|
||||
$handler->edit_cache_clear($item);
|
||||
}
|
||||
|
||||
/**
|
||||
* Break the lock on a panels mini page.
|
||||
*/
|
||||
function panels_mini_panels_cache_break_lock($key, $cache) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of hook_panels_dashboard_blocks().
|
||||
*
|
||||
* Adds mini panels information to the Panels dashboard.
|
||||
*/
|
||||
function panels_mini_panels_dashboard_blocks(&$vars) {
|
||||
$vars['links']['panels_mini'] = array(
|
||||
'title' => l(t('Mini panel'), 'admin/structure/mini-panels/add'),
|
||||
'description' => t('Mini panels are small content areas exposed as blocks, for when you need to have complex block layouts or layouts within layouts.'),
|
||||
'weight' => -1,
|
||||
);
|
||||
|
||||
// Load all mini panels and their displays.
|
||||
$panel_minis = panels_mini_load_all();
|
||||
$count = 0;
|
||||
$rows = array();
|
||||
|
||||
foreach ($panel_minis as $panel_mini) {
|
||||
$rows[] = array(
|
||||
check_plain($panel_mini->admin_title),
|
||||
array(
|
||||
'data' => l(t('Edit'), "admin/structure/mini-panels/list/$panel_mini->name/edit"),
|
||||
'class' => 'links',
|
||||
),
|
||||
);
|
||||
|
||||
// Only show 10.
|
||||
if (++$count >= 10) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ($rows) {
|
||||
$content = theme('table', array('rows' => $rows, 'attributes' => array('class' => 'panels-manage')));
|
||||
}
|
||||
else {
|
||||
$content = '<p>' . t('There are no mini panels.') . '</p>';
|
||||
}
|
||||
|
||||
$vars['blocks']['panels_mini'] = array(
|
||||
'weight' => -100,
|
||||
'title' => t('Manage mini panels'),
|
||||
'link' => l(t('Go to list'), 'admin/structure/mini-panels'),
|
||||
'content' => $content,
|
||||
'class' => 'dashboard-mini-panels',
|
||||
'section' => 'left',
|
||||
);
|
||||
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 450 B |
@@ -0,0 +1,176 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains the content type plugin for a mini panel. While this does not
|
||||
* need to be broken out into a .inc file, it's convenient that we do so
|
||||
* that we don't load code unneccessarily. Plus it demonstrates plugins
|
||||
* in modules other than Panels itself.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Specially named hook. for .inc file. This looks a little silly due to the
|
||||
* redundancy, but that's really just because the content type shares a
|
||||
* name with the module.
|
||||
*/
|
||||
function panels_mini_panels_mini_ctools_content_types() {
|
||||
return array(
|
||||
'title' => t('Mini panels'),
|
||||
'content type' => 'panels_mini_panels_mini_content_type_content_type',
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return each available mini panel available as a subtype.
|
||||
*/
|
||||
function panels_mini_panels_mini_content_type_content_type($subtype_id, $plugin) {
|
||||
$mini = panels_mini_load($subtype_id);
|
||||
return _panels_mini_panels_mini_content_type_content_type($mini);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return each available mini panel available as a subtype.
|
||||
*/
|
||||
function panels_mini_panels_mini_content_type_content_types($plugin) {
|
||||
$types = array();
|
||||
foreach (panels_mini_load_all() as $mini) {
|
||||
$type = _panels_mini_panels_mini_content_type_content_type($mini);
|
||||
if ($type) {
|
||||
$types[$mini->name] = $type;
|
||||
}
|
||||
}
|
||||
return $types;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an info array describing a single mini panel.
|
||||
*/
|
||||
function _panels_mini_panels_mini_content_type_content_type($mini) {
|
||||
if (empty($mini)) {
|
||||
// The mini panel is deleted or missing.
|
||||
return;
|
||||
}
|
||||
|
||||
if (!empty($mini->disabled)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$title = filter_xss_admin($mini->admin_title);
|
||||
$type = array(
|
||||
'title' => $title,
|
||||
// For now mini panels will just use the contrib block icon.
|
||||
'icon' => 'icon_mini_panel.png',
|
||||
'description' => $title,
|
||||
'category' => !empty($mini->category) ? $mini->category : t('Mini panel'),
|
||||
);
|
||||
if (!empty($mini->requiredcontexts)) {
|
||||
$type['required context'] = array();
|
||||
foreach ($mini->requiredcontexts as $context) {
|
||||
$info = ctools_get_context($context['name']);
|
||||
// TODO: allow an optional setting
|
||||
$type['required context'][] = new ctools_context_required($context['identifier'], $info['context name']);
|
||||
}
|
||||
}
|
||||
return $type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Render a mini panel called from a panels display.
|
||||
*/
|
||||
function panels_mini_panels_mini_content_type_render($subtype, $conf, $panel_args, &$contexts) {
|
||||
static $viewing = array();
|
||||
$mini = panels_mini_load($subtype);
|
||||
if (!$mini) {
|
||||
return FALSE;
|
||||
}
|
||||
if (!empty($viewing[$mini->name])) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Load up any contexts we might be using.
|
||||
$context = ctools_context_match_required_contexts($mini->requiredcontexts, $contexts);
|
||||
$mini->context = $mini->display->context = ctools_context_load_contexts($mini, FALSE, $context);
|
||||
|
||||
if (empty($mini) || !empty($mini->disabled)) {
|
||||
return;
|
||||
}
|
||||
$viewing[$mini->name] = TRUE;
|
||||
|
||||
$mini->display->args = $panel_args;
|
||||
$mini->display->css_id = panels_mini_get_id($subtype);
|
||||
$mini->display->owner = $mini;
|
||||
// unique ID of this mini.
|
||||
$mini->display->owner->id = $mini->name;
|
||||
|
||||
$block = new stdClass();
|
||||
$block->module = 'panels_mini';
|
||||
$block->delta = $subtype;
|
||||
$block->content = panels_render_display($mini->display);
|
||||
$block->title = $mini->display->get_title();
|
||||
|
||||
if (user_access('administer mini panels')) {
|
||||
$block->admin_links = array(
|
||||
array(
|
||||
'title' => t('Configure mini panel'),
|
||||
'href' => "admin/structure/mini-panels/list/$subtype/edit/content",
|
||||
'query' => drupal_get_destination(),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
unset($viewing[$mini->name]);
|
||||
return $block;
|
||||
}
|
||||
|
||||
/**
|
||||
* Edit form for the mini panel content type.
|
||||
*/
|
||||
function panels_mini_panels_mini_content_type_edit_form($form, &$form_state) {
|
||||
// Empty form to ensure we have the override title + context gadgets.
|
||||
return $form;
|
||||
}
|
||||
|
||||
/**
|
||||
* Provide the administrative title of a mini panel.
|
||||
*/
|
||||
function panels_mini_panels_mini_content_type_admin_title($subtype, $conf) {
|
||||
$mini = panels_mini_load($subtype);
|
||||
if (!$mini) {
|
||||
return t('Deleted/missing mini panel @name', array('@name' => $subtype));
|
||||
}
|
||||
|
||||
$title = filter_xss_admin($mini->admin_title);
|
||||
if (empty($title)) {
|
||||
$title = t('Untitled mini panel');
|
||||
}
|
||||
return $title;
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback to provide administrative info. Provide links to edit the mini
|
||||
* panel.
|
||||
*/
|
||||
function panels_mini_panels_mini_content_type_admin_info($subtype, $conf) {
|
||||
$mini = panels_mini_load($subtype);
|
||||
if (!$mini) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$block = new stdClass();
|
||||
$block->title = $mini->admin_title;
|
||||
$admin_pages = array(
|
||||
t('Settings') => 'basic',
|
||||
t('Context') => 'context',
|
||||
t('Layout') => 'layout',
|
||||
t('Content') => 'content',
|
||||
);
|
||||
|
||||
$links = array();
|
||||
foreach ($admin_pages as $title => $tail) {
|
||||
$links[] = l($title, 'admin/structure/mini-panels/list/' . $subtype . '/edit/' . $tail, array('query' => drupal_get_destination()));
|
||||
}
|
||||
|
||||
$block->content = theme('item_list', array('items' => $links));
|
||||
return $block;
|
||||
}
|
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
$plugin = array(
|
||||
'schema' => 'panels_mini',
|
||||
'access' => 'administer mini panels',
|
||||
'create access' => 'create mini panels',
|
||||
|
||||
'menu' => array(
|
||||
'menu item' => 'mini-panels',
|
||||
'menu title' => 'Mini panels',
|
||||
'menu description' => 'Add, edit or delete mini panels, which can be used as blocks or content panes in other panels.',
|
||||
),
|
||||
|
||||
'title singular' => t('mini panel'),
|
||||
'title singular proper' => t('Mini panel'),
|
||||
'title plural' => t('mini panels'),
|
||||
'title plural proper' => t('Mini panels'),
|
||||
|
||||
'handler' => array(
|
||||
'class' => 'panels_mini_ui',
|
||||
'parent' => 'ctools_export_ui',
|
||||
),
|
||||
|
||||
'use wizard' => TRUE,
|
||||
'form info' => array(
|
||||
'order' => array(
|
||||
'basic' => t('Settings'),
|
||||
'context' => t('Context'),
|
||||
'layout' => t('Layout'),
|
||||
'content' => t('Content'),
|
||||
),
|
||||
// We have to add this form specially because it's invisible.
|
||||
'forms' => array(
|
||||
'move' => array(
|
||||
'form id' => 'ctools_export_ui_edit_item_wizard_form',
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
);
|
||||
|
@@ -0,0 +1,298 @@
|
||||
<?php
|
||||
|
||||
class panels_mini_ui extends ctools_export_ui {
|
||||
function init($plugin) {
|
||||
parent::init($plugin);
|
||||
ctools_include('context');
|
||||
}
|
||||
|
||||
function list_form(&$form, &$form_state) {
|
||||
ctools_include('plugins', 'panels');
|
||||
$this->layouts = panels_get_layouts();
|
||||
|
||||
parent::list_form($form, $form_state);
|
||||
|
||||
$categories = $layouts = array('all' => t('- All -'));
|
||||
foreach ($this->items as $item) {
|
||||
$categories[$item->category] = $item->category ? $item->category : t('Mini panels');
|
||||
}
|
||||
|
||||
$form['top row']['category'] = array(
|
||||
'#type' => 'select',
|
||||
'#title' => t('Category'),
|
||||
'#options' => $categories,
|
||||
'#default_value' => 'all',
|
||||
'#weight' => -10,
|
||||
);
|
||||
|
||||
foreach ($this->layouts as $name => $plugin) {
|
||||
$layouts[$name] = $plugin['title'];
|
||||
}
|
||||
|
||||
$form['top row']['layout'] = array(
|
||||
'#type' => 'select',
|
||||
'#title' => t('Layout'),
|
||||
'#options' => $layouts,
|
||||
'#default_value' => 'all',
|
||||
'#weight' => -9,
|
||||
);
|
||||
}
|
||||
|
||||
function list_filter($form_state, $item) {
|
||||
if ($form_state['values']['category'] != 'all' && $form_state['values']['category'] != $item->category) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if ($form_state['values']['layout'] != 'all' && $form_state['values']['layout'] != $item->display->layout) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return parent::list_filter($form_state, $item);
|
||||
}
|
||||
|
||||
function list_sort_options() {
|
||||
return array(
|
||||
'disabled' => t('Enabled, title'),
|
||||
'title' => t('Title'),
|
||||
'name' => t('Name'),
|
||||
'category' => t('Category'),
|
||||
'storage' => t('Storage'),
|
||||
'layout' => t('Layout'),
|
||||
);
|
||||
}
|
||||
|
||||
function list_build_row($item, &$form_state, $operations) {
|
||||
// Set up sorting
|
||||
switch ($form_state['values']['order']) {
|
||||
case 'disabled':
|
||||
$this->sorts[$item->name] = empty($item->disabled) . $item->admin_title;
|
||||
break;
|
||||
case 'title':
|
||||
$this->sorts[$item->name] = $item->admin_title;
|
||||
break;
|
||||
case 'name':
|
||||
$this->sorts[$item->name] = $item->name;
|
||||
break;
|
||||
case 'category':
|
||||
$this->sorts[$item->name] = ($item->category ? $item->category : t('Mini panels')) . $item->admin_title;
|
||||
break;
|
||||
case 'layout':
|
||||
$this->sorts[$item->name] = $item->display->layout . $item->admin_title;
|
||||
break;
|
||||
case 'storage':
|
||||
$this->sorts[$item->name] = $item->type . $item->admin_title;
|
||||
break;
|
||||
}
|
||||
|
||||
$layout = !empty($this->layouts[$item->display->layout]) ? $this->layouts[$item->display->layout]['title'] : t('Missing layout');
|
||||
$category = $item->category ? check_plain($item->category) : t('Mini panels');
|
||||
|
||||
$ops = theme('links__ctools_dropbutton', array('links' => $operations, 'attributes' => array('class' => array('links', 'inline'))));
|
||||
|
||||
$this->rows[$item->name] = array(
|
||||
'data' => array(
|
||||
array('data' => check_plain($item->admin_title), 'class' => array('ctools-export-ui-title')),
|
||||
array('data' => check_plain($item->name), 'class' => array('ctools-export-ui-name')),
|
||||
array('data' => $category, 'class' => array('ctools-export-ui-category')),
|
||||
array('data' => $layout, 'class' => array('ctools-export-ui-layout')),
|
||||
array('data' => $item->type, 'class' => array('ctools-export-ui-storage')),
|
||||
array('data' => $ops, 'class' => array('ctools-export-ui-operations')),
|
||||
),
|
||||
'title' => !empty($item->admin_description) ? check_plain($item->admin_description) : '',
|
||||
'class' => array(!empty($item->disabled) ? 'ctools-export-ui-disabled' : 'ctools-export-ui-enabled'),
|
||||
);
|
||||
}
|
||||
|
||||
function list_table_header() {
|
||||
return array(
|
||||
array('data' => t('Title'), 'class' => array('ctools-export-ui-title')),
|
||||
array('data' => t('Name'), 'class' => array('ctools-export-ui-name')),
|
||||
array('data' => t('Category'), 'class' => array('ctools-export-ui-category')),
|
||||
array('data' => t('Layout'), 'class' => array('ctools-export-ui-layout')),
|
||||
array('data' => t('Storage'), 'class' => array('ctools-export-ui-storage')),
|
||||
array('data' => t('Operations'), 'class' => array('ctools-export-ui-operations')),
|
||||
);
|
||||
}
|
||||
|
||||
function edit_form(&$form, &$form_state) {
|
||||
// Get the basic edit form
|
||||
parent::edit_form($form, $form_state);
|
||||
|
||||
// Set the admin title machine name length.
|
||||
// We need to do this because the system block name length is
|
||||
// limited to 32 chars.
|
||||
$form['info']['name']['#maxlength'] = 32;
|
||||
$form['info']['name']['#size'] = 34;
|
||||
$form['info']['name']['#description'] .= ' ' . t('The machine name length is limited to 32 characters, due to a limitation in the core block system.');
|
||||
|
||||
$form['category'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#size' => 24,
|
||||
'#default_value' => $form_state['item']->category,
|
||||
'#title' => t('Category'),
|
||||
'#description' => t("The category that this mini-panel will be grouped into on the Add Content form. Only upper and lower-case alphanumeric characters are allowed. If left blank, defaults to 'Mini panels'."),
|
||||
);
|
||||
|
||||
$form['title']['#title'] = t('Title');
|
||||
$form['title']['#description'] = t('The title for this mini panel. It can be overridden in the block configuration.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate submission of the mini panel edit form.
|
||||
*/
|
||||
function edit_form_basic_validate($form, &$form_state) {
|
||||
parent::edit_form_validate($form, $form_state);
|
||||
if (preg_match("/[^A-Za-z0-9 ]/", $form_state['values']['category'])) {
|
||||
form_error($form['category'], t('Categories may contain only alphanumerics or spaces.'));
|
||||
}
|
||||
}
|
||||
|
||||
function edit_form_submit(&$form, &$form_state) {
|
||||
parent::edit_form_submit($form, $form_state);
|
||||
$form_state['item']->category = $form_state['values']['category'];
|
||||
}
|
||||
|
||||
function edit_form_context(&$form, &$form_state) {
|
||||
ctools_include('context-admin');
|
||||
ctools_context_admin_includes();
|
||||
ctools_add_css('ruleset');
|
||||
|
||||
$form['right'] = array(
|
||||
'#prefix' => '<div class="ctools-right-container">',
|
||||
'#suffix' => '</div>',
|
||||
);
|
||||
|
||||
$form['left'] = array(
|
||||
'#prefix' => '<div class="ctools-left-container clearfix">',
|
||||
'#suffix' => '</div>',
|
||||
);
|
||||
|
||||
// Set this up and we can use CTools' Export UI's built in wizard caching,
|
||||
// which already has callbacks for the context cache under this name.
|
||||
$module = 'export_ui::' . $this->plugin['name'];
|
||||
$name = $this->edit_cache_get_key($form_state['item'], $form_state['form type']);
|
||||
|
||||
ctools_context_add_context_form($module, $form, $form_state, $form['right']['contexts_table'], $form_state['item'], $name);
|
||||
ctools_context_add_required_context_form($module, $form, $form_state, $form['left']['required_contexts_table'], $form_state['item'], $name);
|
||||
ctools_context_add_relationship_form($module, $form, $form_state, $form['right']['relationships_table'], $form_state['item'], $name);
|
||||
}
|
||||
|
||||
function edit_form_context_submit(&$form, &$form_state) {
|
||||
// Prevent this from going to edit_form_submit();
|
||||
}
|
||||
|
||||
function edit_form_layout(&$form, &$form_state) {
|
||||
ctools_include('common', 'panels');
|
||||
ctools_include('display-layout', 'panels');
|
||||
ctools_include('plugins', 'panels');
|
||||
|
||||
// @todo -- figure out where/how to deal with this.
|
||||
$form_state['allowed_layouts'] = 'panels_mini';
|
||||
|
||||
if ($form_state['op'] == 'add' && empty($form_state['item']->display)) {
|
||||
$form_state['item']->display = panels_new_display();
|
||||
}
|
||||
|
||||
$form_state['display'] = &$form_state['item']->display;
|
||||
|
||||
// Tell the Panels form not to display buttons.
|
||||
$form_state['no buttons'] = TRUE;
|
||||
|
||||
// Change the #id of the form so the CSS applies properly.
|
||||
$form['#id'] = 'panels-choose-layout';
|
||||
$form = panels_choose_layout($form, $form_state);
|
||||
|
||||
if ($form_state['op'] == 'edit') {
|
||||
$form['buttons']['next']['#value'] = t('Change');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate that a layout was chosen.
|
||||
*/
|
||||
function edit_form_layout_validate(&$form, &$form_state) {
|
||||
$display = &$form_state['display'];
|
||||
if (empty($form_state['values']['layout'])) {
|
||||
form_error($form['layout'], t('You must select a layout.'));
|
||||
}
|
||||
if ($form_state['op'] == 'edit') {
|
||||
if ($form_state['values']['layout'] == $display->layout) {
|
||||
form_error($form['layout'], t('You must select a different layout if you wish to change layouts.'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A layout has been selected, set it up.
|
||||
*/
|
||||
function edit_form_layout_submit(&$form, &$form_state) {
|
||||
$display = &$form_state['display'];
|
||||
if ($form_state['op'] == 'edit') {
|
||||
if ($form_state['values']['layout'] != $display->layout) {
|
||||
$form_state['item']->temp_layout = $form_state['values']['layout'];
|
||||
$form_state['clicked_button']['#next'] = 'move';
|
||||
}
|
||||
}
|
||||
else {
|
||||
$form_state['item']->display->layout = $form_state['values']['layout'];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* When a layout is changed, the user is given the opportunity to move content.
|
||||
*/
|
||||
function edit_form_move(&$form, &$form_state) {
|
||||
$form_state['display'] = &$form_state['item']->display;
|
||||
$form_state['layout'] = $form_state['item']->temp_layout;
|
||||
|
||||
ctools_include('common', 'panels');
|
||||
ctools_include('display-layout', 'panels');
|
||||
ctools_include('plugins', 'panels');
|
||||
|
||||
// Tell the Panels form not to display buttons.
|
||||
$form_state['no buttons'] = TRUE;
|
||||
|
||||
// Change the #id of the form so the CSS applies properly.
|
||||
$form = panels_change_layout($form, $form_state);
|
||||
|
||||
// This form is outside the normal wizard list, so we need to specify the
|
||||
// previous/next forms.
|
||||
$form['buttons']['previous']['#next'] = 'layout';
|
||||
$form['buttons']['next']['#next'] = 'content';
|
||||
}
|
||||
|
||||
function edit_form_move_submit(&$form, &$form_state) {
|
||||
panels_change_layout_submit($form, $form_state);
|
||||
}
|
||||
|
||||
function edit_form_content(&$form, &$form_state) {
|
||||
ctools_include('ajax');
|
||||
ctools_include('plugins', 'panels');
|
||||
ctools_include('display-edit', 'panels');
|
||||
ctools_include('context');
|
||||
|
||||
// If we are cloning an item, we MUST have this cached for this to work,
|
||||
// so make sure:
|
||||
if ($form_state['form type'] == 'clone' && empty($form_state['item']->export_ui_item_is_cached)) {
|
||||
$this->edit_cache_set($form_state['item'], 'clone');
|
||||
}
|
||||
|
||||
$cache = panels_edit_cache_get('panels_mini:' . $this->edit_cache_get_key($form_state['item'], $form_state['form type']));
|
||||
|
||||
$form_state['renderer'] = panels_get_renderer_handler('editor', $cache->display);
|
||||
$form_state['renderer']->cache = &$cache;
|
||||
|
||||
$form_state['display'] = &$cache->display;
|
||||
$form_state['content_types'] = $cache->content_types;
|
||||
// Tell the Panels form not to display buttons.
|
||||
$form_state['no buttons'] = TRUE;
|
||||
$form_state['display_title'] = !empty($cache->display_title);
|
||||
|
||||
$form = panels_edit_display_form($form, $form_state);
|
||||
}
|
||||
|
||||
function edit_form_content_submit(&$form, &$form_state) {
|
||||
panels_edit_display_form_submit($form, $form_state);
|
||||
$form_state['item']->display = $form_state['display'];
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user