Projet

Général

Profil

Paste
Télécharger (15,1 ko) Statistiques
| Branche: | Révision:

root / drupal7 / sites / all / modules / panelizer / includes / common.inc @ 13755f8d

1 85ad3d82 Assos Assos
<?php
2
/**
3
 * @file
4
 * Contains common forms and routines that different object types use.
5
 *
6
 * The panelizer system has several different places that panels can be
7
 * edited. While they are all subtly different, they have a lot in common.
8
 */
9
10
/**
11
 * Form to configure basic panelizer settings.
12
 */
13
function panelizer_settings_form($form, &$form_state) {
14
  $panelizer = $form_state['panelizer'];
15
16
  if (!empty($form_state['has title'])) {
17
    $form['title'] = array(
18
      '#type' => 'textfield',
19
      '#title' => t('Administrative title'),
20
      '#description' => t('This will appear in the administrative interface to easily identify it.'),
21
      '#default_value' => $panelizer->title,
22
    );
23
  }
24
25
  // We only allow this setting on the "full page override" because it
26
  // does not make sense in other modes.
27
  if ($form_state['view_mode'] == 'page_manager') {
28
    $form['no_blocks'] = array(
29
      '#type' => 'checkbox',
30
      '#default_value' => $panelizer->no_blocks,
31
      '#title' => t('Disable Drupal blocks/regions'),
32
      '#description' => t('Check this to have the panel disable sidebars displayed in the theme. Note that some themes support this setting better than others. If in doubt, try with stock themes to see.'),
33
    );
34
  }
35
36
  ctools_include('plugins', 'panels');
37
  $pipelines = panels_get_renderer_pipelines();
38
39
  // If there are no pipelines, that probably means we're operating in
40
  // legacy mode.
41
  if (empty($pipelines)) {
42
    // We retain the original pipeline so we don't wreck things by installing
43
    // old modules.
44
    $form['pipeline'] = array(
45
      '#type' => 'value',
46
      '#value' => $panelizer->pipeline,
47
    );
48
  }
49
  else {
50
    $options = array();
51
    foreach ($pipelines as $name => $pipeline) {
52
      $options[$name] = check_plain($pipeline->admin_title) . '<div class="description">' . check_plain($pipeline->admin_description) . '</div>';
53
    }
54
55
    $form['pipeline'] = array(
56
      '#type' => 'radios',
57
      '#options' => $options,
58
      '#title' => t('Renderer'),
59
      '#default_value' => $panelizer->pipeline,
60
    );
61
  }
62
63
  if ($form_state['view_mode'] != 'page_manager') {
64
    $form['title_element'] = array(
65
      '#type' => 'textfield',
66
      '#default_value' => $panelizer->title_element,
67
      '#title' => t('Title element'),
68
      '#description' => t('The HTML element to use for the entity title. Typically this will be an H2.'),
69
    );
70
71
    $form['link_to_entity'] = array(
72
      '#type' => 'checkbox',
73
      '#default_value' => $panelizer->link_to_entity,
74
      '#title' => t('Link title to entity'),
75
      '#description' => t('If checked the title will be a link to the entity.'),
76
    );
77
78
    $form['css_class'] = array(
79
      '#type' => 'textfield',
80
      '#size' => 35,
81
      '#default_value' => $panelizer->css_class,
82
      '#title' => t('CSS class'),
83
      '#description' => t('The CSS class to apply to this panel. You may use context substitions here.'),
84
    );
85
  }
86
  else {
87
    $form['css_class'] = array(
88
      '#type' => 'textfield',
89
      '#size' => 35,
90
      '#default_value' => $panelizer->css_class,
91
      '#title' => t('Body class'),
92
      '#description' => t('The CSS class to apply to the BODY tag. You may use context substitions here.'),
93
    );
94
  }
95
96
  $form['css_id'] = array(
97
    '#type' => 'textfield',
98
    '#size' => 35,
99
    '#default_value' => $panelizer->css_id,
100
    '#title' => t('CSS ID'),
101
    '#description' => t('The CSS ID to apply to this panel.'),
102
  );
103
104
  $form['css'] = array(
105
    '#type' => 'textarea',
106
    '#title' => t('CSS code'),
107
    '#description' => t('Enter well-formed CSS code here; this code will be embedded into the panel, and should only be used for minor adjustments; it is usually better to try to put CSS for the panel into the theme if possible. This CSS will be filtered for safety so some CSS may not work.'),
108
    '#default_value' => $panelizer->css,
109
  );
110
111
  panelizer_add_revision_info_form($form, $form_state);
112
113
  $form['actions'] = array(
114
    '#type' => 'actions',
115
  );
116
117
  $form['actions']['submit'] = array(
118
    '#type' => 'submit',
119
    '#value' => t('Save'),
120
  );
121
122
  return $form;
123
}
124
125
/**
126
 * Submit callback
127
 */
