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

added modules
author danieleb <danielebarchiesi@me.com>
date Thu, 19 Sep 2013 10:38:44 +0100
parents ff03f76ab3fe
children
rev   line source
danielebarchiesi@0 1 <?php
danielebarchiesi@0 2
danielebarchiesi@0 3 /**
danielebarchiesi@0 4 * Specialized implementation of hook_page_manager_task_tasks(). See api-task.html for
danielebarchiesi@0 5 * more information.
danielebarchiesi@0 6 */
danielebarchiesi@0 7 function page_manager_node_edit_page_manager_tasks() {
danielebarchiesi@0 8 return array(
danielebarchiesi@0 9 // This is a 'page' task and will fall under the page admin UI
danielebarchiesi@0 10 'task type' => 'page',
danielebarchiesi@0 11
danielebarchiesi@0 12 'title' => t('Node add/edit form'),
danielebarchiesi@0 13 'admin title' => t('Node add/edit form'),
danielebarchiesi@0 14 'admin description' => t('When enabled, this overrides the default Drupal behavior for adding or edit nodes at <em>node/%node/edit</em> and <em>node/add/%node_type</em>. If you add variants, you may use selection criteria such as node type or language or user access to provide different edit forms for nodes. If no variant is selected, the default Drupal node edit will be used.'),
danielebarchiesi@0 15 'admin path' => 'node/%node/edit',
danielebarchiesi@0 16
danielebarchiesi@0 17 // Menu hooks so that we can alter the node/%node menu entry to point to us.
danielebarchiesi@0 18 'hook menu' => 'page_manager_node_edit_menu',
danielebarchiesi@0 19 'hook menu alter' => 'page_manager_node_edit_menu_alter',
danielebarchiesi@0 20
danielebarchiesi@0 21 // This is task uses 'context' handlers and must implement these to give the
danielebarchiesi@0 22 // handler data it needs.
danielebarchiesi@0 23 'handler type' => 'context',
danielebarchiesi@0 24 'get arguments' => 'page_manager_node_edit_get_arguments',
danielebarchiesi@0 25 'get context placeholders' => 'page_manager_node_edit_get_contexts',
danielebarchiesi@0 26
danielebarchiesi@0 27 // Allow this to be enabled or disabled:
danielebarchiesi@0 28 'disabled' => variable_get('page_manager_node_edit_disabled', TRUE),
danielebarchiesi@0 29 'enable callback' => 'page_manager_node_edit_enable',
danielebarchiesi@0 30 'access callback' => 'page_manager_node_edit_access_check',
danielebarchiesi@0 31 );
danielebarchiesi@0 32 }
danielebarchiesi@0 33
danielebarchiesi@0 34 /**
danielebarchiesi@0 35 * Callback defined by page_manager_node_edit_page_manager_tasks().
danielebarchiesi@0 36 *
danielebarchiesi@0 37 * Alter the node edit input so that node edit comes to us rather than the
danielebarchiesi@0 38 * normal node edit process.
danielebarchiesi@0 39 */
danielebarchiesi@0 40 function page_manager_node_edit_menu_alter(&$items, $task) {
danielebarchiesi@0 41 if (variable_get('page_manager_node_edit_disabled', TRUE)) {
danielebarchiesi@0 42 return;
danielebarchiesi@0 43 }
danielebarchiesi@0 44
danielebarchiesi@0 45 $callback = $items['node/%node/edit']['page callback'];
danielebarchiesi@0 46 // Override the node edit handler for our purpose.
danielebarchiesi@0 47 if ($callback == 'node_page_edit' || variable_get('page_manager_override_anyway', FALSE)) {
danielebarchiesi@0 48 $items['node/%node/edit']['page callback'] = 'page_manager_node_edit';
danielebarchiesi@0 49 $items['node/%node/edit']['file path'] = $task['path'];
danielebarchiesi@0 50 $items['node/%node/edit']['file'] = $task['file'];
danielebarchiesi@0 51 }
danielebarchiesi@0 52 else {
danielebarchiesi@0 53 variable_set('page_manager_node_edit_disabled', TRUE);
danielebarchiesi@0 54 if (!empty($GLOBALS['page_manager_enabling_node_edit'])) {
danielebarchiesi@0 55 drupal_set_message(t('Page manager module is unable to enable node/%node/edit because some other module already has overridden with %callback.', array('%callback' => $callback)), 'warning');
danielebarchiesi@0 56 }
danielebarchiesi@0 57 return;
danielebarchiesi@0 58 }
danielebarchiesi@0 59
danielebarchiesi@0 60 // Also catch node/add handling:
danielebarchiesi@0 61 foreach (node_type_get_types() as $type) {
danielebarchiesi@0 62 $path = 'node/add/' . str_replace('_', '-', $type->type);
danielebarchiesi@0 63 if ($items[$path]['page callback'] != 'node_add') {
danielebarchiesi@0 64 if (!empty($GLOBALS['page_manager_enabling_node_edit'])) {
danielebarchiesi@0 65 drupal_set_message(t('Page manager module is unable to override @path because some other module already has overridden with %callback. Node edit will be enabled but that edit path will not be overridden.', array('@path' => $path, '%callback' => $items[$path]['page callback'])), 'warning');
danielebarchiesi@0 66 }
danielebarchiesi@0 67 continue;
danielebarchiesi@0 68 }
danielebarchiesi@0 69
danielebarchiesi@0 70 $items[$path]['page callback'] = 'page_manager_node_add';
danielebarchiesi@0 71 $items[$path]['file path'] = $task['path'];
danielebarchiesi@0 72 $items[$path]['file'] = $task['file'];
danielebarchiesi@0 73 // Why str_replace things back?
danielebarchiesi@0 74 $items[$path]['page arguments'] = array($type->type);
danielebarchiesi@0 75 }
danielebarchiesi@0 76 }
danielebarchiesi@0 77
danielebarchiesi@0 78 /**
danielebarchiesi@0 79 * Entry point for our overridden node edit.
danielebarchiesi@0 80 *
danielebarchiesi@0 81 * This function asks its assigned handlers who, if anyone, would like
danielebarchiesi@0 82 * to run with it. If no one does, it passes through to Drupal core's
danielebarchiesi@0 83 * node edit, which is node_page_edit().
danielebarchiesi@0 84 */
danielebarchiesi@0 85 function page_manager_node_edit($node) {
danielebarchiesi@0 86 // Load my task plugin
danielebarchiesi@0 87 $task = page_manager_get_task('node_edit');
danielebarchiesi@0 88
danielebarchiesi@0 89 // Load the node into a context.
danielebarchiesi@0 90 ctools_include('context');
danielebarchiesi@0 91 ctools_include('context-task-handler');
danielebarchiesi@0 92 $contexts = ctools_context_handler_get_task_contexts($task, '', array($node));
danielebarchiesi@0 93
danielebarchiesi@0 94 $arg = array(isset($node->nid) ? $node->nid : $node->type);
danielebarchiesi@0 95 $output = ctools_context_handler_render($task, '', $contexts, $arg);
danielebarchiesi@0 96 if ($output === FALSE) {
danielebarchiesi@0 97 // Fall back!
danielebarchiesi@0 98 // We've already built the form with the context, so we can't build it again, or
danielebarchiesi@0 99 // form_clean_id will mess up our ids. But we don't really need to, either:
danielebarchiesi@0 100 $context = reset($contexts);
danielebarchiesi@0 101 $output = $context->form;
danielebarchiesi@0 102 }
danielebarchiesi@0 103
danielebarchiesi@0 104 return $output;
danielebarchiesi@0 105 }
danielebarchiesi@0 106
danielebarchiesi@0 107 /**
danielebarchiesi@0 108 * Callback to handle the process of adding a node.
danielebarchiesi@0 109 *
danielebarchiesi@0 110 * This creates a basic $node and passes that off to page_manager_node_edit().
danielebarchiesi@0 111 * It is modeled after Drupal's node_add() function.
danielebarchiesi@0 112 *
danielebarchiesi@0 113 * Unlike node_add() we do not need to check node_access because that was
danielebarchiesi@0 114 * already checked by the menu system.
danielebarchiesi@0 115 */
danielebarchiesi@0 116 function page_manager_node_add($type) {
danielebarchiesi@0 117 global $user;
danielebarchiesi@0 118
danielebarchiesi@0 119 $types = node_type_get_types();
danielebarchiesi@0 120
danielebarchiesi@0 121 // Initialize settings:
danielebarchiesi@0 122 $node = (object) array(
danielebarchiesi@0 123 'uid' => $user->uid,
danielebarchiesi@0 124 'name' => (isset($user->name) ? $user->name : ''),
danielebarchiesi@0 125 'type' => $type,
danielebarchiesi@0 126 'language' => LANGUAGE_NONE,
danielebarchiesi@0 127 );
danielebarchiesi@0 128
danielebarchiesi@0 129 drupal_set_title(t('Create @name', array('@name' => $types[$type]->name)));
danielebarchiesi@0 130 return page_manager_node_edit($node);
danielebarchiesi@0 131 }
danielebarchiesi@0 132
danielebarchiesi@0 133 /**
danielebarchiesi@0 134 * Callback to get arguments provided by this task handler.
danielebarchiesi@0 135 *
danielebarchiesi@0 136 * Since this is the node edit and there is no UI on the arguments, we
danielebarchiesi@0 137 * create dummy arguments that contain the needed data.
danielebarchiesi@0 138 */
danielebarchiesi@0 139 function page_manager_node_edit_get_arguments($task, $subtask_id) {
danielebarchiesi@0 140 return array(
danielebarchiesi@0 141 array(
danielebarchiesi@0 142 'keyword' => 'node',
danielebarchiesi@0 143 'identifier' => t('Node being edited'),
danielebarchiesi@0 144 'id' => 1,
danielebarchiesi@0 145 'name' => 'node_edit',
danielebarchiesi@0 146 'settings' => array(),
danielebarchiesi@0 147 ),
danielebarchiesi@0 148 );
danielebarchiesi@0 149 }
danielebarchiesi@0 150
danielebarchiesi@0 151 /**
danielebarchiesi@0 152 * Callback to get context placeholders provided by this handler.
danielebarchiesi@0 153 */
danielebarchiesi@0 154 function page_manager_node_edit_get_contexts($task, $subtask_id) {
danielebarchiesi@0 155 return ctools_context_get_placeholders_from_argument(page_manager_node_edit_get_arguments($task, $subtask_id));
danielebarchiesi@0 156 }
danielebarchiesi@0 157
danielebarchiesi@0 158 /**
danielebarchiesi@0 159 * Callback to enable/disable the page from the UI.
danielebarchiesi@0 160 */
danielebarchiesi@0 161 function page_manager_node_edit_enable($cache, $status) {
danielebarchiesi@0 162 variable_set('page_manager_node_edit_disabled', $status);
danielebarchiesi@0 163 // Set a global flag so that the menu routine knows it needs
danielebarchiesi@0 164 // to set a message if enabling cannot be done.
danielebarchiesi@0 165 if (!$status) {
danielebarchiesi@0 166 $GLOBALS['page_manager_enabling_node_edit'] = TRUE;
danielebarchiesi@0 167 }
danielebarchiesi@0 168 }
danielebarchiesi@0 169
danielebarchiesi@0 170 /**
danielebarchiesi@0 171 * Callback to determine if a page is accessible.
danielebarchiesi@0 172 *
danielebarchiesi@0 173 * @param $task
danielebarchiesi@0 174 * The task plugin.
danielebarchiesi@0 175 * @param $subtask_id
danielebarchiesi@0 176 * The subtask id
danielebarchiesi@0 177 * @param $contexts
danielebarchiesi@0 178 * The contexts loaded for the task.
danielebarchiesi@0 179 * @return
danielebarchiesi@0 180 * TRUE if the current user can access the page.
danielebarchiesi@0 181 */
danielebarchiesi@0 182 function page_manager_node_edit_access_check($task, $subtask_id, $contexts) {
danielebarchiesi@0 183 $context = reset($contexts);
danielebarchiesi@0 184 return node_access('update', $context->data);
danielebarchiesi@0 185 }