Newer
Older
Earl Miles
committed
<?php
// $Id$
/**
* @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_perm().
*/
function panels_mini_perm() {
return array('create mini panels', 'administer 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();
}
require_once drupal_get_path('module', 'panels_mini') . '/panels_mini.admin.inc';
return _panels_mini_menu();
Earl Miles
committed
}
// ---------------------------------------------------------------------------
// Allow the rest of the system access to mini panels
/**
* Implementation of hook_block().
*
* Expose qualifying mini panels to Drupal's block system.
*/
function panels_mini_block($op = 'list', $delta = 0, $edit = array()) {
// 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();
}
Earl Miles
committed
if ($op == 'list') {
$blocks = array();
$minis = panels_mini_load_all();
foreach ($minis as $panel_mini) {
if (empty($mini->disabled) && empty($mini->requiredcontext)) {
$blocks[$panel_mini->name] = array(
'info' => t('Mini panel: "@title"', array('@title' => $panel_mini->admin_title)),
'cache' => BLOCK_NO_CACHE,
Earl Miles
committed
);
}
}
return $blocks;
}
elseif ($op == 'view') {
// static recursion protection.
static $viewing = array();
if (!empty($viewing[$delta])) {
return;
}
$viewing[$delta] = TRUE;
Earl Miles
committed
$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');
Earl Miles
committed
$panel_mini->context = $panel_mini->display->context = ctools_context_load_contexts($panel_mini);
Earl Miles
committed
$panel_mini->display->css_id = panels_mini_get_id($panel_mini->name);
Earl Miles
committed
$block = array();
Earl Miles
committed
$block['content'] = panels_render_display($panel_mini->display);
$block['subject'] = $panel_mini->display->get_title();
Earl Miles
committed
return $block;
}
elseif ($op = 'configure') {
return array(
'admin-shortcut' => array(
'#value' => l(t('Manage this mini-panel'), 'admin/build/panel-mini/' . $delta . '/edit-general')
),
);
}
Earl Miles
committed
}
/**
* Statically store all used IDs to ensure all mini panels get a unique id.
*/
function panels_mini_get_id($name) {
static $id_cache = array();
$id = 'mini-panel-' . $name;
if (!empty($id_cache[$name])) {
$id .= "-" . $id_cache[$name]++;
}
else {
$id_cache[$name] = 1;
}
return $id;
}
// ---------------------------------------------------------------------------
// Database functions.
/**
Earl Miles
committed
* Create a new page with defaults appropriately set from schema.
Earl Miles
committed
*/
function panels_mini_new($set_defaults = TRUE) {
Earl Miles
committed
ctools_include('export');
return ctools_export_new_object('panels_mini', $set_defaults);
Earl Miles
committed
}
/**
Earl Miles
committed
* Load a single mini panel.
Earl Miles
committed
*/
Earl Miles
committed
function panels_mini_load($name) {
$cache = &ctools_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];
Earl Miles
committed
}
}
/**
Earl Miles
committed
* Load all mini panels.
Earl Miles
committed
*/
function panels_mini_load_all($reset = FALSE) {
$cache = &ctools_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();
}
Earl Miles
committed
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;
}
Earl Miles
committed
$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;
}
Earl Miles
committed
}
Earl Miles
committed
}
/**
Earl Miles
committed
* Write a mini panel to the database.
Earl Miles
committed
*/
Earl Miles
committed
function panels_mini_save(&$mini) {
if (!empty($mini->display)) {
$display = panels_save_display($mini->display);
$mini->did = $display->did;
Earl Miles
committed
}
$update = (isset($mini->pid) && $mini->pid != 'new') ? array('pid') : array();
Earl Miles
committed
drupal_write_record('panels_mini', $mini, $update);
Earl Miles
committed
return $mini;
Earl Miles
committed
}
/**
Earl Miles
committed
* Remove a mini panel.
Earl Miles
committed
*/
Earl Miles
committed
function panels_mini_delete($mini) {
db_query("DELETE FROM {panels_mini} WHERE name = '%s'", $mini->name);
if ($mini->type != t('Overridden')) {
db_query("DELETE FROM {blocks} WHERE module = 'panels_mini' AND delta = '%s'", $mini->name);
}
return panels_delete_display($mini->did);
Earl Miles
committed
}
/**
Earl Miles
committed
* Export a mini panel.
Earl Miles
committed
*/
Earl Miles
committed
function panels_mini_export($mini, $indent = '') {
ctools_include('export');
Earl Miles
committed
$output = ctools_export_object('panels_mini', $mini, $indent);
Earl Miles
committed
// Export the primary display
Earl Miles
committed
$display = !empty($mini->display) ? $mini->display : panels_load_display($mini->did);
$output .= panels_export_display($display, $indent);
$output .= $indent . '$mini->display = $display' . ";\n";
Earl Miles
committed
return $output;
}
/**
* Remove the block version of mini panels from being available content types.
*/
function panels_mini_ctools_block_info($module, $delta, &$info) {
Earl Miles
committed
$info = NULL;
}
Earl Miles
committed
/**
* 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')) {
Earl Miles
committed
return 'plugins/' . $plugin;
}
}
/**
* Get the Page Manager 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);
Earl Miles
committed
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);
Earl Miles
committed
$item->mini_panels_display_cache = $cache;
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
$handler->edit_cache_set_key($item, $key);
}
/**
* Save all changes made to a display using the Page Manager page 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 Page Manager page 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 page manager page.
*/
function panels_mini_panels_cache_break_lock($key, $cache) {
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
/**
* Alter default mini panels to ensure they have new fields and avoid warnings.
*/
function panels_mini_default_panels_mini_alter(&$minis) {
foreach ($minis as $name => $mini) {
if (!isset($mini->admin_description)) {
$minis[$name]->admin_description = '';
}
}
}
/**
* 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/build/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(
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
array(
'data' => l(t('Edit'), "admin/build/mini-panels/list/$panel_mini->name/edit"),
'class' => 'links',
),
);
// Only show 10.
if (++$count >= 10) {
break;
}
}
if ($rows) {
$content = theme('table', array(), $rows, 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/build/mini-panels'),
'content' => $content,
'class' => 'dashboard-mini-panels',
'section' => 'left',
);
}