128
function panelizer_settings_form_submit(&$form, &$form_state) {
129
  $panelizer = $form_state['panelizer'];
130
  if ($form_state['view_mode'] == 'page_manager') {
131
    $panelizer->no_blocks = $form_state['values']['no_blocks'];
132
  }
133
  else {
134
    $panelizer->title_element = $form_state['values']['title_element'];
135
  }
136
137
  $panelizer->css_class = $form_state['values']['css_class'];
138
  $panelizer->css = $form_state['values']['css'];
139
  $panelizer->css_id = $form_state['values']['css_id'];
140
  $panelizer->pipeline = $form_state['values']['pipeline'];
141
  // Behind an if because this value does not always exist.
142
  if (isset($form_state['values']['link_to_entity'])) {
143
    $panelizer->link_to_entity = $form_state['values']['link_to_entity'];
144
  }
145
  if (!empty($form_state['has title'])) {
146
    $panelizer->title = $form_state['values']['title'];
147
  }
148
  // NOTE: We do not save in the submit so that the form can be re-used.
149
}
150
151
/**
152
 * Mini form to add revision settings to a panelizer form so that
153
 * we can properly handle revisioning.
154
 */
155
function panelizer_add_revision_info_form(&$form, &$form_state) {
156
  if (empty($form_state['entity'])) {
157
    return;
158
  }
159
  if (empty($form_state['revision info'])) {
160
    return;
161
  }
162
163
  $entity = $form_state['entity'];
164
165
  list($use_revisions, $control_revisions) = $form_state['revision info'];
166
167
  if ($use_revisions) {
168
    // @todo -- what if an entity uses some other flag to control revisioning?
169
    if (!isset($entity->revision)) {
170
      $entity->revision = $use_revisions;
171
      $entity->log = '';
172
    }
173
174
    $form_state['use revisions'] = TRUE;
175
    $form['revision_information'] = array(
176
      '#weight' => 11,
177
    );
178
179
    $form['revision_information']['revision'] = array(
180
      '#type' => 'checkbox',
181
      '#title' => t('Create new revision'),
182
      '#default_value' => !empty($entity->revision),
183
      '#id' => 'edit-revision',
184
      '#access' => $control_revisions,
185
    );
186
187
    if ($control_revisions || $entity->revision) {
188
      $form['revision_information']['log'] = array(
189
        '#type' => 'textarea',
190
        '#title' => t('Log message'),
191
        '#description' => t('Provide an explanation of the changes you are making. This will help other authors understand your motivations.'),
192
        '#default_value' => $entity->log,
193
      );
194
195
      if ($control_revisions) {
196
        $form['revision_information']['log']['#dependency'] = array('edit-revision' => array(1));
197
      }
198
    }
199
200
    // Don't override the existing submit, eh?
201
    if (!empty($form_state['input']['form_id']) && empty($form['#submit']) && function_exists($form_state['input']['form_id'] . '_submit')) {
202
      $form['#submit'][] = $form_state['input']['form_id'] . '_submit';
203
    }
204
205
    // The submit handler needs to go in a different location depending on
206
    // what form this is.
207
    $submit_handler = 'panelizer_add_revision_info_form_submit';
208
    if (!empty($form['buttons']['submit']['#submit'])) {
209
      $form['buttons']['submit']['#submit'][] = $submit_handler;
210
    }
211
    elseif (!empty($form['buttons']['return']['#submit'])) {
212
      $form['buttons']['return']['#submit'][] = $submit_handler;
213
    }
214
    else {
215
      $form['#submit'][] = $submit_handler;
216
    }
217
  }
218
}
219
220
function panelizer_add_revision_info_form_submit(&$form, &$form_state) {
221
  $entity = $form_state['entity'];
222
  if (!empty($form_state['use revisions'])) {
223
    $entity->revision = $form_state['values']['revision'];
224
    $entity->log = $form_state['values']['log'];
225
  }
226
}
227
228
/**
229
 * Form to edit contexts that go with a panelizer panel.
230
 */
