danielebarchiesi@0
|
1 <?php
|
danielebarchiesi@0
|
2
|
danielebarchiesi@0
|
3 /**
|
danielebarchiesi@0
|
4 * @file
|
danielebarchiesi@0
|
5 * Overrides the user profile display at user/%user.
|
danielebarchiesi@0
|
6 *
|
danielebarchiesi@0
|
7 * Specialized implementation of hook_page_manager_task_tasks(). See api-task.html for
|
danielebarchiesi@0
|
8 * more information.
|
danielebarchiesi@0
|
9 */
|
danielebarchiesi@0
|
10 function page_manager_user_edit_page_manager_tasks() {
|
danielebarchiesi@0
|
11 return array(
|
danielebarchiesi@0
|
12 // This is a 'page' task and will fall under the page admin UI
|
danielebarchiesi@0
|
13 'task type' => 'page',
|
danielebarchiesi@0
|
14 'title' => t('User Edit Template'),
|
danielebarchiesi@0
|
15 'admin title' => t('User edit template'),
|
danielebarchiesi@0
|
16 'admin description' => t('When enabled, this overrides the default Drupal behavior for displaying user edit form at <em>user/%user/edit</em>.'),
|
danielebarchiesi@0
|
17 'admin path' => 'user/%user/edit',
|
danielebarchiesi@0
|
18
|
danielebarchiesi@0
|
19 // Callback to add items to the page managertask administration form:
|
danielebarchiesi@0
|
20 'task admin' => 'page_manager_user_edit_task_admin',
|
danielebarchiesi@0
|
21
|
danielebarchiesi@0
|
22 'hook menu' => 'page_manager_user_edit_menu',
|
danielebarchiesi@0
|
23 'hook menu alter' => 'page_manager_user_edit_menu_alter',
|
danielebarchiesi@0
|
24
|
danielebarchiesi@0
|
25 // This is task uses 'context' handlers and must implement these to give the
|
danielebarchiesi@0
|
26 // handler data it needs.
|
danielebarchiesi@0
|
27 'handler type' => 'context', // handler type -- misnamed
|
danielebarchiesi@0
|
28 'get arguments' => 'page_manager_user_edit_get_arguments',
|
danielebarchiesi@0
|
29 'get context placeholders' => 'page_manager_user_edit_get_contexts',
|
danielebarchiesi@0
|
30
|
danielebarchiesi@0
|
31 // Allow this to be enabled or disabled:
|
danielebarchiesi@0
|
32 'disabled' => variable_get('page_manager_user_edit_disabled', TRUE),
|
danielebarchiesi@0
|
33 'enable callback' => 'page_manager_user_edit_enable',
|
danielebarchiesi@0
|
34 'access callback' => 'page_manager_user_edit_access_check',
|
danielebarchiesi@0
|
35 );
|
danielebarchiesi@0
|
36 }
|
danielebarchiesi@0
|
37
|
danielebarchiesi@0
|
38 /**
|
danielebarchiesi@0
|
39 * Callback defined by page_manager_user_view_page_manager_tasks().
|
danielebarchiesi@0
|
40 *
|
danielebarchiesi@0
|
41 * Alter the user view input so that user view comes to us rather than the
|
danielebarchiesi@0
|
42 * normal user view process.
|
danielebarchiesi@0
|
43 */
|
danielebarchiesi@0
|
44 function page_manager_user_edit_menu_alter(&$items, $task) {
|
danielebarchiesi@0
|
45 if (variable_get('page_manager_user_edit_disabled', TRUE)) {
|
danielebarchiesi@0
|
46 return;
|
danielebarchiesi@0
|
47 }
|
danielebarchiesi@0
|
48
|
danielebarchiesi@0
|
49 // Override the user view handler for our purpose.
|
danielebarchiesi@0
|
50 if ($items['user/%user/edit']['page callback'] == 'drupal_get_form' || variable_get('page_manager_override_anyway', FALSE)) {
|
danielebarchiesi@0
|
51 $items['user/%user/edit']['page callback'] = 'page_manager_user_edit_page';
|
danielebarchiesi@0
|
52 $items['user/%user/edit']['page arguments'] = array(1);
|
danielebarchiesi@0
|
53 $items['user/%user/edit']['file path'] = $task['path'];
|
danielebarchiesi@0
|
54 $items['user/%user/edit']['file'] = $task['file'];
|
danielebarchiesi@0
|
55 if (($categories = _user_categories()) && (count($categories) > 1)) {
|
danielebarchiesi@0
|
56 foreach ($categories as $key => $category) {
|
danielebarchiesi@0
|
57 // 'account' is already handled by the MENU_DEFAULT_LOCAL_TASK.
|
danielebarchiesi@0
|
58 if ($category['name'] != 'account') {
|
danielebarchiesi@0
|
59 $items['user/%user_category/edit/' . $category['name']]['page callback'] = 'page_manager_user_edit_page';
|
danielebarchiesi@0
|
60 $items['user/%user_category/edit/' . $category['name']]['page arguments'] = array(1, 3);
|
danielebarchiesi@0
|
61 $items['user/%user_category/edit/' . $category['name']]['file path'] = $task['path'];
|
danielebarchiesi@0
|
62 $items['user/%user_category/edit/' . $category['name']]['file'] = $task['file'];
|
danielebarchiesi@0
|
63 }
|
danielebarchiesi@0
|
64 }
|
danielebarchiesi@0
|
65 }
|
danielebarchiesi@0
|
66 }
|
danielebarchiesi@0
|
67 else {
|
danielebarchiesi@0
|
68 // automatically disable this task if it cannot be enabled.
|
danielebarchiesi@0
|
69 variable_set('page_manager_user_edit_disabled', TRUE);
|
danielebarchiesi@0
|
70 if (!empty($GLOBALS['page_manager_enabling_user_edit'])) {
|
danielebarchiesi@0
|
71 drupal_set_message(t('Page manager module is unable to enable user/%user/edit because some other module already has overridden with %callback.', array('%callback' => $items['user/%user']['page callback'])), 'error');
|
danielebarchiesi@0
|
72 }
|
danielebarchiesi@0
|
73 }
|
danielebarchiesi@0
|
74 }
|
danielebarchiesi@0
|
75
|
danielebarchiesi@0
|
76 /**
|
danielebarchiesi@0
|
77 * Entry point for our overridden user view.
|
danielebarchiesi@0
|
78 *
|
danielebarchiesi@0
|
79 * This function asks its assigned handlers who, if anyone, would like
|
danielebarchiesi@0
|
80 * to run with it. If no one does, it passes through to Drupal core's
|
danielebarchiesi@0
|
81 * user edit, which is drupal_get_form('user_profile_form',$account).
|
danielebarchiesi@0
|
82 */
|
danielebarchiesi@0
|
83 function page_manager_user_edit_page($account, $category = 'account') {
|
danielebarchiesi@0
|
84 // Store the category on the user for later usage.
|
danielebarchiesi@0
|
85 $account->user_category = $category;
|
danielebarchiesi@0
|
86
|
danielebarchiesi@0
|
87 // Load my task plugin:
|
danielebarchiesi@0
|
88 $task = page_manager_get_task('user_edit');
|
danielebarchiesi@0
|
89
|
danielebarchiesi@0
|
90 // Load the account into a context.
|
danielebarchiesi@0
|
91 ctools_include('context');
|
danielebarchiesi@0
|
92 ctools_include('context-task-handler');
|
danielebarchiesi@0
|
93 $contexts = ctools_context_handler_get_task_contexts($task, '', array($account));
|
danielebarchiesi@0
|
94 // Build content. @todo -- this may not be right.
|
danielebarchiesi@0
|
95 user_build_content($account);
|
danielebarchiesi@0
|
96
|
danielebarchiesi@0
|
97 $output = ctools_context_handler_render($task, '', $contexts, array($account->uid));
|
danielebarchiesi@0
|
98 if (is_array($output)) {
|
danielebarchiesi@0
|
99 $output = drupal_render($output);
|
danielebarchiesi@0
|
100 }
|
danielebarchiesi@0
|
101 if ($output != FALSE) {
|
danielebarchiesi@0
|
102 return $output;
|
danielebarchiesi@0
|
103 }
|
danielebarchiesi@0
|
104
|
danielebarchiesi@0
|
105 $function = 'drupal_get_form';
|
danielebarchiesi@0
|
106 foreach (module_implements('page_manager_override') as $module) {
|
danielebarchiesi@0
|
107 $call = $module . '_page_manager_override';
|
danielebarchiesi@0
|
108 if (($rc = $call('user_edit')) && function_exists($rc)) {
|
danielebarchiesi@0
|
109 $function = $rc;
|
danielebarchiesi@0
|
110 break;
|
danielebarchiesi@0
|
111 }
|
danielebarchiesi@0
|
112 }
|
danielebarchiesi@0
|
113
|
danielebarchiesi@0
|
114 // Otherwise, fall back.
|
danielebarchiesi@0
|
115 if ($function == 'drupal_get_form') {
|
danielebarchiesi@0
|
116
|
danielebarchiesi@0
|
117 //In order to ajax fields to work we need to run form_load_include.
|
danielebarchiesi@0
|
118 //Hence we eschew drupal_get_form and manually build the info and
|
danielebarchiesi@0
|
119 //call drupal_build_form.
|
danielebarchiesi@0
|
120 $form_state = array();
|
danielebarchiesi@0
|
121 $form_id = 'user_profile_form';
|
danielebarchiesi@0
|
122 $args = array($account);
|
danielebarchiesi@0
|
123 $form_state['build_info']['args'] = $args;
|
danielebarchiesi@0
|
124 form_load_include($form_state, 'inc', 'user', 'user.pages');
|
danielebarchiesi@0
|
125 $output = drupal_build_form($form_id, $form_state);
|
danielebarchiesi@0
|
126 return $output;
|
danielebarchiesi@0
|
127 }
|
danielebarchiesi@0
|
128 //fire off "view" op so that triggers still work
|
danielebarchiesi@0
|
129 // @todo -- this doesn't work anymore, and the alternatives seem bad.
|
danielebarchiesi@0
|
130 // will have to figure out how to fix this.
|
danielebarchiesi@0
|
131 // user_module_invoke('view', $array = array(), $account);
|
danielebarchiesi@0
|
132 return $function($account);
|
danielebarchiesi@0
|
133 }
|
danielebarchiesi@0
|
134
|
danielebarchiesi@0
|
135 /**
|
danielebarchiesi@0
|
136 * Callback to get arguments provided by this task handler.
|
danielebarchiesi@0
|
137 *
|
danielebarchiesi@0
|
138 * Since this is the node view and there is no UI on the arguments, we
|
danielebarchiesi@0
|
139 * create dummy arguments that contain the needed data.
|
danielebarchiesi@0
|
140 */
|
danielebarchiesi@0
|
141 function page_manager_user_edit_get_arguments($task, $subtask_id) {
|
danielebarchiesi@0
|
142 return array(
|
danielebarchiesi@0
|
143 array(
|
danielebarchiesi@0
|
144 'keyword' => 'user',
|
danielebarchiesi@0
|
145 'identifier' => t('User being edited'),
|
danielebarchiesi@0
|
146 'id' => 1,
|
danielebarchiesi@0
|
147 'name' => 'user_edit',
|
danielebarchiesi@0
|
148 'settings' => array(),
|
danielebarchiesi@0
|
149 ),
|
danielebarchiesi@0
|
150 );
|
danielebarchiesi@0
|
151 }
|
danielebarchiesi@0
|
152
|
danielebarchiesi@0
|
153 /**
|
danielebarchiesi@0
|
154 * Callback to get context placeholders provided by this handler.
|
danielebarchiesi@0
|
155 */
|
danielebarchiesi@0
|
156 function page_manager_user_edit_get_contexts($task, $subtask_id) {
|
danielebarchiesi@0
|
157 return ctools_context_get_placeholders_from_argument(page_manager_user_edit_get_arguments($task, $subtask_id));
|
danielebarchiesi@0
|
158 }
|
danielebarchiesi@0
|
159
|
danielebarchiesi@0
|
160 /**
|
danielebarchiesi@0
|
161 * Callback to enable/disable the page from the UI.
|
danielebarchiesi@0
|
162 */
|
danielebarchiesi@0
|
163 function page_manager_user_edit_enable($cache, $status) {
|
danielebarchiesi@0
|
164 variable_set('page_manager_user_edit_disabled', $status);
|
danielebarchiesi@0
|
165 // Set a global flag so that the menu routine knows it needs
|
danielebarchiesi@0
|
166 // to set a message if enabling cannot be done.
|
danielebarchiesi@0
|
167 if (!$status) {
|
danielebarchiesi@0
|
168 $GLOBALS['page_manager_enabling_user_edit'] = TRUE;
|
danielebarchiesi@0
|
169 }
|
danielebarchiesi@0
|
170 }
|
danielebarchiesi@0
|
171
|
danielebarchiesi@0
|
172 /**
|
danielebarchiesi@0
|
173 * Callback to determine if a page is accessible.
|
danielebarchiesi@0
|
174 *
|
danielebarchiesi@0
|
175 * @param $task
|
danielebarchiesi@0
|
176 * The task plugin.
|
danielebarchiesi@0
|
177 * @param $subtask_id
|
danielebarchiesi@0
|
178 * The subtask id
|
danielebarchiesi@0
|
179 * @param $contexts
|
danielebarchiesi@0
|
180 * The contexts loaded for the task.
|
danielebarchiesi@0
|
181 * @return
|
danielebarchiesi@0
|
182 * TRUE if the current user can access the page.
|
danielebarchiesi@0
|
183 */
|
danielebarchiesi@0
|
184 function page_manager_user_edit_access_check($task, $subtask_id, $contexts) {
|
danielebarchiesi@0
|
185 $context = reset($contexts);
|
danielebarchiesi@0
|
186 return user_edit_access($context->data);
|
danielebarchiesi@0
|
187 }
|