disabled) && empty($mini->requiredcontext)) { $blocks[$panel_mini->name] = array( 'info' => t('Mini panel: "@title"', array('@title' => $panel_mini->title)), 'cache' => BLOCK_NO_CACHE, ); } } return $blocks; } elseif ($op == 'view') { // 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'); $panel_mini->context = $panel_mini->display->context = ctools_context_load_contexts($panel_mini); $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(); // If NULL, fall back to this title: if (!isset($block['subject'])) { $block['subject'] = $panel_mini->title; } unset($viewing[$delta]); return $block; } elseif ($op = 'configure') { return array( 'admin-shortcut' => array( '#value' => l(t('Manage this mini-panel'), 'admin/build/panel-mini/' . $delta . '/edit-general') ), ); } } /** * 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. /** * Create a new page with defaults appropriately set from schema. */ function panels_mini_new() { ctools_include('export'); return ctools_export_new_object('panels_mini'); } /** * Load a single mini panel. */ 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); } $cache[$name] = $result[$name]; } else { $cache[$name] = NULL; } } if (isset($cache[$name])) { return $cache[$name]; } } /** * Load all mini panels. */ 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(); } ctools_include('export'); $minis = ctools_export_load_object('panels_mini'); $dids = array(); foreach ($minis as $mini) { if (!empty($mini->did) && empty($cache[$mini->name])) { $dids[$mini->did] = $mini->name; } } dsm($dids); $displays = panels_load_displays(array_keys($dids)); foreach ($displays as $did => $display) { $cache[$dids[$did]] = $minis[$dids[$did]]; $cache[$dids[$did]]->display = $display; } } return $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_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); } /** * 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; } /** * Menu callback to check to see if a mini panel is valid as part * of a path, and if it is, return the mini. */ function panels_mini_admin_load($name) { $mini = panels_mini_load($name); if ($mini && empty($mini->disabled)) { return $mini; } } /** * 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') { return 'plugins/' . $plugin; } } function panels_mini_panels_mini_list() { $all_panels = panels_mini_load_all(); $list = array(); foreach ($all_panels as $name => $panel) { $list[$name] = check_plain($name) . ' (' . check_plain($panel->title) . ')'; } return $list; }