231
function panelizer_default_context_form($form, &$form_state) {
232
  ctools_include('context-admin');
233
  ctools_context_admin_includes();
234
235
  $panelizer = &$form_state['panelizer'];
236
237
  if (!empty($panelizer->cached)) {
238
    $form['markup'] = array(
239
      '#prefix' => '<div class="messages warning">',
240
      '#markup' => t('This form contains unsaved changes that will not be stored until the Save button is clicked.'),
241
      '#suffix' => '</div>',
242
    );
243
  }
244
245
  $form['right'] = array(
246
    '#prefix' => '<div class="clear-block"><div class="right-container">',
247
    '#suffix' => '</div>',
248
  );
249
250
  $form['left'] = array(
251
    '#prefix' => '<div class="left-container">',
252
    '#suffix' => '</div></div>',
253
  );
254
255
  $module = 'panelizer_context::' . $form_state['panelizer type'];
256
  ctools_context_add_context_form($module, $form, $form_state, $form['right']['contexts_table'], $panelizer, $form_state['cache key']);
257
  ctools_context_add_relationship_form($module, $form, $form_state, $form['right']['relationships_table'], $panelizer, $form_state['cache key']);
258
259
  // Set an additional description if CCK and Token are enabled, to notify of unlisted keywords
260
  if (!module_exists('token')) {
261
    $description = t('More keywords will be available if you install the Token module, see http://drupal.org/project/token.');
262
  }
263
  else {
264
    $description = '';
265
  }
266
267
  $form['left']['summary'] = array(
268
    '#prefix' => '<div class="page-manager-contexts">',
269
    '#suffix' => '</div>',
270
    '#markup' => theme('ctools_context_list', array(
271
      'object' => $panelizer,
272
      'header' => t('Summary of contexts'),
273
      'description' => $description,
274
    )),
275
  );
276
277
  panelizer_add_revision_info_form($form, $form_state);
278
279
  $form['actions'] = array(
280
    '#type' => 'actions'
281
  );
282
283
  $form['actions']['submit'] = array(
284
    '#type' => 'submit',
285
    '#value' => t('Save'),
286
    '#write' => TRUE,
287
  );
288
289
  $form['actions']['cancel'] = array(
290
    '#type' => 'submit',
291
    '#value' => t('Cancel'),
292
  );
293
294
  return $form;
295
}
296
297
/**
298
 * Form used when an entity bundle is panelized but there is no default
299
 * panel. Entities are then individually panelized.
300
 */
301
function panelizer_panelize_entity_form($form, &$form_state) {
302
  $entity_type = $form_state['panelizer']->panelizer_type;
303
  $entity_info = entity_get_info($entity_type);
304
  $form = array();
305
306
  $form['markup'] = array(
307
    '#markup' => '<p>' . t('This %entity is not currently panelized.', array('%entity' => $entity_info['label'])) . '</p>',
308
  );
309
310
  $form['submit'] = array(
311
    '#type' => 'submit',
312
    '#value' => t('Panelize it!'),
313
  );
314
315
  return $form;
316
}
317
318
/**
319
 * Form used when an entity is panelized and is being reset.
320
 */
321
function panelizer_reset_entity_form($form, &$form_state) {
322
  $entity_type = $form_state['panelizer']->entity_type;
323
  $entity_info = entity_get_info($entity_type);
324
  $form = array();
325
326
  return confirm_form(
327
    $form,
328
    t('Are you sure you want to reset the panelizer status for this %entity?', array('%entity' => $entity_info['label'])),
329
    dirname(dirname($_GET['q'])),
330
    t('This %entity will be reset to the default panelizer state, discarding any modifications made to it. This action cannot be undone.', array('%entity' => $entity_info['label'])),
331
    t('Reset'),
332
    t('Cancel'),
333
    'panelizer_reset_entity_confirm');
334
}
335
336
/**
337
 * Panelizer layout change form. If there is no content this will be
338
 * a 'choose' layout form. If there is content it will be a 'change' layout
339
 * form.
340
 *
341
 * @param $form_state
342
 *   The initial form state array to be used by the wizard. This *must* contain:
343
 *   - 'display': The display whose layout should be changed.
344
 *   - 'wizard path': The Drupal path where this wizard lives, so it knows where
345
 *     to redirect to. Note that the layout chosen will be appended to this
346
 *     path for the second step, so the page callback for this wizard needs to
347
 *     make sure to pass that through when teh function is called.
348
 *
349
 *   This can also contain:
350
 *   - 'allowed_layouts' => The key to the allowed layouts array to use.
351
 *   - 'finish' => The text to use on the save button.
352
 *
353
 * @param $step
354
 *   The wizard step that must be passed through. It should be in the %step
355
 *   portion of the path.
356
 *
357
 * @param $layout
358
 *   A layout that is chosen in the first step. It is passed through the URL
359
 *   so that no caching is needed. The caller needs to be sure to extract this
360
 *   from the URL.
361
 *
362
 * @return
363
 *   While the return value is render array, if $form_state['complete'] is
364
 *   true, then$form_state['display'] can be saved by the caller and
365
 *   redirection chosen. If $form_state['cancel'] is true, then the display
366
 *   should not be saved.
367
 */
