1 |
85ad3d82
|
Assos Assos
|
<?php
|
2 |
|
|
|
3 |
|
|
/*
|
4 |
|
|
* @file
|
5 |
|
|
* Core Panels API include file containing various display-editing functions.
|
6 |
|
|
* This includes all the basic editing forms (content, layout, layout settings)
|
7 |
|
|
* as well as the ajax modal forms associated with them.
|
8 |
|
|
*/
|
9 |
|
|
|
10 |
|
|
/**
|
11 |
|
|
* Handle calling and processing of the form for editing display content.
|
12 |
|
|
*
|
13 |
|
|
* Helper function for panels_edit().
|
14 |
|
|
*
|
15 |
|
|
* @see panels_edit() for details on the various behaviors of this function.
|
16 |
|
|
*/
|
17 |
|
|
function _panels_edit($display, $destination, $content_types, $title = FALSE) {
|
18 |
|
|
$did = $display->did;
|
19 |
|
|
if (!$did) {
|
20 |
|
|
$display->did = $did = 'new';
|
21 |
|
|
}
|
22 |
|
|
|
23 |
|
|
// Load the display being edited from cache, if possible.
|
24 |
|
|
if (!empty($_POST) && is_object($cache = panels_edit_cache_get($did))) {
|
25 |
|
|
$display = $cache->display;
|
26 |
|
|
}
|
27 |
|
|
else {
|
28 |
|
|
$cache = panels_edit_cache_get_default($display, $content_types, $title);
|
29 |
|
|
}
|
30 |
|
|
|
31 |
|
|
// Get a renderer.
|
32 |
|
|
$renderer = panels_get_renderer_handler('editor', $display);
|
33 |
|
|
$renderer->cache = $cache;
|
34 |
|
|
|
35 |
|
|
$output = $renderer->edit();
|
36 |
|
|
if (is_object($output) && $destination) {
|
37 |
|
|
return panels_goto($destination);
|
38 |
|
|
}
|
39 |
|
|
return $output;
|
40 |
|
|
}
|
41 |
|
|
|
42 |
|
|
/**
|
43 |
|
|
* Form definition for the panels display editor
|
44 |
|
|
*
|
45 |
|
|
* No validation function is necessary, as all 'validation' is handled
|
46 |
|
|
* either in the lead-up to form rendering (through the selection of
|
47 |
|
|
* specified content types) or by the validation functions specific to
|
48 |
|
|
* the ajax modals & content types.
|
49 |
|
|
*
|
50 |
|
|
* @ingroup forms
|
51 |
|
|
* @see panels_edit_display_submit()
|
52 |
|
|
*/
|
53 |
|
|
function panels_edit_display_form($form, &$form_state) {
|
54 |
|
|
$display = &$form_state['display'];
|
55 |
|
|
$renderer = &$form_state['renderer'];
|
56 |
|
|
|
57 |
|
|
// Make sure there is a valid cache key.
|
58 |
|
|
$cache_key = isset($display->cache_key) ? $display->cache_key : $display->did;
|
59 |
|
|
$display->cache_key = $cache_key;
|
60 |
|
|
|
61 |
|
|
// Annoyingly, theme doesn't have access to form_state so we have to do this.
|
62 |
|
|
$form['#display'] = $display;
|
63 |
|
|
|
64 |
|
|
// The flexible layout maker wants to be able to edit a display without
|
65 |
|
|
// actually editing a display, so we provide this 'setting' to allow
|
66 |
|
|
// that to go away.
|
67 |
|
|
if (empty($form_state['no display settings'])) {
|
68 |
|
|
$links = $renderer->get_display_links();
|
69 |
|
|
}
|
70 |
|
|
else {
|
71 |
|
|
$renderer->no_edit_links = TRUE;
|
72 |
|
|
$links = '';
|
73 |
|
|
}
|
74 |
|
|
$form['hide']['display-settings'] = array(
|
75 |
|
|
'#markup' => $links,
|
76 |
|
|
);
|
77 |
|
|
|
78 |
|
|
$form += panels_edit_display_settings_form($form, $form_state);
|
79 |
|
|
|
80 |
|
|
$form['panel'] = array('#tree' => TRUE);
|
81 |
|
|
$form['panel']['pane'] = array('#tree' => TRUE);
|
82 |
|
|
|
83 |
|
|
$form['display'] = array(
|
84 |
|
|
'#markup' => $renderer->render(),
|
85 |
|
|
);
|
86 |
|
|
|
87 |
|
|
foreach ($renderer->plugins['layout']['regions'] as $region_id => $title) {
|
88 |
|
|
// Make sure we at least have an empty array for all possible locations.
|
89 |
|
|
if (!isset($display->panels[$region_id])) {
|
90 |
|
|
$display->panels[$region_id] = array();
|
91 |
|
|
}
|
92 |
|
|
|
93 |
|
|
$form['panel']['pane'][$region_id] = array(
|
94 |
|
|
// Use 'hidden' instead of 'value' so the js can access it.
|
95 |
|
|
'#type' => 'hidden',
|
96 |
|
|
'#default_value' => implode(',', (array) $display->panels[$region_id]),
|
97 |
|
|
);
|
98 |
|
|
}
|
99 |
|
|
|
100 |
|
|
if (empty($form_state['no buttons'])) {
|
101 |
|
|
$form['buttons']['submit'] = array(
|
102 |
|
|
'#type' => 'submit',
|
103 |
|
|
'#value' => t('Save'),
|
104 |
|
|
'#id' => 'panels-dnd-save',
|
105 |
|
|
'#submit' => array('panels_edit_display_form_submit'),
|
106 |
|
|
'#save-display' => TRUE,
|
107 |
|
|
);
|
108 |
|
|
$form['buttons']['cancel'] = array(
|
109 |
|
|
'#type' => 'submit',
|
110 |
|
|
'#value' => t('Cancel'),
|
111 |
|
|
);
|
112 |
|
|
}
|
113 |
|
|
|
114 |
|
|
// Build up the preview portion of the form, if necessary.
|
115 |
|
|
if (empty($form_state['no preview'])) {
|
116 |
|
|
$form['preview'] = array(
|
117 |
|
|
'#tree' => TRUE,
|
118 |
|
|
'#prefix' => '<h2>' . t('Live preview') . '</h2>' . '<div id="panels-live-preview">',
|
119 |
|
|
'#suffix' => '</div>',
|
120 |
|
|
);
|
121 |
|
|
|
122 |
|
|
ctools_context_replace_form($form['preview'], $display->context);
|
123 |
|
|
$form['preview']['button'] = array(
|
124 |
|
|
'#type' => 'submit',
|
125 |
|
|
'#value' => t('Preview'),
|
126 |
|
|
'#attributes' => array('class' => array('use-ajax-submit')),
|
127 |
|
|
'#id' => 'panels-live-preview-button',
|
128 |
|
|
'#submit' => array('panels_edit_display_form_submit', 'panels_edit_display_form_preview'),
|
129 |
|
|
);
|
130 |
|
|
}
|
131 |
|
|
|
132 |
|
|
return $form;
|
133 |
|
|
}
|
134 |
|
|
|
135 |
|
|
/**
|
136 |
|
|
* Handle form validation of the display content editor.
|
137 |
|
|
*/
|
138 |
|
|
function panels_edit_display_form_validate($form, &$form_state) {
|
139 |
|
|
panels_edit_display_settings_form_validate($form, $form_state);
|
140 |
|
|
}
|
141 |
|
|
|
142 |
|
|
/**
|
143 |
|
|
* Handle form submission of the display content editor.
|
144 |
|
|
*
|
145 |
|
|
* This reads the location of the various panes from the form, which will
|
146 |
|
|
* have been modified from the ajax, rearranges them and then saves
|
147 |
|
|
* the display.
|
148 |
|
|
*/
|
149 |
|
|
function panels_edit_display_form_submit($form, &$form_state) {
|
150 |
|
|
$display = &$form_state['display'];
|
151 |
|
|
|
152 |
|
|
$old_content = $display->content;
|
153 |
|
|
$display->content = array();
|
154 |
|
|
|
155 |
|
|
if (!empty($form_state['values']['panel']['pane'])) {
|
156 |
|
|
foreach ($form_state['values']['panel']['pane'] as $region_id => $panes) {
|
157 |
|
|
$display->panels[$region_id] = array();
|
158 |
|
|
if ($panes) {
|
159 |
|
|
$pids = explode(',', $panes);
|
160 |
|
|
// need to filter the array, b/c passing it in a hidden field can generate trash
|
161 |
|
|
foreach (array_filter($pids) as $pid) {
|
162 |
|
|
if ($old_content[$pid]) {
|
163 |
|
|
$display->panels[$region_id][] = $pid;
|
164 |
|
|
$old_content[$pid]->panel = $region_id;
|
165 |
|
|
$display->content[$pid] = $old_content[$pid];
|
166 |
|
|
|
167 |
|
|
// If the panel has region locking, make sure that the region
|
168 |
|
|
// the panel is in is applicable. This can happen if the panel
|
169 |
|
|
// was moved and then the lock changed and the server didn't
|
170 |
|
|
// know.
|
171 |
|
|
if (!empty($old_content[$pid]->locks) && $old_content[$pid]->locks['type'] == 'regions') {
|
172 |
|
|
$old_content[$pid]->locks['regions'][$region_id] = $region_id;
|
173 |
|
|
}
|
174 |
|
|
}
|
175 |
|
|
}
|
176 |
|
|
}
|
177 |
|
|
}
|
178 |
|
|
}
|
179 |
|
|
|
180 |
|
|
panels_edit_display_settings_form_submit($form, $form_state);
|
181 |
|
|
}
|
182 |
|
|
|
183 |
|
|
/**
|
184 |
|
|
* Submission of the preview button. Render the preview and put it into
|
185 |
|
|
* the preview widget area.
|
186 |
|
|
*/
|
187 |
|
|
function panels_edit_display_form_preview(&$form, &$form_state) {
|
188 |
|
|
$display = &$form_state['display'];
|
189 |
|
|
ctools_include('ajax');
|
190 |
|
|
|
191 |
|
|
$display->context = ctools_context_replace_placeholders($display->context, $form_state['values']['preview']);
|
192 |
|
|
$display->skip_cache = TRUE;
|
193 |
|
|
$output = panels_render_display($display);
|
194 |
|
|
|
195 |
|
|
// Add any extra CSS that some layouts may have added specifically for this.
|
196 |
|
|
if (!empty($display->add_css)) {
|
197 |
|
|
$output = "<style type=\"text/css\">\n$display->add_css</style>\n" . $output;
|
198 |
|
|
}
|
199 |
|
|
|
200 |
|
|
$commands = array();
|
201 |
|
|
$commands[] = array(
|
202 |
|
|
'command' => 'panel_preview',
|
203 |
|
|
'output' => $output,
|
204 |
|
|
);
|
205 |
|
|
|
206 |
|
|
print ajax_render($commands);
|
207 |
|
|
ajax_footer();
|
208 |
|
|
exit;
|
209 |
|
|
}
|
210 |
|
|
|
211 |
|
|
|
212 |
|
|
/**
|
213 |
|
|
* Form for display settings.
|
214 |
|
|
*/
|
215 |
|
|
function panels_edit_display_settings_form($form, &$form_state) {
|
216 |
|
|
$display = &$form_state['display'];
|
217 |
|
|
|
218 |
|
|
$layout = panels_get_layout($display->layout);
|
219 |
|
|
$form_state['layout'] = $layout;
|
220 |
|
|
|
221 |
|
|
ctools_include('dependent');
|
222 |
|
|
|
223 |
|
|
if ($form_state['display_title']) {
|
224 |
|
|
$form['display_title'] = array (
|
225 |
|
|
'#tree' => TRUE,
|
226 |
|
|
);
|
227 |
|
|
|
228 |
|
|
$form['display_title']['hide_title'] = array(
|
229 |
|
|
'#type' => 'select',
|
230 |
|
|
'#title' => t('Title type'),
|
231 |
|
|
'#default_value' => (int) $display->hide_title,
|
232 |
|
|
'#options' => array(
|
233 |
|
|
PANELS_TITLE_NONE => t('No title'),
|
234 |
|
|
PANELS_TITLE_FIXED => t('Manually set'),
|
235 |
|
|
PANELS_TITLE_PANE => t('From pane'),
|
236 |
|
|
),
|
237 |
|
|
);
|
238 |
|
|
|
239 |
|
|
$form['display_title']['title'] = array(
|
240 |
|
|
'#type' => 'textfield',
|
241 |
|
|
'#default_value' => $display->title,
|
242 |
|
|
'#title' => t('Title'),
|
243 |
e4c061ad
|
Assos Assos
|
'#description' => t('The title of this panel. If left blank, a default title may be used. If you want the title actually to be blank, change the "Title type" dropdown from "Manually Set" to "No Title".'),
|
244 |
85ad3d82
|
Assos Assos
|
'#process' => array('ctools_dependent_process'),
|
245 |
|
|
'#dependency' => array('edit-display-title-hide-title' => array(PANELS_TITLE_FIXED)),
|
246 |
|
|
'#maxlength' => 255,
|
247 |
|
|
);
|
248 |
|
|
|
249 |
|
|
if (!empty($display->context)) {
|
250 |
|
|
$form['display_title']['title']['#description'] .= ' ' . t('You may use substitutions in this title.');
|
251 |
|
|
|
252 |
|
|
// We have to create a manual fieldset because fieldsets do not support IDs.
|
253 |
|
|
// Use 'hidden' instead of 'markup' so that the process will run.
|
254 |
|
|
// Add js for collapsible fieldsets manually
|
255 |
|
|
// drupal_add_js('misc/form.js');
|
256 |
|
|
// drupal_add_js('misc/collapse.js');
|
257 |
|
|
// $form['display_title']['contexts_prefix'] = array(
|
258 |
|
|
// '#type' => 'hidden',
|
259 |
|
|
// '#id' => 'edit-display-substitutions',
|
260 |
|
|
// '#prefix' => '<div><fieldset id="edit-display-substitutions" class="collapsed collapsible"><legend>' . t('Substitutions') . '</legend><div class="fieldset-wrapper">',
|
261 |
|
|
// '#process' => array('ctools_dependent_process'),
|
262 |
|
|
// '#dependency' => array('edit-display-title-hide-title' => array(PANELS_TITLE_FIXED)),
|
263 |
|
|
// );
|
264 |
|
|
|
265 |
|
|
$rows = array();
|
266 |
|
|
foreach ($display->context as $context) {
|
267 |
|
|
foreach (ctools_context_get_converters('%' . check_plain($context->keyword) . ':', $context) as $keyword => $title) {
|
268 |
|
|
$rows[] = array(
|
269 |
|
|
check_plain($keyword),
|
270 |
|
|
t('@identifier: @title', array('@title' => $title, '@identifier' => $context->identifier)),
|
271 |
|
|
);
|
272 |
|
|
}
|
273 |
|
|
}
|
274 |
|
|
|
275 |
|
|
$header = array(t('Keyword'), t('Value'));
|
276 |
|
|
$form['display_title']['contexts'] = array(
|
277 |
|
|
'#type' => 'fieldset',
|
278 |
|
|
'#title' => t('Substitutions'),
|
279 |
|
|
'#collapsible' => TRUE,
|
280 |
|
|
'#collapsed' => TRUE,
|
281 |
|
|
'#value' => theme('table', array('header' => $header, 'rows' => $rows)),
|
282 |
|
|
// '#process' => array('form_process_fieldset', 'ctools_dependent_process'),
|
283 |
|
|
// '#id' => 'edit-display-title-context',
|
284 |
|
|
// '#dependency' => array('edit-display-title-hide-title' => array(PANELS_TITLE_FIXED)),
|
285 |
|
|
);
|
286 |
|
|
// $form['display_title']['contexts_suffix'] = array(
|
287 |
|
|
// '#value' => '</div></fieldset></div>',
|
288 |
|
|
// );
|
289 |
|
|
}
|
290 |
|
|
}
|
291 |
|
|
|
292 |
|
|
// TODO doc the ability to do this as part of the API
|
293 |
|
|
if (!empty($layout['settings form']) && function_exists($layout['settings form'])) {
|
294 |
|
|
$form['layout_settings'] = $layout['settings form']($display, $layout, $display->layout_settings);
|
295 |
|
|
}
|
296 |
|
|
$form['layout_settings']['#tree'] = TRUE;
|
297 |
|
|
|
298 |
|
|
return $form;
|
299 |
|
|
}
|
300 |
|
|
|
301 |
|
|
/**
|
302 |
|
|
* Validate the layout settings form.
|
303 |
|
|
*/
|
304 |
|
|
function panels_edit_display_settings_form_validate($form, &$form_state) {
|
305 |
08475715
|
Assos Assos
|
if ($function = panels_plugin_get_function('layouts', $form_state['layout'], 'settings validate')) {
|
306 |
85ad3d82
|
Assos Assos
|
$function($form_state['values']['layout_settings'], $form['layout_settings'], $form_state['display'], $form_state['layout'], $form_state['display']->layout_settings);
|
307 |
|
|
}
|
308 |
|
|
}
|
309 |
|
|
|
310 |
|
|
/**
|
311 |
|
|
* Store changes from the layout settings form.
|
312 |
|
|
*/
|
313 |
|
|
function panels_edit_display_settings_form_submit($form, &$form_state) {
|
314 |
|
|
$display = &$form_state['display'];
|
315 |
08475715
|
Assos Assos
|
if ($function = panels_plugin_get_function('layouts', $form_state['layout'], 'settings submit')) {
|
316 |
85ad3d82
|
Assos Assos
|
$function($form_state['values']['layout_settings'], $display, $form_state['layout'], $display->layout_settings);
|
317 |
|
|
}
|
318 |
|
|
|
319 |
|
|
// Since not all layouts have layout settings, check here in case of notices.
|
320 |
|
|
if (isset($form_state['values']['layout_settings'])) {
|
321 |
|
|
$display->layout_settings = $form_state['values']['layout_settings'];
|
322 |
|
|
}
|
323 |
|
|
|
324 |
|
|
if (isset($form_state['values']['display_title']['title'])) {
|
325 |
|
|
$display->title = $form_state['values']['display_title']['title'];
|
326 |
|
|
$display->hide_title = $form_state['values']['display_title']['hide_title'];
|
327 |
|
|
}
|
328 |
|
|
} |