annotate sites/all/modules/ctools/page_manager/plugins/tasks/page.admin.inc @ 4:ce11bbd8f642

added modules
author danieleb <danielebarchiesi@me.com>
date Thu, 19 Sep 2013 10:38:44 +0100
parents ff03f76ab3fe
children
rev   line source
danielebarchiesi@0 1 <?php
danielebarchiesi@0 2
danielebarchiesi@0 3 /**
danielebarchiesi@0 4 * @file
danielebarchiesi@0 5 * Administrative functions for the page subtasks.
danielebarchiesi@0 6 *
danielebarchiesi@0 7 * These are attached to the menu system in page.inc via the hook_menu
danielebarchiesi@0 8 * delegation. They are included here so that this code is loaded
danielebarchiesi@0 9 * only when needed.
danielebarchiesi@0 10 */
danielebarchiesi@0 11
danielebarchiesi@0 12 /**
danielebarchiesi@0 13 * Delegated implementation of hook_menu().
danielebarchiesi@0 14 */
danielebarchiesi@0 15 function page_manager_page_menu(&$items, $task) {
danielebarchiesi@0 16 // Set up access permissions.
danielebarchiesi@0 17 $access_callback = isset($task['admin access callback']) ? $task['admin access callback'] : 'user_access';
danielebarchiesi@0 18 $access_arguments = isset($task['admin access arguments']) ? $task['admin access arguments'] : array('administer page manager');
danielebarchiesi@0 19
danielebarchiesi@0 20 $base = array(
danielebarchiesi@0 21 'access callback' => $access_callback,
danielebarchiesi@0 22 'access arguments' => $access_arguments,
danielebarchiesi@0 23 'file' => 'plugins/tasks/page.admin.inc',
danielebarchiesi@0 24 );
danielebarchiesi@0 25
danielebarchiesi@0 26 $items['admin/structure/pages/add'] = array(
danielebarchiesi@0 27 'title' => 'Add custom page',
danielebarchiesi@0 28 'page callback' => 'page_manager_page_add_subtask',
danielebarchiesi@0 29 'page arguments' => array(),
danielebarchiesi@0 30 'type' => MENU_LOCAL_ACTION,
danielebarchiesi@0 31 ) + $base;
danielebarchiesi@0 32
danielebarchiesi@0 33 $items['admin/structure/pages/import'] = array(
danielebarchiesi@0 34 'title' => 'Import page',
danielebarchiesi@0 35 'page callback' => 'drupal_get_form',
danielebarchiesi@0 36 'page arguments' => array('page_manager_page_import_subtask', 'page'),
danielebarchiesi@0 37 'type' => MENU_LOCAL_ACTION,
danielebarchiesi@0 38 ) + $base;
danielebarchiesi@0 39 if ($access_callback == 'user_access') {
danielebarchiesi@0 40 $items['admin/structure/pages/import']['access callback'] = 'ctools_access_multiperm';
danielebarchiesi@0 41 $items['admin/structure/pages/import']['access arguments'][] = 'use PHP for settings';
danielebarchiesi@0 42 }
danielebarchiesi@0 43
danielebarchiesi@0 44 // AJAX callbacks for argument modal.
danielebarchiesi@0 45 $items['admin/structure/pages/argument'] = array(
danielebarchiesi@0 46 'page callback' => 'page_manager_page_subtask_argument_ajax',
danielebarchiesi@0 47 'type' => MENU_CALLBACK,
danielebarchiesi@0 48 ) + $base;
danielebarchiesi@0 49
danielebarchiesi@0 50 // Add menu entries for each subtask
danielebarchiesi@0 51 foreach (page_manager_page_load_all() as $subtask_id => $subtask) {
danielebarchiesi@0 52 if (!empty($subtask->disabled)) {
danielebarchiesi@0 53 continue;
danielebarchiesi@0 54 }
danielebarchiesi@0 55
danielebarchiesi@0 56 if (!isset($subtask->access['type'])) {
danielebarchiesi@0 57 $subtask->access['type'] = 'none';
danielebarchiesi@0 58 }
danielebarchiesi@0 59 if (!isset($subtask->access['settings'])) {
danielebarchiesi@0 60 $subtask->access['settings'] = NULL;
danielebarchiesi@0 61 }
danielebarchiesi@0 62
danielebarchiesi@0 63 $path = array();
danielebarchiesi@0 64 $page_arguments = array($subtask_id);
danielebarchiesi@0 65 $access_arguments = array($subtask->access);
danielebarchiesi@0 66 $load_arguments = array($subtask_id, '%index', '%map');
danielebarchiesi@0 67
danielebarchiesi@0 68 // Replace named placeholders with our own placeholder to load contexts.
danielebarchiesi@0 69 $position = 0;
danielebarchiesi@0 70
danielebarchiesi@0 71 foreach (explode('/', $subtask->path) as $bit) {
danielebarchiesi@0 72 // Remove things like double slashes completely.
danielebarchiesi@0 73 if (!isset($bit) || $bit === '') {
danielebarchiesi@0 74 continue;
danielebarchiesi@0 75 }
danielebarchiesi@0 76
danielebarchiesi@0 77 if ($bit[0] == '%' && $bit != '%') {
danielebarchiesi@0 78 $placeholder = '%pm_arg';
danielebarchiesi@0 79
danielebarchiesi@0 80 // Chop off that %.
danielebarchiesi@0 81 $name = substr($bit, 1);
danielebarchiesi@0 82
danielebarchiesi@0 83 // Check to see if the argument plugin wants to use a different
danielebarchiesi@0 84 // placholder. This will allow to_args.
danielebarchiesi@0 85 if (!empty($subtask->arguments[$name])) {
danielebarchiesi@0 86 ctools_include('context');
danielebarchiesi@0 87 if (!empty($subtask->arguments[$name]['name'])) {
danielebarchiesi@0 88 $plugin = ctools_get_argument($subtask->arguments[$name]['name']);
danielebarchiesi@0 89 if (isset($plugin['path placeholder'])) {
danielebarchiesi@0 90 if (function_exists($plugin['path placeholder'])) {
danielebarchiesi@0 91 $placeholder = $plugin['path placeholder']($subtask->arguments[$name]);
danielebarchiesi@0 92 }
danielebarchiesi@0 93 else {
danielebarchiesi@0 94 $placeholder = $plugin['path placeholder'];
danielebarchiesi@0 95 }
danielebarchiesi@0 96 }
danielebarchiesi@0 97 }
danielebarchiesi@0 98 }
danielebarchiesi@0 99 // If an argument, swap it out with our argument loader and make sure
danielebarchiesi@0 100 // the argument gets passed through to the page callback.
danielebarchiesi@0 101 $path[] = $placeholder;
danielebarchiesi@0 102 $page_arguments[] = $position;
danielebarchiesi@0 103 $access_arguments[] = $position;
danielebarchiesi@0 104 }
danielebarchiesi@0 105 else if ($bit[0] != '!') {
danielebarchiesi@0 106 $path[] = $bit;
danielebarchiesi@0 107 }
danielebarchiesi@0 108
danielebarchiesi@0 109 // Increment position. We do it like this to skip empty items that
danielebarchiesi@0 110 // could happen from erroneous paths like: this///that
danielebarchiesi@0 111 $position++;
danielebarchiesi@0 112 }
danielebarchiesi@0 113
danielebarchiesi@0 114 $menu_path = implode('/', $path);
danielebarchiesi@0 115
danielebarchiesi@0 116 $items[$menu_path] = page_manager_page_menu_item($task, $subtask->menu, $access_arguments, $page_arguments, $load_arguments);
danielebarchiesi@0 117
danielebarchiesi@0 118 // Add a parent menu item if one is configured.
danielebarchiesi@0 119 if (isset($subtask->menu['type']) && $subtask->menu['type'] == 'default tab') {
danielebarchiesi@0 120 array_pop($path);
danielebarchiesi@0 121 $parent_path = implode('/', $path);
danielebarchiesi@0 122 $items[$parent_path] = page_manager_page_menu_item($task, $subtask->menu['parent'], $access_arguments, $page_arguments, $load_arguments);
danielebarchiesi@0 123 }
danielebarchiesi@0 124 }
danielebarchiesi@0 125 }
danielebarchiesi@0 126
danielebarchiesi@0 127 /**
danielebarchiesi@0 128 * Create a menu item for page manager pages.
danielebarchiesi@0 129 *
danielebarchiesi@0 130 * @param $menu
danielebarchiesi@0 131 * The configuration to use. It will contain a type, and depending on the
danielebarchiesi@0 132 * type may also contain weight, title and name. These are presumed to have
danielebarchiesi@0 133 * been configured from the UI.
danielebarchiesi@0 134 * @param $access_arguments
danielebarchiesi@0 135 * Arguments that go with ctools_access_menu; it should be loaded with
danielebarchiesi@0 136 * the access plugin type, settings, and positions of any arguments that
danielebarchiesi@0 137 * may produce contexts.
danielebarchiesi@0 138 * @param $page_arguments
danielebarchiesi@0 139 * This should be seeded with the subtask name for easy loading and like
danielebarchiesi@0 140 * the access arguments above should contain positions of arguments so
danielebarchiesi@0 141 * that the menu system passes contexts through.
danielebarchiesi@0 142 * @param $load_arguments
danielebarchiesi@0 143 * Arguments to send to the arg loader; should be the subtask id and '%index'.
danielebarchiesi@0 144 */
danielebarchiesi@0 145 function page_manager_page_menu_item($task, $menu, $access_arguments, $page_arguments, $load_arguments) {
danielebarchiesi@0 146 $item = array(
danielebarchiesi@0 147 'access callback' => 'ctools_access_menu',
danielebarchiesi@0 148 'access arguments' => $access_arguments,
danielebarchiesi@0 149 'page callback' => 'page_manager_page_execute',
danielebarchiesi@0 150 'page arguments' => $page_arguments,
danielebarchiesi@0 151 'load arguments' => $load_arguments,
danielebarchiesi@0 152 'file' => 'plugins/tasks/page.inc',
danielebarchiesi@0 153 );
danielebarchiesi@0 154
danielebarchiesi@0 155 if (isset($menu['title'])) {
danielebarchiesi@0 156 $item['title'] = $menu['title'];
danielebarchiesi@0 157 }
danielebarchiesi@0 158 if (isset($menu['weight'])) {
danielebarchiesi@0 159 $item['weight'] = $menu['weight'];
danielebarchiesi@0 160 }
danielebarchiesi@0 161
danielebarchiesi@0 162 if (empty($menu['type'])) {
danielebarchiesi@0 163 $menu['type'] = 'none';
danielebarchiesi@0 164 }
danielebarchiesi@0 165
danielebarchiesi@0 166 switch ($menu['type']) {
danielebarchiesi@0 167 case 'none':
danielebarchiesi@0 168 default:
danielebarchiesi@0 169 $item['type'] = MENU_CALLBACK;
danielebarchiesi@0 170 break;
danielebarchiesi@0 171
danielebarchiesi@0 172 case 'normal':
danielebarchiesi@0 173 $item['type'] = MENU_NORMAL_ITEM;
danielebarchiesi@0 174 // Insert item into the proper menu
danielebarchiesi@0 175 $item['menu_name'] = $menu['name'];
danielebarchiesi@0 176 break;
danielebarchiesi@0 177
danielebarchiesi@0 178 case 'tab':
danielebarchiesi@0 179 $item['type'] = MENU_LOCAL_TASK;
danielebarchiesi@0 180 break;
danielebarchiesi@0 181
danielebarchiesi@0 182 case 'action':
danielebarchiesi@0 183 $item['type'] = MENU_LOCAL_ACTION;
danielebarchiesi@0 184 break;
danielebarchiesi@0 185
danielebarchiesi@0 186 case 'default tab':
danielebarchiesi@0 187 $item['type'] = MENU_DEFAULT_LOCAL_TASK;
danielebarchiesi@0 188 break;
danielebarchiesi@0 189 }
danielebarchiesi@0 190
danielebarchiesi@0 191 return $item;
danielebarchiesi@0 192 }
danielebarchiesi@0 193
danielebarchiesi@0 194 /**
danielebarchiesi@0 195 * Page callback to add a subtask.
danielebarchiesi@0 196 */
danielebarchiesi@0 197 function page_manager_page_add_subtask($task_name = NULL, $step = NULL) {
danielebarchiesi@0 198 ctools_include('context');
danielebarchiesi@0 199 $task = page_manager_get_task('page');
danielebarchiesi@0 200 $task_handler_plugins = page_manager_get_task_handler_plugins($task);
danielebarchiesi@0 201 if (empty($task_handler_plugins)) {
danielebarchiesi@0 202 drupal_set_message(t('There are currently no variants available and a page may not be added. Perhaps you need to install the Panels module to get a variant?'), 'error');
danielebarchiesi@0 203 return ' ';
danielebarchiesi@0 204 }
danielebarchiesi@0 205
danielebarchiesi@0 206 $form_info = array(
danielebarchiesi@0 207 'id' => 'page_manager_add_page',
danielebarchiesi@0 208 'show trail' => TRUE,
danielebarchiesi@0 209 'show back' => TRUE,
danielebarchiesi@0 210 'show return' => FALSE,
danielebarchiesi@0 211 'next callback' => 'page_manager_page_add_subtask_next',
danielebarchiesi@0 212 'finish callback' => 'page_manager_page_add_subtask_finish',
danielebarchiesi@0 213 'return callback' => 'page_manager_page_add_subtask_finish',
danielebarchiesi@0 214 'cancel callback' => 'page_manager_page_add_subtask_cancel',
danielebarchiesi@0 215 'add order' => array(
danielebarchiesi@0 216 'basic' => t('Basic settings'),
danielebarchiesi@0 217 'argument' => t('Argument settings'),
danielebarchiesi@0 218 'access' => t('Access control'),
danielebarchiesi@0 219 'menu' => t('Menu settings'),
danielebarchiesi@0 220 ),
danielebarchiesi@0 221 'forms' => array(
danielebarchiesi@0 222 'basic' => array(
danielebarchiesi@0 223 'form id' => 'page_manager_page_form_basic',
danielebarchiesi@0 224 ),
danielebarchiesi@0 225 'access' => array(
danielebarchiesi@0 226 'form id' => 'page_manager_page_form_access',
danielebarchiesi@0 227 ),
danielebarchiesi@0 228 'menu' => array(
danielebarchiesi@0 229 'form id' => 'page_manager_page_form_menu',
danielebarchiesi@0 230 ),
danielebarchiesi@0 231 'argument' => array(
danielebarchiesi@0 232 'form id' => 'page_manager_page_form_argument',
danielebarchiesi@0 233 ),
danielebarchiesi@0 234 ),
danielebarchiesi@0 235 );
danielebarchiesi@0 236
danielebarchiesi@0 237 if ($task_name) {
danielebarchiesi@0 238 $page = page_manager_get_page_cache($task_name);
danielebarchiesi@0 239 if (empty($page)) {
danielebarchiesi@0 240 return drupal_not_found();
danielebarchiesi@0 241 }
danielebarchiesi@0 242
danielebarchiesi@0 243 $form_info['path'] = "admin/structure/pages/add/$task_name/%step";
danielebarchiesi@0 244 }
danielebarchiesi@0 245 else {
danielebarchiesi@0 246 $new_page = page_manager_page_new();
danielebarchiesi@0 247 $new_page->name = NULL;
danielebarchiesi@0 248
danielebarchiesi@0 249 $page = new stdClass();
danielebarchiesi@0 250 page_manager_page_new_page_cache($new_page, $page);
danielebarchiesi@0 251 $form_info['path'] = 'admin/structure/pages/add/%task_name/%step';
danielebarchiesi@0 252 }
danielebarchiesi@0 253
danielebarchiesi@0 254 if ($step && $step != 'basic') {
danielebarchiesi@0 255 $handler_plugin = page_manager_get_task_handler($page->handler);
danielebarchiesi@0 256
danielebarchiesi@0 257 $form_info['forms'] += $handler_plugin['forms'];
danielebarchiesi@0 258
danielebarchiesi@0 259 if (isset($page->forms)) {
danielebarchiesi@0 260 foreach ($page->forms as $id) {
danielebarchiesi@0 261 if (isset($form_info['add order'][$id])) {
danielebarchiesi@0 262 $form_info['order'][$id] = $form_info['add order'][$id];
danielebarchiesi@0 263 }
danielebarchiesi@0 264 else if (isset($handler_plugin['add features'][$id])) {
danielebarchiesi@0 265 $form_info['order'][$id] = $handler_plugin['add features'][$id];
danielebarchiesi@0 266 }
danielebarchiesi@0 267 else if (isset($handler_plugin['required forms'][$id])) {
danielebarchiesi@0 268 $form_info['order'][$id] = $handler_plugin['required forms'][$id];
danielebarchiesi@0 269 }
danielebarchiesi@0 270 }
danielebarchiesi@0 271 }
danielebarchiesi@0 272 else {
danielebarchiesi@0 273 $form_info['order'] = $form_info['add order'];
danielebarchiesi@0 274 }
danielebarchiesi@0 275
danielebarchiesi@0 276 // This means we just submitted our form from the default list
danielebarchiesi@0 277 // of steps, which we've traded in for a newly generated list of
danielebarchiesi@0 278 // steps above. We need to translate this 'next' step into what
danielebarchiesi@0 279 // our questions determined would be next.
danielebarchiesi@0 280 if ($step == 'next') {
danielebarchiesi@0 281 $keys = array_keys($form_info['order']);
danielebarchiesi@0 282 // get rid of 'basic' from the list of forms.
danielebarchiesi@0 283 array_shift($keys);
danielebarchiesi@0 284 $step = array_shift($keys);
danielebarchiesi@0 285
danielebarchiesi@0 286 // If $step == 'basic' at this point, we were not presented with any
danielebarchiesi@0 287 // additional forms at all. Let's just save and go!
danielebarchiesi@0 288 if ($step == 'basic') {
danielebarchiesi@0 289 page_manager_save_page_cache($page);
danielebarchiesi@0 290 // Redirect to the new page's task handler editor.
danielebarchiesi@0 291 drupal_goto(page_manager_edit_url($page->task_name));
danielebarchiesi@0 292 }
danielebarchiesi@0 293 }
danielebarchiesi@0 294 }
danielebarchiesi@0 295 else {
danielebarchiesi@0 296 $form_info['show trail'] = FALSE;
danielebarchiesi@0 297 $form_info['order'] = array(
danielebarchiesi@0 298 'basic' => t('Basic settings'),
danielebarchiesi@0 299 'next' => t('A meaningless second page'),
danielebarchiesi@0 300 );
danielebarchiesi@0 301 }
danielebarchiesi@0 302
danielebarchiesi@0 303 ctools_include('wizard');
danielebarchiesi@0 304 $form_state = array(
danielebarchiesi@0 305 'task' => $task,
danielebarchiesi@0 306 'subtask' => $page->subtask,
danielebarchiesi@0 307 'page' => &$page,
danielebarchiesi@0 308 'type' => 'add',
danielebarchiesi@0 309 'task_id' => 'page',
danielebarchiesi@0 310 'task_name' => $page->task_name,
danielebarchiesi@0 311 'creating' => TRUE,
danielebarchiesi@0 312 );
danielebarchiesi@0 313
danielebarchiesi@0 314 if (!empty($page->handlers)) {
danielebarchiesi@0 315 $keys = array_keys($page->handlers);
danielebarchiesi@0 316 $key = array_shift($keys);
danielebarchiesi@0 317 $form_state['handler'] = &$page->handlers[$key];
danielebarchiesi@0 318 $form_state['handler_id'] = $key;
danielebarchiesi@0 319 }
danielebarchiesi@0 320
danielebarchiesi@0 321 $output = ctools_wizard_multistep_form($form_info, $step, $form_state);
danielebarchiesi@0 322
danielebarchiesi@0 323 if (!$output) {
danielebarchiesi@0 324 // redirect.
danielebarchiesi@0 325 drupal_redirect_form(array(), $form_state['redirect']);
danielebarchiesi@0 326 }
danielebarchiesi@0 327
danielebarchiesi@0 328 return $output;
danielebarchiesi@0 329 }
danielebarchiesi@0 330
danielebarchiesi@0 331 /**
danielebarchiesi@0 332 * Callback generated when the add page process is finished.
danielebarchiesi@0 333 */
danielebarchiesi@0 334 function page_manager_page_add_subtask_finish(&$form_state) {
danielebarchiesi@0 335 $page = &$form_state['page'];
danielebarchiesi@0 336 // Update the cache with changes.
danielebarchiesi@0 337 page_manager_set_page_cache($page);
danielebarchiesi@0 338
danielebarchiesi@0 339 $handler = $form_state['handler'];
danielebarchiesi@0 340 $handler_plugin = page_manager_get_task_handler($handler->handler);
danielebarchiesi@0 341
danielebarchiesi@0 342 // Redirect to the new page's task handler editor.
danielebarchiesi@0 343 if (isset($handler_plugin['add finish'])) {
danielebarchiesi@0 344 $form_state['redirect'] = page_manager_edit_url($page->task_name, array('handlers', $handler->name, $handler_plugin['add finish']));
danielebarchiesi@0 345 }
danielebarchiesi@0 346 else {
danielebarchiesi@0 347 $form_state['redirect'] = page_manager_edit_url($page->task_name);
danielebarchiesi@0 348 }
danielebarchiesi@0 349 return;
danielebarchiesi@0 350 }
danielebarchiesi@0 351
danielebarchiesi@0 352 /**
danielebarchiesi@0 353 * Callback generated when the 'next' button is clicked.
danielebarchiesi@0 354 *
danielebarchiesi@0 355 * All we do here is store the cache.
danielebarchiesi@0 356 */
danielebarchiesi@0 357 function page_manager_page_add_subtask_next(&$form_state) {
danielebarchiesi@0 358 if (empty($form_state['task_name']) || $form_state['task_name'] == 'page') {
danielebarchiesi@0 359 // We may not have known the path to go next, because we didn't yet know the
danielebarchiesi@0 360 // task name. This fixes that.
danielebarchiesi@0 361 $form_state['form_info']['path'] = str_replace('%task_name', $form_state['page']->task_name, $form_state['form_info']['path']);
danielebarchiesi@0 362
danielebarchiesi@0 363 $form_state['redirect'] = ctools_wizard_get_path($form_state['form_info'], $form_state['clicked_button']['#next']);
danielebarchiesi@0 364 }
danielebarchiesi@0 365
danielebarchiesi@0 366 // Update the cache with changes.
danielebarchiesi@0 367 page_manager_set_page_cache($form_state['page']);
danielebarchiesi@0 368 }
danielebarchiesi@0 369
danielebarchiesi@0 370 /**
danielebarchiesi@0 371 * Callback generated when the 'cancel' button is clicked.
danielebarchiesi@0 372 *
danielebarchiesi@0 373 * All we do here is clear the cache.
danielebarchiesi@0 374 */
danielebarchiesi@0 375 function page_manager_page_add_subtask_cancel(&$form_state) {
danielebarchiesi@0 376 // Wipe all our stored changes.
danielebarchiesi@0 377 if (isset($form_state['page']->task_name)) {
danielebarchiesi@0 378 page_manager_clear_page_cache($form_state['page']->task_name);
danielebarchiesi@0 379 }
danielebarchiesi@0 380 }
danielebarchiesi@0 381
danielebarchiesi@0 382 /**
danielebarchiesi@0 383 * Basic settings form for a page manager page.
danielebarchiesi@0 384 */
danielebarchiesi@0 385 function page_manager_page_form_basic($form, &$form_state) {
danielebarchiesi@0 386 $page = &$form_state['page']->subtask['subtask'];
danielebarchiesi@0 387 $task = $form_state['task'];
danielebarchiesi@0 388
danielebarchiesi@0 389 $form['admin_title'] = array(
danielebarchiesi@0 390 '#type' => 'textfield',
danielebarchiesi@0 391 '#title' => t('Administrative title'),
danielebarchiesi@0 392 '#description' => t('The name of this page. This will appear in the administrative interface to easily identify it.'),
danielebarchiesi@0 393 '#default_value' => $page->admin_title,
danielebarchiesi@0 394 );
danielebarchiesi@0 395
danielebarchiesi@0 396 $form['name'] = array(
danielebarchiesi@0 397 '#type' => 'machine_name',
danielebarchiesi@0 398 '#title' => t('Machine name'),
danielebarchiesi@0 399 '#machine_name' => array(
danielebarchiesi@0 400 'exists' => 'page_manager_page_load',
danielebarchiesi@0 401 'source' => array('admin_title'),
danielebarchiesi@0 402 ),
danielebarchiesi@0 403 '#description' => t('The machine readable name of this page. It must be unique, and it must contain only alphanumeric characters and underscores. Once created, you will not be able to change this value!'),
danielebarchiesi@0 404 '#default_value' => $page->name,
danielebarchiesi@0 405 );
danielebarchiesi@0 406
danielebarchiesi@0 407 if (isset($page->pid) || empty($form_state['creating'])) {
danielebarchiesi@0 408 $form['name']['#disabled'] = TRUE;
danielebarchiesi@0 409 $form['name']['#value'] = $page->name;
danielebarchiesi@0 410 }
danielebarchiesi@0 411
danielebarchiesi@0 412 $form['admin_description'] = array(
danielebarchiesi@0 413 '#type' => 'textarea',
danielebarchiesi@0 414 '#title' => t('Administrative description'),
danielebarchiesi@0 415 '#description' => t('A description of what this page is, does or is for, for administrative use.'),
danielebarchiesi@0 416 '#default_value' => $page->admin_description,
danielebarchiesi@0 417 );
danielebarchiesi@0 418
danielebarchiesi@0 419 // path
danielebarchiesi@0 420 $form['path'] = array(
danielebarchiesi@0 421 '#type' => 'textfield',
danielebarchiesi@0 422 '#title' => t('Path'),
danielebarchiesi@0 423 '#description' => t('The URL path to get to this page. You may create named placeholders for variable parts of the path by using %name for required elements and !name for optional elements. For example: "node/%node/foo", "forum/%forum" or "dashboard/!input". These named placeholders can be turned into contexts on the arguments form.'),
danielebarchiesi@0 424 '#default_value' => $page->path,
danielebarchiesi@0 425 '#field_prefix' => url(NULL, array('absolute' => TRUE)) . (variable_get('clean_url', 0) ? '' : '?q='),
danielebarchiesi@0 426 );
danielebarchiesi@0 427
danielebarchiesi@0 428 $frontpage = variable_get('site_frontpage', 'node');
danielebarchiesi@0 429
danielebarchiesi@0 430 $path = array();
danielebarchiesi@0 431 if ($page->path) {
danielebarchiesi@0 432 foreach (explode('/', $page->path) as $bit) {
danielebarchiesi@0 433 if ($bit[0] != '!') {
danielebarchiesi@0 434 $path[] = $bit;
danielebarchiesi@0 435 }
danielebarchiesi@0 436 }
danielebarchiesi@0 437 }
danielebarchiesi@0 438
danielebarchiesi@0 439 $path = implode('/', $path);
danielebarchiesi@0 440
danielebarchiesi@0 441 if (empty($path) || $path != $frontpage) {
danielebarchiesi@0 442 $form['frontpage'] = array(
danielebarchiesi@0 443 '#type' => 'checkbox',
danielebarchiesi@0 444 '#default_value' => !empty($page->make_frontpage),
danielebarchiesi@0 445 '#title' => t('Make this your site home page.'),
danielebarchiesi@0 446 '#description' => t('To set this panel as your home page you must create a unique path name with no % placeholders in the path. The site home page is currently set to %homepage on the !siteinfo configuration form.', array('!siteinfo' => l(t('Site Information'), 'admin/settings/site-information'), '%homepage' => '/' . $frontpage)),
danielebarchiesi@0 447 );
danielebarchiesi@0 448 $form['admin_paths'] = array(
danielebarchiesi@0 449 '#type' => 'checkbox',
danielebarchiesi@0 450 '#default_value' => !empty($page->conf['admin_paths']),
danielebarchiesi@0 451 '#title' => t('Use this page in an admin overlay.'),
danielebarchiesi@0 452 '#description' => t('Admin overlays are used in many places in Drupal 7 and administrative custom pages should probably utilize this feature.'),
danielebarchiesi@0 453 );
danielebarchiesi@0 454 }
danielebarchiesi@0 455 else if ($path == $frontpage) {
danielebarchiesi@0 456 $form['frontpage_markup'] = array(
danielebarchiesi@0 457 '#value' => '<b>' . t('This page is currently set to be your site home page. This can be modified on the !siteinfo configuration form.', array('!siteinfo' => l(t('Site Information'), 'admin/settings/site-information'))) . '</b>',
danielebarchiesi@0 458 );
danielebarchiesi@0 459
danielebarchiesi@0 460 $form['frontpage'] = array(
danielebarchiesi@0 461 '#type' => 'value',
danielebarchiesi@0 462 '#value' => TRUE,
danielebarchiesi@0 463 );
danielebarchiesi@0 464 }
danielebarchiesi@0 465
danielebarchiesi@0 466 if (!isset($page->pid) && !empty($form_state['creating'])) {
danielebarchiesi@0 467 $features['default'] = array(
danielebarchiesi@0 468 'access' => t('Access control'),
danielebarchiesi@0 469 'menu' => t('Visible menu item'),
danielebarchiesi@0 470 );
danielebarchiesi@0 471
danielebarchiesi@0 472 module_load_include('inc', 'page_manager', 'page_manager.admin');
danielebarchiesi@0 473 $form = page_manager_handler_add_form($form, $form_state, $features);
danielebarchiesi@0 474 }
danielebarchiesi@0 475
danielebarchiesi@0 476 return $form;
danielebarchiesi@0 477 }
danielebarchiesi@0 478
danielebarchiesi@0 479 function page_manager_page_form_basic_validate_filter($value) {
danielebarchiesi@0 480 return $value === -1;
danielebarchiesi@0 481 }
danielebarchiesi@0 482
danielebarchiesi@0 483 /**
danielebarchiesi@0 484 * Validate the basic form.
danielebarchiesi@0 485 */
danielebarchiesi@0 486 function page_manager_page_form_basic_validate(&$form, &$form_state) {
danielebarchiesi@0 487 // Ensure path is unused by other pages.
danielebarchiesi@0 488 $page = $form_state['page']->subtask['subtask'];
danielebarchiesi@0 489 $name = !empty($form_state['values']['name']) ? $form_state['values']['name'] : $page->name;
danielebarchiesi@0 490 if (empty($name)) {
danielebarchiesi@0 491 form_error($form['name'], t('Name is required.'));
danielebarchiesi@0 492 }
danielebarchiesi@0 493
danielebarchiesi@0 494 // If this is new, make sure the name is unique:
danielebarchiesi@0 495 if (empty($page->name)) {
danielebarchiesi@0 496 $test = page_manager_page_load($name);
danielebarchiesi@0 497 if ($test) {
danielebarchiesi@0 498 form_error($form['name'], t('That name is used by another page: @page', array('@page' => $test->admin_title)));
danielebarchiesi@0 499 }
danielebarchiesi@0 500
danielebarchiesi@0 501 // Ensure name fits the rules:
danielebarchiesi@0 502 if (preg_match('/[^a-zA-Z0-9_]/', $form_state['values']['name'])) {
danielebarchiesi@0 503 form_error($form['name'], t('Page name must be alphanumeric or underscores only.'));
danielebarchiesi@0 504 }
danielebarchiesi@0 505 }
danielebarchiesi@0 506
danielebarchiesi@0 507 $pages = page_manager_page_load_all();
danielebarchiesi@0 508 foreach ($pages as $test) {
danielebarchiesi@0 509 if ($test->name != $name && $test->path == $form_state['values']['path'] && empty($test->disabled)) {
danielebarchiesi@0 510 form_error($form['path'], t('That path is used by another page: @page', array('@page' => $test->admin_title)));
danielebarchiesi@0 511 }
danielebarchiesi@0 512 }
danielebarchiesi@0 513
danielebarchiesi@0 514 // Ensure path is unused by things NOT pages. We do the double check because
danielebarchiesi@0 515 // we're checking against our page callback.
danielebarchiesi@0 516 $path = array();
danielebarchiesi@0 517 if (empty($form_state['values']['path'])) {
danielebarchiesi@0 518 form_error($form['path'], t('Path is required.'));
danielebarchiesi@0 519 // stop processing here if there is no path.
danielebarchiesi@0 520 return;
danielebarchiesi@0 521 }
danielebarchiesi@0 522
danielebarchiesi@0 523 $found = FALSE;
danielebarchiesi@0 524 $error = FALSE;
danielebarchiesi@0 525 foreach (explode('/', $form_state['values']['path']) as $position => $bit) {
danielebarchiesi@0 526 if (!isset($bit) || $bit === '') {
danielebarchiesi@0 527 continue;
danielebarchiesi@0 528 }
danielebarchiesi@0 529
danielebarchiesi@0 530 if ($bit == '%' || $bit == '!') {
danielebarchiesi@0 531 form_error($form['path'], t('You cannot have an unnamed placeholder (% or ! by itself). Please name your placeholder by adding a short piece of descriptive text to the % or !, such as %user or %node.'));
danielebarchiesi@0 532 }
danielebarchiesi@0 533
danielebarchiesi@0 534 if ($bit[0] == '%') {
danielebarchiesi@0 535 if ($found) {
danielebarchiesi@0 536 form_error($form['path'], t('You cannot have a dynamic path element after an optional path element.'));
danielebarchiesi@0 537 }
danielebarchiesi@0 538
danielebarchiesi@0 539 if ($position == 0) {
danielebarchiesi@0 540 form_error($form['path'], t('The first element in a path may not be dynamic.'));
danielebarchiesi@0 541 }
danielebarchiesi@0 542
danielebarchiesi@0 543 $path[] = '%';
danielebarchiesi@0 544 }
danielebarchiesi@0 545 else if ($bit[0] == '!') {
danielebarchiesi@0 546 $found = TRUE;
danielebarchiesi@0 547 }
danielebarchiesi@0 548 else {
danielebarchiesi@0 549 if ($found) {
danielebarchiesi@0 550 form_error($form['path'], t('You cannot have a static path element after an optional path element.'));
danielebarchiesi@0 551 }
danielebarchiesi@0 552 $path[] = $bit;
danielebarchiesi@0 553 }
danielebarchiesi@0 554 }
danielebarchiesi@0 555
danielebarchiesi@0 556 // Check to see if something that isn't a page manager page is using the path.
danielebarchiesi@0 557 $path = implode('/', $path);
danielebarchiesi@0 558 $result = db_query('SELECT * FROM {menu_router} WHERE path = :path', array(':path' => $path));
danielebarchiesi@0 559 foreach ($result as $router) {
danielebarchiesi@0 560 if ($router->page_callback != 'page_manager_page_execute') {
danielebarchiesi@0 561 form_error($form['path'], t('That path is already in use. This system cannot override existing paths.'));
danielebarchiesi@0 562 }
danielebarchiesi@0 563 }
danielebarchiesi@0 564
danielebarchiesi@0 565 // Ensure the path is not already an alias to something else.
danielebarchiesi@0 566 if (strpos($path, '%') === FALSE) {
danielebarchiesi@0 567 $alias = db_query('SELECT alias, source FROM {url_alias} WHERE alias = :path', array(':path' => $path))->fetchObject();
danielebarchiesi@0 568 if ($alias) {
danielebarchiesi@0 569 form_error($form['path'], t('That path is currently assigned to be an alias for @alias. This system cannot override existing aliases.', array('@alias' => $alias->src)));
danielebarchiesi@0 570 }
danielebarchiesi@0 571 }
danielebarchiesi@0 572 else {
danielebarchiesi@0 573 if (!empty($form_state['values']['frontpage'])) {
danielebarchiesi@0 574 form_error($form['path'], t('You cannot make this page your site home page if it uses % placeholders.'));
danielebarchiesi@0 575 }
danielebarchiesi@0 576 }
danielebarchiesi@0 577
danielebarchiesi@0 578 // Ensure path is properly formed.
danielebarchiesi@0 579 $args = page_manager_page_get_named_arguments($form_state['values']['path']);
danielebarchiesi@0 580 if ($invalid_args = array_filter($args, 'page_manager_page_form_basic_validate_filter')) {
danielebarchiesi@0 581 foreach ($invalid_args as $arg => $position) {
danielebarchiesi@0 582 form_error($form['path'], t('Duplicated argument %arg', array('%arg' => $arg)));
danielebarchiesi@0 583 }
danielebarchiesi@0 584 }
danielebarchiesi@0 585
danielebarchiesi@0 586 if (isset($args['%'])) {
danielebarchiesi@0 587 form_error($form['path'], t('Invalid arg <em>%</em>. All arguments must be named with keywords.'));
danielebarchiesi@0 588 }
danielebarchiesi@0 589
danielebarchiesi@0 590 $form_state['arguments'] = $args;
danielebarchiesi@0 591 }
danielebarchiesi@0 592
danielebarchiesi@0 593 /**
danielebarchiesi@0 594 * Store the values from the basic settings form.
danielebarchiesi@0 595 */
danielebarchiesi@0 596 function page_manager_page_form_basic_submit(&$form, &$form_state) {
danielebarchiesi@0 597 $page = &$form_state['page']->subtask['subtask'];
danielebarchiesi@0 598 $cache = &$form_state['page'];
danielebarchiesi@0 599
danielebarchiesi@0 600 // If this is a new thing, then we have to do a bunch of setup to create
danielebarchiesi@0 601 // the cache record with the right ID and some basic data that we could
danielebarchiesi@0 602 // not know until we asked the user some questions.
danielebarchiesi@0 603 if (!isset($page->pid) && !empty($form_state['creating'])) {
danielebarchiesi@0 604 // Update the data with our new name.
danielebarchiesi@0 605 $page->name = $form_state['values']['name'];
danielebarchiesi@0 606 $form_state['page']->task_name = page_manager_make_task_name($form_state['task_id'], $page->name);
danielebarchiesi@0 607 $cache->handler = $form_state['values']['handler'];
danielebarchiesi@0 608 $cache->subtask_id = $page->name;
danielebarchiesi@0 609 $plugin = page_manager_get_task_handler($cache->handler);
danielebarchiesi@0 610
danielebarchiesi@0 611 // If they created and went back, there might be old, dead handlers
danielebarchiesi@0 612 // that are not going to be added.
danielebarchiesi@0 613 //
danielebarchiesi@0 614 // Remove them:
danielebarchiesi@0 615 $cache->handlers = array();
danielebarchiesi@0 616 $cache->handler_info = array();
danielebarchiesi@0 617
danielebarchiesi@0 618 // Create a new handler.
danielebarchiesi@0 619 $handler = page_manager_new_task_handler($plugin);
danielebarchiesi@0 620 $title = !empty($form_state['values']['title']) ? $form_state['values']['title'] : $plugin['title'];
danielebarchiesi@0 621 page_manager_handler_add_to_page($cache, $handler, $title);
danielebarchiesi@0 622
danielebarchiesi@0 623 // Figure out which forms to present them with
danielebarchiesi@0 624 $cache->forms = array();
danielebarchiesi@0 625 $cache->forms[] = 'basic'; // This one is always there.
danielebarchiesi@0 626 if (!empty($form_state['arguments'])) {
danielebarchiesi@0 627 $cache->forms[] = 'argument';
danielebarchiesi@0 628 }
danielebarchiesi@0 629
danielebarchiesi@0 630 $features = $form_state['values']['features'];
danielebarchiesi@0 631 $cache->forms = array_merge($cache->forms, array_keys(array_filter($features['default'])));
danielebarchiesi@0 632 if (isset($features[$form_state['values']['handler']])) {
danielebarchiesi@0 633 $cache->forms = array_merge($cache->forms, array_keys(array_filter($features[$form_state['values']['handler']])));
danielebarchiesi@0 634 }
danielebarchiesi@0 635
danielebarchiesi@0 636 if (isset($plugin['required forms'])) {
danielebarchiesi@0 637 $cache->forms = array_merge($cache->forms, array_keys($plugin['required forms']));
danielebarchiesi@0 638 }
danielebarchiesi@0 639 }
danielebarchiesi@0 640
danielebarchiesi@0 641 $page->admin_title = $form_state['values']['admin_title'];
danielebarchiesi@0 642 $cache->subtask['admin title'] = check_plain($form_state['values']['admin_title']);
danielebarchiesi@0 643
danielebarchiesi@0 644 $page->admin_description = $form_state['values']['admin_description'];
danielebarchiesi@0 645 $cache->subtask['admin description'] = filter_xss_admin($form_state['values']['admin_description']);
danielebarchiesi@0 646
danielebarchiesi@0 647 if ($page->path != $form_state['values']['path']) {
danielebarchiesi@0 648 $page->path = $form_state['values']['path'];
danielebarchiesi@0 649 page_manager_page_recalculate_arguments($page);
danielebarchiesi@0 650 $cache->path_changed = TRUE;
danielebarchiesi@0 651 }
danielebarchiesi@0 652
danielebarchiesi@0 653 $page->make_frontpage = !empty($form_state['values']['frontpage']);
danielebarchiesi@0 654 $page->conf['admin_paths'] = !empty($form_state['values']['admin_paths']);
danielebarchiesi@0 655 }
danielebarchiesi@0 656
danielebarchiesi@0 657 /**
danielebarchiesi@0 658 * Form to handle menu item controls.
danielebarchiesi@0 659 */
danielebarchiesi@0 660 function page_manager_page_form_menu($form, &$form_state) {
danielebarchiesi@0 661 ctools_include('dependent');
danielebarchiesi@0 662 $form['menu'] = array(
danielebarchiesi@0 663 '#prefix' => '<div class="clearfix">',
danielebarchiesi@0 664 '#suffix' => '</div>',
danielebarchiesi@0 665 '#tree' => TRUE,
danielebarchiesi@0 666 );
danielebarchiesi@0 667
danielebarchiesi@0 668 $menu = $form_state['page']->subtask['subtask']->menu;
danielebarchiesi@0 669 if (empty($menu)) {
danielebarchiesi@0 670 $menu = array(
danielebarchiesi@0 671 'type' => 'none',
danielebarchiesi@0 672 'title' => '',
danielebarchiesi@0 673 'weight' => 0,
danielebarchiesi@0 674 'name' => 'navigation',
danielebarchiesi@0 675 'parent' => array(
danielebarchiesi@0 676 'type' => 'none',
danielebarchiesi@0 677 'title' => '',
danielebarchiesi@0 678 'weight' => 0,
danielebarchiesi@0 679 'name' => 'navigation',
danielebarchiesi@0 680 ),
danielebarchiesi@0 681 );
danielebarchiesi@0 682 }
danielebarchiesi@0 683
danielebarchiesi@0 684 $form['menu']['type'] = array(
danielebarchiesi@0 685 '#title' => t('Type'),
danielebarchiesi@0 686 '#type' => 'radios',
danielebarchiesi@0 687 '#options' => array(
danielebarchiesi@0 688 'none' => t('No menu entry'),
danielebarchiesi@0 689 'normal' => t('Normal menu entry'),
danielebarchiesi@0 690 'tab' => t('Menu tab'),
danielebarchiesi@0 691 'default tab' => t('Default menu tab'),
danielebarchiesi@0 692 'action' => t('Local action'),
danielebarchiesi@0 693 ),
danielebarchiesi@0 694 '#default_value' => $menu['type'],
danielebarchiesi@0 695 );
danielebarchiesi@0 696
danielebarchiesi@0 697 $form['menu']['title'] = array(
danielebarchiesi@0 698 '#title' => t('Title'),
danielebarchiesi@0 699 '#type' => 'textfield',
danielebarchiesi@0 700 '#default_value' => $menu['title'],
danielebarchiesi@0 701 '#description' => t('If set to normal or tab, enter the text to use for the menu item.'),
danielebarchiesi@0 702 '#dependency' => array('radio:menu[type]' => array('normal', 'tab', 'default tab', 'action')),
danielebarchiesi@0 703 );
danielebarchiesi@0 704
danielebarchiesi@0 705 list($major, $minor) = explode('.', VERSION, 2);
danielebarchiesi@0 706
danielebarchiesi@0 707 // Only display the menu selector if menu module is enabled.
danielebarchiesi@0 708 if (module_exists('menu')) {
danielebarchiesi@0 709 $form['menu']['name'] = array(
danielebarchiesi@0 710 '#title' => t('Menu'),
danielebarchiesi@0 711 '#type' => 'select',
danielebarchiesi@0 712 '#options' => menu_get_menus(),
danielebarchiesi@0 713 '#default_value' => $menu['name'],
danielebarchiesi@0 714 '#description' => t('Insert item into an available menu.'),
danielebarchiesi@0 715 '#dependency' => array('radio:menu[type]' => array('normal')),
danielebarchiesi@0 716 );
danielebarchiesi@0 717 }
danielebarchiesi@0 718 else {
danielebarchiesi@0 719 $form['menu']['name'] = array(
danielebarchiesi@0 720 '#type' => 'value',
danielebarchiesi@0 721 '#value' => $menu['name'],
danielebarchiesi@0 722 );
danielebarchiesi@0 723 $form['menu']['markup'] = array(
danielebarchiesi@0 724 '#value' => t('Menu selection requires the activation of menu module.'),
danielebarchiesi@0 725 );
danielebarchiesi@0 726 }
danielebarchiesi@0 727 $form['menu']['weight'] = array(
danielebarchiesi@0 728 '#title' => t('Weight'),
danielebarchiesi@0 729 '#type' => 'textfield',
danielebarchiesi@0 730 '#default_value' => isset($menu['weight']) ? $menu['weight'] : 0,
danielebarchiesi@0 731 '#description' => t('The lower the weight the higher/further left it will appear.'),
danielebarchiesi@0 732 '#dependency' => array('radio:menu[type]' => array('normal', 'tab', 'default tab', 'action')),
danielebarchiesi@0 733 );
danielebarchiesi@0 734
danielebarchiesi@0 735 $form['menu']['parent']['type'] = array(
danielebarchiesi@0 736 '#prefix' => '<div id="edit-menu-parent-type-wrapper">',
danielebarchiesi@0 737 '#suffix' => '</div>',
danielebarchiesi@0 738 '#title' => t('Parent menu item'),
danielebarchiesi@0 739 '#type' => 'radios',
danielebarchiesi@0 740 '#options' => array('none' => t('No menu entry'), 'normal' => t('Normal menu item'), 'tab' => t('Menu tab')),
danielebarchiesi@0 741 '#default_value' => $menu['parent']['type'],
danielebarchiesi@0 742 '#description' => t('When providing a menu item as a default tab, Drupal needs to know what the parent menu item of that tab will be. Sometimes the parent will already exist, but other times you will need to have one created. The path of a parent item will always be the same path with the last part left off. i.e, if the path to this view is <em>foo/bar/baz</em>, the parent path would be <em>foo/bar</em>.'),
danielebarchiesi@0 743 '#dependency' => array('radio:menu[type]' => array('default tab')),
danielebarchiesi@0 744 );
danielebarchiesi@0 745 $form['menu']['parent']['title'] = array(
danielebarchiesi@0 746 '#title' => t('Parent item title'),
danielebarchiesi@0 747 '#type' => 'textfield',
danielebarchiesi@0 748 '#default_value' => $menu['parent']['title'],
danielebarchiesi@0 749 '#description' => t('If creating a parent menu item, enter the title of the item.'),
danielebarchiesi@0 750 '#dependency' => array('radio:menu[type]' => array('default tab'), 'radio:menu[parent][type]' => array('normal', 'tab')),
danielebarchiesi@0 751 '#dependency_count' => 2,
danielebarchiesi@0 752 );
danielebarchiesi@0 753 // Only display the menu selector if menu module is enabled.
danielebarchiesi@0 754 if (module_exists('menu')) {
danielebarchiesi@0 755 $form['menu']['parent']['name'] = array(
danielebarchiesi@0 756 '#title' => t('Parent item menu'),
danielebarchiesi@0 757 '#type' => 'select',
danielebarchiesi@0 758 '#options' => menu_get_menus(),
danielebarchiesi@0 759 '#default_value' => $menu['parent']['name'],
danielebarchiesi@0 760 '#description' => t('Insert item into an available menu.'),
danielebarchiesi@0 761 '#dependency' => array('radio:menu[type]' => array('default tab'), 'radio:menu[parent][type]' => array('normal')),
danielebarchiesi@0 762 '#dependency_count' => 2,
danielebarchiesi@0 763 );
danielebarchiesi@0 764 }
danielebarchiesi@0 765 else {
danielebarchiesi@0 766 $form['menu']['parent']['name'] = array(
danielebarchiesi@0 767 '#type' => 'value',
danielebarchiesi@0 768 '#value' => $menu['parent']['name'],
danielebarchiesi@0 769 );
danielebarchiesi@0 770 }
danielebarchiesi@0 771 $form['menu']['parent']['weight'] = array(
danielebarchiesi@0 772 '#title' => t('Tab weight'),
danielebarchiesi@0 773 '#type' => 'textfield',
danielebarchiesi@0 774 '#default_value' => $menu['parent']['weight'],
danielebarchiesi@0 775 '#size' => 5,
danielebarchiesi@0 776 '#description' => t('If the parent menu item is a tab, enter the weight of the tab. The lower the number, the more to the left it will be.'),
danielebarchiesi@0 777 '#dependency' => array('radio:menu[type]' => array('default tab'), 'radio:menu[parent][type]' => array('tab')),
danielebarchiesi@0 778 '#dependency_count' => 2,
danielebarchiesi@0 779 );
danielebarchiesi@0 780
danielebarchiesi@0 781 return $form;
danielebarchiesi@0 782 }
danielebarchiesi@0 783
danielebarchiesi@0 784 /**
danielebarchiesi@0 785 * Validate handler for the menu form for add/edit page task.
danielebarchiesi@0 786 */
danielebarchiesi@0 787 function page_manager_page_form_menu_validate(&$form, &$form_state) {
danielebarchiesi@0 788 // If setting a 'normal' menu entry, make sure that any placeholders
danielebarchiesi@0 789 // support the to_arg stuff.
danielebarchiesi@0 790
danielebarchiesi@0 791 if ($form_state['values']['menu']['type'] == 'normal') {
danielebarchiesi@0 792 $page = $form_state['page']->subtask['subtask'];
danielebarchiesi@0 793
danielebarchiesi@0 794 foreach (explode('/', $page->path) as $bit) {
danielebarchiesi@0 795 if (!isset($bit) || $bit === '') {
danielebarchiesi@0 796 continue;
danielebarchiesi@0 797 }
danielebarchiesi@0 798
danielebarchiesi@0 799 if ($bit[0] == '%') {
danielebarchiesi@0 800 // Chop off that %.
danielebarchiesi@0 801 $name = substr($bit, 1);
danielebarchiesi@0 802
danielebarchiesi@0 803 // Check to see if the argument plugin allows to arg:
danielebarchiesi@0 804 if (!empty($page->arguments[$name])) {
danielebarchiesi@0 805 ctools_include('context');
danielebarchiesi@0 806 $plugin = ctools_get_argument($page->arguments[$name]['name']);
danielebarchiesi@0 807 if (!empty($plugin['path placeholder to_arg'])) {
danielebarchiesi@0 808 continue;
danielebarchiesi@0 809 }
danielebarchiesi@0 810 }
danielebarchiesi@0 811
danielebarchiesi@0 812 form_error($form['menu']['type'], t('Paths with non optional placeholders cannot be used as normal menu items unless the selected argument handler provides a default argument to use for the menu item.'));
danielebarchiesi@0 813 return;
danielebarchiesi@0 814 }
danielebarchiesi@0 815 }
danielebarchiesi@0 816 }
danielebarchiesi@0 817 }
danielebarchiesi@0 818
danielebarchiesi@0 819 /**
danielebarchiesi@0 820 * Submit handler for the menu form for add/edit page task.
danielebarchiesi@0 821 */
danielebarchiesi@0 822 function page_manager_page_form_menu_submit(&$form, &$form_state) {
danielebarchiesi@0 823 $form_state['page']->subtask['subtask']->menu = $form_state['values']['menu'];
danielebarchiesi@0 824 $form_state['page']->path_changed = TRUE;
danielebarchiesi@0 825 }
danielebarchiesi@0 826
danielebarchiesi@0 827 /**
danielebarchiesi@0 828 * Form to handle menu item controls.
danielebarchiesi@0 829 */
danielebarchiesi@0 830 function page_manager_page_form_access($form, &$form_state) {
danielebarchiesi@0 831 ctools_include('context');
danielebarchiesi@0 832 $form_state['module'] = 'page_manager_page';
danielebarchiesi@0 833 $form_state['callback argument'] = $form_state['page']->task_name;
danielebarchiesi@0 834 $form_state['access'] = $form_state['page']->subtask['subtask']->access;
danielebarchiesi@0 835 $form_state['no buttons'] = TRUE;
danielebarchiesi@0 836 $form_state['contexts'] = array();
danielebarchiesi@0 837
danielebarchiesi@0 838 // Load contexts based on argument data:
danielebarchiesi@0 839 if ($arguments = _page_manager_page_get_arguments($form_state['page']->subtask['subtask'])) {
danielebarchiesi@0 840 $form_state['contexts'] = ctools_context_get_placeholders_from_argument($arguments);
danielebarchiesi@0 841 }
danielebarchiesi@0 842
danielebarchiesi@0 843 ctools_include('context-access-admin');
danielebarchiesi@0 844 $form = ctools_access_admin_form($form, $form_state);
danielebarchiesi@0 845
danielebarchiesi@0 846 return $form;
danielebarchiesi@0 847 }
danielebarchiesi@0 848
danielebarchiesi@0 849 /**
danielebarchiesi@0 850 * Submit handler to deal with access control changes.
danielebarchiesi@0 851 */
danielebarchiesi@0 852 function page_manager_page_form_access_submit(&$form, &$form_state) {
danielebarchiesi@0 853 $form_state['page']->subtask['subtask']->access['logic'] = $form_state['values']['logic'];
danielebarchiesi@0 854 $form_state['page']->path_changed = TRUE;
danielebarchiesi@0 855 }
danielebarchiesi@0 856
danielebarchiesi@0 857 /**
danielebarchiesi@0 858 * Form to handle assigning argument handlers to named arguments.
danielebarchiesi@0 859 */
danielebarchiesi@0 860 function page_manager_page_form_argument($form, &$form_state) {
danielebarchiesi@0 861 $page = &$form_state['page']->subtask['subtask'];
danielebarchiesi@0 862 $path = $page->path;
danielebarchiesi@0 863
danielebarchiesi@0 864 $arguments = page_manager_page_get_named_arguments($path);
danielebarchiesi@0 865
danielebarchiesi@0 866 $form['table'] = array(
danielebarchiesi@0 867 '#theme' => 'page_manager_page_form_argument_table',
danielebarchiesi@0 868 '#page-manager-path' => $path,
danielebarchiesi@0 869 'argument' => array(),
danielebarchiesi@0 870 );
danielebarchiesi@0 871
danielebarchiesi@0 872 $task_name = $form_state['page']->task_name;
danielebarchiesi@0 873 foreach ($arguments as $keyword => $position) {
danielebarchiesi@0 874 $conf = array();
danielebarchiesi@0 875
danielebarchiesi@0 876 if (isset($page->temporary_arguments[$keyword]) && !empty($form_state['allow temp'])) {
danielebarchiesi@0 877 $conf = $page->temporary_arguments[$keyword];
danielebarchiesi@0 878 }
danielebarchiesi@0 879 else if (isset($page->arguments[$keyword])) {
danielebarchiesi@0 880 $conf = $page->arguments[$keyword];
danielebarchiesi@0 881 }
danielebarchiesi@0 882
danielebarchiesi@0 883 $context = t('No context assigned');
danielebarchiesi@0 884
danielebarchiesi@0 885 $plugin = array();
danielebarchiesi@0 886 if ($conf && isset($conf['name'])) {
danielebarchiesi@0 887 ctools_include('context');
danielebarchiesi@0 888 $plugin = ctools_get_argument($conf['name']);
danielebarchiesi@0 889
danielebarchiesi@0 890 if (isset($plugin['title'])) {
danielebarchiesi@0 891 $context = $plugin['title'];
danielebarchiesi@0 892 }
danielebarchiesi@0 893 }
danielebarchiesi@0 894
danielebarchiesi@0 895 $form['table']['argument'][$keyword]['#keyword'] = $keyword;
danielebarchiesi@0 896 $form['table']['argument'][$keyword]['#position'] = $position;
danielebarchiesi@0 897 $form['table']['argument'][$keyword]['#context'] = $context;
danielebarchiesi@0 898
danielebarchiesi@0 899 // The URL for this ajax button
danielebarchiesi@0 900 $form['table']['argument'][$keyword]['change-url'] = array(
danielebarchiesi@0 901 '#attributes' => array('class' => array("page-manager-context-$keyword-change-url")),
danielebarchiesi@0 902 '#type' => 'hidden',
danielebarchiesi@0 903 '#value' => url("admin/structure/pages/argument/change/$task_name/$keyword", array('absolute' => TRUE)),
danielebarchiesi@0 904 );
danielebarchiesi@0 905 $form['table']['argument'][$keyword]['change'] = array(
danielebarchiesi@0 906 '#type' => 'submit',
danielebarchiesi@0 907 '#value' => t('Change'),
danielebarchiesi@0 908 '#attributes' => array('class' => array('ctools-use-modal')),
danielebarchiesi@0 909 '#id' => "page-manager-context-$keyword-change",
danielebarchiesi@0 910 );
danielebarchiesi@0 911
danielebarchiesi@0 912 $form['table']['argument'][$keyword]['settings'] = array();
danielebarchiesi@0 913
danielebarchiesi@0 914 // Only show the button if this has a settings form available:
danielebarchiesi@0 915 if (!empty($plugin)) {
danielebarchiesi@0 916 // The URL for this ajax button
danielebarchiesi@0 917 $form['table']['argument'][$keyword]['settings-url'] = array(
danielebarchiesi@0 918 '#attributes' => array('class' => array("page-manager-context-$keyword-settings-url")),
danielebarchiesi@0 919 '#type' => 'hidden',
danielebarchiesi@0 920 '#value' => url("admin/structure/pages/argument/settings/$task_name/$keyword", array('absolute' => TRUE)),
danielebarchiesi@0 921 );
danielebarchiesi@0 922 $form['table']['argument'][$keyword]['settings'] = array(
danielebarchiesi@0 923 '#type' => 'submit',
danielebarchiesi@0 924 '#value' => t('Settings'),
danielebarchiesi@0 925 '#attributes' => array('class' => array('ctools-use-modal')),
danielebarchiesi@0 926 '#id' => "page-manager-context-$keyword-settings",
danielebarchiesi@0 927 );
danielebarchiesi@0 928 }
danielebarchiesi@0 929 }
danielebarchiesi@0 930
danielebarchiesi@0 931 return $form;
danielebarchiesi@0 932 }
danielebarchiesi@0 933
danielebarchiesi@0 934 /**
danielebarchiesi@0 935 * Theme the table for this form.
danielebarchiesi@0 936 */
danielebarchiesi@0 937 function theme_page_manager_page_form_argument_table($vars) {
danielebarchiesi@0 938 $form = $vars['form'];
danielebarchiesi@0 939 $header = array(
danielebarchiesi@0 940 array('data' => t('Argument'), 'class' => array('page-manager-argument')),
danielebarchiesi@0 941 array('data' => t('Position in path'), 'class' => array('page-manager-position')),
danielebarchiesi@0 942 array('data' => t('Context assigned'), 'class' => array('page-manager-context')),
danielebarchiesi@0 943 array('data' => t('Operations'), 'class' => array('page-manager-operations')),
danielebarchiesi@0 944 );
danielebarchiesi@0 945
danielebarchiesi@0 946 $rows = array();
danielebarchiesi@0 947
danielebarchiesi@0 948 ctools_include('modal');
danielebarchiesi@0 949 ctools_modal_add_js();
danielebarchiesi@0 950 foreach (element_children($form['argument']) as $key) {
danielebarchiesi@0 951 $row = array();
danielebarchiesi@0 952 $row[] = '%' . check_plain($form['argument'][$key]['#keyword']);
danielebarchiesi@0 953 $row[] = check_plain($form['argument'][$key]['#position']);
danielebarchiesi@0 954 $row[] = $form['argument'][$key]['#context'] . ' &nbsp; ' . drupal_render($form['argument'][$key]['change']);;
danielebarchiesi@0 955 $row[] = drupal_render($form['argument'][$key]['settings']) . drupal_render($form['argument'][$key]);
danielebarchiesi@0 956
danielebarchiesi@0 957 $rows[] = array('data' => $row);
danielebarchiesi@0 958 }
danielebarchiesi@0 959
danielebarchiesi@0 960 if (!$rows) {
danielebarchiesi@0 961 $rows[] = array(array('data' => t('The path %path has no arguments to configure.', array('%path' => $form['#page-manager-path'])), 'colspan' => 4));
danielebarchiesi@0 962 }
danielebarchiesi@0 963
danielebarchiesi@0 964 $attributes = array(
danielebarchiesi@0 965 'id' => 'page-manager-argument-table',
danielebarchiesi@0 966 );
danielebarchiesi@0 967
danielebarchiesi@0 968 $output = theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => $attributes));
danielebarchiesi@0 969 return $output;
danielebarchiesi@0 970 }
danielebarchiesi@0 971
danielebarchiesi@0 972 /**
danielebarchiesi@0 973 * Ajax entry point to edit an item
danielebarchiesi@0 974 */
danielebarchiesi@0 975 function page_manager_page_subtask_argument_ajax($step = NULL, $task_name = NULL, $keyword = NULL) {
danielebarchiesi@0 976 ctools_include('ajax');
danielebarchiesi@0 977 ctools_include('modal');
danielebarchiesi@0 978 ctools_include('context');
danielebarchiesi@0 979 ctools_include('wizard');
danielebarchiesi@0 980
danielebarchiesi@0 981 if (!$step) {
danielebarchiesi@0 982 return ctools_ajax_render_error();
danielebarchiesi@0 983 }
danielebarchiesi@0 984
danielebarchiesi@0 985 if (!$cache = page_manager_get_page_cache($task_name)) {
danielebarchiesi@0 986 return ctools_ajax_render_error(t('Invalid object name.'));
danielebarchiesi@0 987 }
danielebarchiesi@0 988
danielebarchiesi@0 989 $page = &$cache->subtask['subtask'];
danielebarchiesi@0 990 $path = $page->path;
danielebarchiesi@0 991 $arguments = page_manager_page_get_named_arguments($path);
danielebarchiesi@0 992
danielebarchiesi@0 993 // Load stored object from cache.
danielebarchiesi@0 994 if (!isset($arguments[$keyword])) {
danielebarchiesi@0 995 return ctools_ajax_render_error(t('Invalid keyword.'));
danielebarchiesi@0 996 }
danielebarchiesi@0 997
danielebarchiesi@0 998 // Set up wizard info
danielebarchiesi@0 999 $form_info = array(
danielebarchiesi@0 1000 'id' => 'page_manager_page_argument',
danielebarchiesi@0 1001 'path' => "admin/structure/pages/argument/%step/$task_name/$keyword",
danielebarchiesi@0 1002 'show cancel' => TRUE,
danielebarchiesi@0 1003 'next callback' => 'page_manager_page_argument_next',
danielebarchiesi@0 1004 'finish callback' => 'page_manager_page_argument_finish',
danielebarchiesi@0 1005 'cancel callback' => 'page_manager_page_argument_cancel',
danielebarchiesi@0 1006 'order' => array(
danielebarchiesi@0 1007 'change' => t('Change context type'),
danielebarchiesi@0 1008 'settings' => t('Argument settings'),
danielebarchiesi@0 1009 ),
danielebarchiesi@0 1010 'forms' => array(
danielebarchiesi@0 1011 'change' => array(
danielebarchiesi@0 1012 'title' => t('Change argument'),
danielebarchiesi@0 1013 'form id' => 'page_manager_page_argument_form_change',
danielebarchiesi@0 1014 ),
danielebarchiesi@0 1015 'settings' => array(
danielebarchiesi@0 1016 'title' => t('Argument settings'),
danielebarchiesi@0 1017 'form id' => 'page_manager_page_argument_form_settings',
danielebarchiesi@0 1018 ),
danielebarchiesi@0 1019 ),
danielebarchiesi@0 1020 );
danielebarchiesi@0 1021
danielebarchiesi@0 1022 $form_state = array(
danielebarchiesi@0 1023 'page' => $cache,
danielebarchiesi@0 1024 'keyword' => $keyword,
danielebarchiesi@0 1025 'ajax' => TRUE,
danielebarchiesi@0 1026 'modal' => TRUE,
danielebarchiesi@0 1027 'modal return' => TRUE,
danielebarchiesi@0 1028 'commands' => array(),
danielebarchiesi@0 1029 );
danielebarchiesi@0 1030
danielebarchiesi@0 1031 $output = ctools_wizard_multistep_form($form_info, $step, $form_state);
danielebarchiesi@0 1032 if (!empty($form_state['cancel'])) {
danielebarchiesi@0 1033 $commands = array(ctools_modal_command_dismiss());
danielebarchiesi@0 1034 }
danielebarchiesi@0 1035 else if (!empty($form_state['complete'])) {
danielebarchiesi@0 1036 if (isset($page->temporary_arguments[$keyword])) {
danielebarchiesi@0 1037 $page->arguments[$keyword] = $page->temporary_arguments[$keyword];
danielebarchiesi@0 1038 }
danielebarchiesi@0 1039
danielebarchiesi@0 1040 if (isset($page->temporary_arguments)) {
danielebarchiesi@0 1041 unset($page->temporary_arguments);
danielebarchiesi@0 1042 }
danielebarchiesi@0 1043
danielebarchiesi@0 1044 // Update the cache with changes.
danielebarchiesi@0 1045 page_manager_set_page_cache($cache);
danielebarchiesi@0 1046
danielebarchiesi@0 1047 // Rerender the table so we can ajax it back in.
danielebarchiesi@0 1048 // Go directly to the form and retrieve it using a blank form and
danielebarchiesi@0 1049 // a clone of our current form state. This is an abbreviated
danielebarchiesi@0 1050 // drupal_get_form that is halted prior to render and is never
danielebarchiesi@0 1051 // fully processed, but is guaranteed to produce the same form we
danielebarchiesi@0 1052 // started with so we don't have to do crazy stuff to rerender
danielebarchiesi@0 1053 // just part of it.
danielebarchiesi@0 1054
danielebarchiesi@0 1055 // @todo should there be a tool to do this?
danielebarchiesi@0 1056
danielebarchiesi@0 1057 $clone_state = $form_state;
danielebarchiesi@0 1058 $clone_state['allow temp'] = TRUE;
danielebarchiesi@0 1059 $form = drupal_build_form('page_manager_page_form_argument', $form_state);
danielebarchiesi@0 1060
danielebarchiesi@0 1061 // Render just the table portion.
danielebarchiesi@0 1062 $output = drupal_render($form['table']);
danielebarchiesi@0 1063 $commands = array(
danielebarchiesi@0 1064 ajax_command_replace('#page-manager-argument-table', $output),
danielebarchiesi@0 1065 ctools_modal_command_dismiss(),
danielebarchiesi@0 1066 );
danielebarchiesi@0 1067 }
danielebarchiesi@0 1068 else {
danielebarchiesi@0 1069 $commands = ctools_modal_form_render($form_state, $output);
danielebarchiesi@0 1070 }
danielebarchiesi@0 1071 print ajax_render($commands);
danielebarchiesi@0 1072 ajax_footer();
danielebarchiesi@0 1073 exit;
danielebarchiesi@0 1074 }
danielebarchiesi@0 1075
danielebarchiesi@0 1076 /**
danielebarchiesi@0 1077 * Callback generated when the add page process is finished.
danielebarchiesi@0 1078 */
danielebarchiesi@0 1079 function page_manager_page_argument_finish(&$form_state) {
danielebarchiesi@0 1080 }
danielebarchiesi@0 1081
danielebarchiesi@0 1082 /**
danielebarchiesi@0 1083 * Callback generated when the 'next' button is clicked.
danielebarchiesi@0 1084 *
danielebarchiesi@0 1085 * All we do here is store the cache.
danielebarchiesi@0 1086 */
danielebarchiesi@0 1087 function page_manager_page_argument_next(&$form_state) {
danielebarchiesi@0 1088 // Update the cache with changes.
danielebarchiesi@0 1089 page_manager_set_page_cache($form_state['page']);
danielebarchiesi@0 1090 }
danielebarchiesi@0 1091
danielebarchiesi@0 1092 /**
danielebarchiesi@0 1093 * Callback generated when the 'cancel' button is clicked.
danielebarchiesi@0 1094 *
danielebarchiesi@0 1095 * We might have some temporary data lying around. We must remove it.
danielebarchiesi@0 1096 */
danielebarchiesi@0 1097 function page_manager_page_argument_cancel(&$form_state) {
danielebarchiesi@0 1098 $page = &$form_state['page']->subtask['subtask'];
danielebarchiesi@0 1099 if (isset($page->temporary_arguments)) {
danielebarchiesi@0 1100 unset($page->temporary_arguments);
danielebarchiesi@0 1101 // Update the cache with changes.
danielebarchiesi@0 1102 page_manager_set_page_cache($page);
danielebarchiesi@0 1103 }
danielebarchiesi@0 1104 }
danielebarchiesi@0 1105
danielebarchiesi@0 1106 /**
danielebarchiesi@0 1107 * Basic settings form for a page manager page.
danielebarchiesi@0 1108 */
danielebarchiesi@0 1109 function page_manager_page_argument_form_change($form, &$form_state) {
danielebarchiesi@0 1110 $page = &$form_state['page']->subtask['subtask'];
danielebarchiesi@0 1111 $keyword = &$form_state['keyword'];
danielebarchiesi@0 1112
danielebarchiesi@0 1113 ctools_include('context');
danielebarchiesi@0 1114 $plugins = ctools_get_arguments();
danielebarchiesi@0 1115
danielebarchiesi@0 1116 $options = array();
danielebarchiesi@0 1117 foreach ($plugins as $id => $plugin) {
danielebarchiesi@0 1118 if (empty($plugin['no ui'])) {
danielebarchiesi@0 1119 $options[$id] = $plugin['title'];
danielebarchiesi@0 1120 }
danielebarchiesi@0 1121 }
danielebarchiesi@0 1122
danielebarchiesi@0 1123 asort($options);
danielebarchiesi@0 1124
danielebarchiesi@0 1125 $options = array('' => t('No context selected')) + $options;
danielebarchiesi@0 1126
danielebarchiesi@0 1127 $argument = '';
danielebarchiesi@0 1128 if (isset($page->arguments[$keyword]) && isset($page->arguments[$keyword]['name'])) {
danielebarchiesi@0 1129 $argument = $page->arguments[$keyword]['name'];
danielebarchiesi@0 1130 }
danielebarchiesi@0 1131
danielebarchiesi@0 1132 $form['argument'] = array(
danielebarchiesi@0 1133 '#type' => 'radios',
danielebarchiesi@0 1134 '#options' => $options,
danielebarchiesi@0 1135 '#default_value' => $argument,
danielebarchiesi@0 1136 );
danielebarchiesi@0 1137
danielebarchiesi@0 1138 return $form;
danielebarchiesi@0 1139 }
danielebarchiesi@0 1140
danielebarchiesi@0 1141 /**
danielebarchiesi@0 1142 * Submit handler to change an argument.
danielebarchiesi@0 1143 */
danielebarchiesi@0 1144 function page_manager_page_argument_form_change_submit(&$form, &$form_state) {
danielebarchiesi@0 1145 $page = &$form_state['page']->subtask['subtask'];
danielebarchiesi@0 1146 $keyword = &$form_state['keyword'];
danielebarchiesi@0 1147 $argument = $form_state['values']['argument'];
danielebarchiesi@0 1148
danielebarchiesi@0 1149 // If the argument is not changing, we do not need to do anything.
danielebarchiesi@0 1150 if (isset($page->arguments[$keyword]['name']) && $page->arguments[$keyword]['name'] == $argument) {
danielebarchiesi@0 1151 // Set the task to cancel since no change means do nothing:
danielebarchiesi@0 1152 $form_state['clicked_button']['#wizard type'] = 'cancel';
danielebarchiesi@0 1153 return;
danielebarchiesi@0 1154 }
danielebarchiesi@0 1155
danielebarchiesi@0 1156 ctools_include('context');
danielebarchiesi@0 1157
danielebarchiesi@0 1158 // If switching to the no context, just wipe out the old data.
danielebarchiesi@0 1159 if (empty($argument)) {
danielebarchiesi@0 1160 $form_state['clicked_button']['#wizard type'] = 'finish';
danielebarchiesi@0 1161 $page->temporary_arguments[$keyword] = array(
danielebarchiesi@0 1162 'settings' => array(),
danielebarchiesi@0 1163 'identifier' => t('No context'),
danielebarchiesi@0 1164 );
danielebarchiesi@0 1165 return;
danielebarchiesi@0 1166 }
danielebarchiesi@0 1167
danielebarchiesi@0 1168 $plugin = ctools_get_argument($argument);
danielebarchiesi@0 1169
danielebarchiesi@0 1170 // Acquire defaults.
danielebarchiesi@0 1171 $settings = array();
danielebarchiesi@0 1172
danielebarchiesi@0 1173 if (isset($plugin['default'])) {
danielebarchiesi@0 1174 if (is_array($plugin['default'])) {
danielebarchiesi@0 1175 $settings = $plugin['default'];
danielebarchiesi@0 1176 }
danielebarchiesi@0 1177 else if (function_exists($plugin['default'])) {
danielebarchiesi@0 1178 $settings = $plugin['default']();
danielebarchiesi@0 1179 }
danielebarchiesi@0 1180 }
danielebarchiesi@0 1181
danielebarchiesi@0 1182 $id = ctools_context_next_id($page->arguments, $argument);
danielebarchiesi@0 1183 $title = isset($plugin['title']) ? $plugin['title'] : t('No context');
danielebarchiesi@0 1184
danielebarchiesi@0 1185 // Set the new argument in a temporary location.
danielebarchiesi@0 1186 $page->temporary_arguments[$keyword] = array(
danielebarchiesi@0 1187 'id' => $id,
danielebarchiesi@0 1188 'identifier' => $title . ($id > 1 ? ' ' . $id : ''),
danielebarchiesi@0 1189 'name' => $argument,
danielebarchiesi@0 1190 'settings' => $settings,
danielebarchiesi@0 1191 );
danielebarchiesi@0 1192 }
danielebarchiesi@0 1193
danielebarchiesi@0 1194 /**
danielebarchiesi@0 1195 * Basic settings form for a page manager page.
danielebarchiesi@0 1196 */
danielebarchiesi@0 1197 function page_manager_page_argument_form_settings($form, &$form_state) {
danielebarchiesi@0 1198 $page = &$form_state['page']->subtask['subtask'];
danielebarchiesi@0 1199 $keyword = &$form_state['keyword'];
danielebarchiesi@0 1200
danielebarchiesi@0 1201 if (isset($page->temporary_arguments[$keyword])) {
danielebarchiesi@0 1202 $conf = $page->temporary_arguments[$keyword];
danielebarchiesi@0 1203 }
danielebarchiesi@0 1204 else if (isset($page->arguments[$keyword])) {
danielebarchiesi@0 1205 $conf = $page->temporary_arguments[$keyword] = $page->arguments[$keyword];
danielebarchiesi@0 1206 }
danielebarchiesi@0 1207
danielebarchiesi@0 1208 if (!isset($conf)) {
danielebarchiesi@0 1209 // This should be impossible and thus never seen.
danielebarchiesi@0 1210 $form['error'] = array('#value' => t('Error: missing argument.'));
danielebarchiesi@0 1211 return;
danielebarchiesi@0 1212 }
danielebarchiesi@0 1213
danielebarchiesi@0 1214 ctools_include('context');
danielebarchiesi@0 1215 $plugin = ctools_get_argument($conf['name']);
danielebarchiesi@0 1216
danielebarchiesi@0 1217 $form['settings'] = array(
danielebarchiesi@0 1218 '#tree' => TRUE,
danielebarchiesi@0 1219 );
danielebarchiesi@0 1220
danielebarchiesi@0 1221 $form['identifier'] = array(
danielebarchiesi@0 1222 '#type' => 'textfield',
danielebarchiesi@0 1223 '#title' => t('Context identifier'),
danielebarchiesi@0 1224 '#description' => t('This is the title of the context used to identify it later in the administrative process. This will never be shown to a user.'),
danielebarchiesi@0 1225 '#default_value' => $conf['identifier'],
danielebarchiesi@0 1226 );
danielebarchiesi@0 1227
danielebarchiesi@0 1228 if (!$plugin) {
danielebarchiesi@0 1229 // This should be impossible and thus never seen.
danielebarchiesi@0 1230 $form['error'] = array('#value' => t('Error: missing or invalid argument plugin %argument.', array('%argument', $argument)));
danielebarchiesi@0 1231 return;
danielebarchiesi@0 1232 }
danielebarchiesi@0 1233
danielebarchiesi@0 1234 if ($function = ctools_plugin_get_function($plugin, 'settings form')) {
danielebarchiesi@0 1235 $function($form, $form_state, $conf['settings']);
danielebarchiesi@0 1236 }
danielebarchiesi@0 1237
danielebarchiesi@0 1238 $form_state['plugin'] = $plugin;
danielebarchiesi@0 1239 return $form;
danielebarchiesi@0 1240 }
danielebarchiesi@0 1241
danielebarchiesi@0 1242 /**
danielebarchiesi@0 1243 * Validate handler for argument settings.
danielebarchiesi@0 1244 */
danielebarchiesi@0 1245 function page_manager_page_argument_form_settings_validate(&$form, &$form_state) {
danielebarchiesi@0 1246 if ($function = ctools_plugin_get_function($form_state['plugin'], 'settings form validate')) {
danielebarchiesi@0 1247 $function($form, $form_state);
danielebarchiesi@0 1248 }
danielebarchiesi@0 1249 }
danielebarchiesi@0 1250
danielebarchiesi@0 1251 /**
danielebarchiesi@0 1252 * Submit handler for argument settings.
danielebarchiesi@0 1253 */
danielebarchiesi@0 1254 function page_manager_page_argument_form_settings_submit(&$form, &$form_state) {
danielebarchiesi@0 1255 if ($function = ctools_plugin_get_function($form_state['plugin'], 'settings form submit')) {
danielebarchiesi@0 1256 $function($form, $form_state);
danielebarchiesi@0 1257 }
danielebarchiesi@0 1258
danielebarchiesi@0 1259 $page = &$form_state['page']->subtask['subtask'];
danielebarchiesi@0 1260 $keyword = &$form_state['keyword'];
danielebarchiesi@0 1261 // Copy the form to our temporary location which will get moved again when
danielebarchiesi@0 1262 // finished. Yes, finished is always next but finish can happen from other
danielebarchiesi@0 1263 // locations so we funnel through that path rather than duplicate.
danielebarchiesi@0 1264 $page->temporary_arguments[$keyword]['identifier'] = $form_state['values']['identifier'];
danielebarchiesi@0 1265 if (isset($form_state['values']['settings'])) {
danielebarchiesi@0 1266 $page->temporary_arguments[$keyword]['settings'] = $form_state['values']['settings'];
danielebarchiesi@0 1267 }
danielebarchiesi@0 1268 else {
danielebarchiesi@0 1269 $page->temporary_arguments[$keyword]['settings'] = array();
danielebarchiesi@0 1270 }
danielebarchiesi@0 1271 }
danielebarchiesi@0 1272
danielebarchiesi@0 1273 /**
danielebarchiesi@0 1274 * Import a task handler from cut & paste
danielebarchiesi@0 1275 */
danielebarchiesi@0 1276 function page_manager_page_import_subtask($form, &$form_state, $task_name) {
danielebarchiesi@0 1277 $form_state['task'] = page_manager_get_task($task_name);
danielebarchiesi@0 1278
danielebarchiesi@0 1279 drupal_set_title(t('Import page'));
danielebarchiesi@0 1280 $form['name'] = array(
danielebarchiesi@0 1281 '#type' => 'textfield',
danielebarchiesi@0 1282 '#title' => t('Page name'),
danielebarchiesi@0 1283 '#description' => t('Enter the name to use for this page if it is different from the source page. Leave blank to use the original name of the page.'),
danielebarchiesi@0 1284 );
danielebarchiesi@0 1285
danielebarchiesi@0 1286 $form['path'] = array(
danielebarchiesi@0 1287 '#type' => 'textfield',
danielebarchiesi@0 1288 '#title' => t('Path'),
danielebarchiesi@0 1289 '#description' => t('Enter the path to use for this page if it is different from the source page. Leave blank to use the original path of the page.'),
danielebarchiesi@0 1290 );
danielebarchiesi@0 1291
danielebarchiesi@0 1292 $form['overwrite'] = array(
danielebarchiesi@0 1293 '#type' => 'checkbox',
danielebarchiesi@0 1294 '#title' => t('Allow overwrite of an existing page'),
danielebarchiesi@0 1295 '#description' => t('If the name you selected already exists in the database, this page will be allowed to overwrite the existing page.'),
danielebarchiesi@0 1296 );
danielebarchiesi@0 1297
danielebarchiesi@0 1298 $form['object'] = array(
danielebarchiesi@0 1299 '#type' => 'textarea',
danielebarchiesi@0 1300 '#title' => t('Paste page code here'),
danielebarchiesi@0 1301 '#rows' => 15,
danielebarchiesi@0 1302 );
danielebarchiesi@0 1303
danielebarchiesi@0 1304 $form['submit'] = array(
danielebarchiesi@0 1305 '#type' => 'submit',
danielebarchiesi@0 1306 '#value' => t('Import'),
danielebarchiesi@0 1307 );
danielebarchiesi@0 1308 return $form;
danielebarchiesi@0 1309 }
danielebarchiesi@0 1310
danielebarchiesi@0 1311 /**
danielebarchiesi@0 1312 * Ensure we got a valid page.
danielebarchiesi@0 1313 */
danielebarchiesi@0 1314 function page_manager_page_import_subtask_validate(&$form, &$form_state) {
danielebarchiesi@0 1315 ob_start();
danielebarchiesi@0 1316 eval($form_state['values']['object']);
danielebarchiesi@0 1317 ob_end_clean();
danielebarchiesi@0 1318
danielebarchiesi@0 1319 if (!isset($page) || !is_object($page)) {
danielebarchiesi@0 1320 $errors = ob_get_contents();
danielebarchiesi@0 1321 if (empty($errors)) {
danielebarchiesi@0 1322 $errors = t('No handler found.');
danielebarchiesi@0 1323 }
danielebarchiesi@0 1324 form_error($form['object'], t('Unable to get a page from the import. Errors reported: @errors', array('@errors' => $errors)));
danielebarchiesi@0 1325 }
danielebarchiesi@0 1326
danielebarchiesi@0 1327 if (empty($form_state['values']['name'])) {
danielebarchiesi@0 1328 $form_state['values']['name'] = $page->name;
danielebarchiesi@0 1329 }
danielebarchiesi@0 1330
danielebarchiesi@0 1331 $task_name = page_manager_make_task_name('page', $form_state['values']['name']);
danielebarchiesi@0 1332 $form_state['cache'] = page_manager_get_page_cache($task_name);
danielebarchiesi@0 1333
danielebarchiesi@0 1334 if ($form_state['cache'] && $form_state['cache']->locked) {
danielebarchiesi@0 1335 form_error($form['name'], t('That page name is in use and locked by another user. You must <a href="!break">break the lock</a> on that page before proceeding, or choose a different name.', array('!break' => url(page_manager_edit_url($task_name, array('actions', 'break-lock'))))));
danielebarchiesi@0 1336 return;
danielebarchiesi@0 1337 }
danielebarchiesi@0 1338
danielebarchiesi@0 1339 if (empty($form_state['values']['path'])) {
danielebarchiesi@0 1340 $form_state['values']['path'] = $page->path;
danielebarchiesi@0 1341 }
danielebarchiesi@0 1342
danielebarchiesi@0 1343 if (empty($form_state['values']['overwrite'])) {
danielebarchiesi@0 1344 $page->name = NULL;
danielebarchiesi@0 1345 }
danielebarchiesi@0 1346
danielebarchiesi@0 1347 $form_state['page'] = new stdClass();
danielebarchiesi@0 1348 $form_state['page']->subtask['subtask'] = $page;
danielebarchiesi@0 1349 page_manager_page_form_basic_validate($form, $form_state);
danielebarchiesi@0 1350 }
danielebarchiesi@0 1351
danielebarchiesi@0 1352 /**
danielebarchiesi@0 1353 * Submit the import page to create the new page and redirect.
danielebarchiesi@0 1354 */
danielebarchiesi@0 1355 function page_manager_page_import_subtask_submit($form, &$form_state) {
danielebarchiesi@0 1356 $page = &$form_state['page']->subtask['subtask'];
danielebarchiesi@0 1357 $page->name = $form_state['values']['name'];
danielebarchiesi@0 1358 $page->path = $form_state['values']['path'];
danielebarchiesi@0 1359
danielebarchiesi@0 1360 $task_name = page_manager_make_task_name('page', $page->name);
danielebarchiesi@0 1361 $cache = page_manager_get_page_cache($task_name);
danielebarchiesi@0 1362 if (!$cache) {
danielebarchiesi@0 1363 $cache = new stdClass();
danielebarchiesi@0 1364 }
danielebarchiesi@0 1365
danielebarchiesi@0 1366 page_manager_page_new_page_cache($page, $cache);
danielebarchiesi@0 1367 page_manager_set_page_cache($cache);
danielebarchiesi@0 1368
danielebarchiesi@0 1369 $form_state['redirect'] = page_manager_edit_url($task_name);
danielebarchiesi@0 1370 }
danielebarchiesi@0 1371
danielebarchiesi@0 1372 /**
danielebarchiesi@0 1373 * Entry point to export a page.
danielebarchiesi@0 1374 */
danielebarchiesi@0 1375 function page_manager_page_form_export($form, &$form_state) {
danielebarchiesi@0 1376 $page = $form_state['page']->subtask['subtask'];
danielebarchiesi@0 1377
danielebarchiesi@0 1378 $export = page_manager_page_export($page, $form_state['page']->handlers);
danielebarchiesi@0 1379
danielebarchiesi@0 1380 $lines = substr_count($export, "\n");
danielebarchiesi@0 1381 $form['code'] = array(
danielebarchiesi@0 1382 '#type' => 'textarea',
danielebarchiesi@0 1383 '#default_value' => $export,
danielebarchiesi@0 1384 '#rows' => $lines,
danielebarchiesi@0 1385 );
danielebarchiesi@0 1386
danielebarchiesi@0 1387 unset($form['buttons']);
danielebarchiesi@0 1388 return $form;
danielebarchiesi@0 1389 }
danielebarchiesi@0 1390
danielebarchiesi@0 1391 /**
danielebarchiesi@0 1392 * Entry point to clone a page.
danielebarchiesi@0 1393 */
danielebarchiesi@0 1394 function page_manager_page_form_clone($form, &$form_state) {
danielebarchiesi@0 1395 $page = &$form_state['page']->subtask['subtask'];
danielebarchiesi@0 1396
danielebarchiesi@0 1397 // This provides its own button because it does something totally different.
danielebarchiesi@0 1398 unset($form['buttons']);
danielebarchiesi@0 1399
danielebarchiesi@0 1400 $form['admin_title'] = array(
danielebarchiesi@0 1401 '#type' => 'textfield',
danielebarchiesi@0 1402 '#title' => t('Administrative title'),
danielebarchiesi@0 1403 '#description' => t('The name of this page. This will appear in the administrative interface to easily identify it.'),
danielebarchiesi@0 1404 '#default_value' => $page->admin_title,
danielebarchiesi@0 1405 );
danielebarchiesi@0 1406
danielebarchiesi@0 1407 $form['name'] = array(
danielebarchiesi@0 1408 '#type' => 'machine_name',
danielebarchiesi@0 1409 '#title' => t('Page name'),
danielebarchiesi@0 1410 '#machine_name' => array(
danielebarchiesi@0 1411 'exists' => 'page_manager_page_load',
danielebarchiesi@0 1412 'source' => array('admin_title'),
danielebarchiesi@0 1413 ),
danielebarchiesi@0 1414 '#description' => t('Enter the name to the new page It must be unique and contain only alphanumeric characters and underscores.'),
danielebarchiesi@0 1415 );
danielebarchiesi@0 1416
danielebarchiesi@0 1417 // path
danielebarchiesi@0 1418 $form['path'] = array(
danielebarchiesi@0 1419 '#type' => 'textfield',
danielebarchiesi@0 1420 '#title' => t('Path'),
danielebarchiesi@0 1421 '#description' => t('The URL path to get to this page. You may create named placeholders for variable parts of the path by using %name for required elements and !name for optional elements. For example: "node/%node/foo", "forum/%forum" or "dashboard/!input". These named placeholders can be turned into contexts on the arguments form. You cannot use the same path as the original page.'),
danielebarchiesi@0 1422 '#default_value' => $page->path,
danielebarchiesi@0 1423 );
danielebarchiesi@0 1424
danielebarchiesi@0 1425 $form['handlers'] = array(
danielebarchiesi@0 1426 '#type' => 'checkbox',
danielebarchiesi@0 1427 '#title' => t('Clone variants'),
danielebarchiesi@0 1428 '#description' => t('If checked all variants associated with the page will be cloned as well. If not checked the page will be cloned without variants.'),
danielebarchiesi@0 1429 '#default_value' => TRUE,
danielebarchiesi@0 1430 );
danielebarchiesi@0 1431
danielebarchiesi@0 1432 $form['submit'] = array(
danielebarchiesi@0 1433 '#type' => 'submit',
danielebarchiesi@0 1434 '#value' => t('Clone'),
danielebarchiesi@0 1435 );
danielebarchiesi@0 1436
danielebarchiesi@0 1437 return $form;
danielebarchiesi@0 1438 }
danielebarchiesi@0 1439
danielebarchiesi@0 1440 /**
danielebarchiesi@0 1441 * Validate clone page form.
danielebarchiesi@0 1442 */
danielebarchiesi@0 1443 function page_manager_page_form_clone_validate(&$form, &$form_state) {
danielebarchiesi@0 1444 $page = &$form_state['page']->subtask['subtask'];
danielebarchiesi@0 1445
danielebarchiesi@0 1446 $page->old_name = $page->name;
danielebarchiesi@0 1447 $page->name = NULL;
danielebarchiesi@0 1448 page_manager_page_form_basic_validate($form, $form_state);
danielebarchiesi@0 1449 }
danielebarchiesi@0 1450
danielebarchiesi@0 1451 /**
danielebarchiesi@0 1452 * submit clone page form.
danielebarchiesi@0 1453 *
danielebarchiesi@0 1454 * Load the page, change the name(s) to protect the innocent, and if
danielebarchiesi@0 1455 * requested, load all the task handlers so that they get saved properly too.
danielebarchiesi@0 1456 */
danielebarchiesi@0 1457 function page_manager_page_form_clone_submit(&$form, &$form_state) {
danielebarchiesi@0 1458 $original = $form_state['page']->subtask['subtask'];
danielebarchiesi@0 1459
danielebarchiesi@0 1460 $original->name = $form_state['values']['name'];
danielebarchiesi@0 1461 $original->admin_title = $form_state['values']['admin_title'];
danielebarchiesi@0 1462 $original->path = $form_state['values']['path'];
danielebarchiesi@0 1463
danielebarchiesi@0 1464 $handlers = !empty($form_state['values']['handlers']) ? $form_state['page']->handlers : FALSE;
danielebarchiesi@0 1465 // Export the handler, which is a fantastic way to clean database IDs out of it.
danielebarchiesi@0 1466 $export = page_manager_page_export($original, $handlers);
danielebarchiesi@0 1467 ob_start();
danielebarchiesi@0 1468 eval($export);
danielebarchiesi@0 1469 ob_end_clean();
danielebarchiesi@0 1470
danielebarchiesi@0 1471 $task_name = page_manager_make_task_name('page', $page->name);
danielebarchiesi@0 1472 $cache = new stdClass();
danielebarchiesi@0 1473
danielebarchiesi@0 1474 page_manager_page_new_page_cache($page, $cache);
danielebarchiesi@0 1475 page_manager_set_page_cache($cache);
danielebarchiesi@0 1476
danielebarchiesi@0 1477 $form_state['redirect'] = page_manager_edit_url($task_name);
danielebarchiesi@0 1478 }
danielebarchiesi@0 1479
danielebarchiesi@0 1480 /**
danielebarchiesi@0 1481 * Entry point to export a page.
danielebarchiesi@0 1482 */
danielebarchiesi@0 1483 function page_manager_page_form_delete($form, &$form_state) {
danielebarchiesi@0 1484 $page = &$form_state['page']->subtask['subtask'];
danielebarchiesi@0 1485
danielebarchiesi@0 1486 if ($page->type == t('Overridden')) {
danielebarchiesi@0 1487 $text = t('Reverting the page will delete the page that is in the database, reverting it to the original default page. Any changes you have made will be lost and cannot be recovered.');
danielebarchiesi@0 1488 }
danielebarchiesi@0 1489 else {
danielebarchiesi@0 1490 $text = t('Are you sure you want to delete this page? Deleting a page cannot be undone.');
danielebarchiesi@0 1491 }
danielebarchiesi@0 1492 $form['markup'] = array(
danielebarchiesi@0 1493 '#value' => '<p>' . $text . '</p>',
danielebarchiesi@0 1494 );
danielebarchiesi@0 1495
danielebarchiesi@0 1496 if (empty($form_state['page']->locked)) {
danielebarchiesi@0 1497 unset($form['buttons']);
danielebarchiesi@0 1498 $form['delete'] = array(
danielebarchiesi@0 1499 '#type' => 'submit',
danielebarchiesi@0 1500 '#value' => $page->type == t('Overridden') ? t('Revert') : t('Delete'),
danielebarchiesi@0 1501 );
danielebarchiesi@0 1502 }
danielebarchiesi@0 1503
danielebarchiesi@0 1504 return $form;
danielebarchiesi@0 1505 }
danielebarchiesi@0 1506
danielebarchiesi@0 1507 /**
danielebarchiesi@0 1508 * Submit handler to delete a view.
danielebarchiesi@0 1509 */
danielebarchiesi@0 1510 function page_manager_page_form_delete_submit(&$form, &$form_state) {
danielebarchiesi@0 1511 $page = $form_state['page']->subtask['subtask'];
danielebarchiesi@0 1512 page_manager_page_delete($page);
danielebarchiesi@0 1513 if ($page->type != t('Overridden')) {
danielebarchiesi@0 1514 $form_state['redirect'] = 'admin/structure/pages';
danielebarchiesi@0 1515 drupal_set_message(t('The page has been deleted.'));
danielebarchiesi@0 1516 }
danielebarchiesi@0 1517 else {
danielebarchiesi@0 1518 $form_state['redirect'] = page_manager_edit_url($form_state['page']->task_name, array('summary'));
danielebarchiesi@0 1519 drupal_set_message(t('The page has been reverted.'));
danielebarchiesi@0 1520 }
danielebarchiesi@0 1521 }