annotate sites/all/modules/ctools/page_manager/plugins/tasks/page.inc @ 11:b0ee71395280

deleted .DS_Store files
author danieleb <danielebarchiesi@me.com>
date Mon, 28 Oct 2013 16:12:13 +0000
parents ff03f76ab3fe
children
rev   line source
danielebarchiesi@0 1 <?php
danielebarchiesi@0 2
danielebarchiesi@0 3 /**
danielebarchiesi@0 4 * @file
danielebarchiesi@0 5 * Handle the 'page' task, which creates pages with arbitrary tasks and lets
danielebarchiesi@0 6 * handlers decide how they will be rendered.
danielebarchiesi@0 7 *
danielebarchiesi@0 8 * This creates subtasks and stores them in the page_manager_pages table. These
danielebarchiesi@0 9 * are exportable objects, too.
danielebarchiesi@0 10 *
danielebarchiesi@0 11 * The render callback for this task type has $handler, $page, $contexts as
danielebarchiesi@0 12 * parameters.
danielebarchiesi@0 13 */
danielebarchiesi@0 14
danielebarchiesi@0 15 /**
danielebarchiesi@0 16 * Specialized implementation of hook_page_manager_task_tasks(). See api-task.html for
danielebarchiesi@0 17 * more information.
danielebarchiesi@0 18 */
danielebarchiesi@0 19 function page_manager_page_page_manager_tasks() {
danielebarchiesi@0 20 return array(
danielebarchiesi@0 21 'title' => t('Custom pages'),
danielebarchiesi@0 22 'description' => t('Administrator created pages that have a URL path, access control and entries in the Drupal menu system.'),
danielebarchiesi@0 23 'non-exportable' => TRUE,
danielebarchiesi@0 24 'subtasks' => TRUE,
danielebarchiesi@0 25 'subtask callback' => 'page_manager_page_subtask',
danielebarchiesi@0 26 'subtasks callback' => 'page_manager_page_subtasks',
danielebarchiesi@0 27 'save subtask callback' => 'page_manager_page_save_subtask',
danielebarchiesi@0 28 'access callback' => 'page_manager_page_access_check',
danielebarchiesi@0 29 'hook menu' => array(
danielebarchiesi@0 30 'file' => 'page.admin.inc',
danielebarchiesi@0 31 'path' => drupal_get_path('module', 'page_manager') . '/plugins/tasks',
danielebarchiesi@0 32 'function' => 'page_manager_page_menu',
danielebarchiesi@0 33 ),
danielebarchiesi@0 34 'hook theme' => 'page_manager_page_theme',
danielebarchiesi@0 35 // page only items
danielebarchiesi@0 36 'task type' => 'page',
danielebarchiesi@0 37 'page operations' => array(
danielebarchiesi@0 38 array(
danielebarchiesi@0 39 'title' => ' &raquo; ' . t('Create a new page'),
danielebarchiesi@0 40 'href' => 'admin/structure/pages/add',
danielebarchiesi@0 41 'html' => TRUE,
danielebarchiesi@0 42 ),
danielebarchiesi@0 43 ),
danielebarchiesi@0 44 'columns' => array(
danielebarchiesi@0 45 'storage' => array(
danielebarchiesi@0 46 'label' => t('Storage'),
danielebarchiesi@0 47 'class' => 'page-manager-page-storage',
danielebarchiesi@0 48 ),
danielebarchiesi@0 49 ),
danielebarchiesi@0 50 'page type' => 'custom',
danielebarchiesi@0 51
danielebarchiesi@0 52 // context only items
danielebarchiesi@0 53 'handler type' => 'context',
danielebarchiesi@0 54 'get arguments' => array(
danielebarchiesi@0 55 'file' => 'page.admin.inc',
danielebarchiesi@0 56 'path' => drupal_get_path('module', 'page_manager') . '/plugins/tasks',
danielebarchiesi@0 57 'function' => 'page_manager_page_get_arguments',
danielebarchiesi@0 58 ),
danielebarchiesi@0 59 'get context placeholders' => 'page_manager_page_get_contexts',
danielebarchiesi@0 60 'access restrictions' => 'page_manager_page_access_restrictions',
danielebarchiesi@0 61 'uses handlers' => TRUE,
danielebarchiesi@0 62 );
danielebarchiesi@0 63 }
danielebarchiesi@0 64
danielebarchiesi@0 65 /**
danielebarchiesi@0 66 * Task callback to get all subtasks.
danielebarchiesi@0 67 *
danielebarchiesi@0 68 * Return a list of all subtasks.
danielebarchiesi@0 69 */
danielebarchiesi@0 70 function page_manager_page_subtasks($task) {
danielebarchiesi@0 71 $pages = page_manager_page_load_all($task['name']);
danielebarchiesi@0 72 $return = array();
danielebarchiesi@0 73 foreach ($pages as $name => $page) {
danielebarchiesi@0 74 $return[$name] = page_manager_page_build_subtask($task, $page);
danielebarchiesi@0 75 }
danielebarchiesi@0 76
danielebarchiesi@0 77 return $return;
danielebarchiesi@0 78 }
danielebarchiesi@0 79
danielebarchiesi@0 80 /**
danielebarchiesi@0 81 * Callback to return a single subtask.
danielebarchiesi@0 82 */
danielebarchiesi@0 83 function page_manager_page_subtask($task, $subtask_id) {
danielebarchiesi@0 84 $page = page_manager_page_load($subtask_id);
danielebarchiesi@0 85 if ($page) {
danielebarchiesi@0 86 return page_manager_page_build_subtask($task, $page);
danielebarchiesi@0 87 }
danielebarchiesi@0 88 }
danielebarchiesi@0 89
danielebarchiesi@0 90 /**
danielebarchiesi@0 91 * Call back from the administrative system to save a page.
danielebarchiesi@0 92 *
danielebarchiesi@0 93 * We get the $subtask as created by page_manager_page_build_subtask.
danielebarchiesi@0 94 */
danielebarchiesi@0 95 function page_manager_page_save_subtask($subtask) {
danielebarchiesi@0 96 $page = &$subtask['subtask'];
danielebarchiesi@0 97
danielebarchiesi@0 98 // Ensure $page->arguments contains only real arguments:
danielebarchiesi@0 99 $arguments = page_manager_page_get_named_arguments($page->path);
danielebarchiesi@0 100 $args = array();
danielebarchiesi@0 101 foreach ($arguments as $keyword => $position) {
danielebarchiesi@0 102 if (isset($page->arguments[$keyword])) {
danielebarchiesi@0 103 $args[$keyword] = $page->arguments[$keyword];
danielebarchiesi@0 104 }
danielebarchiesi@0 105 else {
danielebarchiesi@0 106 $args[$keyword] = array(
danielebarchiesi@0 107 'id' => '',
danielebarchiesi@0 108 'identifier' => '',
danielebarchiesi@0 109 'argument' => '',
danielebarchiesi@0 110 'settings' => array(),
danielebarchiesi@0 111 );
danielebarchiesi@0 112 }
danielebarchiesi@0 113 }
danielebarchiesi@0 114 page_manager_page_recalculate_arguments($page);
danielebarchiesi@0 115 // Create a real object from the cache
danielebarchiesi@0 116 page_manager_page_save($page);
danielebarchiesi@0 117
danielebarchiesi@0 118 // Check to see if we should make this the site frontpage.
danielebarchiesi@0 119 if (!empty($page->make_frontpage)) {
danielebarchiesi@0 120 $path = array();
danielebarchiesi@0 121 foreach (explode('/', $page->path) as $bit) {
danielebarchiesi@0 122 if ($bit[0] != '!') {
danielebarchiesi@0 123 $path[] = $bit;
danielebarchiesi@0 124 }
danielebarchiesi@0 125 }
danielebarchiesi@0 126
danielebarchiesi@0 127 $path = implode('/', $path);
danielebarchiesi@0 128 $front = variable_get('site_frontpage', 'node');
danielebarchiesi@0 129 if ($path != $front) {
danielebarchiesi@0 130 variable_set('site_frontpage', $path);
danielebarchiesi@0 131 }
danielebarchiesi@0 132 }
danielebarchiesi@0 133 }
danielebarchiesi@0 134
danielebarchiesi@0 135 /**
danielebarchiesi@0 136 * Build a subtask array for a given page.
danielebarchiesi@0 137 */
danielebarchiesi@0 138 function page_manager_page_build_subtask($task, $page) {
danielebarchiesi@0 139 $operations = array();
danielebarchiesi@0 140 $operations['settings'] = array(
danielebarchiesi@0 141 'type' => 'group',
danielebarchiesi@0 142 'class' => array('operations-settings'),
danielebarchiesi@0 143 'title' => t('Settings'),
danielebarchiesi@0 144 'children' => array(),
danielebarchiesi@0 145 );
danielebarchiesi@0 146
danielebarchiesi@0 147 $settings = &$operations['settings']['children'];
danielebarchiesi@0 148
danielebarchiesi@0 149 $settings['basic'] = array(
danielebarchiesi@0 150 'title' => t('Basic'),
danielebarchiesi@0 151 'description' => t('Edit name, path and other basic settings for the page.'),
danielebarchiesi@0 152 'form' => 'page_manager_page_form_basic',
danielebarchiesi@0 153 );
danielebarchiesi@0 154
danielebarchiesi@0 155 $arguments = page_manager_page_get_named_arguments($page->path);
danielebarchiesi@0 156 if ($arguments) {
danielebarchiesi@0 157 $settings['argument'] = array(
danielebarchiesi@0 158 'title' => t('Arguments'),
danielebarchiesi@0 159 'description' => t('Set up contexts for the arguments on this page.'),
danielebarchiesi@0 160 'form' => 'page_manager_page_form_argument',
danielebarchiesi@0 161 );
danielebarchiesi@0 162 }
danielebarchiesi@0 163
danielebarchiesi@0 164 $settings['access'] = array(
danielebarchiesi@0 165 'title' => t('Access'),
danielebarchiesi@0 166 'description' => t('Control what users can access this page.'),
danielebarchiesi@0 167 'admin description' => t('Access rules are used to test if the page is accessible and any menu items associated with it are visible.'),
danielebarchiesi@0 168 'form' => 'page_manager_page_form_access',
danielebarchiesi@0 169 );
danielebarchiesi@0 170
danielebarchiesi@0 171 $settings['menu'] = array(
danielebarchiesi@0 172 'title' => t('Menu'),
danielebarchiesi@0 173 'description' => t('Provide this page a visible menu or a menu tab.'),
danielebarchiesi@0 174 'form' => 'page_manager_page_form_menu',
danielebarchiesi@0 175 );
danielebarchiesi@0 176
danielebarchiesi@0 177 $operations['actions']['children']['clone'] = array(
danielebarchiesi@0 178 'title' => t('Clone'),
danielebarchiesi@0 179 'description' => t('Make a copy of this page'),
danielebarchiesi@0 180 'form' => 'page_manager_page_form_clone',
danielebarchiesi@0 181 );
danielebarchiesi@0 182 $operations['actions']['children']['export'] = array(
danielebarchiesi@0 183 'title' => t('Export'),
danielebarchiesi@0 184 'description' => t('Export this page as code that can be imported or embedded into a module.'),
danielebarchiesi@0 185 'form' => 'page_manager_page_form_export',
danielebarchiesi@0 186 );
danielebarchiesi@0 187 if ($page->export_type == (EXPORT_IN_CODE | EXPORT_IN_DATABASE)) {
danielebarchiesi@0 188 $operations['actions']['children']['delete'] = array(
danielebarchiesi@0 189 'title' => t('Revert'),
danielebarchiesi@0 190 'description' => t('Remove all changes to this page and revert to the version in code.'),
danielebarchiesi@0 191 'form' => 'page_manager_page_form_delete',
danielebarchiesi@0 192 );
danielebarchiesi@0 193 }
danielebarchiesi@0 194 else if ($page->export_type != EXPORT_IN_CODE) {
danielebarchiesi@0 195 $operations['actions']['children']['delete'] = array(
danielebarchiesi@0 196 'title' => t('Delete'),
danielebarchiesi@0 197 'description' => t('Remove this page from your system completely.'),
danielebarchiesi@0 198 'form' => 'page_manager_page_form_delete',
danielebarchiesi@0 199 );
danielebarchiesi@0 200 }
danielebarchiesi@0 201
danielebarchiesi@0 202 $subtask = array(
danielebarchiesi@0 203 'name' => $page->name,
danielebarchiesi@0 204 'admin title' => check_plain($page->admin_title),
danielebarchiesi@0 205 'admin description' => filter_xss_admin($page->admin_description),
danielebarchiesi@0 206 'admin summary' => 'page_manager_page_admin_summary',
danielebarchiesi@0 207 'admin path' => $page->path,
danielebarchiesi@0 208 'admin type' => t('Custom'),
danielebarchiesi@0 209 'subtask' => $page,
danielebarchiesi@0 210 'operations' => $operations,
danielebarchiesi@0 211 'operations include' => array(
danielebarchiesi@0 212 'file' => 'page.admin.inc',
danielebarchiesi@0 213 'path' => drupal_get_path('module', 'page_manager') . '/plugins/tasks',
danielebarchiesi@0 214 ),
danielebarchiesi@0 215 'single task' => empty($page->multiple),
danielebarchiesi@0 216 'row class' => empty($page->disabled) ? 'page-manager-enabled' : 'page-manager-disabled',
danielebarchiesi@0 217 'storage' => $page->type == t('Default') ? t('In code') : $page->type,
danielebarchiesi@0 218 'disabled' => !empty($page->disabled),
danielebarchiesi@0 219 // This works for both enable AND disable
danielebarchiesi@0 220 'enable callback' => 'page_manager_page_enable',
danielebarchiesi@0 221 );
danielebarchiesi@0 222
danielebarchiesi@0 223 // default handlers may appear from a default subtask.
danielebarchiesi@0 224 if (isset($page->default_handlers)) {
danielebarchiesi@0 225 $subtask['default handlers'] = $page->default_handlers;
danielebarchiesi@0 226 }
danielebarchiesi@0 227 return $subtask;
danielebarchiesi@0 228 }
danielebarchiesi@0 229
danielebarchiesi@0 230 /**
danielebarchiesi@0 231 * Delegated implementation of hook_theme().
danielebarchiesi@0 232 */
danielebarchiesi@0 233 function page_manager_page_theme(&$items, $task) {
danielebarchiesi@0 234 $base = array(
danielebarchiesi@0 235 'file' => 'page.admin.inc',
danielebarchiesi@0 236 'path' => drupal_get_path('module', 'page_manager') . '/plugins/tasks',
danielebarchiesi@0 237 );
danielebarchiesi@0 238 $items['page_manager_page_form_argument_table'] = $base + array(
danielebarchiesi@0 239 'render element' => 'form',
danielebarchiesi@0 240 );
danielebarchiesi@0 241 $items['page_manager_page_lock'] = $base + array(
danielebarchiesi@0 242 'variables' => array('lock' => array(), 'task_name' => NULL),
danielebarchiesi@0 243 );
danielebarchiesi@0 244 $items['page_manager_page_changed'] = $base + array(
danielebarchiesi@0 245 'variables' => array(),
danielebarchiesi@0 246 );
danielebarchiesi@0 247 }
danielebarchiesi@0 248
danielebarchiesi@0 249 // --------------------------------------------------------------------------
danielebarchiesi@0 250 // Page execution functions
danielebarchiesi@0 251
danielebarchiesi@0 252 /**
danielebarchiesi@0 253 * Execute a page task.
danielebarchiesi@0 254 *
danielebarchiesi@0 255 * This is the callback to entries in the Drupal menu system created by the
danielebarchiesi@0 256 * page task.
danielebarchiesi@0 257 *
danielebarchiesi@0 258 * @param $subtask_id
danielebarchiesi@0 259 * The name of the page task used.
danielebarchiesi@0 260 * @param ...
danielebarchiesi@0 261 * A number of context objects as specified by the user when
danielebarchiesi@0 262 * creating named arguments in the path.
danielebarchiesi@0 263 */
danielebarchiesi@0 264 function page_manager_page_execute($subtask_id) {
danielebarchiesi@0 265 $page = page_manager_page_load($subtask_id);
danielebarchiesi@0 266 $task = page_manager_get_task($page->task);
danielebarchiesi@0 267 $subtask = page_manager_get_task_subtask($task, $subtask_id);
danielebarchiesi@0 268
danielebarchiesi@0 269 // Turn the contexts into a properly keyed array.
danielebarchiesi@0 270 $contexts = array();
danielebarchiesi@0 271 $args = array();
danielebarchiesi@0 272 foreach (func_get_args() as $count => $arg) {
danielebarchiesi@0 273 if (is_object($arg) && get_class($arg) == 'ctools_context') {
danielebarchiesi@0 274 $contexts[$arg->id] = $arg;
danielebarchiesi@0 275 $args[] = $arg->original_argument;
danielebarchiesi@0 276 }
danielebarchiesi@0 277 else if ($count) {
danielebarchiesi@0 278 $args[] = $arg;
danielebarchiesi@0 279 }
danielebarchiesi@0 280 }
danielebarchiesi@0 281
danielebarchiesi@0 282 $count = 0;
danielebarchiesi@0 283 $names = page_manager_page_get_named_arguments($page->path);
danielebarchiesi@0 284 $bits = explode('/', $page->path);
danielebarchiesi@0 285
danielebarchiesi@0 286 if ($page->arguments) {
danielebarchiesi@0 287 foreach ($page->arguments as $name => $argument) {
danielebarchiesi@0 288 // Optional arguments must be converted to contexts too, if they exist.
danielebarchiesi@0 289 if ($bits[$names[$name]][0] == '!') {
danielebarchiesi@0 290 ctools_include('context');
danielebarchiesi@0 291 $argument['keyword'] = $name;
danielebarchiesi@0 292 if (isset($args[$count])) {
danielebarchiesi@0 293 // Hack: use a special argument config variable to learn if we need
danielebarchiesi@0 294 // to use menu_tail style behavior:
danielebarchiesi@0 295 if (empty($argument['settings']['use_tail'])) {
danielebarchiesi@0 296 $value = $args[$count];
danielebarchiesi@0 297 }
danielebarchiesi@0 298 else {
danielebarchiesi@0 299 $value = implode('/', array_slice($args, $count));
danielebarchiesi@0 300 }
danielebarchiesi@0 301
danielebarchiesi@0 302 $context = ctools_context_get_context_from_argument($argument, $value);
danielebarchiesi@0 303 }
danielebarchiesi@0 304 else {
danielebarchiesi@0 305 // make sure there is a placeholder context for missing optional contexts.
danielebarchiesi@0 306 $context = ctools_context_get_context_from_argument($argument, NULL, TRUE);
danielebarchiesi@0 307 // Force the title to blank for replacements
danielebarchiesi@0 308 }
danielebarchiesi@0 309 if ($context) {
danielebarchiesi@0 310 $contexts[$context->id] = $context;
danielebarchiesi@0 311 }
danielebarchiesi@0 312 }
danielebarchiesi@0 313 $count++;
danielebarchiesi@0 314 }
danielebarchiesi@0 315 }
danielebarchiesi@0 316
danielebarchiesi@0 317 if ($function = ctools_plugin_get_function($task, 'page callback')) {
danielebarchiesi@0 318 return call_user_func_array($function, array($page, $contexts, $args));
danielebarchiesi@0 319 }
danielebarchiesi@0 320
danielebarchiesi@0 321 ctools_include('context-task-handler');
danielebarchiesi@0 322 $output = ctools_context_handler_render($task, $subtask, $contexts, $args);
danielebarchiesi@0 323 if ($output === FALSE) {
danielebarchiesi@0 324 return drupal_not_found();
danielebarchiesi@0 325 }
danielebarchiesi@0 326
danielebarchiesi@0 327 return $output;
danielebarchiesi@0 328 }
danielebarchiesi@0 329
danielebarchiesi@0 330 // --------------------------------------------------------------------------
danielebarchiesi@0 331 // Context type callbacks
danielebarchiesi@0 332
danielebarchiesi@0 333 /**
danielebarchiesi@0 334 * Return a list of arguments used by this task.
danielebarchiesi@0 335 */
danielebarchiesi@0 336 function page_manager_page_get_arguments($task, $subtask) {
danielebarchiesi@0 337 return _page_manager_page_get_arguments($subtask['subtask']);
danielebarchiesi@0 338 }
danielebarchiesi@0 339
danielebarchiesi@0 340 function _page_manager_page_get_arguments($page) {
danielebarchiesi@0 341 $arguments = array();
danielebarchiesi@0 342 if (!empty($page->arguments)) {
danielebarchiesi@0 343 foreach ($page->arguments as $keyword => $argument) {
danielebarchiesi@0 344 if (isset($argument['name'])) {
danielebarchiesi@0 345 $argument['keyword'] = $keyword;
danielebarchiesi@0 346 $arguments[$keyword] = $argument;
danielebarchiesi@0 347 }
danielebarchiesi@0 348 }
danielebarchiesi@0 349 }
danielebarchiesi@0 350 return $arguments;
danielebarchiesi@0 351 }
danielebarchiesi@0 352
danielebarchiesi@0 353 /**
danielebarchiesi@0 354 * Get a group of context placeholders for the arguments.
danielebarchiesi@0 355 */
danielebarchiesi@0 356 function page_manager_page_get_contexts($task, $subtask) {
danielebarchiesi@0 357 ctools_include('context');
danielebarchiesi@0 358 return ctools_context_get_placeholders_from_argument(page_manager_page_get_arguments($task, $subtask));
danielebarchiesi@0 359 }
danielebarchiesi@0 360
danielebarchiesi@0 361 /**
danielebarchiesi@0 362 * Return a list of arguments used by this task.
danielebarchiesi@0 363 */
danielebarchiesi@0 364 function page_manager_page_access_restrictions($task, $subtask, $contexts) {
danielebarchiesi@0 365 $page = $subtask['subtask'];
danielebarchiesi@0 366 return ctools_access_add_restrictions($page->access, $contexts);
danielebarchiesi@0 367 }
danielebarchiesi@0 368
danielebarchiesi@0 369 // --------------------------------------------------------------------------
danielebarchiesi@0 370 // Page task database info.
danielebarchiesi@0 371
danielebarchiesi@0 372 /**
danielebarchiesi@0 373 * Create a new page with defaults appropriately set from schema.
danielebarchiesi@0 374 */
danielebarchiesi@0 375 function page_manager_page_new() {
danielebarchiesi@0 376 ctools_include('export');
danielebarchiesi@0 377 return ctools_export_new_object('page_manager_pages');
danielebarchiesi@0 378 }
danielebarchiesi@0 379
danielebarchiesi@0 380 /**
danielebarchiesi@0 381 * Load a single page subtask.
danielebarchiesi@0 382 */
danielebarchiesi@0 383 function page_manager_page_load($name) {
danielebarchiesi@0 384 ctools_include('export');
danielebarchiesi@0 385 $result = ctools_export_load_object('page_manager_pages', 'names', array($name));
danielebarchiesi@0 386 if (isset($result[$name])) {
danielebarchiesi@0 387 return $result[$name];
danielebarchiesi@0 388 }
danielebarchiesi@0 389 }
danielebarchiesi@0 390
danielebarchiesi@0 391 /**
danielebarchiesi@0 392 * Load all page subtasks.
danielebarchiesi@0 393 */
danielebarchiesi@0 394 function page_manager_page_load_all($task = NULL) {
danielebarchiesi@0 395 ctools_include('export');
danielebarchiesi@0 396
danielebarchiesi@0 397 if (empty($task)) {
danielebarchiesi@0 398 return ctools_export_load_object('page_manager_pages');
danielebarchiesi@0 399 }
danielebarchiesi@0 400 else {
danielebarchiesi@0 401 return ctools_export_load_object('page_manager_pages', 'conditions', array('task' => $task));
danielebarchiesi@0 402 }
danielebarchiesi@0 403 }
danielebarchiesi@0 404
danielebarchiesi@0 405 /**
danielebarchiesi@0 406 * Write a page subtask to the database.
danielebarchiesi@0 407 */
danielebarchiesi@0 408 function page_manager_page_save(&$page) {
danielebarchiesi@0 409 $update = (isset($page->pid)) ? array('pid') : array();
danielebarchiesi@0 410 $task = page_manager_get_task($page->task);
danielebarchiesi@0 411
danielebarchiesi@0 412 if ($function = ctools_plugin_get_function($task, 'save')) {
danielebarchiesi@0 413 $function($page, $update);
danielebarchiesi@0 414 }
danielebarchiesi@0 415 drupal_write_record('page_manager_pages', $page, $update);
danielebarchiesi@0 416
danielebarchiesi@0 417 // If this was a default page we may need to write default task
danielebarchiesi@0 418 // handlers that we provided as well.
danielebarchiesi@0 419 if (!$update && isset($page->default_handlers)) {
danielebarchiesi@0 420 $handlers = page_manager_load_task_handlers(page_manager_get_task('page'), $page->name);
danielebarchiesi@0 421 foreach ($page->default_handlers as $name => $handler) {
danielebarchiesi@0 422 if (!isset($handlers[$name]) || !($handlers[$name]->export_type & EXPORT_IN_DATABASE)) {
danielebarchiesi@0 423 // Make sure this is right, as exports can wander a bit.
danielebarchiesi@0 424 $handler->subtask = $page->name;
danielebarchiesi@0 425 page_manager_save_task_handler($handler);
danielebarchiesi@0 426 }
danielebarchiesi@0 427 }
danielebarchiesi@0 428 }
danielebarchiesi@0 429 return $page;
danielebarchiesi@0 430 }
danielebarchiesi@0 431
danielebarchiesi@0 432 /**
danielebarchiesi@0 433 * Remove a page subtask.
danielebarchiesi@0 434 */
danielebarchiesi@0 435 function page_manager_page_delete($page) {
danielebarchiesi@0 436 $task = page_manager_get_task($page->task);
danielebarchiesi@0 437 if ($function = ctools_plugin_get_function($task, 'delete')) {
danielebarchiesi@0 438 $function($page);
danielebarchiesi@0 439 }
danielebarchiesi@0 440 if (!empty($task['uses handlers'])) {
danielebarchiesi@0 441 $handlers = page_manager_load_task_handlers($task, $page->name);
danielebarchiesi@0 442 foreach ($handlers as $handler) {
danielebarchiesi@0 443 page_manager_delete_task_handler($handler);
danielebarchiesi@0 444 }
danielebarchiesi@0 445 }
danielebarchiesi@0 446 db_delete('page_manager_pages')
danielebarchiesi@0 447 ->condition('name', $page->name)
danielebarchiesi@0 448 ->execute();
danielebarchiesi@0 449 // Make sure that the cache is reset so that the menu rebuild does not
danielebarchiesi@0 450 // rebuild this page again.
danielebarchiesi@0 451 ctools_include('export');
danielebarchiesi@0 452 ctools_export_load_object_reset('page_manager_pages');
danielebarchiesi@0 453 menu_rebuild();
danielebarchiesi@0 454 }
danielebarchiesi@0 455
danielebarchiesi@0 456 /**
danielebarchiesi@0 457 * Export a page subtask.
danielebarchiesi@0 458 */
danielebarchiesi@0 459 function page_manager_page_export($page, $with_handlers = FALSE, $indent = '') {
danielebarchiesi@0 460 $task = page_manager_get_task($page->task);
danielebarchiesi@0 461 $append = '';
danielebarchiesi@0 462
danielebarchiesi@0 463 if ($function = ctools_plugin_get_function($task, 'export')) {
danielebarchiesi@0 464 $append = $function($page, $indent);
danielebarchiesi@0 465 }
danielebarchiesi@0 466
danielebarchiesi@0 467 ctools_include('export');
danielebarchiesi@0 468 $output = ctools_export_object('page_manager_pages', $page, $indent);
danielebarchiesi@0 469 $output .= $append;
danielebarchiesi@0 470
danielebarchiesi@0 471 if ($with_handlers) {
danielebarchiesi@0 472 if (is_array($with_handlers)) {
danielebarchiesi@0 473 $handlers = $with_handlers;
danielebarchiesi@0 474 }
danielebarchiesi@0 475 else {
danielebarchiesi@0 476 $handlers = page_manager_load_task_handlers(page_manager_get_task('page'), $page->name);
danielebarchiesi@0 477 }
danielebarchiesi@0 478 $output .= $indent . '$page->default_handlers = array();' . "\n";
danielebarchiesi@0 479 foreach ($handlers as $handler) {
danielebarchiesi@0 480 $output .= page_manager_export_task_handler($handler, $indent);
danielebarchiesi@0 481 $output .= $indent . '$page->default_handlers[$handler->name] = $handler;' . "\n";
danielebarchiesi@0 482 }
danielebarchiesi@0 483 }
danielebarchiesi@0 484 return $output;
danielebarchiesi@0 485 }
danielebarchiesi@0 486
danielebarchiesi@0 487 /**
danielebarchiesi@0 488 * Get a list of named arguments in a page manager path.
danielebarchiesi@0 489 *
danielebarchiesi@0 490 * @param $path
danielebarchiesi@0 491 * A normal Drupal path.
danielebarchiesi@0 492 *
danielebarchiesi@0 493 * @return
danielebarchiesi@0 494 * An array of % marked variable arguments, keyed by the argument's name.
danielebarchiesi@0 495 * The value will be the position of the argument so that it can easily
danielebarchiesi@0 496 * be found. Items with a position of -1 have multiple positions.
danielebarchiesi@0 497 */
danielebarchiesi@0 498 function page_manager_page_get_named_arguments($path) {
danielebarchiesi@0 499 $arguments = array();
danielebarchiesi@0 500 $bits = explode('/', $path);
danielebarchiesi@0 501 foreach ($bits as $position => $bit) {
danielebarchiesi@0 502 if ($bit && ($bit[0] == '%' || $bit[0] == '!')) {
danielebarchiesi@0 503 // special handling for duplicate path items and substr to remove the %
danielebarchiesi@0 504 $arguments[substr($bit, 1)] = isset($arguments[$bit]) ? -1 : $position;
danielebarchiesi@0 505 }
danielebarchiesi@0 506 }
danielebarchiesi@0 507
danielebarchiesi@0 508 return $arguments;
danielebarchiesi@0 509 }
danielebarchiesi@0 510
danielebarchiesi@0 511 /**
danielebarchiesi@0 512 * Load a context from an argument for a given page task.
danielebarchiesi@0 513 *
danielebarchiesi@0 514 * Helper function for pm_arg_load(), which is in page_manager.module because
danielebarchiesi@0 515 * drupal's menu system does not allow loader functions to reside in separate
danielebarchiesi@0 516 * files.
danielebarchiesi@0 517 *
danielebarchiesi@0 518 * @param $value
danielebarchiesi@0 519 * The incoming argument value.
danielebarchiesi@0 520 * @param $subtask
danielebarchiesi@0 521 * The subtask id.
danielebarchiesi@0 522 * @param $argument
danielebarchiesi@0 523 * The numeric position of the argument in the path, counting from 0.
danielebarchiesi@0 524 *
danielebarchiesi@0 525 * @return
danielebarchiesi@0 526 * A context item if one is configured, the argument if one is not, or
danielebarchiesi@0 527 * FALSE if restricted or invalid.
danielebarchiesi@0 528 */
danielebarchiesi@0 529 function _pm_arg_load($value, $subtask, $argument) {
danielebarchiesi@0 530 $page = page_manager_page_load($subtask);
danielebarchiesi@0 531 if (!$page) {
danielebarchiesi@0 532 return FALSE;
danielebarchiesi@0 533 }
danielebarchiesi@0 534
danielebarchiesi@0 535 $path = explode('/', $page->path);
danielebarchiesi@0 536 if (empty($path[$argument])) {
danielebarchiesi@0 537 return FALSE;
danielebarchiesi@0 538 }
danielebarchiesi@0 539
danielebarchiesi@0 540 $keyword = substr($path[$argument], 1);
danielebarchiesi@0 541 if (empty($page->arguments[$keyword])) {
danielebarchiesi@0 542 return $value;
danielebarchiesi@0 543 }
danielebarchiesi@0 544
danielebarchiesi@0 545 $page->arguments[$keyword]['keyword'] = $keyword;
danielebarchiesi@0 546
danielebarchiesi@0 547 ctools_include('context');
danielebarchiesi@0 548 $context = ctools_context_get_context_from_argument($page->arguments[$keyword], $value);
danielebarchiesi@0 549
danielebarchiesi@0 550 // convert false equivalents to false.
danielebarchiesi@0 551 return $context ? $context : FALSE;
danielebarchiesi@0 552 }
danielebarchiesi@0 553
danielebarchiesi@0 554 /**
danielebarchiesi@0 555 * Provide a nice administrative summary of the page so an admin can see at a
danielebarchiesi@0 556 * glance what this page does and how it is configured.
danielebarchiesi@0 557 */
danielebarchiesi@0 558 function page_manager_page_admin_summary($task, $subtask) {
danielebarchiesi@0 559 $task_name = page_manager_make_task_name($task['name'], $subtask['name']);
danielebarchiesi@0 560 $page = $subtask['subtask'];
danielebarchiesi@0 561 $output = '';
danielebarchiesi@0 562
danielebarchiesi@0 563 $rows = array();
danielebarchiesi@0 564
danielebarchiesi@0 565 $rows[] = array(
danielebarchiesi@0 566 array('class' => array('page-summary-label'), 'data' => t('Storage')),
danielebarchiesi@0 567 array('class' => array('page-summary-data'), 'data' => $subtask['storage']),
danielebarchiesi@0 568 array('class' => array('page-summary-operation'), 'data' => ''),
danielebarchiesi@0 569 );
danielebarchiesi@0 570
danielebarchiesi@0 571 if (!empty($page->disabled)) {
danielebarchiesi@0 572 $link = l(t('Enable'), page_manager_edit_url($task_name, array('handlers', $page->name, 'actions', 'enable')));
danielebarchiesi@0 573 $text = t('Disabled');
danielebarchiesi@0 574 }
danielebarchiesi@0 575 else {
danielebarchiesi@0 576 $link = l(t('Disable'), page_manager_edit_url($task_name, array('handlers', $page->name, 'actions', 'disable')));
danielebarchiesi@0 577 $text = t('Enabled');
danielebarchiesi@0 578 }
danielebarchiesi@0 579
danielebarchiesi@0 580 $rows[] = array(
danielebarchiesi@0 581 array('class' => array('page-summary-label'), 'data' => t('Status')),
danielebarchiesi@0 582 array('class' => array('page-summary-data'), 'data' => $text),
danielebarchiesi@0 583 array('class' => array('page-summary-operation'), 'data' => $link),
danielebarchiesi@0 584 );
danielebarchiesi@0 585
danielebarchiesi@0 586
danielebarchiesi@0 587 $path = array();
danielebarchiesi@0 588 foreach (explode('/', $page->path) as $bit) {
danielebarchiesi@0 589 if ($bit[0] != '!') {
danielebarchiesi@0 590 $path[] = $bit;
danielebarchiesi@0 591 }
danielebarchiesi@0 592 }
danielebarchiesi@0 593
danielebarchiesi@0 594 $path = implode('/', $path);
danielebarchiesi@0 595 $front = variable_get('site_frontpage', 'node');
danielebarchiesi@0 596
danielebarchiesi@0 597 $link = l(t('Edit'), page_manager_edit_url($task_name, array('settings', 'basic')));
danielebarchiesi@0 598 $message = '';
danielebarchiesi@0 599 if ($path == $front) {
danielebarchiesi@0 600 $message = t('This is your site home page.');
danielebarchiesi@0 601 }
danielebarchiesi@0 602 else if (!empty($page->make_frontpage)) {
danielebarchiesi@0 603 $message = t('This page is set to become your site home page.');
danielebarchiesi@0 604 }
danielebarchiesi@0 605
danielebarchiesi@0 606 if ($message) {
danielebarchiesi@0 607 $rows[] = array(
danielebarchiesi@0 608 array('class' => array('page-summary-data'), 'data' => $message, 'colspan' => 2),
danielebarchiesi@0 609 array('class' => array('page-summary-operation'), 'data' => $link),
danielebarchiesi@0 610 );
danielebarchiesi@0 611 }
danielebarchiesi@0 612
danielebarchiesi@0 613 if (strpos($path, '%') === FALSE) {
danielebarchiesi@0 614 $path = l('/' . $page->path, $path);
danielebarchiesi@0 615 }
danielebarchiesi@0 616 else {
danielebarchiesi@0 617 $path = '/' . $page->path;
danielebarchiesi@0 618 }
danielebarchiesi@0 619
danielebarchiesi@0 620 $rows[] = array(
danielebarchiesi@0 621 array('class' => array('page-summary-label'), 'data' => t('Path')),
danielebarchiesi@0 622 array('class' => array('page-summary-data'), 'data' => $path),
danielebarchiesi@0 623 array('class' => array('page-summary-operation'), 'data' => $link),
danielebarchiesi@0 624 );
danielebarchiesi@0 625
danielebarchiesi@0 626 if (empty($access['plugins'])) {
danielebarchiesi@0 627 $access['plugins'] = array();
danielebarchiesi@0 628 }
danielebarchiesi@0 629
danielebarchiesi@0 630 $contexts = page_manager_page_get_contexts($task, $subtask);
danielebarchiesi@0 631 $access = ctools_access_group_summary($page->access, $contexts);
danielebarchiesi@0 632 if ($access) {
danielebarchiesi@0 633 $access = t('Accessible only if @conditions.', array('@conditions' => $access));
danielebarchiesi@0 634 }
danielebarchiesi@0 635 else {
danielebarchiesi@0 636 $access = t('This page is publicly accessible.');
danielebarchiesi@0 637 }
danielebarchiesi@0 638
danielebarchiesi@0 639 $link = l(t('Edit'), page_manager_edit_url($task_name, array('settings', 'access')));
danielebarchiesi@0 640
danielebarchiesi@0 641 $rows[] = array(
danielebarchiesi@0 642 array('class' => array('page-summary-label'), 'data' => t('Access')),
danielebarchiesi@0 643 array('class' => array('page-summary-data'), 'data' => $access),
danielebarchiesi@0 644 array('class' => array('page-summary-operation'), 'data' => $link),
danielebarchiesi@0 645 );
danielebarchiesi@0 646
danielebarchiesi@0 647 $menu_options = array(
danielebarchiesi@0 648 'none' => t('No menu entry.'),
danielebarchiesi@0 649 'normal' => t('Normal menu entry.'),
danielebarchiesi@0 650 'tab' => t('Menu tab.'),
danielebarchiesi@0 651 'default tab' => t('Default menu tab.'),
danielebarchiesi@0 652 'action' => t('Local action'),
danielebarchiesi@0 653 );
danielebarchiesi@0 654
danielebarchiesi@0 655 if (!empty($page->menu)) {
danielebarchiesi@0 656 $menu = $menu_options[$page->menu['type']];
danielebarchiesi@0 657 if ($page->menu['type'] != 'none') {
danielebarchiesi@0 658 $menu .= ' ' . t('Title: %title.', array('%title' => $page->menu['title']));
danielebarchiesi@0 659 switch ($page->menu['type']) {
danielebarchiesi@0 660 case 'default tab':
danielebarchiesi@0 661 $menu .= ' ' . t('Parent title: %title.', array('%title' => $page->menu['parent']['title']));
danielebarchiesi@0 662 break;
danielebarchiesi@0 663 case 'normal':
danielebarchiesi@0 664 if (module_exists('menu')) {
danielebarchiesi@0 665 $menus = menu_get_menus();
danielebarchiesi@0 666 $menu .= ' ' . t('Menu block: %title.', array('%title' => $menus[$page->menu['name']]));
danielebarchiesi@0 667 }
danielebarchiesi@0 668 break;
danielebarchiesi@0 669 }
danielebarchiesi@0 670 }
danielebarchiesi@0 671 }
danielebarchiesi@0 672 else {
danielebarchiesi@0 673 $menu = t('No menu entry');
danielebarchiesi@0 674 }
danielebarchiesi@0 675
danielebarchiesi@0 676 $link = l(t('Edit'), page_manager_edit_url($task_name, array('settings', 'menu')));
danielebarchiesi@0 677 $rows[] = array(
danielebarchiesi@0 678 array('class' => array('page-summary-label'), 'data' => t('Menu')),
danielebarchiesi@0 679 array('class' => array('page-summary-data'), 'data' => $menu),
danielebarchiesi@0 680 array('class' => array('page-summary-operation'), 'data' => $link),
danielebarchiesi@0 681 );
danielebarchiesi@0 682
danielebarchiesi@0 683 $output .= theme('table', array('rows' => $rows, 'attributes' => array('id' => 'page-manager-page-summary')));
danielebarchiesi@0 684 return $output;
danielebarchiesi@0 685 }
danielebarchiesi@0 686
danielebarchiesi@0 687 /**
danielebarchiesi@0 688 * Callback to enable/disable the page from the UI.
danielebarchiesi@0 689 */
danielebarchiesi@0 690 function page_manager_page_enable(&$cache, $status) {
danielebarchiesi@0 691 $page = &$cache->subtask['subtask'];
danielebarchiesi@0 692 ctools_include('export');
danielebarchiesi@0 693 ctools_export_set_object_status($page, $status);
danielebarchiesi@0 694
danielebarchiesi@0 695 $page->disabled = FALSE;
danielebarchiesi@0 696 }
danielebarchiesi@0 697
danielebarchiesi@0 698 /**
danielebarchiesi@0 699 * Recalculate the arguments when something like the path changes.
danielebarchiesi@0 700 */
danielebarchiesi@0 701 function page_manager_page_recalculate_arguments(&$page) {
danielebarchiesi@0 702 // Ensure $page->arguments contains only real arguments:
danielebarchiesi@0 703 $arguments = page_manager_page_get_named_arguments($page->path);
danielebarchiesi@0 704 $args = array();
danielebarchiesi@0 705 foreach ($arguments as $keyword => $position) {
danielebarchiesi@0 706 if (isset($page->arguments[$keyword])) {
danielebarchiesi@0 707 $args[$keyword] = $page->arguments[$keyword];
danielebarchiesi@0 708 }
danielebarchiesi@0 709 else {
danielebarchiesi@0 710 $args[$keyword] = array(
danielebarchiesi@0 711 'id' => '',
danielebarchiesi@0 712 'identifier' => '',
danielebarchiesi@0 713 'argument' => '',
danielebarchiesi@0 714 'settings' => array(),
danielebarchiesi@0 715 );
danielebarchiesi@0 716 }
danielebarchiesi@0 717 }
danielebarchiesi@0 718 $page->arguments = $args;
danielebarchiesi@0 719 }
danielebarchiesi@0 720
danielebarchiesi@0 721 /**
danielebarchiesi@0 722 * When adding or cloning a new page, this creates a new page cache
danielebarchiesi@0 723 * and adds our page to it.
danielebarchiesi@0 724 *
danielebarchiesi@0 725 * This does not check to see if the existing cache is already locked.
danielebarchiesi@0 726 * This must be done beforehand.
danielebarchiesi@0 727 *
danielebarchiesi@0 728 * @param &$page
danielebarchiesi@0 729 * The page to create.
danielebarchiesi@0 730 * @param &$cache
danielebarchiesi@0 731 * The cache to use. If the cache has any existing task handlers,
danielebarchiesi@0 732 * they will be marked for deletion. This may be a blank object.
danielebarchiesi@0 733 */
danielebarchiesi@0 734 function page_manager_page_new_page_cache(&$page, &$cache) {
danielebarchiesi@0 735 // Does a page already exist? If so, we are overwriting it so
danielebarchiesi@0 736 // take its pid.
danielebarchiesi@0 737 if (!empty($cache->subtask) && !empty($cache->subtask['subtask']) && !empty($cache->subtask['subtask']->pid)) {
danielebarchiesi@0 738 $page->pid = $cache->subtask['subtask']->pid;
danielebarchiesi@0 739 }
danielebarchiesi@0 740 else {
danielebarchiesi@0 741 $cache->new = TRUE;
danielebarchiesi@0 742 }
danielebarchiesi@0 743
danielebarchiesi@0 744 $cache->task_name = page_manager_make_task_name('page', $page->name);
danielebarchiesi@0 745 $cache->task_id = 'page';
danielebarchiesi@0 746 $cache->task = page_manager_get_task('page');
danielebarchiesi@0 747 $cache->subtask_id = $page->name;
danielebarchiesi@0 748 $page->export_type = EXPORT_IN_DATABASE;
danielebarchiesi@0 749 $page->type = t('Normal');
danielebarchiesi@0 750 $cache->subtask = page_manager_page_build_subtask($cache->task, $page);
danielebarchiesi@0 751
danielebarchiesi@0 752 if (isset($cache->handlers)) {
danielebarchiesi@0 753 foreach($cache->handlers as $id => $handler) {
danielebarchiesi@0 754 $cache->handler_info[$id]['changed'] = PAGE_MANAGER_CHANGED_DELETED;
danielebarchiesi@0 755 }
danielebarchiesi@0 756 }
danielebarchiesi@0 757 else {
danielebarchiesi@0 758 $cache->handlers = array();
danielebarchiesi@0 759 $cache->handler_info = array();
danielebarchiesi@0 760 }
danielebarchiesi@0 761
danielebarchiesi@0 762 if (!empty($page->default_handlers)) {
danielebarchiesi@0 763 foreach ($page->default_handlers as $id => $handler) {
danielebarchiesi@0 764 page_manager_handler_add_to_page($cache, $handler);
danielebarchiesi@0 765 }
danielebarchiesi@0 766 }
danielebarchiesi@0 767
danielebarchiesi@0 768 $cache->locked = FALSE;
danielebarchiesi@0 769 $cache->changed = TRUE;
danielebarchiesi@0 770 }
danielebarchiesi@0 771
danielebarchiesi@0 772 /**
danielebarchiesi@0 773 * Callback to determine if a page is accessible.
danielebarchiesi@0 774 *
danielebarchiesi@0 775 * @param $task
danielebarchiesi@0 776 * The task plugin.
danielebarchiesi@0 777 * @param $subtask_id
danielebarchiesi@0 778 * The subtask id
danielebarchiesi@0 779 * @param $contexts
danielebarchiesi@0 780 * The contexts loaded for the task.
danielebarchiesi@0 781 * @return
danielebarchiesi@0 782 * TRUE if the current user can access the page.
danielebarchiesi@0 783 */
danielebarchiesi@0 784 function page_manager_page_access_check($task, $subtask_id, $contexts) {
danielebarchiesi@0 785 $page = page_manager_page_load($subtask_id);
danielebarchiesi@0 786 return ctools_access($page->access, $contexts);
danielebarchiesi@0 787 }