368
function panelizer_change_layout_wizard(&$form_state, $step = 'choose', $layout = NULL) {
369
  ctools_include('common', 'panels');
370
371
  // Add defaults to the form state sent in.
372
  $form_state += array(
373
    'finish' => t('Save'),
374
    'allowed_layouts' => '',
375
    'no_redirect' => TRUE,
376
    'no buttons' => TRUE,
377
    'layout' => $layout,
378
  );
379
380
  $form_info = array(
381
    'id' => 'panelizer_change_layout_wizard',
382
    'finish text' => $form_state['finish'],
383
    'path' => $form_state['wizard path'],
384
    'show back' => TRUE,
385
    'order' => array(
386
      'choose' => t('Choose layout'),
387
    ),
388
    'forms' => array(
389
      'choose' => array(
390
        'form id' => 'panelizer_choose_layout_form',
391
      ),
392
      'move' => array(
393
        'form id' => 'panelizer_move_content_form',
394
      ),
395
    ),
396
  );
397
398
  if (!empty($form_state['display']->content)) {
399
    $form_info['order']['move'] = t('Move content');
400
  }
401
402
  ctools_include('common', 'panels');
403
  ctools_include('display-layout', 'panels');
404
  ctools_include('plugins', 'panels');
405
  ctools_include('wizard');
406
  $output = ctools_wizard_multistep_form($form_info, $step, $form_state);
407
  if (!empty($form_state['complete'])) {
408
    $form_state['display']->layout = $form_state['layout'];
409
  }
410
411
  return $output;
412
}
413
414
function panelizer_choose_layout_form($form, &$form_state) {
415
  // Change the #id of the form so the CSS applies properly.
416
  $form['#id'] = 'panels-choose-layout';
417
  $form = panels_choose_layout($form, $form_state);
418
419
  if (!empty($form['buttons']['return'])) {
420
    panelizer_add_revision_info_form($form, $form_state);
421
  }
422
423
  return $form;
424
}
425
426
function panelizer_choose_layout_form_validate(&$form, &$form_state) {
427
  if ($form_state['values']['layout'] == $form_state['display']->layout) {
428
    form_error($form['layout'], t('You must select a different layout if you wish to change layouts.'));
429
  }
430
}
431
432
function panelizer_choose_layout_form_submit(&$form, &$form_state) {
433
  $form_state['layout'] = $form_state['values']['layout'];
434
  $form_state['form_info']['path'] .= '/' . $form_state['values']['layout'];
435
}
436
437
function panelizer_move_content_form($form, &$form_state) {
438
  // Tell the Panels form not to display buttons.
439
  $form_state['no buttons'] = TRUE;
440
441
  // Change the #id of the form so the CSS applies properly.
442
  $form = panels_change_layout($form, $form_state);
443
444
  $form['buttons']['return']['#submit'][] = 'panels_change_layout_submit';
445
  panelizer_add_revision_info_form($form, $form_state);
446
  return $form;
447
}
448
449
function panelizer_edit_content_form($form, &$form_state) {
450
  ctools_include('ajax');
451
  ctools_include('plugins', 'panels');
452
  ctools_include('display-edit', 'panels');
453
  ctools_include('context');
454
455
  $cache = $form_state['display cache'];
456
457
  $form_state['renderer'] = panels_get_renderer_handler('editor', $cache->display);
458
  $form_state['renderer']->cache = $cache;
459
460
  $form_state['display'] = &$cache->display;
461
  $form_state['content_types'] = $cache->content_types;
462
  $form_state['display_title'] = TRUE;
463
464
  $form = panels_edit_display_form($form, $form_state);
465
466
  panelizer_add_revision_info_form($form, $form_state);
467
  $form['preview']['#weight'] = 100;
468
469
  return $form;
470
}