annotate sites/all/modules/ctools/page_manager/page_manager.admin.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 * Administrative functions for the page manager.
danielebarchiesi@0 6 *
danielebarchiesi@0 7 * This provides the UI to list, create, edit and delete pages, though much
danielebarchiesi@0 8 * of this is delegated through to individual tasks.
danielebarchiesi@0 9 */
danielebarchiesi@0 10
danielebarchiesi@0 11 /**
danielebarchiesi@0 12 * Output a list of pages that are managed.
danielebarchiesi@0 13 */
danielebarchiesi@0 14 function page_manager_list_page($js = NULL) {
danielebarchiesi@0 15 // Prevent this page from showing up when random other links fail.
danielebarchiesi@0 16 if ($js && $js != 'ajax' && $js != 'nojs') {
danielebarchiesi@0 17 return drupal_not_found();
danielebarchiesi@0 18 }
danielebarchiesi@0 19
danielebarchiesi@0 20 // TRUE if 'ajax', FALSE if otherwise.
danielebarchiesi@0 21 $js = $js == 'ajax';
danielebarchiesi@0 22
danielebarchiesi@0 23 // If we do any form rendering, it's to completely replace a form on the
danielebarchiesi@0 24 // page, so don't let it force our ids to change.
danielebarchiesi@0 25 if ($js && isset($_POST['ajax_html_ids'])) {
danielebarchiesi@0 26 unset($_POST['ajax_html_ids']);
danielebarchiesi@0 27 }
danielebarchiesi@0 28
danielebarchiesi@0 29 if (module_exists('advanced_help') && !$js) {
danielebarchiesi@0 30 drupal_set_message(theme('advanced_help_topic', array(
danielebarchiesi@0 31 'module' => 'page_manager',
danielebarchiesi@0 32 'topic' => 'getting-started',
danielebarchiesi@0 33 'type' => t('See the getting started guide for more information.'),
danielebarchiesi@0 34 )));
danielebarchiesi@0 35 }
danielebarchiesi@0 36
danielebarchiesi@0 37 $tasks = page_manager_get_tasks_by_type('page');
danielebarchiesi@0 38 $pages = array('operations' => array(), 'tasks' => array());
danielebarchiesi@0 39
danielebarchiesi@0 40 page_manager_get_pages($tasks, $pages);
danielebarchiesi@0 41
danielebarchiesi@0 42 // Add lock icon to all locked tasks.
danielebarchiesi@0 43 global $user;
danielebarchiesi@0 44
danielebarchiesi@0 45 ctools_include('object-cache');
danielebarchiesi@0 46 $locks = ctools_object_cache_test_objects('page_manager_page', $pages['tasks']);
danielebarchiesi@0 47 foreach ($locks as $task_name => $lock) {
danielebarchiesi@0 48 if ($lock->uid == $user->uid) {
danielebarchiesi@0 49 $pages['rows'][$task_name]['class'][] = ' page-manager-locked';
danielebarchiesi@0 50 $pages['rows'][$task_name]['title'] = t('This page is currently locked for editing by you. Nobody else may edit this page until these changes are saved or canceled.');
danielebarchiesi@0 51 }
danielebarchiesi@0 52 else {
danielebarchiesi@0 53 $pages['rows'][$task_name]['class'][] = ' page-manager-locked-other';
danielebarchiesi@0 54 $pages['rows'][$task_name]['title'] = t('This page is currently locked for editing by another user. You may not edit this page without breaking the lock.');
danielebarchiesi@0 55 }
danielebarchiesi@0 56 }
danielebarchiesi@0 57
danielebarchiesi@0 58 $input = $_POST;
danielebarchiesi@0 59
danielebarchiesi@0 60 // Respond to a reset command by clearing session and doing a drupal goto
danielebarchiesi@0 61 // back to the base URL.
danielebarchiesi@0 62 if (isset($input['op']) && $input['op'] == t('Reset')) {
danielebarchiesi@0 63 unset($_SESSION['page_manager']['#admin']);
danielebarchiesi@0 64 if (!$js) {
danielebarchiesi@0 65 return drupal_goto($_GET['q']);
danielebarchiesi@0 66 }
danielebarchiesi@0 67 // clear everything but form id, form build id and form token:
danielebarchiesi@0 68 $keys = array_keys($input);
danielebarchiesi@0 69 foreach ($keys as $id) {
danielebarchiesi@0 70 if ($id != 'form_id' && $id != 'form_build_id' && $id != 'form_token') {
danielebarchiesi@0 71 unset($input[$id]);
danielebarchiesi@0 72 }
danielebarchiesi@0 73 }
danielebarchiesi@0 74 $replace_form = TRUE;
danielebarchiesi@0 75 }
danielebarchiesi@0 76 if (count($input) <= 1) {
danielebarchiesi@0 77 if (isset($_SESSION['page_manager']['#admin']) && is_array($_SESSION['page_manager']['#admin'])) {
danielebarchiesi@0 78 $input = $_SESSION['page_manager']['#admin'];
danielebarchiesi@0 79 }
danielebarchiesi@0 80 }
danielebarchiesi@0 81 else {
danielebarchiesi@0 82 $_SESSION['page_manager']['#admin'] = $input;
danielebarchiesi@0 83 unset($_SESSION['page_manager']['#admin']['q']);
danielebarchiesi@0 84 }
danielebarchiesi@0 85
danielebarchiesi@0 86 $form_state = array(
danielebarchiesi@0 87 'pages' => &$pages,
danielebarchiesi@0 88 'input' => $input,
danielebarchiesi@0 89 'rerender' => TRUE,
danielebarchiesi@0 90 'no_redirect' => TRUE,
danielebarchiesi@0 91 );
danielebarchiesi@0 92
danielebarchiesi@0 93 // This form will sort and filter the pages.
danielebarchiesi@0 94 $form = drupal_build_form('page_manager_list_pages_form', $form_state);
danielebarchiesi@0 95
danielebarchiesi@0 96 $header = array(
danielebarchiesi@0 97 array('data' => t('Type'), 'class' => array('page-manager-page-type')),
danielebarchiesi@0 98 array('data' => t('Name'), 'class' => array('page-manager-page-name')),
danielebarchiesi@0 99 array('data' => t('Title'), 'class' => array('page-manager-page-title')),
danielebarchiesi@0 100 array('data' => t('Path'), 'class' => array('page-manager-page-path')),
danielebarchiesi@0 101 array('data' => t('Storage'), 'class' => array('page-manager-page-storage')),
danielebarchiesi@0 102 );
danielebarchiesi@0 103
danielebarchiesi@0 104 $header[] = array('data' => t('Operations'), 'class' => array('page-manager-page-operations'));
danielebarchiesi@0 105 $table = theme('table', array('header' => $header, 'rows' => $pages['rows'], 'attributes' => array('id' => 'page-manager-list-pages')));
danielebarchiesi@0 106
danielebarchiesi@0 107 $operations = '<div id="page-manager-links" class="links">' . theme('links', array('links' => $pages['operations'])) . '</div>';
danielebarchiesi@0 108
danielebarchiesi@0 109 drupal_add_css(drupal_get_path('module', 'page_manager') . '/css/page-manager.css');
danielebarchiesi@0 110
danielebarchiesi@0 111
danielebarchiesi@0 112 if (!$js) {
danielebarchiesi@0 113 return array('#markup' => drupal_render($form) . $table . $operations);
danielebarchiesi@0 114 }
danielebarchiesi@0 115
danielebarchiesi@0 116 ctools_include('ajax');
danielebarchiesi@0 117 $commands = array();
danielebarchiesi@0 118 $commands[] = ajax_command_replace('#page-manager-list-pages', $table);
danielebarchiesi@0 119 if (!empty($replace_form)) {
danielebarchiesi@0 120 $commands[] = ajax_command_replace('#page-manager-list-pages-form', drupal_render($form));
danielebarchiesi@0 121 }
danielebarchiesi@0 122 print ajax_render($commands);
danielebarchiesi@0 123 ajax_footer();
danielebarchiesi@0 124 }
danielebarchiesi@0 125
danielebarchiesi@0 126 /**
danielebarchiesi@0 127 * Sort tasks into buckets based upon whether or not they have subtasks.
danielebarchiesi@0 128 */
danielebarchiesi@0 129 function page_manager_get_pages($tasks, &$pages, $task_id = NULL) {
danielebarchiesi@0 130 foreach ($tasks as $id => $task) {
danielebarchiesi@0 131 if (empty($task_id) && !empty($task['page operations'])) {
danielebarchiesi@0 132 $pages['operations'] = array_merge($pages['operations'], $task['page operations']);
danielebarchiesi@0 133 }
danielebarchiesi@0 134
danielebarchiesi@0 135 // If a type has subtasks, add its subtasks in its own table.
danielebarchiesi@0 136 if (!empty($task['subtasks'])) {
danielebarchiesi@0 137 page_manager_get_pages(page_manager_get_task_subtasks($task), $pages, $task['name']);
danielebarchiesi@0 138 continue;
danielebarchiesi@0 139 }
danielebarchiesi@0 140
danielebarchiesi@0 141 if (isset($task_id)) {
danielebarchiesi@0 142 $task_name = page_manager_make_task_name($task_id, $task['name']);
danielebarchiesi@0 143 }
danielebarchiesi@0 144 else {
danielebarchiesi@0 145 $task_name = $task['name'];
danielebarchiesi@0 146 }
danielebarchiesi@0 147
danielebarchiesi@0 148 $class = array('page-task-' . $id);
danielebarchiesi@0 149 if (isset($task['row class'])) {
danielebarchiesi@0 150 $class[] = $task['row class'];
danielebarchiesi@0 151 }
danielebarchiesi@0 152
danielebarchiesi@0 153 if (!empty($task['disabled'])) {
danielebarchiesi@0 154 $class[] = 'page-manager-disabled';
danielebarchiesi@0 155 }
danielebarchiesi@0 156
danielebarchiesi@0 157 $path = array();
danielebarchiesi@0 158 $visible_path = '';
danielebarchiesi@0 159 if (!empty($task['admin path'])) {
danielebarchiesi@0 160 foreach (explode('/', $task['admin path']) as $bit) {
danielebarchiesi@0 161 if (isset($bit[0]) && $bit[0] != '!') {
danielebarchiesi@0 162 $path[] = $bit;
danielebarchiesi@0 163 }
danielebarchiesi@0 164 }
danielebarchiesi@0 165
danielebarchiesi@0 166 $path = implode('/', $path);
danielebarchiesi@0 167 if (empty($task['disabled']) && strpos($path, '%') === FALSE) {
danielebarchiesi@0 168 $visible_path = l('/' . $task['admin path'], $path);
danielebarchiesi@0 169 }
danielebarchiesi@0 170 else {
danielebarchiesi@0 171 $visible_path = '/' . $task['admin path'];
danielebarchiesi@0 172 }
danielebarchiesi@0 173 }
danielebarchiesi@0 174
danielebarchiesi@0 175 $row = array('data' => array(), 'class' => $class, 'title' => strip_tags($task['admin description']));
danielebarchiesi@0 176
danielebarchiesi@0 177 $type = isset($task['admin type']) ? $task['admin type'] : t('System');
danielebarchiesi@0 178 $pages['types'][$type] = $type;
danielebarchiesi@0 179 $row['data']['type'] = array('data' => $type, 'class' => array('page-manager-page-type'));
danielebarchiesi@0 180
danielebarchiesi@0 181 $row['data']['name'] = array('data' => $task_name, 'class' => array('page-manager-page-name'));
danielebarchiesi@0 182 $row['data']['title'] = array('data' => $task['admin title'], 'class' => array('page-manager-page-title'));
danielebarchiesi@0 183 $row['data']['path'] = array('data' => $visible_path, 'class' => array('page-manager-page-path'));
danielebarchiesi@0 184
danielebarchiesi@0 185 $storage = isset($task['storage']) ? $task['storage'] : t('In code');
danielebarchiesi@0 186 $pages['storages'][$storage] = $storage;
danielebarchiesi@0 187 $row['data']['storage'] = array('data' => $storage, 'class' => array('page-manager-page-storage'));
danielebarchiesi@0 188
danielebarchiesi@0 189
danielebarchiesi@0 190 /*
danielebarchiesi@0 191 if (empty($task['disabled'])) {
danielebarchiesi@0 192 $item = menu_get_item($path);
danielebarchiesi@0 193 if (empty($item)) {
danielebarchiesi@0 194 dsm($path);
danielebarchiesi@0 195 }
danielebarchiesi@0 196 else {
danielebarchiesi@0 197 dsm($item);
danielebarchiesi@0 198 }
danielebarchiesi@0 199 }
danielebarchiesi@0 200 */
danielebarchiesi@0 201 $operations = array(
danielebarchiesi@0 202 array(
danielebarchiesi@0 203 'title' => t('Edit'),
danielebarchiesi@0 204 'href' => page_manager_edit_url($task_name),
danielebarchiesi@0 205 ),
danielebarchiesi@0 206 );
danielebarchiesi@0 207
danielebarchiesi@0 208 if (!empty($task['enable callback'])) {
danielebarchiesi@0 209 if (!empty($task['disabled'])) {
danielebarchiesi@0 210 array_unshift($operations, array(
danielebarchiesi@0 211 'title' => t('Enable'),
danielebarchiesi@0 212 'href' => 'admin/structure/pages/nojs/enable/' . $task_name,
danielebarchiesi@0 213 'query' => array('token' => drupal_get_token($task_name)),
danielebarchiesi@0 214 ));
danielebarchiesi@0 215 }
danielebarchiesi@0 216 else {
danielebarchiesi@0 217 $operations[] = array(
danielebarchiesi@0 218 'title' => t('Disable'),
danielebarchiesi@0 219 'href' => 'admin/structure/pages/nojs/disable/' . $task_name,
danielebarchiesi@0 220 'query' => array('token' => drupal_get_token($task_name)),
danielebarchiesi@0 221 );
danielebarchiesi@0 222 }
danielebarchiesi@0 223 }
danielebarchiesi@0 224
danielebarchiesi@0 225 $ops = theme('links__ctools_dropbutton', array('links' => $operations, 'attributes' => array('class' => array('links', 'inline'))));
danielebarchiesi@0 226
danielebarchiesi@0 227 $row['data']['operations'] = array('data' => $ops, 'class' => array('page-manager-page-operations'));
danielebarchiesi@0 228
danielebarchiesi@0 229 $pages['disabled'][$task_name] = !empty($task['disabled']);
danielebarchiesi@0 230 $pages['tasks'][] = $task_name;
danielebarchiesi@0 231 $pages['rows'][$task_name] = $row;
danielebarchiesi@0 232 }
danielebarchiesi@0 233 }
danielebarchiesi@0 234
danielebarchiesi@0 235 /**
danielebarchiesi@0 236 * Provide a form for sorting and filtering the list of pages.
danielebarchiesi@0 237 */
danielebarchiesi@0 238 function page_manager_list_pages_form($form, &$form_state) {
danielebarchiesi@0 239 // This forces the form to *always* treat as submitted which is
danielebarchiesi@0 240 // necessary to make it work.
danielebarchiesi@0 241 if (empty($_POST)) {
danielebarchiesi@0 242 $form["#programmed"] = TRUE;
danielebarchiesi@0 243 }
danielebarchiesi@0 244 $form['#action'] = url('admin/structure/pages/nojs/', array('absolute' => TRUE));
danielebarchiesi@0 245 if (!variable_get('clean_url', FALSE)) {
danielebarchiesi@0 246 $form['q'] = array(
danielebarchiesi@0 247 '#type' => 'hidden',
danielebarchiesi@0 248 '#value' => $_GET['q'],
danielebarchiesi@0 249 );
danielebarchiesi@0 250 }
danielebarchiesi@0 251
danielebarchiesi@0 252 $all = array('all' => t('<All>'));
danielebarchiesi@0 253
danielebarchiesi@0 254 $form['type'] = array(
danielebarchiesi@0 255 '#type' => 'select',
danielebarchiesi@0 256 '#title' => t('Type'),
danielebarchiesi@0 257 '#options' => $all + $form_state['pages']['types'],
danielebarchiesi@0 258 '#default_value' => 'all',
danielebarchiesi@0 259 );
danielebarchiesi@0 260
danielebarchiesi@0 261 $form['storage'] = array(
danielebarchiesi@0 262 '#type' => 'select',
danielebarchiesi@0 263 '#title' => t('Storage'),
danielebarchiesi@0 264 '#options' => $all + $form_state['pages']['storages'],
danielebarchiesi@0 265 '#default_value' => 'all',
danielebarchiesi@0 266 );
danielebarchiesi@0 267
danielebarchiesi@0 268 $form['disabled'] = array(
danielebarchiesi@0 269 '#type' => 'select',
danielebarchiesi@0 270 '#title' => t('Enabled'),
danielebarchiesi@0 271 '#options' => $all + array('0' => t('Enabled'), '1' => t('Disabled')),
danielebarchiesi@0 272 '#default_value' => 'all',
danielebarchiesi@0 273 );
danielebarchiesi@0 274
danielebarchiesi@0 275 $form['search'] = array(
danielebarchiesi@0 276 '#type' => 'textfield',
danielebarchiesi@0 277 '#title' => t('Search'),
danielebarchiesi@0 278 );
danielebarchiesi@0 279
danielebarchiesi@0 280 $form['order'] = array(
danielebarchiesi@0 281 '#type' => 'select',
danielebarchiesi@0 282 '#title' => t('Sort by'),
danielebarchiesi@0 283 '#options' => array(
danielebarchiesi@0 284 'disabled' => t('Enabled, title'),
danielebarchiesi@0 285 'title' => t('Title'),
danielebarchiesi@0 286 'name' => t('Name'),
danielebarchiesi@0 287 'path' => t('Path'),
danielebarchiesi@0 288 'type' => t('Type'),
danielebarchiesi@0 289 'storage' => t('Storage'),
danielebarchiesi@0 290 ),
danielebarchiesi@0 291 '#default_value' => 'disabled',
danielebarchiesi@0 292 );
danielebarchiesi@0 293
danielebarchiesi@0 294 $form['sort'] = array(
danielebarchiesi@0 295 '#type' => 'select',
danielebarchiesi@0 296 '#title' => t('Order'),
danielebarchiesi@0 297 '#options' => array(
danielebarchiesi@0 298 'asc' => t('Up'),
danielebarchiesi@0 299 'desc' => t('Down'),
danielebarchiesi@0 300 ),
danielebarchiesi@0 301 '#default_value' => 'asc',
danielebarchiesi@0 302 );
danielebarchiesi@0 303
danielebarchiesi@0 304 $form['submit'] = array(
danielebarchiesi@0 305 '#name' => '', // so it won't in the $_GET args
danielebarchiesi@0 306 '#type' => 'submit',
danielebarchiesi@0 307 '#id' => 'edit-pages-apply',
danielebarchiesi@0 308 '#value' => t('Apply'),
danielebarchiesi@0 309 '#attributes' => array('class' => array('use-ajax-submit ctools-auto-submit-click')),
danielebarchiesi@0 310 );
danielebarchiesi@0 311
danielebarchiesi@0 312 $form['reset'] = array(
danielebarchiesi@0 313 '#type' => 'submit',
danielebarchiesi@0 314 '#id' => 'edit-pages-reset',
danielebarchiesi@0 315 '#value' => t('Reset'),
danielebarchiesi@0 316 '#attributes' => array('class' => array('use-ajax-submit')),
danielebarchiesi@0 317 );
danielebarchiesi@0 318
danielebarchiesi@0 319 $form['#attached']['js'] = array(ctools_attach_js('auto-submit'), ctools_attach_js('page-list', 'page_manager'));
danielebarchiesi@0 320 $form['#attached']['library'][] = array('system', 'drupal.ajax');
danielebarchiesi@0 321 $form['#attached']['library'][] = array('system', 'jquery.form');
danielebarchiesi@0 322 $form['#prefix'] = '<div class="clearfix">';
danielebarchiesi@0 323 $form['#suffix'] = '</div>';
danielebarchiesi@0 324 $form['#attributes'] = array('class' => array('ctools-auto-submit-full-form'));
danielebarchiesi@0 325
danielebarchiesi@0 326 return $form;
danielebarchiesi@0 327 }
danielebarchiesi@0 328
danielebarchiesi@0 329 /**
danielebarchiesi@0 330 * Accept submission from the page manager sort/filter form and apply it
danielebarchiesi@0 331 * to the list of pages.
danielebarchiesi@0 332 */
danielebarchiesi@0 333 function page_manager_list_pages_form_submit(&$form, &$form_state) {
danielebarchiesi@0 334 // Filter and re-sort the pages.
danielebarchiesi@0 335
danielebarchiesi@0 336 // This is a copy.
danielebarchiesi@0 337 $rows = $form_state['pages']['rows'];
danielebarchiesi@0 338
danielebarchiesi@0 339 $sorts = array();
danielebarchiesi@0 340 foreach ($rows as $name => $data) {
danielebarchiesi@0 341 // Filter
danielebarchiesi@0 342 if ($form_state['values']['type'] != 'all' && $form_state['values']['type'] != $data['data']['type']['data']) {
danielebarchiesi@0 343 continue;
danielebarchiesi@0 344 }
danielebarchiesi@0 345
danielebarchiesi@0 346 if ($form_state['values']['storage'] != 'all' && $form_state['values']['storage'] != $data['data']['storage']['data']) {
danielebarchiesi@0 347 continue;
danielebarchiesi@0 348 }
danielebarchiesi@0 349
danielebarchiesi@0 350 if ($form_state['values']['disabled'] != 'all' && $form_state['values']['disabled'] != $form_state['pages']['disabled'][$name]) {
danielebarchiesi@0 351 continue;
danielebarchiesi@0 352 }
danielebarchiesi@0 353
danielebarchiesi@0 354 if ($form_state['values']['search'] &&
danielebarchiesi@0 355 strpos($data['data']['name']['data'], $form_state['values']['search']) === FALSE &&
danielebarchiesi@0 356 strpos($data['data']['path']['data'], $form_state['values']['search']) === FALSE &&
danielebarchiesi@0 357 strpos($data['data']['title']['data'], $form_state['values']['search']) === FALSE) {
danielebarchiesi@0 358 continue;
danielebarchiesi@0 359 }
danielebarchiesi@0 360 // Set up sorting
danielebarchiesi@0 361 switch ($form_state['values']['order']) {
danielebarchiesi@0 362 case 'disabled':
danielebarchiesi@0 363 $sorts[$name] = !$form_state['pages']['disabled'][$name] . $data['data']['title']['data'];
danielebarchiesi@0 364 break;
danielebarchiesi@0 365 case 'title':
danielebarchiesi@0 366 $sorts[$name] = $data['data']['title']['data'];
danielebarchiesi@0 367 break;
danielebarchiesi@0 368 case 'name':
danielebarchiesi@0 369 $sorts[$name] = $data['data']['name']['data'];
danielebarchiesi@0 370 break;
danielebarchiesi@0 371 case 'path':
danielebarchiesi@0 372 $sorts[$name] = $data['data']['path']['data'];
danielebarchiesi@0 373 break;
danielebarchiesi@0 374 case 'type':
danielebarchiesi@0 375 $sorts[$name] = $data['data']['type']['data'];
danielebarchiesi@0 376 break;
danielebarchiesi@0 377 case 'storage':
danielebarchiesi@0 378 $sorts[$name] = $data['data']['storage']['data'];
danielebarchiesi@0 379 break;
danielebarchiesi@0 380 }
danielebarchiesi@0 381 }
danielebarchiesi@0 382
danielebarchiesi@0 383 // Now actually sort
danielebarchiesi@0 384 if ($form_state['values']['sort'] == 'desc') {
danielebarchiesi@0 385 arsort($sorts);
danielebarchiesi@0 386 }
danielebarchiesi@0 387 else {
danielebarchiesi@0 388 asort($sorts);
danielebarchiesi@0 389 }
danielebarchiesi@0 390
danielebarchiesi@0 391 // Nuke the original.
danielebarchiesi@0 392 $form_state['pages']['rows'] = array();
danielebarchiesi@0 393 // And restore.
danielebarchiesi@0 394 foreach ($sorts as $name => $title) {
danielebarchiesi@0 395 $form_state['pages']['rows'][$name] = $rows[$name];
danielebarchiesi@0 396 }
danielebarchiesi@0 397
danielebarchiesi@0 398 }
danielebarchiesi@0 399
danielebarchiesi@0 400 /**
danielebarchiesi@0 401 * Render the edit page for a a page, custom or system.
danielebarchiesi@0 402 */
danielebarchiesi@0 403 function page_manager_edit_page($page) {
danielebarchiesi@0 404 drupal_set_title($page->subtask['admin title']);
danielebarchiesi@0 405 // Provide and process the save page form before anything else.
danielebarchiesi@0 406 $form_state = array('page' => &$page);
danielebarchiesi@0 407 $built_form = drupal_build_form('page_manager_save_page_form', $form_state);
danielebarchiesi@0 408 $form = drupal_render($built_form);
danielebarchiesi@0 409
danielebarchiesi@0 410 $operations = page_manager_get_operations($page);
danielebarchiesi@0 411 $args = array('summary');
danielebarchiesi@0 412 $rendered_operations = page_manager_render_operations($page, $operations, $args, array('class' => array('operations-main')), 'nav');
danielebarchiesi@0 413 $content = page_manager_get_operation_content(FALSE, $page, $args, $operations);
danielebarchiesi@0 414 $output = theme('page_manager_edit_page', array('page' => $page, 'save' => $form, 'operations' => $rendered_operations, 'content' => $content));
danielebarchiesi@0 415 return array('#markup' => $output);
danielebarchiesi@0 416 }
danielebarchiesi@0 417
danielebarchiesi@0 418 /**
danielebarchiesi@0 419 * Entry point to edit a single operation for a page.
danielebarchiesi@0 420 *
danielebarchiesi@0 421 * @param $js
danielebarchiesi@0 422 * Whether or not the page was called via javascript.
danielebarchiesi@0 423 * @param $page
danielebarchiesi@0 424 * The cached page that is being edited.
danielebarchiesi@0 425 * @param ...
danielebarchiesi@0 426 * A number of items used to drill down into the actual operation called.
danielebarchiesi@0 427 */
danielebarchiesi@0 428 function page_manager_edit_page_operation() {
danielebarchiesi@0 429 $args = func_get_args();
danielebarchiesi@0 430 $js = array_shift($args);
danielebarchiesi@0 431 $page = array_shift($args);
danielebarchiesi@0 432
danielebarchiesi@0 433 $operations = page_manager_get_operations($page);
danielebarchiesi@0 434 $content = page_manager_get_operation_content($js, $page, $args, $operations);
danielebarchiesi@0 435
danielebarchiesi@0 436 // If the operation requested we go somewhere else afterward, oblige it.
danielebarchiesi@0 437 if (isset($content['new trail'])) {
danielebarchiesi@0 438 $args = $content['new trail'];
danielebarchiesi@0 439 // Get operations again, for the operation may have changed their availability.
danielebarchiesi@0 440 $operations = page_manager_get_operations($page);
danielebarchiesi@0 441 $content = page_manager_get_operation_content($js, $page, $args, $operations);
danielebarchiesi@0 442 }
danielebarchiesi@0 443
danielebarchiesi@0 444 // Rendering the content may have been a form submission that changed the
danielebarchiesi@0 445 // operations, such as renaming or adding a handler. Thus we get a new set
danielebarchiesi@0 446 // of operations.
danielebarchiesi@0 447 $operations = page_manager_get_operations($page);
danielebarchiesi@0 448 $rendered_operations = page_manager_render_operations($page, $operations, $args, array('class' => array('operations-main')), 'nav');
danielebarchiesi@0 449
danielebarchiesi@0 450 // Since this form should never be submitted to this page, process it late so
danielebarchiesi@0 451 // that we can be sure it notices changes.
danielebarchiesi@0 452 $form_state = array('page' => &$page);
danielebarchiesi@0 453 $built_form = drupal_build_form('page_manager_save_page_form', $form_state);
danielebarchiesi@0 454 $form = drupal_render($built_form);
danielebarchiesi@0 455
danielebarchiesi@0 456 $output = theme('page_manager_edit_page', array('page' => $page, 'save' => $form, 'operations' => $rendered_operations, 'content' => $content));
danielebarchiesi@0 457
danielebarchiesi@0 458 if ($js) {
danielebarchiesi@0 459 $commands = array();
danielebarchiesi@0 460 $commands[] = ajax_command_replace('#page-manager-edit', $output);
danielebarchiesi@0 461
danielebarchiesi@0 462 print ajax_render($commands);
danielebarchiesi@0 463 ajax_footer();
danielebarchiesi@0 464 return;
danielebarchiesi@0 465 }
danielebarchiesi@0 466
danielebarchiesi@0 467 drupal_set_title($page->subtask['admin title']);
danielebarchiesi@0 468 return $output;
danielebarchiesi@0 469 }
danielebarchiesi@0 470
danielebarchiesi@0 471 /**
danielebarchiesi@0 472 * Take the operations array from a task and expand it.
danielebarchiesi@0 473 *
danielebarchiesi@0 474 * This allows some of the operations to be dynamic, based upon settings
danielebarchiesi@0 475 * on the task or the task's handlers. Each operation should have a type. In
danielebarchiesi@0 476 * addition to all the types allowed in page_manager_render_operations, these
danielebarchiesi@0 477 * types will be dynamically replaced with something else:
danielebarchiesi@0 478 * - 'handlers': An automatically created group that contains all the task's
danielebarchiesi@0 479 * handlers and appropriate links.
danielebarchiesi@0 480 * - 'function': A callback (which will be placed in the 'function' parameter
danielebarchiesi@0 481 * that should return an array of operations. This can be used to provide
danielebarchiesi@0 482 * additional, dynamic links if needed.
danielebarchiesi@0 483 */
danielebarchiesi@0 484 function page_manager_get_operations($page, $operations = NULL) {
danielebarchiesi@0 485 if (!isset($operations)) {
danielebarchiesi@0 486 // All tasks have at least these 2 ops:
danielebarchiesi@0 487 $operations = array(
danielebarchiesi@0 488 'summary' => array(
danielebarchiesi@0 489 'title' => t('Summary'),
danielebarchiesi@0 490 'description' => t('Get a summary of the information about this page.'),
danielebarchiesi@0 491 'path' => 'admin/structure/pages/edit',
danielebarchiesi@0 492 'ajax' => FALSE,
danielebarchiesi@0 493 'no operations' => TRUE,
danielebarchiesi@0 494 'form info' => array(
danielebarchiesi@0 495 'no buttons' => TRUE,
danielebarchiesi@0 496 ),
danielebarchiesi@0 497 'form' => 'page_manager_page_summary',
danielebarchiesi@0 498 ),
danielebarchiesi@0 499 'actions' => array(
danielebarchiesi@0 500 'type' => 'group',
danielebarchiesi@0 501 'title' => '',
danielebarchiesi@0 502 'class' => array('operations-actions'),
danielebarchiesi@0 503 'location' => 'primary',
danielebarchiesi@0 504 'children' => array(),
danielebarchiesi@0 505 ),
danielebarchiesi@0 506 );
danielebarchiesi@0 507
danielebarchiesi@0 508 if (isset($page->subtask['operations'])) {
danielebarchiesi@0 509 $operations += $page->subtask['operations'];
danielebarchiesi@0 510 // add actions separately.
danielebarchiesi@0 511 if (!empty($page->subtask['operations']['actions'])) {
danielebarchiesi@0 512 $operations['actions']['children'] += $page->subtask['operations']['actions']['children'];
danielebarchiesi@0 513 }
danielebarchiesi@0 514 }
danielebarchiesi@0 515 $operations['handlers'] = array('type' => 'handlers');
danielebarchiesi@0 516 }
danielebarchiesi@0 517
danielebarchiesi@0 518 $result = array();
danielebarchiesi@0 519 foreach ($operations as $id => $operation) {
danielebarchiesi@0 520 if (empty($operation['type'])) {
danielebarchiesi@0 521 $operation['type'] = 'operation';
danielebarchiesi@0 522 }
danielebarchiesi@0 523 switch ($operation['type']) {
danielebarchiesi@0 524 case 'handlers':
danielebarchiesi@0 525 $result[$id] = page_manager_get_handler_operations($page);
danielebarchiesi@0 526 break;
danielebarchiesi@0 527 case 'function':
danielebarchiesi@0 528 if (function_exists($operation['function'])) {
danielebarchiesi@0 529 $retval = $function($page, $operation);
danielebarchiesi@0 530 if (is_array($retval)) {
danielebarchiesi@0 531 $result[$id] = $retval;
danielebarchiesi@0 532 }
danielebarchiesi@0 533 }
danielebarchiesi@0 534 break;
danielebarchiesi@0 535 default:
danielebarchiesi@0 536 $result[$id] = $operation;
danielebarchiesi@0 537 }
danielebarchiesi@0 538 }
danielebarchiesi@0 539
danielebarchiesi@0 540 if (!empty($page->subtask['enable callback']) && !empty($page->subtask['disabled']) && empty($result['actions']['children']['enable'])) {
danielebarchiesi@0 541 $result['actions']['children']['enable'] = array(
danielebarchiesi@0 542 'title' => t('Enable'),
danielebarchiesi@0 543 'description' => t('Activate this page so that it will be in use in your system.'),
danielebarchiesi@0 544 'form' => 'page_manager_enable_form',
danielebarchiesi@0 545 'ajax' => FALSE,
danielebarchiesi@0 546 'silent' => TRUE,
danielebarchiesi@0 547 'no update and save' => TRUE,
danielebarchiesi@0 548 'form info' => array(
danielebarchiesi@0 549 'finish text' => t('Enable'),
danielebarchiesi@0 550 ),
danielebarchiesi@0 551 );
danielebarchiesi@0 552 }
danielebarchiesi@0 553
danielebarchiesi@0 554 if (!empty($page->subtask['enable callback']) && empty($page->subtask['disabled']) && empty($result['actions']['children']['disable'])) {
danielebarchiesi@0 555 $result['actions']['children']['disable'] = array(
danielebarchiesi@0 556 'title' => t('Disable'),
danielebarchiesi@0 557 'description' => t('De-activate this page. The data will remain but the page will not be in use on your system.'),
danielebarchiesi@0 558 'form' => 'page_manager_disable_form',
danielebarchiesi@0 559 'ajax' => FALSE,
danielebarchiesi@0 560 'silent' => TRUE,
danielebarchiesi@0 561 'no update and save' => TRUE,
danielebarchiesi@0 562 'form info' => array(
danielebarchiesi@0 563 'finish text' => t('Disable'),
danielebarchiesi@0 564 ),
danielebarchiesi@0 565 );
danielebarchiesi@0 566 }
danielebarchiesi@0 567
danielebarchiesi@0 568 $result['actions']['children']['add'] = array(
danielebarchiesi@0 569 'title' => t('Add variant'),
danielebarchiesi@0 570 'description' => t('Add a new variant to this page.'),
danielebarchiesi@0 571 'form' => 'page_manager_handler_add',
danielebarchiesi@0 572 'ajax' => FALSE,
danielebarchiesi@0 573 'silent' => TRUE, // prevents a message about updating and prevents this item from showing as changed.
danielebarchiesi@0 574 'no update and save' => TRUE, // get rid of update and save button which is bad here.
danielebarchiesi@0 575 'form info' => array(
danielebarchiesi@0 576 'finish text' => t('Create variant'),
danielebarchiesi@0 577 ),
danielebarchiesi@0 578 );
danielebarchiesi@0 579
danielebarchiesi@0 580 // Restrict variant import to users who can already execute arbitrary PHP
danielebarchiesi@0 581 if (user_access('use PHP for settings')) {
danielebarchiesi@0 582 $result['actions']['children']['import'] = array(
danielebarchiesi@0 583 'title' => t('Import variant'),
danielebarchiesi@0 584 'description' => t('Add a new variant to this page from code exported from another page.'),
danielebarchiesi@0 585 'form' => 'page_manager_handler_import',
danielebarchiesi@0 586 );
danielebarchiesi@0 587 }
danielebarchiesi@0 588
danielebarchiesi@0 589 if (count($page->handlers) > 1) {
danielebarchiesi@0 590 $result['actions']['children']['rearrange'] = array(
danielebarchiesi@0 591 'title' => t('Reorder variants'),
danielebarchiesi@0 592 'ajax' => FALSE,
danielebarchiesi@0 593 'description' => t('Change the priority of the variants to ensure that the right one gets selected.'),
danielebarchiesi@0 594 'form' => 'page_manager_handler_rearrange',
danielebarchiesi@0 595 );
danielebarchiesi@0 596 }
danielebarchiesi@0 597
danielebarchiesi@0 598 // This is a special operation used to configure a new task handler before
danielebarchiesi@0 599 // it is added.
danielebarchiesi@0 600 if (isset($page->new_handler)) {
danielebarchiesi@0 601 $plugin = page_manager_get_task_handler($page->new_handler->handler);
danielebarchiesi@0 602 $result['actions']['children']['configure'] = array(
danielebarchiesi@0 603 'title' => t('Configure'),
danielebarchiesi@0 604 'description' => t('Configure a newly created variant prior to actually adding it to the page.'),
danielebarchiesi@0 605 'ajax' => FALSE,
danielebarchiesi@0 606 'no update and save' => TRUE, // get rid of update and save button which is bad here.
danielebarchiesi@0 607 'form info' => array(
danielebarchiesi@0 608 // We use our own cancel and finish callback to handle the fun stuff.
danielebarchiesi@0 609 'finish callback' => 'page_manager_handler_add_finish',
danielebarchiesi@0 610 'cancel callback' => 'page_manager_handler_add_cancel',
danielebarchiesi@0 611 'show trail' => TRUE,
danielebarchiesi@0 612 'show back' => TRUE,
danielebarchiesi@0 613 'finish text' => t('Create variant'),
danielebarchiesi@0 614 ),
danielebarchiesi@0 615 'form' => array(
danielebarchiesi@0 616 'forms' => $plugin['forms'],
danielebarchiesi@0 617 ),
danielebarchiesi@0 618 );
danielebarchiesi@0 619
danielebarchiesi@0 620 foreach ($page->forms as $id) {
danielebarchiesi@0 621 if (isset($plugin['add features'][$id])) {
danielebarchiesi@0 622 $result['actions']['children']['configure']['form']['order'][$id] = $plugin['add features'][$id];
danielebarchiesi@0 623 }
danielebarchiesi@0 624 else if (isset($plugin['required forms'][$id])) {
danielebarchiesi@0 625 $result['actions']['children']['configure']['form']['order'][$id] = $plugin['required forms'][$id];
danielebarchiesi@0 626 }
danielebarchiesi@0 627 }
danielebarchiesi@0 628 }
danielebarchiesi@0 629
danielebarchiesi@0 630 if ($page->locked) {
danielebarchiesi@0 631 $result['actions']['children']['break-lock'] = array(
danielebarchiesi@0 632 'title' => t('Break lock'),
danielebarchiesi@0 633 'description' => t('Break the lock on this page so that you can edit it.'),
danielebarchiesi@0 634 'form' => 'page_manager_break_lock',
danielebarchiesi@0 635 'ajax' => FALSE,
danielebarchiesi@0 636 'no update and save' => TRUE, // get rid of update and save button which is bad here.
danielebarchiesi@0 637 'form info' => array(
danielebarchiesi@0 638 'finish text' => t('Break lock'),
danielebarchiesi@0 639 ),
danielebarchiesi@0 640 'even locked' => TRUE, // show button even if locked
danielebarchiesi@0 641 'silent' => TRUE,
danielebarchiesi@0 642 );
danielebarchiesi@0 643 }
danielebarchiesi@0 644
danielebarchiesi@0 645 drupal_alter('page_manager_operations', $result, $page);
danielebarchiesi@0 646 return $result;
danielebarchiesi@0 647 }
danielebarchiesi@0 648
danielebarchiesi@0 649 /**
danielebarchiesi@0 650 * Collect all the operations related to task handlers (variants) and
danielebarchiesi@0 651 * build a menu.
danielebarchiesi@0 652 */
danielebarchiesi@0 653 function page_manager_get_handler_operations(&$page) {
danielebarchiesi@0 654 ctools_include('export');
danielebarchiesi@0 655 $group = array(
danielebarchiesi@0 656 'type' => 'group',
danielebarchiesi@0 657 'class' => array('operations-handlers'),
danielebarchiesi@0 658 'title' => t('Variants'),
danielebarchiesi@0 659 );
danielebarchiesi@0 660
danielebarchiesi@0 661 $operations = array();
danielebarchiesi@0 662
danielebarchiesi@0 663 // If there is only one variant, let's not have it collapsible.
danielebarchiesi@0 664 $collapsible = count($page->handler_info) != 1;
danielebarchiesi@0 665 foreach ($page->handler_info as $id => $info) {
danielebarchiesi@0 666 if ($info['changed'] & PAGE_MANAGER_CHANGED_DELETED) {
danielebarchiesi@0 667 continue;
danielebarchiesi@0 668 }
danielebarchiesi@0 669 $handler = $page->handlers[$id];
danielebarchiesi@0 670 $plugin = page_manager_get_task_handler($handler->handler);
danielebarchiesi@0 671
danielebarchiesi@0 672 $operations[$id] = array(
danielebarchiesi@0 673 'type' => 'group',
danielebarchiesi@0 674 'class' => array('operations-handlers-' . $id),
danielebarchiesi@0 675 'title' => page_manager_get_handler_title($plugin, $handler, $page->task, $page->subtask_id),
danielebarchiesi@0 676 'collapsible' => $collapsible,
danielebarchiesi@0 677 'children' => array(),
danielebarchiesi@0 678 );
danielebarchiesi@0 679
danielebarchiesi@0 680 $operations[$id]['children']['actions'] = array(
danielebarchiesi@0 681 'type' => 'group',
danielebarchiesi@0 682 'class' => array('operations-handlers-actions-' . $id),
danielebarchiesi@0 683 'title' => t('Variant operations'),
danielebarchiesi@0 684 'children' => array(),
danielebarchiesi@0 685 'location' => $id,
danielebarchiesi@0 686 );
danielebarchiesi@0 687
danielebarchiesi@0 688 // There needs to be a 'summary' item here for variants.
danielebarchiesi@0 689 $operations[$id]['children']['summary'] = array(
danielebarchiesi@0 690 'title' => t('Summary'),
danielebarchiesi@0 691 'description' => t('Get a summary of the information about this variant.'),
danielebarchiesi@0 692 'form info' => array(
danielebarchiesi@0 693 'no buttons' => TRUE,
danielebarchiesi@0 694 ),
danielebarchiesi@0 695 'form' => 'page_manager_handler_summary',
danielebarchiesi@0 696 );
danielebarchiesi@0 697
danielebarchiesi@0 698 if ($plugin && isset($plugin['operations'])) {
danielebarchiesi@0 699 $operations[$id]['children'] += $plugin['operations'];
danielebarchiesi@0 700 }
danielebarchiesi@0 701
danielebarchiesi@0 702 $actions = &$operations[$id]['children']['actions']['children'];
danielebarchiesi@0 703
danielebarchiesi@0 704 $actions['clone'] = array(
danielebarchiesi@0 705 'title' => t('Clone'),
danielebarchiesi@0 706 'description' => t('Make an exact copy of this variant.'),
danielebarchiesi@0 707 'form' => 'page_manager_handler_clone',
danielebarchiesi@0 708 );
danielebarchiesi@0 709 $actions['export'] = array(
danielebarchiesi@0 710 'title' => t('Export'),
danielebarchiesi@0 711 'description' => t('Export this variant into code to import into another page.'),
danielebarchiesi@0 712 'form' => 'page_manager_handler_export',
danielebarchiesi@0 713 );
danielebarchiesi@0 714 if ($handler->export_type == (EXPORT_IN_CODE | EXPORT_IN_DATABASE)) {
danielebarchiesi@0 715 $actions['delete'] = array(
danielebarchiesi@0 716 'title' => t('Revert'),
danielebarchiesi@0 717 'description' => t('Remove all changes to this variant and revert to the version in code.'),
danielebarchiesi@0 718 'form' => 'page_manager_handler_delete',
danielebarchiesi@0 719 'no update and save' => TRUE,
danielebarchiesi@0 720 'form info' => array(
danielebarchiesi@0 721 'finish text' => t('Revert'),
danielebarchiesi@0 722 ),
danielebarchiesi@0 723 );
danielebarchiesi@0 724 }
danielebarchiesi@0 725 else if ($handler->export_type != EXPORT_IN_CODE) {
danielebarchiesi@0 726 $actions['delete'] = array(
danielebarchiesi@0 727 'title' => t('Delete'),
danielebarchiesi@0 728 'description' => t('Remove this variant from the page completely.'),
danielebarchiesi@0 729 'form' => 'page_manager_handler_delete',
danielebarchiesi@0 730 'form info' => array(
danielebarchiesi@0 731 'finish text' => t('Delete'),
danielebarchiesi@0 732 'save text' => t('Delete and save'),
danielebarchiesi@0 733 ),
danielebarchiesi@0 734 );
danielebarchiesi@0 735 }
danielebarchiesi@0 736 if (!empty($handler->disabled)) {
danielebarchiesi@0 737 $actions['enable'] = array(
danielebarchiesi@0 738 'title' => t('Enable'),
danielebarchiesi@0 739 'description' => t('Activate this variant so that it will be in use in your system.'),
danielebarchiesi@0 740 'form' => 'page_manager_handler_enable',
danielebarchiesi@0 741 'silent' => TRUE,
danielebarchiesi@0 742 'form info' => array(
danielebarchiesi@0 743 'finish text' => t('Enable'),
danielebarchiesi@0 744 'save text' => t('Enable and save'),
danielebarchiesi@0 745 ),
danielebarchiesi@0 746 );
danielebarchiesi@0 747 }
danielebarchiesi@0 748 else {
danielebarchiesi@0 749 $actions['disable'] = array(
danielebarchiesi@0 750 'title' => t('Disable'),
danielebarchiesi@0 751 'description' => t('De-activate this variant. The data will remain but the variant will not be in use on your system.'),
danielebarchiesi@0 752 'form' => 'page_manager_handler_disable',
danielebarchiesi@0 753 'silent' => TRUE,
danielebarchiesi@0 754 'form info' => array(
danielebarchiesi@0 755 'finish text' => t('Disable'),
danielebarchiesi@0 756 'save text' => t('Disable and save'),
danielebarchiesi@0 757 ),
danielebarchiesi@0 758 );
danielebarchiesi@0 759 }
danielebarchiesi@0 760
danielebarchiesi@0 761 drupal_alter('page_manager_variant_operations', $operations[$id], $handler);
danielebarchiesi@0 762 }
danielebarchiesi@0 763 if (empty($operations)) {
danielebarchiesi@0 764 $operations['empty'] = array(
danielebarchiesi@0 765 'type' => 'text',
danielebarchiesi@0 766 'title' => t('No variants'),
danielebarchiesi@0 767 );
danielebarchiesi@0 768 }
danielebarchiesi@0 769
danielebarchiesi@0 770 $group['children'] = $operations;
danielebarchiesi@0 771 return $group;
danielebarchiesi@0 772 }
danielebarchiesi@0 773
danielebarchiesi@0 774 /**
danielebarchiesi@0 775 * Get an operation from a trail.
danielebarchiesi@0 776 *
danielebarchiesi@0 777 * @return array($operation, $active, $args)
danielebarchiesi@0 778 */
danielebarchiesi@0 779 function page_manager_get_operation($operations, $trail) {
danielebarchiesi@0 780 $args = $trail;
danielebarchiesi@0 781 $stop = FALSE;
danielebarchiesi@0 782 $active = array();
danielebarchiesi@0 783 $titles = array();
danielebarchiesi@0 784 // Drill down into operations array:
danielebarchiesi@0 785 while (!$stop) {
danielebarchiesi@0 786 $check = reset($args);
danielebarchiesi@0 787 $stop = TRUE;
danielebarchiesi@0 788 if (is_array($operations)) {
danielebarchiesi@0 789 if (isset($operations[$check])) {
danielebarchiesi@0 790 $active[] = $check;
danielebarchiesi@0 791 $operation = array_shift($args);
danielebarchiesi@0 792 // check to see if this operation has children. If so, we continue.
danielebarchiesi@0 793 if (!isset($operations[$check]['children'])) {
danielebarchiesi@0 794 $operations = $operations[$check];
danielebarchiesi@0 795 }
danielebarchiesi@0 796 else {
danielebarchiesi@0 797 $titles[] = $operations[$check]['title'];
danielebarchiesi@0 798 $operations = $operations[$check]['children'];
danielebarchiesi@0 799 // continue only if the operation hs children.
danielebarchiesi@0 800 $stop = FALSE;
danielebarchiesi@0 801 }
danielebarchiesi@0 802 }
danielebarchiesi@0 803 }
danielebarchiesi@0 804 }
danielebarchiesi@0 805
danielebarchiesi@0 806 return array($operations, $active, $args, $titles);
danielebarchiesi@0 807 }
danielebarchiesi@0 808
danielebarchiesi@0 809 /**
danielebarchiesi@0 810 * Fetch the content for an operation.
danielebarchiesi@0 811 *
danielebarchiesi@0 812 * First, this drills down through the arguments to find the operation, and
danielebarchiesi@0 813 * turns whatever it finds into the active trail which is then used to
danielebarchiesi@0 814 * hilite where we are when rendering the operation list.
danielebarchiesi@0 815 *
danielebarchiesi@0 816 * The arguments are discovered from the URL, and are an exact match for where
danielebarchiesi@0 817 * the operation is in the hierarchy. For example, handlers/foo/settings will
danielebarchiesi@0 818 * be the operation to edit the settings for the handler named foo. This comes
danielebarchiesi@0 819 * in as an array ('handlers', 'foo', 'settings') and is used to find where the
danielebarchiesi@0 820 * data for that operation is in the array.
danielebarchiesi@0 821 */
danielebarchiesi@0 822 function page_manager_get_operation_content($js, &$page, $trail, $operations) {
danielebarchiesi@0 823 list($operation, $active, $args, $titles) = page_manager_get_operation($operations, $trail);
danielebarchiesi@0 824 // Once we've found the operation, send it off to render.
danielebarchiesi@0 825 if ($operation) {
danielebarchiesi@0 826 $content = _page_manager_get_operation_content($js, $page, $active, $operation, $titles, $args);
danielebarchiesi@0 827 }
danielebarchiesi@0 828
danielebarchiesi@0 829 if (empty($content)) {
danielebarchiesi@0 830 $content = _page_manager_get_operation_content($js, $page, array('summary'), $operations['summary']);
danielebarchiesi@0 831 }
danielebarchiesi@0 832
danielebarchiesi@0 833 return $content;
danielebarchiesi@0 834 }
danielebarchiesi@0 835
danielebarchiesi@0 836 /**
danielebarchiesi@0 837 * Fetch the content for an operation, after it's been discovered from arguments.
danielebarchiesi@0 838 *
danielebarchiesi@0 839 * This system runs through the CTools form wizard. Each operation specifies a form
danielebarchiesi@0 840 * or set of forms that it may use. Operations may also specify wrappers and can
danielebarchiesi@0 841 * set their own next/finish handlers so that they can make additional things happen
danielebarchiesi@0 842 * at the end.
danielebarchiesi@0 843 */
danielebarchiesi@0 844 function _page_manager_get_operation_content($js, &$page, $active, $operation, $titles = array(), $args = array()) {
danielebarchiesi@0 845 if (isset($operation['form'])) {
danielebarchiesi@0 846 $form_info = array(
danielebarchiesi@0 847 'id' => 'page_manager_page',
danielebarchiesi@0 848 'finish text' => t('Update'),
danielebarchiesi@0 849 'show trail' => FALSE,
danielebarchiesi@0 850 'show back' => FALSE,
danielebarchiesi@0 851 'show return' => FALSE,
danielebarchiesi@0 852 'show cancel' => FALSE,
danielebarchiesi@0 853 'next callback' => 'page_manager_edit_page_next',
danielebarchiesi@0 854 'finish callback' => 'page_manager_edit_page_finish',
danielebarchiesi@0 855 // Items specific to the 'edit' routines that will get moved over:
danielebarchiesi@0 856 'path' => page_manager_edit_url($page->task_name, $active) . "/%step",
danielebarchiesi@0 857 // wrapper function to add an extra finish button.
danielebarchiesi@0 858 'wrapper' => 'page_manager_operation_wrapper',
danielebarchiesi@0 859 );
danielebarchiesi@0 860
danielebarchiesi@0 861 // If $operation['form'] is simply a string, then it is the function
danielebarchiesi@0 862 // name of the form.
danielebarchiesi@0 863 if (!is_array($operation['form'])) {
danielebarchiesi@0 864 $form_info['order'] = array(
danielebarchiesi@0 865 'form' => $operation['title'],
danielebarchiesi@0 866 );
danielebarchiesi@0 867 $form_info['forms'] = array(
danielebarchiesi@0 868 'form' => array('form id' => $operation['form']),
danielebarchiesi@0 869 );
danielebarchiesi@0 870 if (isset($operation['wrapper'])) {
danielebarchiesi@0 871 $form_info['forms']['form']['wrapper'] = $operation['wrapper'];
danielebarchiesi@0 872 }
danielebarchiesi@0 873 }
danielebarchiesi@0 874 // Otherwise it's the order and forms arrays directly.
danielebarchiesi@0 875 else {
danielebarchiesi@0 876 $form_info['order'] = $operation['form']['order'];
danielebarchiesi@0 877 $form_info['forms'] = $operation['form']['forms'];
danielebarchiesi@0 878 }
danielebarchiesi@0 879
danielebarchiesi@0 880 // Allow the operation to override any form info settings:
danielebarchiesi@0 881 if (isset($operation['form info'])) {
danielebarchiesi@0 882 foreach ($operation['form info'] as $key => $setting) {
danielebarchiesi@0 883 $form_info[$key] = $setting;
danielebarchiesi@0 884 }
danielebarchiesi@0 885 }
danielebarchiesi@0 886
danielebarchiesi@0 887 if (!empty($page->subtask['operations include'])) {
danielebarchiesi@0 888 // Quickly load any files necessary to display the forms.
danielebarchiesi@0 889 $page->subtask['operations include']['function'] = 'nop';
danielebarchiesi@0 890 ctools_plugin_get_function($page->subtask, 'operations include');
danielebarchiesi@0 891 }
danielebarchiesi@0 892
danielebarchiesi@0 893 $step = array_shift($args);
danielebarchiesi@0 894 // If step is unset, go with the basic step.
danielebarchiesi@0 895 if (!isset($step)) {
danielebarchiesi@0 896 $step = current(array_keys($form_info['order']));
danielebarchiesi@0 897 }
danielebarchiesi@0 898
danielebarchiesi@0 899 // If it is locked, hide the buttonzzz!
danielebarchiesi@0 900 if ($page->locked && empty($operation['even locked'])) {
danielebarchiesi@0 901 $form_info['no buttons'] = TRUE;
danielebarchiesi@0 902 }
danielebarchiesi@0 903
danielebarchiesi@0 904 ctools_include('wizard');
danielebarchiesi@0 905 $form_state = array(
danielebarchiesi@0 906 'page' => $page,
danielebarchiesi@0 907 'type' => 'edit',
danielebarchiesi@0 908 'ajax' => $js && (!isset($operation['ajax']) || !empty($operation['ajax'])),
danielebarchiesi@0 909 'rerender' => TRUE,
danielebarchiesi@0 910 'trail' => $active,
danielebarchiesi@0 911 'task_name' => $page->task_name,
danielebarchiesi@0 912 'task_id' => $page->task_id,
danielebarchiesi@0 913 'task' => $page->task,
danielebarchiesi@0 914 'subtask_id' => $page->subtask_id,
danielebarchiesi@0 915 'subtask' => $page->subtask,
danielebarchiesi@0 916 'operation' => $operation,
danielebarchiesi@0 917 );
danielebarchiesi@0 918
danielebarchiesi@0 919 if ($active && $active[0] == 'handlers' && isset($form_state['page']->handlers[$form_state['trail'][1]])) {
danielebarchiesi@0 920 $form_state['handler_id'] = $form_state['trail'][1];
danielebarchiesi@0 921 $form_state['handler'] = &$form_state['page']->handlers[$form_state['handler_id']];
danielebarchiesi@0 922 }
danielebarchiesi@0 923
danielebarchiesi@0 924 if ($active && $active[0] == 'actions' && $active[1] == 'configure' && isset($form_state['page']->new_handler)) {
danielebarchiesi@0 925 $form_state['handler_id'] = $form_state['page']->new_handler->name;
danielebarchiesi@0 926 $form_state['handler'] = &$form_state['page']->new_handler;
danielebarchiesi@0 927 }
danielebarchiesi@0 928
danielebarchiesi@0 929 $built_form = ctools_wizard_multistep_form($form_info, $step, $form_state);
danielebarchiesi@0 930 $output = drupal_render($built_form);
danielebarchiesi@0 931 $title = empty($form_state['title']) ? $operation['title'] : $form_state['title'];
danielebarchiesi@0 932 $titles[] = $title;
danielebarchiesi@0 933 $title = implode(' &raquo ', array_filter($titles));
danielebarchiesi@0 934
danielebarchiesi@0 935 // If there are messages for the form, render them.
danielebarchiesi@0 936 if ($messages = theme('status_messages')) {
danielebarchiesi@0 937 $output = $messages . $output;
danielebarchiesi@0 938 }
danielebarchiesi@0 939
danielebarchiesi@0 940 $description = isset($operation['admin description']) ? $operation['admin description'] : (isset($operation['description']) ? $operation['description'] : '');
danielebarchiesi@0 941 $return = array(
danielebarchiesi@0 942 'title' => $title,
danielebarchiesi@0 943 'content' => $output,
danielebarchiesi@0 944 'description' => $description,
danielebarchiesi@0 945 );
danielebarchiesi@0 946
danielebarchiesi@0 947 // Append any extra content, used for the preview which is submitted then
danielebarchiesi@0 948 // rendered.
danielebarchiesi@0 949 if (isset($form_state['content'])) {
danielebarchiesi@0 950 $return['content'] .= $form_state['content'];
danielebarchiesi@0 951 }
danielebarchiesi@0 952
danielebarchiesi@0 953 // If the form wanted us to go somewhere else next, pass that along.
danielebarchiesi@0 954 if (isset($form_state['new trail'])) {
danielebarchiesi@0 955 $return['new trail'] = $form_state['new trail'];
danielebarchiesi@0 956 }
danielebarchiesi@0 957 }
danielebarchiesi@0 958 else {
danielebarchiesi@0 959 $return = array(
danielebarchiesi@0 960 'title' => t('Error'),
danielebarchiesi@0 961 'content' => t('This operation trail does not exist.'),
danielebarchiesi@0 962 );
danielebarchiesi@0 963 }
danielebarchiesi@0 964
danielebarchiesi@0 965 $return['active'] = $active;
danielebarchiesi@0 966 return $return;
danielebarchiesi@0 967 }
danielebarchiesi@0 968
danielebarchiesi@0 969 function page_manager_operation_wrapper($form, &$form_state) {
danielebarchiesi@0 970 if (empty($form_state['operation']['no update and save']) && !empty($form['buttons']['return']['#wizard type']) && $form['buttons']['return']['#wizard type']) {
danielebarchiesi@0 971 $form['buttons']['save'] = array(
danielebarchiesi@0 972 '#type' => 'submit',
danielebarchiesi@0 973 '#value' => !empty($form_state['form_info']['save text']) ? $form_state['form_info']['save text'] : t('Update and save'),
danielebarchiesi@0 974 '#wizard type' => 'finish',
danielebarchiesi@0 975 '#attributes' => $form['buttons']['return']['#attributes'],
danielebarchiesi@0 976 '#save' => TRUE,
danielebarchiesi@0 977 );
danielebarchiesi@0 978 }
danielebarchiesi@0 979
danielebarchiesi@0 980 return $form;
danielebarchiesi@0 981 }
danielebarchiesi@0 982
danielebarchiesi@0 983 /**
danielebarchiesi@0 984 * Callback generated when the an operation edit finished.
danielebarchiesi@0 985 */
danielebarchiesi@0 986 function page_manager_edit_page_finish(&$form_state) {
danielebarchiesi@0 987 if (empty($form_state['operation']['silent'])) {
danielebarchiesi@0 988 if (empty($form_state['clicked_button']['#save'])) {
danielebarchiesi@0 989 drupal_set_message(t('The page has been updated. Changes will not be permanent until you save.'));
danielebarchiesi@0 990 }
danielebarchiesi@0 991 else {
danielebarchiesi@0 992 drupal_set_message(t('The page has been updated and saved.'));
danielebarchiesi@0 993 }
danielebarchiesi@0 994 $path = array();
danielebarchiesi@0 995 foreach ($form_state['trail'] as $operation) {
danielebarchiesi@0 996 $path[] = $operation;
danielebarchiesi@0 997 $form_state['page']->changes[implode('/', $path)] = TRUE;
danielebarchiesi@0 998 }
danielebarchiesi@0 999 }
danielebarchiesi@0 1000
danielebarchiesi@0 1001 // If a handler was modified, set it to changed so we know to overwrite it.
danielebarchiesi@0 1002 if (isset($form_state['handler_id'])) {
danielebarchiesi@0 1003 $form_state['page']->handler_info[$form_state['handler_id']]['changed'] |= PAGE_MANAGER_CHANGED_CACHED;
danielebarchiesi@0 1004 }
danielebarchiesi@0 1005
danielebarchiesi@0 1006 // While we make buttons go away on locked pages, it is still possible to
danielebarchiesi@0 1007 // have a lock a appear while you were editing, and have your changes
danielebarchiesi@0 1008 // disappear. This at least warns the user that this has happened.
danielebarchiesi@0 1009 if (!empty($page->locked)) {
danielebarchiesi@0 1010 drupal_set_message(t('Unable to update changes due to lock.'));
danielebarchiesi@0 1011 }
danielebarchiesi@0 1012
danielebarchiesi@0 1013 // If the 'Update and Save' button was selected, write our cache out.
danielebarchiesi@0 1014 if (!empty($form_state['clicked_button']['#save'])) {
danielebarchiesi@0 1015 page_manager_save_page_cache($form_state['page']);
danielebarchiesi@0 1016 page_manager_clear_page_cache($form_state['page']->task_name);
danielebarchiesi@0 1017 $form_state['page'] = page_manager_get_page_cache($form_state['page']->task_name);
danielebarchiesi@0 1018 }
danielebarchiesi@0 1019 else {
danielebarchiesi@0 1020 if (empty($form_state['do not cache'])) {
danielebarchiesi@0 1021 page_manager_set_page_cache($form_state['page']);
danielebarchiesi@0 1022 }
danielebarchiesi@0 1023 }
danielebarchiesi@0 1024
danielebarchiesi@0 1025 // We basically always want to force a rerender when the forms
danielebarchiesi@0 1026 // are finished, so make sure there is a new trail.
danielebarchiesi@0 1027 if (empty($form_state['new trail'])) {
danielebarchiesi@0 1028 // force a rerender to get rid of old form items that may have changed
danielebarchiesi@0 1029 // during save.
danielebarchiesi@0 1030 $form_state['new trail'] = $form_state['trail'];
danielebarchiesi@0 1031 }
danielebarchiesi@0 1032
danielebarchiesi@0 1033 if (isset($form_state['new trail']) && empty($form_state['ajax'])) {
danielebarchiesi@0 1034 $form_state['redirect'] = page_manager_edit_url($form_state['page']->task_name, $form_state['new trail']);
danielebarchiesi@0 1035 }
danielebarchiesi@0 1036
danielebarchiesi@0 1037 $form_state['complete'] = TRUE;
danielebarchiesi@0 1038 }
danielebarchiesi@0 1039
danielebarchiesi@0 1040 /**
danielebarchiesi@0 1041 * Callback generated when the 'next' button is clicked.
danielebarchiesi@0 1042 *
danielebarchiesi@0 1043 * All we do here is store the cache.
danielebarchiesi@0 1044 */
danielebarchiesi@0 1045 function page_manager_edit_page_next(&$form_state) {
danielebarchiesi@0 1046 page_manager_set_page_cache($form_state['page']);
danielebarchiesi@0 1047 }
danielebarchiesi@0 1048
danielebarchiesi@0 1049 /**
danielebarchiesi@0 1050 * Callback generated when the 'cancel' button is clicked.
danielebarchiesi@0 1051 *
danielebarchiesi@0 1052 * All we do here is clear the cache.
danielebarchiesi@0 1053 */
danielebarchiesi@0 1054 function page_manager_edit_page_cancel(&$form_state) {
danielebarchiesi@0 1055 $page = $form_state['page'];
danielebarchiesi@0 1056 }
danielebarchiesi@0 1057
danielebarchiesi@0 1058 /**
danielebarchiesi@0 1059 * Render an operations array.
danielebarchiesi@0 1060 *
danielebarchiesi@0 1061 * This renders an array of operations into a series of nested UL statements,
danielebarchiesi@0 1062 * with ajax automatically on unless specified otherwise. Operations will
danielebarchiesi@0 1063 * automatically have the URLs generated nested.
danielebarchiesi@0 1064 *
danielebarchiesi@0 1065 * Each operation should have a 'type', which tells the renderer how to deal
danielebarchiesi@0 1066 * with it:
danielebarchiesi@0 1067 * - 'operation': An AJAX link to render. This is the default and is
danielebarchiesi@0 1068 * assumed if a type is not specified. Other fields for the operation:
danielebarchiesi@0 1069 * - - 'title': The text to display. Can be an image. Must be pre-sanitized.
danielebarchiesi@0 1070 * - - 'description': Text to place in the hover box over the link using the
danielebarchiesi@0 1071 * title attribute.
danielebarchiesi@0 1072 * - - 'arguments': Anything optional to put at the end of the URL.
danielebarchiesi@0 1073 * - - 'path': If set, overrides the default path.
danielebarchiesi@0 1074 * - - 'no operations': If set, the path will not have operations appended.
danielebarchiesi@0 1075 * - - 'no task': If set, the path will not have the task id.
danielebarchiesi@0 1076 * - - 'no link': If set, this item will just be text, not a link.
danielebarchiesi@0 1077 * - - 'ajax': If set to TRUE, ajax will be used. The default is TRUE.
danielebarchiesi@0 1078 * - - 'class': An optional class to specify for the link.
danielebarchiesi@0 1079 * - - 'form': The form to display for this operation, if using a single form.
danielebarchiesi@0 1080 * - - 'forms': An array of forms that must be paired with 'order' of this
danielebarchiesi@0 1081 * operation uses multiple forms. See wizard tool for details.
danielebarchiesi@0 1082 * - - 'order': The form order to use for multiple forms. See wizard tool for
danielebarchiesi@0 1083 * details.
danielebarchiesi@0 1084 * - - 'form info': Form info overrides for the wizard. See the wizard tool
danielebarchiesi@0 1085 * for available settings
danielebarchiesi@0 1086 * - 'group':
danielebarchiesi@0 1087 * - - 'title': The title of the link. May be HTML.
danielebarchiesi@0 1088 * - - 'title class': A class to apply to the title.
danielebarchiesi@0 1089 * - - 'children': An array of more operations that this group represents.
danielebarchiesi@0 1090 * All operations within this group will have this group's ID as part
danielebarchiesi@0 1091 * of the AJAX url to make it easier to find.
danielebarchiesi@0 1092 * - - 'class': A class to apply to the UL of the children.
danielebarchiesi@0 1093 * - - 'collapsible': If TRUE the collapsible tool will be used.
danielebarchiesi@0 1094 */
danielebarchiesi@0 1095 function page_manager_render_operations(&$page, $operations, $active_trail, $attributes, $location, $parents = array()) {
danielebarchiesi@0 1096 drupal_add_library('system', 'drupal.ajax');
danielebarchiesi@0 1097
danielebarchiesi@0 1098 if (!isset($output[$location])) {
danielebarchiesi@0 1099 $output[$location] = '';
danielebarchiesi@0 1100 }
danielebarchiesi@0 1101
danielebarchiesi@0 1102 $keys = array_keys($operations);
danielebarchiesi@0 1103 $first = array_shift($keys);
danielebarchiesi@0 1104 $last = array_pop($keys);
danielebarchiesi@0 1105
danielebarchiesi@0 1106 // Make sure the 'first' and 'last' operations are part of THIS nav tree:
danielebarchiesi@0 1107 while ($keys && isset($operations[$first]['location']) && $operations[$first]['location'] != $location) {
danielebarchiesi@0 1108 $first = array_shift($keys);
danielebarchiesi@0 1109 }
danielebarchiesi@0 1110 while ($keys && isset($operations[$last]['location']) && $operations[$last]['location'] != $location) {
danielebarchiesi@0 1111 $last = array_pop($keys);
danielebarchiesi@0 1112 }
danielebarchiesi@0 1113
danielebarchiesi@0 1114 $active = reset($active_trail);
danielebarchiesi@0 1115 foreach ($operations as $id => $operation) {
danielebarchiesi@0 1116 $current_path = '';
danielebarchiesi@0 1117 if ($parents) {
danielebarchiesi@0 1118 $current_path .= implode('/', $parents) . '/';
danielebarchiesi@0 1119 }
danielebarchiesi@0 1120 $current_path .= $id;
danielebarchiesi@0 1121
danielebarchiesi@0 1122 if (empty($operation['type'])) {
danielebarchiesi@0 1123 $operation['type'] = 'operation';
danielebarchiesi@0 1124 }
danielebarchiesi@0 1125
danielebarchiesi@0 1126 // We only render an li for things in the same nav tree.
danielebarchiesi@0 1127 if (empty($operation['location']) || $operation['location'] == $location) {
danielebarchiesi@0 1128 if (!is_array($attributes['class'])) {
danielebarchiesi@0 1129 $attributes['class'] = array($attributes['class']);
danielebarchiesi@0 1130 }
danielebarchiesi@0 1131
danielebarchiesi@0 1132 $class = empty($attributes['class']) || !is_array($attributes['class']) ? array() : $attributes['class'];
danielebarchiesi@0 1133
danielebarchiesi@0 1134 if ($id == $first) {
danielebarchiesi@0 1135 $class[] = 'operation-first';
danielebarchiesi@0 1136 }
danielebarchiesi@0 1137 else if ($id == $last) {
danielebarchiesi@0 1138 $class[] = 'operation-last';
danielebarchiesi@0 1139 }
danielebarchiesi@0 1140
danielebarchiesi@0 1141 if (empty($operation['silent']) && !empty($page->changes[$current_path])) {
danielebarchiesi@0 1142 $class[] = $operation['type'] == 'group' ? 'changed-group' : 'changed';
danielebarchiesi@0 1143 }
danielebarchiesi@0 1144 else {
danielebarchiesi@0 1145 $class[] = 'not-changed';
danielebarchiesi@0 1146 }
danielebarchiesi@0 1147
danielebarchiesi@0 1148 if ($active == $id) {
danielebarchiesi@0 1149 $class[] = $operation['type'] == 'group' ? 'active-group' : 'active';
danielebarchiesi@0 1150 }
danielebarchiesi@0 1151 else {
danielebarchiesi@0 1152 $class[] = 'not-active';
danielebarchiesi@0 1153 }
danielebarchiesi@0 1154
danielebarchiesi@0 1155 $output[$location] .= '<li class="' . implode(' ', $class) . '">';
danielebarchiesi@0 1156 }
danielebarchiesi@0 1157
danielebarchiesi@0 1158 switch ($operation['type']) {
danielebarchiesi@0 1159 case 'text':
danielebarchiesi@0 1160 $output[$location] .= $operation['title'];
danielebarchiesi@0 1161 break;
danielebarchiesi@0 1162 case 'operation':
danielebarchiesi@0 1163 $path = isset($operation['path']) ? $operation['path'] : 'admin/structure/pages/nojs/operation';
danielebarchiesi@0 1164 if (!isset($operation['no task'])) {
danielebarchiesi@0 1165 $path .= '/' . $page->task_name;
danielebarchiesi@0 1166 }
danielebarchiesi@0 1167
danielebarchiesi@0 1168 if (!isset($operation['no operations'])) {
danielebarchiesi@0 1169 $path .= '/' . $current_path;
danielebarchiesi@0 1170 if (isset($operation['arguments'])) {
danielebarchiesi@0 1171 $path .= '/' . $arguments;
danielebarchiesi@0 1172 }
danielebarchiesi@0 1173 }
danielebarchiesi@0 1174
danielebarchiesi@0 1175 $class = array('page-manager-operation');
danielebarchiesi@0 1176 if (!isset($operation['ajax']) || !empty($operation['ajax'])) {
danielebarchiesi@0 1177 $class[] = 'use-ajax';
danielebarchiesi@0 1178 }
danielebarchiesi@0 1179 if (!empty($operation['class'])) {
danielebarchiesi@0 1180 $class[] = $operation['class'];
danielebarchiesi@0 1181 }
danielebarchiesi@0 1182
danielebarchiesi@0 1183 $description = isset($operation['description']) ? $operation['description'] : '';
danielebarchiesi@0 1184 if (empty($operation['silent']) && !empty($page->changes[$current_path])) {
danielebarchiesi@0 1185 $description .= ' ' . t('This setting contains unsaved changes.');
danielebarchiesi@0 1186 }
danielebarchiesi@0 1187
danielebarchiesi@0 1188 $output[$location] .= l($operation['title'], $path, array('attributes' => array('id' => 'page-manager-operation-' . $id, 'class' => $class, 'title' => $description), 'html' => TRUE));
danielebarchiesi@0 1189 break;
danielebarchiesi@0 1190 case 'group':
danielebarchiesi@0 1191 if ($active == $id) {
danielebarchiesi@0 1192 $trail = $active_trail;
danielebarchiesi@0 1193 array_shift($trail);
danielebarchiesi@0 1194 }
danielebarchiesi@0 1195 else {
danielebarchiesi@0 1196 $trail = array();
danielebarchiesi@0 1197 }
danielebarchiesi@0 1198 $group_location = isset($operation['location']) ? $operation['location'] : $location;
danielebarchiesi@0 1199 $temp = page_manager_render_operations($page, $operation['children'], $trail, $operation, $group_location, array_merge($parents, array($id)));
danielebarchiesi@0 1200 if ($temp) {
danielebarchiesi@0 1201 foreach ($temp as $id => $text) {
danielebarchiesi@0 1202 if (empty($output[$id])) {
danielebarchiesi@0 1203 $output[$id] = '';
danielebarchiesi@0 1204 }
danielebarchiesi@0 1205 $output[$id] .= $text;
danielebarchiesi@0 1206 }
danielebarchiesi@0 1207 }
danielebarchiesi@0 1208 break;
danielebarchiesi@0 1209 }
danielebarchiesi@0 1210
danielebarchiesi@0 1211 if (empty($operation['location']) || $operation['location'] == $location) {
danielebarchiesi@0 1212 $output[$location] .= '</li>';
danielebarchiesi@0 1213 }
danielebarchiesi@0 1214 }
danielebarchiesi@0 1215
danielebarchiesi@0 1216 if ($output[$location]) {
danielebarchiesi@0 1217 $classes = isset($attributes['class']) && is_array($attributes['class']) ? $attributes['class'] : array();
danielebarchiesi@0 1218 $classes[] = 'page-manager-operations';
danielebarchiesi@0 1219
danielebarchiesi@0 1220 $output[$location] = '<ul class="' . implode(' ', $classes) . '">' . $output[$location] . '</ul>';
danielebarchiesi@0 1221
danielebarchiesi@0 1222 if (!empty($attributes['title'])) {
danielebarchiesi@0 1223 $class = '';
danielebarchiesi@0 1224 if (isset($attributes['title class'])) {
danielebarchiesi@0 1225 $class = $attributes['title class'];
danielebarchiesi@0 1226 }
danielebarchiesi@0 1227 $title = '<div class="page-manager-group-title' . $class . '">' . $attributes['title'] . '</div>';
danielebarchiesi@0 1228
danielebarchiesi@0 1229 if (!empty($attributes['collapsible'])) {
danielebarchiesi@0 1230 $output[$location] = theme('ctools_collapsible', array('handle' => $title, 'content' => $output[$location], 'collapsed' => empty($active_trail)));
danielebarchiesi@0 1231 }
danielebarchiesi@0 1232 else {
danielebarchiesi@0 1233 $output[$location] = $title . $output[$location];
danielebarchiesi@0 1234 }
danielebarchiesi@0 1235 }
danielebarchiesi@0 1236 return $output;
danielebarchiesi@0 1237 }
danielebarchiesi@0 1238 }
danielebarchiesi@0 1239
danielebarchiesi@0 1240 /**
danielebarchiesi@0 1241 * Provide a simple form for saving the page manager info out of the cache.
danielebarchiesi@0 1242 */
danielebarchiesi@0 1243 function page_manager_save_page_form($form, &$form_state) {
danielebarchiesi@0 1244 if (!empty($form_state['page']->changed)) {
danielebarchiesi@0 1245 $form['markup'] = array(
danielebarchiesi@0 1246 '#markup' => '<div class="changed-notification">' . t('You have unsaved changes to this page. You must select Save to write them to the database, or Cancel to discard these changes. Please note that if you have changed any form, you must submit that form before saving.') . '</div>',
danielebarchiesi@0 1247 );
danielebarchiesi@0 1248
danielebarchiesi@0 1249 // Always make sure we submit back to the proper page.
danielebarchiesi@0 1250 $form['#action'] = url('admin/structure/pages/edit/' . $form_state['page']->task_name);
danielebarchiesi@0 1251 $form['save'] = array(
danielebarchiesi@0 1252 '#type' => 'submit',
danielebarchiesi@0 1253 '#value' => t('Save'),
danielebarchiesi@0 1254 '#submit' => array('page_manager_save_page_form_submit'),
danielebarchiesi@0 1255 );
danielebarchiesi@0 1256
danielebarchiesi@0 1257 $form['cancel'] = array(
danielebarchiesi@0 1258 '#type' => 'submit',
danielebarchiesi@0 1259 '#value' => t('Cancel'),
danielebarchiesi@0 1260 '#submit' => array('page_manager_save_page_form_cancel'),
danielebarchiesi@0 1261 );
danielebarchiesi@0 1262 return $form;
danielebarchiesi@0 1263 }
danielebarchiesi@0 1264 }
danielebarchiesi@0 1265
danielebarchiesi@0 1266 /**
danielebarchiesi@0 1267 * Save the page.
danielebarchiesi@0 1268 */
danielebarchiesi@0 1269 function page_manager_save_page_form_submit(&$form, &$form_state) {
danielebarchiesi@0 1270 page_manager_save_page_cache($form_state['page']);
danielebarchiesi@0 1271 }
danielebarchiesi@0 1272
danielebarchiesi@0 1273 /**
danielebarchiesi@0 1274 * Discard changes to the page.
danielebarchiesi@0 1275 */
danielebarchiesi@0 1276 function page_manager_save_page_form_cancel($form, &$form_state) {
danielebarchiesi@0 1277 drupal_set_message(t('All pending changes have been discarded, and the page is now unlocked.'));
danielebarchiesi@0 1278 page_manager_clear_page_cache($form_state['page']->task_name);
danielebarchiesi@0 1279
danielebarchiesi@0 1280 if (!empty($form_state['page']->new)) {
danielebarchiesi@0 1281 $form_state['redirect'] = 'admin/structure/pages';
danielebarchiesi@0 1282 }
danielebarchiesi@0 1283 }
danielebarchiesi@0 1284
danielebarchiesi@0 1285 // --------------------------------------------------------------------------
danielebarchiesi@0 1286 // Handler (variant) related forms.
danielebarchiesi@0 1287
danielebarchiesi@0 1288 /**
danielebarchiesi@0 1289 * Add a new task handler.
danielebarchiesi@0 1290 */
danielebarchiesi@0 1291 function page_manager_handler_add($form, &$form_state) {
danielebarchiesi@0 1292 // Get a list of possible task handlers for this task.
danielebarchiesi@0 1293 return page_manager_handler_add_form($form, $form_state);
danielebarchiesi@0 1294 }
danielebarchiesi@0 1295
danielebarchiesi@0 1296 /**
danielebarchiesi@0 1297 * Handler related forms.
danielebarchiesi@0 1298 */
danielebarchiesi@0 1299 function page_manager_handler_add_submit(&$form, &$form_state) {
danielebarchiesi@0 1300 $cache = $form_state['page'];
danielebarchiesi@0 1301 $plugin = page_manager_get_task_handler($form_state['values']['handler']);
danielebarchiesi@0 1302
danielebarchiesi@0 1303 // Create a new handler.
danielebarchiesi@0 1304 $handler = page_manager_new_task_handler($plugin);
danielebarchiesi@0 1305 if (!empty($form_state['values']['title'])) {
danielebarchiesi@0 1306 $handler->conf['title'] = $form_state['values']['title'];
danielebarchiesi@0 1307 }
danielebarchiesi@0 1308 else {
danielebarchiesi@0 1309 $handler->conf['title'] = $plugin['title'];
danielebarchiesi@0 1310 }
danielebarchiesi@0 1311 $cache->new_handler = $handler;
danielebarchiesi@0 1312
danielebarchiesi@0 1313 // Figure out which forms to present them with
danielebarchiesi@0 1314 $cache->forms = array();
danielebarchiesi@0 1315
danielebarchiesi@0 1316 $features = $form_state['values']['features'];
danielebarchiesi@0 1317 if (isset($features[$form_state['values']['handler']])) {
danielebarchiesi@0 1318 $cache->forms = array_merge($cache->forms, array_keys(array_filter($features[$form_state['values']['handler']])));
danielebarchiesi@0 1319 }
danielebarchiesi@0 1320
danielebarchiesi@0 1321 if (isset($plugin['required forms'])) {
danielebarchiesi@0 1322 $cache->forms = array_merge($cache->forms, array_keys($plugin['required forms']));
danielebarchiesi@0 1323 }
danielebarchiesi@0 1324
danielebarchiesi@0 1325 $form_state['no_rerender'] = TRUE;
danielebarchiesi@0 1326 if (!empty($cache->forms)) {
danielebarchiesi@0 1327 // Tell the form to go to the config page.
danielebarchiesi@0 1328 drupal_set_message(t('Before this variant can be added, it must be configured. When you are finished, click "Create variant" at the end of this wizard to add this to your page.'));
danielebarchiesi@0 1329 $form_state['new trail'] = array('actions', 'configure');
danielebarchiesi@0 1330 }
danielebarchiesi@0 1331 else {
danielebarchiesi@0 1332 // It has no forms at all. Add the variant and go to its first operation.
danielebarchiesi@0 1333 page_manager_handler_add_finish($form_state);
danielebarchiesi@0 1334 }
danielebarchiesi@0 1335 }
danielebarchiesi@0 1336
danielebarchiesi@0 1337 /**
danielebarchiesi@0 1338 * Finish the add process and make the new handler official.
danielebarchiesi@0 1339 */
danielebarchiesi@0 1340 function page_manager_handler_add_finish(&$form_state) {
danielebarchiesi@0 1341 $page = &$form_state['page'];
danielebarchiesi@0 1342 $handler = $page->new_handler;
danielebarchiesi@0 1343 page_manager_handler_add_to_page($page, $handler);
danielebarchiesi@0 1344
danielebarchiesi@0 1345 // Remove the temporary page.
danielebarchiesi@0 1346 unset($page->new_handler);
danielebarchiesi@0 1347 unset($page->forms);
danielebarchiesi@0 1348
danielebarchiesi@0 1349 // Set the new destination
danielebarchiesi@0 1350 $plugin = page_manager_get_task_handler($handler->handler);
danielebarchiesi@0 1351 if (!empty($plugin['add finish'])) {
danielebarchiesi@0 1352 $location = $plugin['add finish'];
danielebarchiesi@0 1353 }
danielebarchiesi@0 1354 else {
danielebarchiesi@0 1355 $keys = array_keys($plugin['operations']);
danielebarchiesi@0 1356 $location = reset($keys);
danielebarchiesi@0 1357 }
danielebarchiesi@0 1358
danielebarchiesi@0 1359 $form_state['new trail'] = array('handlers', $handler->name, $location);
danielebarchiesi@0 1360
danielebarchiesi@0 1361 // Pass through.
danielebarchiesi@0 1362 page_manager_edit_page_finish($form_state);
danielebarchiesi@0 1363 }
danielebarchiesi@0 1364
danielebarchiesi@0 1365 /**
danielebarchiesi@0 1366 * Throw away a new handler and return to the add form
danielebarchiesi@0 1367 */
danielebarchiesi@0 1368 function page_manager_handler_add_cancel(&$form_state) {
danielebarchiesi@0 1369 $form_state['new trail'] = array('handlers', 'add');
danielebarchiesi@0 1370
danielebarchiesi@0 1371 // Remove the temporary page.
danielebarchiesi@0 1372 unset($page->new_handler);
danielebarchiesi@0 1373 unset($page->forms);
danielebarchiesi@0 1374 }
danielebarchiesi@0 1375
danielebarchiesi@0 1376 /**
danielebarchiesi@0 1377 * Provide a consistent UI for adding handlers.
danielebarchiesi@0 1378 */
danielebarchiesi@0 1379 function page_manager_handler_add_form($form, $form_state, $features = array()) {
danielebarchiesi@0 1380 $task = $form_state['task'];
danielebarchiesi@0 1381 $task_handler_plugins = page_manager_get_task_handler_plugins($task);
danielebarchiesi@0 1382 if (empty($task_handler_plugins)) {
danielebarchiesi@0 1383 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 1384 $form['buttons']['return']['#disabled'] = TRUE;
danielebarchiesi@0 1385 return;
danielebarchiesi@0 1386 }
danielebarchiesi@0 1387
danielebarchiesi@0 1388 foreach ($task_handler_plugins as $id => $plugin) {
danielebarchiesi@0 1389 $options[$id] = $plugin['title'];
danielebarchiesi@0 1390 if (isset($plugin['add features'])) {
danielebarchiesi@0 1391 $features[$id] = $plugin['add features'];
danielebarchiesi@0 1392 }
danielebarchiesi@0 1393 }
danielebarchiesi@0 1394
danielebarchiesi@0 1395 if (!isset($form_state['type']) || $form_state['type'] != 'add') {
danielebarchiesi@0 1396 $form['title'] = array(
danielebarchiesi@0 1397 '#type' => 'textfield',
danielebarchiesi@0 1398 '#title' => t('Title'),
danielebarchiesi@0 1399 '#description' => t('Administrative title of this variant. If you leave blank it will be automatically assigned.'),
danielebarchiesi@0 1400 );
danielebarchiesi@0 1401 }
danielebarchiesi@0 1402
danielebarchiesi@0 1403 $form['handler'] = array(
danielebarchiesi@0 1404 '#title' => t('Variant type'),
danielebarchiesi@0 1405 '#type' => 'select',
danielebarchiesi@0 1406 '#options' => $options,
danielebarchiesi@0 1407 );
danielebarchiesi@0 1408
danielebarchiesi@0 1409 // This set of checkboxes is not dangerous at all.
danielebarchiesi@0 1410 $form['features'] = array(
danielebarchiesi@0 1411 '#type' => 'item',
danielebarchiesi@0 1412 '#title' => t('Optional features'),
danielebarchiesi@0 1413 '#description' => t('Check any optional features you need to be presented with forms for configuring them. If you do not check them here you will still be able to utilize these features once the new page is created. If you are not sure, leave these unchecked.'),
danielebarchiesi@0 1414 '#tree' => TRUE,
danielebarchiesi@0 1415 );
danielebarchiesi@0 1416
danielebarchiesi@0 1417 ctools_include('dependent');
danielebarchiesi@0 1418 foreach ($features as $plugin => $feature_list) {
danielebarchiesi@0 1419 foreach ($feature_list as $feature_id => $feature) {
danielebarchiesi@0 1420 $form['features'][$plugin][$feature_id] = array(
danielebarchiesi@0 1421 '#type' => 'checkbox',
danielebarchiesi@0 1422 '#title' => $feature,
danielebarchiesi@0 1423 );
danielebarchiesi@0 1424 if (!empty($form_state['page']->forms) && in_array($feature_id, $form_state['page']->forms)) {
danielebarchiesi@0 1425 $form['features'][$plugin][$feature_id]['#default_value'] = TRUE;
danielebarchiesi@0 1426 }
danielebarchiesi@0 1427
danielebarchiesi@0 1428 if ($plugin != 'default') {
danielebarchiesi@0 1429 $form['features'][$plugin][$feature_id] += array(
danielebarchiesi@0 1430 '#dependency' => array('edit-handler' => array($plugin)),
danielebarchiesi@0 1431 );
danielebarchiesi@0 1432 }
danielebarchiesi@0 1433 }
danielebarchiesi@0 1434 }
danielebarchiesi@0 1435
danielebarchiesi@0 1436 return $form;
danielebarchiesi@0 1437 }
danielebarchiesi@0 1438
danielebarchiesi@0 1439 /**
danielebarchiesi@0 1440 * Rearrange the order of variants.
danielebarchiesi@0 1441 */
danielebarchiesi@0 1442 function page_manager_handler_import($form, &$form_state) {
danielebarchiesi@0 1443 $form['title'] = array(
danielebarchiesi@0 1444 '#type' => 'textfield',
danielebarchiesi@0 1445 '#title' => t('Variant name'),
danielebarchiesi@0 1446 '#description' => t('Enter the name of the new variant.'),
danielebarchiesi@0 1447 );
danielebarchiesi@0 1448
danielebarchiesi@0 1449 if (user_access('use PHP for settings')) {
danielebarchiesi@0 1450 $form['object'] = array(
danielebarchiesi@0 1451 '#type' => 'textarea',
danielebarchiesi@0 1452 '#title' => t('Paste variant code here'),
danielebarchiesi@0 1453 '#rows' => 15,
danielebarchiesi@0 1454 );
danielebarchiesi@0 1455 }
danielebarchiesi@0 1456 // Users ordinarily can't get here without the PHP block visibility perm.
danielebarchiesi@0 1457 // In case they somehow do, though, disable the form widget for extra safety.
danielebarchiesi@0 1458 else {
danielebarchiesi@0 1459 $form['shoveoff'] = array(
danielebarchiesi@0 1460 '#markup' => '<div>' . t('You do not have sufficient permissions to perform this action.') . '</div>',
danielebarchiesi@0 1461 );
danielebarchiesi@0 1462 }
danielebarchiesi@0 1463
danielebarchiesi@0 1464 return $form;
danielebarchiesi@0 1465 }
danielebarchiesi@0 1466
danielebarchiesi@0 1467 /**
danielebarchiesi@0 1468 * Make sure that an import actually provides a handler.
danielebarchiesi@0 1469 */
danielebarchiesi@0 1470 function page_manager_handler_import_validate($form, &$form_state) {
danielebarchiesi@0 1471 if (!user_access('use PHP for settings')) {
danielebarchiesi@0 1472 form_error($form['shoveoff'], t('You account permissions do not permit you to import.'));
danielebarchiesi@0 1473 return;
danielebarchiesi@0 1474 }
danielebarchiesi@0 1475 ob_start();
danielebarchiesi@0 1476 eval($form_state['values']['object']);
danielebarchiesi@0 1477 ob_end_clean();
danielebarchiesi@0 1478
danielebarchiesi@0 1479 if (empty($handler)) {
danielebarchiesi@0 1480 $errors = ob_get_contents();
danielebarchiesi@0 1481 if (empty($errors)) {
danielebarchiesi@0 1482 $errors = t('No variant found.');
danielebarchiesi@0 1483 }
danielebarchiesi@0 1484
danielebarchiesi@0 1485 form_error($form['object'], t('Unable to get a variant from the import. Errors reported: @errors', array('@errors' => $errors)));
danielebarchiesi@0 1486 }
danielebarchiesi@0 1487
danielebarchiesi@0 1488 $form_state['handler'] = $handler;
danielebarchiesi@0 1489 }
danielebarchiesi@0 1490
danielebarchiesi@0 1491 /**
danielebarchiesi@0 1492 * Clone an existing task handler into a new handler.
danielebarchiesi@0 1493 */
danielebarchiesi@0 1494 function page_manager_handler_import_submit(&$form, &$form_state) {
danielebarchiesi@0 1495 $handler = $form_state['handler'];
danielebarchiesi@0 1496
danielebarchiesi@0 1497 page_manager_handler_add_to_page($form_state['page'], $handler, $form_state['values']['title']);
danielebarchiesi@0 1498
danielebarchiesi@0 1499 $plugin = page_manager_get_task_handler($handler->handler);
danielebarchiesi@0 1500 // It has no forms at all. Add the variant and go to its first operation.
danielebarchiesi@0 1501 $keys = array_keys($plugin['operations']);
danielebarchiesi@0 1502 $form_state['new trail'] = array('handlers', $handler->name, reset($keys));
danielebarchiesi@0 1503 }
danielebarchiesi@0 1504
danielebarchiesi@0 1505 /**
danielebarchiesi@0 1506 * Rearrange the order of variants.
danielebarchiesi@0 1507 */
danielebarchiesi@0 1508 function page_manager_handler_rearrange($form, &$form_state) {
danielebarchiesi@0 1509 $page = $form_state['page'];
danielebarchiesi@0 1510
danielebarchiesi@0 1511 $form['handlers'] = array('#tree' => TRUE);
danielebarchiesi@0 1512
danielebarchiesi@0 1513 foreach ($page->handler_info as $id => $info) {
danielebarchiesi@0 1514 if ($info['changed'] & PAGE_MANAGER_CHANGED_DELETED) {
danielebarchiesi@0 1515 continue;
danielebarchiesi@0 1516 }
danielebarchiesi@0 1517 $handler = $page->handlers[$id];
danielebarchiesi@0 1518 $plugin = page_manager_get_task_handler($handler->handler);
danielebarchiesi@0 1519
danielebarchiesi@0 1520 $form['handlers'][$id]['title'] = array(
danielebarchiesi@0 1521 '#markup' => page_manager_get_handler_title($plugin, $handler, $page->task, $page->subtask_id),
danielebarchiesi@0 1522 );
danielebarchiesi@0 1523
danielebarchiesi@0 1524 $form['handlers'][$id]['weight'] = array(
danielebarchiesi@0 1525 '#type' => 'weight',
danielebarchiesi@0 1526 '#default_value' => $info['weight'],
danielebarchiesi@0 1527 '#delta' => 30,
danielebarchiesi@0 1528 );
danielebarchiesi@0 1529 }
danielebarchiesi@0 1530
danielebarchiesi@0 1531 return $form;
danielebarchiesi@0 1532 }
danielebarchiesi@0 1533
danielebarchiesi@0 1534 function page_manager_handler_rearrange_submit(&$form, &$form_state) {
danielebarchiesi@0 1535 $handler_info = &$form_state['page']->handler_info;
danielebarchiesi@0 1536
danielebarchiesi@0 1537 foreach ($form_state['values']['handlers'] as $id => $info) {
danielebarchiesi@0 1538 if ($handler_info[$id]['weight'] = $info['weight']) {
danielebarchiesi@0 1539 $handler_info[$id]['weight'] = $info['weight'];
danielebarchiesi@0 1540 $handler_info[$id]['changed'] |= PAGE_MANAGER_CHANGED_MOVED;
danielebarchiesi@0 1541 }
danielebarchiesi@0 1542 }
danielebarchiesi@0 1543
danielebarchiesi@0 1544 // Sort the new cache.
danielebarchiesi@0 1545 uasort($handler_info, '_page_manager_handler_sort');
danielebarchiesi@0 1546
danielebarchiesi@0 1547 }
danielebarchiesi@0 1548
danielebarchiesi@0 1549 /**
danielebarchiesi@0 1550 * Used as a callback to uasort to sort the task cache by weight.
danielebarchiesi@0 1551 *
danielebarchiesi@0 1552 * The 'name' field is used as a backup when weights are the same, which
danielebarchiesi@0 1553 * can happen when multiple modules put items out there at the same
danielebarchiesi@0 1554 * weight.
danielebarchiesi@0 1555 */
danielebarchiesi@0 1556 function _page_manager_handler_sort($a, $b) {
danielebarchiesi@0 1557 if ($a['weight'] < $b['weight']) {
danielebarchiesi@0 1558 return -1;
danielebarchiesi@0 1559 }
danielebarchiesi@0 1560 elseif ($a['weight'] > $b['weight']) {
danielebarchiesi@0 1561 return 1;
danielebarchiesi@0 1562 }
danielebarchiesi@0 1563 elseif ($a['name'] < $b['name']) {
danielebarchiesi@0 1564 return -1;
danielebarchiesi@0 1565 }
danielebarchiesi@0 1566 elseif ($a['name'] > $b['name']) {
danielebarchiesi@0 1567 return 1;
danielebarchiesi@0 1568 }
danielebarchiesi@0 1569 }
danielebarchiesi@0 1570
danielebarchiesi@0 1571 /**
danielebarchiesi@0 1572 * Rearrange the order of variants.
danielebarchiesi@0 1573 */
danielebarchiesi@0 1574 function page_manager_handler_delete($form, &$form_state) {
danielebarchiesi@0 1575 if ($form_state['handler']->type == t('Overridden')) {
danielebarchiesi@0 1576 $text = t('Reverting the variant will delete the variant that is in the database, reverting it to the original default variant. This deletion will not be made permanent until you click Save.');
danielebarchiesi@0 1577 }
danielebarchiesi@0 1578 else {
danielebarchiesi@0 1579 $text = t('Are you sure you want to delete this variant? This deletion will not be made permanent until you click Save.');
danielebarchiesi@0 1580 }
danielebarchiesi@0 1581 $form['markup'] = array(
danielebarchiesi@0 1582 '#markup' => '<p>' . $text . '</p>',
danielebarchiesi@0 1583 );
danielebarchiesi@0 1584
danielebarchiesi@0 1585 return $form;
danielebarchiesi@0 1586 }
danielebarchiesi@0 1587
danielebarchiesi@0 1588 /**
danielebarchiesi@0 1589 * Submit handler to delete a view.
danielebarchiesi@0 1590 */
danielebarchiesi@0 1591 function page_manager_handler_delete_submit(&$form, &$form_state) {
danielebarchiesi@0 1592 $form_state['page']->handler_info[$form_state['handler_id']]['changed'] |= PAGE_MANAGER_CHANGED_DELETED;
danielebarchiesi@0 1593 $form_state['new trail'] = array('summary');
danielebarchiesi@0 1594 }
danielebarchiesi@0 1595
danielebarchiesi@0 1596 /**
danielebarchiesi@0 1597 * Entry point to export a page.
danielebarchiesi@0 1598 */
danielebarchiesi@0 1599 function page_manager_handler_export($form, &$form_state) {
danielebarchiesi@0 1600 $export = page_manager_export_task_handler($form_state['handler']);
danielebarchiesi@0 1601
danielebarchiesi@0 1602 $lines = substr_count($export, "\n");
danielebarchiesi@0 1603 $form['code'] = array(
danielebarchiesi@0 1604 '#type' => 'textarea',
danielebarchiesi@0 1605 '#default_value' => $export,
danielebarchiesi@0 1606 '#rows' => $lines,
danielebarchiesi@0 1607 );
danielebarchiesi@0 1608
danielebarchiesi@0 1609 unset($form['buttons']);
danielebarchiesi@0 1610 return $form;
danielebarchiesi@0 1611 }
danielebarchiesi@0 1612
danielebarchiesi@0 1613 /**
danielebarchiesi@0 1614 * Rearrange the order of variants.
danielebarchiesi@0 1615 */
danielebarchiesi@0 1616 function page_manager_handler_clone($form, &$form_state) {
danielebarchiesi@0 1617 // This provides its own button because it does something totally different.
danielebarchiesi@0 1618 $form['title'] = array(
danielebarchiesi@0 1619 '#type' => 'textfield',
danielebarchiesi@0 1620 '#title' => t('Variant name'),
danielebarchiesi@0 1621 '#description' => t('Enter the name of the new variant.'),
danielebarchiesi@0 1622 );
danielebarchiesi@0 1623
danielebarchiesi@0 1624 return $form;
danielebarchiesi@0 1625 }
danielebarchiesi@0 1626
danielebarchiesi@0 1627 /**
danielebarchiesi@0 1628 * Clone an existing task handler into a new handler.
danielebarchiesi@0 1629 */
danielebarchiesi@0 1630 function page_manager_handler_clone_submit(&$form, &$form_state) {
danielebarchiesi@0 1631 $export = page_manager_export_task_handler($form_state['handler']);
danielebarchiesi@0 1632 ob_start();
danielebarchiesi@0 1633 eval($export);
danielebarchiesi@0 1634 ob_end_clean();
danielebarchiesi@0 1635
danielebarchiesi@0 1636 page_manager_handler_add_to_page($form_state['page'], $handler, $form_state['values']['title']);
danielebarchiesi@0 1637
danielebarchiesi@0 1638 $plugin = page_manager_get_task_handler($handler->handler);
danielebarchiesi@0 1639 // It has no forms at all. Add the variant and go to its first operation.
danielebarchiesi@0 1640 $keys = array_keys($plugin['operations']);
danielebarchiesi@0 1641 $form_state['new trail'] = array('handlers', $handler->name, reset($keys));
danielebarchiesi@0 1642 }
danielebarchiesi@0 1643
danielebarchiesi@0 1644 /**
danielebarchiesi@0 1645 * Form to enable a handler.
danielebarchiesi@0 1646 */
danielebarchiesi@0 1647 function page_manager_handler_enable($form, &$form_state) {
danielebarchiesi@0 1648 $form['markup'] = array(
danielebarchiesi@0 1649 '#markup' => t('This variant is currently disabled. Enabling it will make it available in your system. This will not take effect until you save this page.'),
danielebarchiesi@0 1650 );
danielebarchiesi@0 1651
danielebarchiesi@0 1652 return $form;
danielebarchiesi@0 1653 }
danielebarchiesi@0 1654
danielebarchiesi@0 1655 /**
danielebarchiesi@0 1656 * Enable the page after it has been confirmed.
danielebarchiesi@0 1657 */
danielebarchiesi@0 1658 function page_manager_handler_enable_submit(&$form, &$form_state) {
danielebarchiesi@0 1659 $form_state['handler']->disabled = FALSE;
danielebarchiesi@0 1660 $form_state['page']->handler_info[$form_state['handler_id']]['disabled'] = FALSE;
danielebarchiesi@0 1661 $form_state['page']->handler_info[$form_state['handler_id']]['changed'] |= PAGE_MANAGER_CHANGED_STATUS;
danielebarchiesi@0 1662 $form_state['new trail'] = array('handlers', $form_state['handler_id'], 'actions', 'disable');
danielebarchiesi@0 1663 }
danielebarchiesi@0 1664
danielebarchiesi@0 1665 /**
danielebarchiesi@0 1666 * Form to disable a page.
danielebarchiesi@0 1667 */
danielebarchiesi@0 1668 function page_manager_handler_disable($form, &$form_state) {
danielebarchiesi@0 1669 $form['markup'] = array(
danielebarchiesi@0 1670 '#markup' => t('This variant is currently enabled. Disabling it will make it unavailable in your system, and it will not be used. This will not take effect until you save this page.'),
danielebarchiesi@0 1671 );
danielebarchiesi@0 1672
danielebarchiesi@0 1673 return $form;
danielebarchiesi@0 1674 }
danielebarchiesi@0 1675
danielebarchiesi@0 1676 /**
danielebarchiesi@0 1677 * Form to disable a page.
danielebarchiesi@0 1678 */
danielebarchiesi@0 1679 function page_manager_handler_summary($form, &$form_state) {
danielebarchiesi@0 1680 $handler = $form_state['handler'];
danielebarchiesi@0 1681 $page = $form_state['page'];
danielebarchiesi@0 1682 $plugin = page_manager_get_task_handler($handler->handler);
danielebarchiesi@0 1683
danielebarchiesi@0 1684 $form['markup'] = array(
danielebarchiesi@0 1685 '#markup' => page_manager_get_handler_summary($plugin, $handler, $page, FALSE),
danielebarchiesi@0 1686 );
danielebarchiesi@0 1687
danielebarchiesi@0 1688 return $form;
danielebarchiesi@0 1689 }
danielebarchiesi@0 1690
danielebarchiesi@0 1691 /**
danielebarchiesi@0 1692 * Disable the page after it has been confirmed.
danielebarchiesi@0 1693 */
danielebarchiesi@0 1694 function page_manager_handler_disable_submit(&$form, &$form_state) {
danielebarchiesi@0 1695 $form_state['handler']->disabled = TRUE;
danielebarchiesi@0 1696 $form_state['page']->handler_info[$form_state['handler_id']]['disabled'] = TRUE;
danielebarchiesi@0 1697 $form_state['page']->handler_info[$form_state['handler_id']]['changed'] |= PAGE_MANAGER_CHANGED_STATUS;
danielebarchiesi@0 1698 $form_state['new trail'] = array('handlers', $form_state['handler_id'], 'actions', 'enable');
danielebarchiesi@0 1699 }
danielebarchiesi@0 1700
danielebarchiesi@0 1701 /**
danielebarchiesi@0 1702 * Break the lock on a page so that it can be edited.
danielebarchiesi@0 1703 */
danielebarchiesi@0 1704 function page_manager_break_lock($form, &$form_state) {
danielebarchiesi@0 1705 $form['markup'] = array(
danielebarchiesi@0 1706 '#markup' => t('Breaking the lock on this page will <strong>discard</strong> any pending changes made by the locking user. Are you REALLY sure you want to do this?')
danielebarchiesi@0 1707 );
danielebarchiesi@0 1708
danielebarchiesi@0 1709 return $form;
danielebarchiesi@0 1710 }
danielebarchiesi@0 1711
danielebarchiesi@0 1712 /**
danielebarchiesi@0 1713 * Submit to break the lock on a page.
danielebarchiesi@0 1714 */
danielebarchiesi@0 1715 function page_manager_break_lock_submit(&$form, &$form_state) {
danielebarchiesi@0 1716 $page = &$form_state['page'];
danielebarchiesi@0 1717 $form_state['page']->locked = FALSE;
danielebarchiesi@0 1718 ctools_object_cache_clear_all('page_manager_page', $page->task_name);
danielebarchiesi@0 1719 $form_state['do not cache'] = TRUE;
danielebarchiesi@0 1720 drupal_set_message(t('The lock has been cleared and all changes discarded. You may now make changes to this page.'));
danielebarchiesi@0 1721
danielebarchiesi@0 1722 $form_state['new trail'] = array('summary');
danielebarchiesi@0 1723 }
danielebarchiesi@0 1724
danielebarchiesi@0 1725 /**
danielebarchiesi@0 1726 * Form to enable a page.
danielebarchiesi@0 1727 */
danielebarchiesi@0 1728 function page_manager_enable_form($form, &$form_state) {
danielebarchiesi@0 1729 $form['markup'] = array(
danielebarchiesi@0 1730 '#markup' => t('Enabling this page will immediately make it available in your system (there is no need to wait for a save.)'),
danielebarchiesi@0 1731 );
danielebarchiesi@0 1732
danielebarchiesi@0 1733 return $form;
danielebarchiesi@0 1734 }
danielebarchiesi@0 1735
danielebarchiesi@0 1736 /**
danielebarchiesi@0 1737 * Enable the page after it has been confirmed.
danielebarchiesi@0 1738 */
danielebarchiesi@0 1739 function page_manager_enable_form_submit(&$form, &$form_state) {
danielebarchiesi@0 1740 $page = &$form_state['page'];
danielebarchiesi@0 1741 if ($function = ctools_plugin_get_function($page->subtask, 'enable callback')) {
danielebarchiesi@0 1742 $result = $function($page, FALSE);
danielebarchiesi@0 1743 menu_rebuild();
danielebarchiesi@0 1744 }
danielebarchiesi@0 1745 $form_state['new trail'] = array('actions', 'disable');
danielebarchiesi@0 1746
danielebarchiesi@0 1747 // We don't want to cause this to cache if it wasn't already. If it was
danielebarchiesi@0 1748 // cached, however, we want to update the enabled state.
danielebarchiesi@0 1749 if (empty($form_state['page']->changed)) {
danielebarchiesi@0 1750 $form_state['do not cache'] = TRUE;
danielebarchiesi@0 1751 }
danielebarchiesi@0 1752 }
danielebarchiesi@0 1753
danielebarchiesi@0 1754 /**
danielebarchiesi@0 1755 * Form to disable a page.
danielebarchiesi@0 1756 */
danielebarchiesi@0 1757 function page_manager_disable_form($form, &$form_state) {
danielebarchiesi@0 1758 $form['markup'] = array(
danielebarchiesi@0 1759 '#markup' => t('Disabling this page will immediately make it unavailable in your system (there is no need to wait for a save.)'),
danielebarchiesi@0 1760 );
danielebarchiesi@0 1761
danielebarchiesi@0 1762 return $form;
danielebarchiesi@0 1763 }
danielebarchiesi@0 1764
danielebarchiesi@0 1765 /**
danielebarchiesi@0 1766 * Disable the page after it has been confirmed.
danielebarchiesi@0 1767 */
danielebarchiesi@0 1768 function page_manager_disable_form_submit(&$form, &$form_state) {
danielebarchiesi@0 1769 $page = &$form_state['page'];
danielebarchiesi@0 1770 if ($function = ctools_plugin_get_function($page->subtask, 'enable callback')) {
danielebarchiesi@0 1771 $result = $function($page, TRUE);
danielebarchiesi@0 1772 menu_rebuild();
danielebarchiesi@0 1773 $form_state['new trail'] = array('actions', 'enable');
danielebarchiesi@0 1774
danielebarchiesi@0 1775 // We don't want to cause this to cache if it wasn't already. If it was
danielebarchiesi@0 1776 // cached, however, we want to update the enabled state.
danielebarchiesi@0 1777 if (empty($form_state['page']->changed)) {
danielebarchiesi@0 1778 $form_state['do not cache'] = TRUE;
danielebarchiesi@0 1779 }
danielebarchiesi@0 1780 }
danielebarchiesi@0 1781 }
danielebarchiesi@0 1782
danielebarchiesi@0 1783 /**
danielebarchiesi@0 1784 * Print the summary information for a page.
danielebarchiesi@0 1785 */
danielebarchiesi@0 1786 function page_manager_page_summary($form, &$form_state) {
danielebarchiesi@0 1787 $page = $form_state['page'];
danielebarchiesi@0 1788
danielebarchiesi@0 1789 $output = '';
danielebarchiesi@0 1790
danielebarchiesi@0 1791 /*
danielebarchiesi@0 1792 if (isset($form_state['subtask']['admin title'])) {
danielebarchiesi@0 1793 $form_state['title'] = $form_state['subtask']['admin title'];
danielebarchiesi@0 1794 }
danielebarchiesi@0 1795 */
danielebarchiesi@0 1796
danielebarchiesi@0 1797 if (isset($form_state['subtask']['admin description'])) {
danielebarchiesi@0 1798 $output .= '<div class="description">' . $form_state['subtask']['admin description'] . '</div>';
danielebarchiesi@0 1799 }
danielebarchiesi@0 1800
danielebarchiesi@0 1801 $output .= page_manager_get_page_summary($page->task, $page->subtask);
danielebarchiesi@0 1802
danielebarchiesi@0 1803 if (!empty($page->handlers)) {
danielebarchiesi@0 1804 foreach ($page->handler_info as $id => $info) {
danielebarchiesi@0 1805 if ($info['changed'] & PAGE_MANAGER_CHANGED_DELETED) {
danielebarchiesi@0 1806 continue;
danielebarchiesi@0 1807 }
danielebarchiesi@0 1808
danielebarchiesi@0 1809 $handler = $page->handlers[$id];
danielebarchiesi@0 1810 $plugin = page_manager_get_task_handler($handler->handler);
danielebarchiesi@0 1811
danielebarchiesi@0 1812 $output .= '<div class="handler-summary">';
danielebarchiesi@0 1813 $output .= page_manager_get_handler_summary($plugin, $handler, $page);
danielebarchiesi@0 1814 $output .= '</div>';
danielebarchiesi@0 1815
danielebarchiesi@0 1816 }
danielebarchiesi@0 1817 }
danielebarchiesi@0 1818 else {
danielebarchiesi@0 1819 $output .= '<p>' . t('This page has no variants and thus no output of its own.') . '</p>';
danielebarchiesi@0 1820 }
danielebarchiesi@0 1821
danielebarchiesi@0 1822 $links = array(
danielebarchiesi@0 1823 array(
danielebarchiesi@0 1824 'title' => ' &raquo; ' . t('Add a new variant'),
danielebarchiesi@0 1825 'href' => page_manager_edit_url($page->task_name, array('actions', 'add')),
danielebarchiesi@0 1826 'html' => TRUE,
danielebarchiesi@0 1827 ),
danielebarchiesi@0 1828 );
danielebarchiesi@0 1829
danielebarchiesi@0 1830 $output .= '<div class="links">' . theme('links', array('links' => $links)) . '</div>';
danielebarchiesi@0 1831 $form['markup'] = array(
danielebarchiesi@0 1832 '#markup' => $output,
danielebarchiesi@0 1833 );
danielebarchiesi@0 1834
danielebarchiesi@0 1835 return $form;
danielebarchiesi@0 1836 }
danielebarchiesi@0 1837
danielebarchiesi@0 1838 /**
danielebarchiesi@0 1839 * Menu callback to enable or disable a page
danielebarchiesi@0 1840 */
danielebarchiesi@0 1841 function page_manager_enable_page($disable, $js, $page) {
danielebarchiesi@0 1842 if (!isset($_GET['token']) || !drupal_valid_token($_GET['token'], $page->task_name)) {
danielebarchiesi@0 1843 return MENU_ACCESS_DENIED;
danielebarchiesi@0 1844 }
danielebarchiesi@0 1845 if ($page->locked) {
danielebarchiesi@0 1846 if ($disable) {
danielebarchiesi@0 1847 drupal_set_message(t('Unable to disable due to lock.'));
danielebarchiesi@0 1848 }
danielebarchiesi@0 1849 else {
danielebarchiesi@0 1850 drupal_set_message(t('Unable to enable due to lock.'));
danielebarchiesi@0 1851 }
danielebarchiesi@0 1852 }
danielebarchiesi@0 1853 else {
danielebarchiesi@0 1854 if ($function = ctools_plugin_get_function($page->subtask, 'enable callback')) {
danielebarchiesi@0 1855 $result = $function($page, $disable);
danielebarchiesi@0 1856 menu_rebuild();
danielebarchiesi@0 1857
danielebarchiesi@0 1858 // We want to re-cache this if it's changed so that status is properly
danielebarchiesi@0 1859 // updated on the changed form.
danielebarchiesi@0 1860 if (!empty($page->changed)) {
danielebarchiesi@0 1861 page_manager_set_page_cache($page);
danielebarchiesi@0 1862 }
danielebarchiesi@0 1863 }
danielebarchiesi@0 1864 }
danielebarchiesi@0 1865
danielebarchiesi@0 1866 // For now $js is not actually in use on this.
danielebarchiesi@0 1867 drupal_goto('admin/structure/pages');
danielebarchiesi@0 1868 }