Projet

Général

Profil

Paste
Télécharger (29,4 ko) Statistiques
| Branche: | Révision:

root / drupal7 / sites / all / modules / sweaver / plugins / sweaver_plugin_editor / sweaver_plugin_editor.admin.inc @ 651307cd

1 85ad3d82 Assos Assos
<?php
2
3
/**
4
 * @file
5
 * Administrative functions for Sweaver.
6
 */
7
8
/**
9
 * Settings form.
10
 */
11
function sweaver_settings($form, $form_state) {
12
  $form = array();
13
14
  $form['sweaver_enabled'] = array(
15
    '#type' => 'checkbox',
16
    '#title' => t('Enable sweaver editor'),
17
    '#default_value' => variable_get('sweaver_enabled', TRUE),
18
    '#description' => t('Enable the editor at the bottom.'),
19
  );
20
21
  $form['sweaver_preview_selection'] = array(
22
    '#type' => 'checkbox',
23
    '#title' => t('Enable selection preview'),
24
    '#default_value' => variable_get('sweaver_preview_selection', TRUE),
25
    '#description' => t('Enable the preview selector so you see what you are going to change.'),
26
  );
27
28
  $form['sweaver_combined_selectors'] = array(
29
    '#type' => 'checkbox',
30
    '#title' => t('Enable combined selectors'),
31
    '#default_value' => variable_get('sweaver_combined_selectors', FALSE),
32
    '#description' => t('Show combined tag and id or class selectors in the selectors dropdown.'),
33
  );
34
  
35
  $form['sweaver_translate_path'] = array(
36
    '#type' => 'checkbox',
37
    '#title' => t('Enable translate oject\'s path translation'),
38
    '#default_value' => variable_get('sweaver_translate_path', TRUE),
39
    '#description' => t('Translate object path in a human-readable name'),
40
  );
41
42
  $skins = array();
43
  $ignore = array('.', '..', '.svn', 'CVS', '.git');
44
  $directories = scandir(drupal_get_path('module', 'sweaver') .'/skins');
45
  foreach ($directories as $directory) {
46
    if (!in_array($directory, $ignore)) {
47
      $skins[$directory] = $directory;
48
    }
49
  }
50
  $form['sweaver_skin'] = array(
51
    '#type' => 'select',
52
    '#title' => t('Sweaver skin'),
53
    '#options' => $skins,
54
    '#default_value' => variable_get('sweaver_skin', SWEAVER_SKIN),
55
  );
56
57
  $form['sweaver_paths'] = array(
58
    '#type' => 'textarea',
59
    '#title' => t('Exclude paths'),
60
    '#default_value' => variable_get('sweaver_paths', SWEAVER_PATHS_EXCLUDE),
61
    '#description' => t('Exclude the editor on some pages, usually administration pages. Enter one page per line as Drupal paths. The \'*\' character is a wildcard. &lt;front&gt; is the front page.'),
62
    '#wysiwyg' => FALSE,
63
  );
64
65
  $form['sweaver_selectors_exclude'] = array(
66
    '#type' => 'textarea',
67
    '#title' => t('Exclude selectors'),
68
    '#default_value' => variable_get('sweaver_selectors_exclude', SWEAVER_SELECTORS_EXCLUDE),
69
    '#description' => t('Define on which items the style editor should not be applicable. Enter one selector per line.'),
70
    '#wysiwyg' => FALSE,
71
  );
72
73
  $form['sweaver_classes_exclude'] = array(
74
    '#type' => 'textarea',
75
    '#title' => t('Exclude classes'),
76
    '#default_value' => variable_get('sweaver_classes_exclude', SWEAVER_CLASSES_EXCLUDE),
77
    '#description' => t('Define which classes should never be displayed in the css path. Enter one selector per line.'),
78
    '#wysiwyg' => FALSE,
79
  );
80
81
  $form['sweaver_ctools_allowed_properties'] = array(
82
    '#type' => 'textarea',
83
    '#title' => t('Allowed Properties'),
84
    '#default_value' => variable_get('sweaver_ctools_allowed_properties', SWEAVER_CTOOLS_ALLOWED_PROPERTIES),
85
    '#description' => t('Define which properties can be used in css besides the default ones defined by CTools. That list is found in ctools_css_filter_default_allowed_properties() in ctools/includes/css.inc. Enter one selector per line.'),
86
    '#wysiwyg' => FALSE,
87
  );
88
89
  $form = system_settings_form($form);
90
  $form['#submit'][] = 'sweaver_settings_submit';
91
  return $form;
92
}
93
94
/**
95
 * Settings screen submit.
96
 */
97
function sweaver_settings_submit($form, &$form_state) {
98
  drupal_theme_rebuild();
99
}
100
101
/**
102
 * Sweaver objects list.
103
 *
104
 * Selectors also have weights.
105
 */
106
function sweaver_plugin_editor_objects_list($form, $form_state, $object_type) {
107
108
  $form['#tree'] = TRUE;
109
  $form['#objects'] = array();
110
  $form['#objects_enabled'] = array();
111
  $form['#objects_disabled'] = array();
112
  $form['#object_type'] = $object_type;
113
  $form['#theme'] = 'sweaver_plugin_editor_objects_list';
114
115
  if ($object_type == 'selector') {
116
    $form['info'] = array(
117
      '#markup' => t('<p>Only the selectors enabled in the list below will be available when using Sweaver. The higher a selector is placed, the more important it is.</p><p>Example: if you have a \'div\' with the class \'block\', then the path in the Sweaver frontend can either show \'a region\' or \'a block\', depending or the weight of these selectors.</p>'),
118
    );
119
    $form['checkbox'] = array(
120
      '#type' => 'fieldset',
121
      '#description' => 'Themes can define selectors in the info file. If none are found, the selectors underneath will be used. Toggle the checkbox underneath so Sweaver will look into the theme info file.',
122
    );
123
    $form['checkbox']['sweaver_selectors_source'] = array(
124
      '#type' => 'checkbox',
125
      '#title' => t('Look for selectors in theme info file'),
126
      '#default_value' => variable_get('sweaver_selectors_source', FALSE),
127
    );
128
    $form['checkbox']['submit'] = array(
129
      '#type' => 'submit',
130
      '#value' => t('Save setting'),
131
      '#suffix' => '<div class="clearfix"></div><br />'
132
    );
133
  }
134
135
  $form['add_link'] = array(
136
    '#markup' => l(t('Add new @sweaver_object', array('@sweaver_object' => $object_type)), 'admin/config/user-interface/sweaver/editor/add/'. $object_type),
137
  );
138
139
  $new_weight = 20;
140
  $objects = sweaver_object_load(NULL, $object_type, 'all');
141
    
142
  if (!empty($objects)) {
143
    if ($object_type == 'selector') {
144
      $order = variable_get('sweaver_selector_order', array());
145
    }
146
    foreach ($objects as $key => $object) {
147
      $object_name = check_plain($object->name);
148
      $object_export_type = $object->export_type;
149
      if (isset($order[$object_name])) {
150
        $weight = $order[$object_name];
151
      }
152
      else {
153
        if (isset($object->weight)) {
154
          $weight = $object->weight;
155
        }
156
        else {
157
          $weight = $new_weight++;
158
        }
159
      }
160
161
      $form[$object_name]['name'] = array(
162
        '#markup' => $object_name,
163
      );
164
      $form[$object_name]['description'] = array(
165
        '#markup' => check_plain($object->description),
166
      );
167
      $form[$object_name]['type'] = array(
168
        '#markup' => $object->type,
169
      );
170
171
      // Operations.
172
      $operations = array();
173
      if ($object_export_type != 4) {
174
        $operations['edit'] = l(t('Edit'), 'admin/config/user-interface/sweaver/editor/edit/'. $object_type .'/'. $object_name);
175
      }
176
177
      if ($object_export_type != 2 && $object_export_type != 4) {
178
        $operations['export'] = l(t('Export'), 'admin/config/user-interface/sweaver/editor/export/'. $object_type .'/'. $object_name);
179
      }
180
181
      // Delete - revert.
182
      if ($object_export_type == 1) {
183
        $operations['delete'] = l(t('Delete'), 'admin/config/user-interface/sweaver/editor/delete/'. $object_type .'/'. $object_name);
184
      }
185
      elseif ($object_export_type == 3) {
186
        $operations['delete'] = l(t('Revert'), 'admin/config/user-interface/sweaver/editor/revert/'. $object_type .'/'. $object_name);
187
      }
188
189
      // Disable - enable.
190
      $row_enabled = TRUE;
191
      if ($object_export_type == 2) {
192
        if ($object->disabled) {
193
          $row_enabled = FALSE;
194
          unset($operations['edit']);
195
          unset($operations['export']);
196
          unset($operations['delete']);
197
          $operations['status'] = l(t('Enable'), 'admin/config/user-interface/sweaver/editor/enable/'. $object_type .'/'. $object_name);
198
        }
199
        else {
200
          $operations['status'] = l(t('Disable'), 'admin/config/user-interface/sweaver/editor/disable/'. $object_type .'/'. $object_name);
201
        }
202
      }
203
      // Exception for allids.
204
      if ($object_type == 'selector' && in_array($object_name, array('allids', 'alltags', 'allclasses'))) {
205
        unset($operations['edit']);
206
      }
207
      $form[$object_name]['operations'] = array(
208
        '#markup' => implode(' - ', $operations),
209
      );
210
211
      // Weight for selectors.
212
      if ($object_type == 'selector') {
213
        $form[$object_name]['weight'] = array(
214
          '#type' => 'weight',
215
          '#delta' => 100,
216
          '#attributes' => array(
217
            'class' => array('selector-weight'),
218
          ),
219
          '#default_value' => $weight
220
        );
221
      }
222
223
      if ($row_enabled) {
224
        $form['#objects_enabled'][] = array('weight' => $weight, 'name' => $object_name, 'status' => TRUE);
225
      }
226
      else {
227
        $form['#objects_disabled'][] = array('weight' => $weight, 'name' => $object_name, 'status' => FALSE);
228
      }
229
    }
230
231
    // Merge enabled with disabled.
232
    $form['#objects'] = array_merge($form['#objects_enabled'], $form['#objects_disabled']);
233
  }
234
  else {
235
    $form['info']['#value'] .= t('<p>No @object_type available.</p>', array('@object_type' => $object_type));
236
  }
237
238
  // Add submit button.
239
  if ($object_type == 'selector') {
240
    $form['save_selector_order'] = array(
241
      '#type' => 'submit',
242
      '#value' => t('Save order'),
243
    );
244
  }
245
246
  return $form;
247
}
248
249
/**
250
 * Submit callback. Save objects lists, only used for selectors.
251
 */
252
function sweaver_plugin_editor_objects_list_submit($form, &$form_state) {
253
  // Save selectors source.
254
  variable_set('sweaver_selectors_source', $form_state['values']['checkbox']['sweaver_selectors_source']);
255
256
  $selectors_order = variable_get('sweaver_selector_order', array());
257
258
  foreach ($form['#objects_enabled'] as $key => $object) {
259
    $name = $object['name'];
260
    $selectors_order[$name] = $form_state['values'][$name]['weight'];
261
  }
262
263
  // Save order.
264
  variable_set('sweaver_selector_order', $selectors_order);
265
  drupal_set_message(t('The settings have been saved.'));
266
}
267
268
269
/**
270
 * Theme objects list form.
271
 */
272
function theme_sweaver_plugin_editor_objects_list(&$vars) {
273
274
  $form = &$vars['form'];
275
276
  $output = drupal_render($form['checkbox']);
277
  $output .= drupal_render($form['info']);
278
  $output .= drupal_render($form['add_link']);
279
  drupal_add_css(drupal_get_path('module', 'sweaver') .'/plugins/sweaver_plugin_editor/sweaver_plugin_editor.admin.css');
280
281
  if (!empty($form['#objects'])) {
282
283
    $header = array(
284
      t('Name'),
285
      t('Description'),
286
      t('Status'),
287
      t('Operations'),
288
    );
289
290
    // Add tabledrag for selector type and order the $form['#objects'].
291
    if ($form['#object_type'] == 'selector') {
292
      drupal_add_js('misc/tableheader.js');
293
      drupal_add_tabledrag('object-list-enabled', 'order', 'sibling', 'selector-weight', NULL, NULL, TRUE);
294
      $header[] = t('Weight');
295
      asort($form['#objects']);
296
    }
297
298
    $rows_enabled = array();
299
    $rows_disabled = array();
300
    foreach ($form['#objects'] as $key => $object) {
301
      $row = array();
302
      $object_name = $object['name'];
303
304
      $row[] = drupal_render($form[$object_name]['name']);
305
      $row[] = isset($form[$object_name]['description']) ? drupal_render($form[$object_name]['description']) : '';
306
      $row[] = isset($form[$object_name]['type']) ? drupal_render($form[$object_name]['type']) : '';
307
      $row[] = isset($form[$object_name]['operations']) ? drupal_render($form[$object_name]['operations']) : '';
308
309
      // Selector has a weight.
310
      if ($form['#object_type'] == 'selector') {
311
        if ($object['status']) {
312
          $row[] = drupal_render($form[$object_name]['weight']);
313
        }
314
        else {
315
          $form[$object_name]['weight']['#type'] = 'value';
316
          drupal_render($form[$object_name]['weight']);
317
        }
318
      }
319
320
      // Merge row.
321
      $row = array_merge(array('data' => $row), array());
322
323
      // Only enabled selectors are draggable.
324
      if ($object['status']) {
325
        $row['class'] = array('draggable');
326
        $rows_enabled[] = $row;
327
      }
328
      else {
329
        $row['class'] = array('disabled');
330
        $rows_disabled[] = $row;
331
      }
332
    }
333
334
    // Theme output.
335
    $variables_enabled = array(
336
      'header' => $header,
337
      'rows' => $rows_enabled,
338
      'attributes' => array('id' => 'object-list-enabled'),
339
    );
340
    $output .= theme('table', $variables_enabled);
341
    $output .= drupal_render($form['save_selector_order']);
342
    if (!empty($rows_disabled)) {
343
      $variables_disabled = array(
344
        'header' => array(),
345
        'rows' => $rows_disabled,
346
        'attributes' => array('id' => 'object-list-disabled'),
347
      );
348
      $output .= theme('table', $variables_disabled);
349
    }
350
  }
351
352
  $output .= drupal_render_children($form);
353
354
  return $output;
355
}
356
357
/**
358
 * Object form.
359
 */
360
function sweaver_object_form($form, $form_state, $object_type, $object = NULL) {
361
  $form = array();
362
  $function = 'sweaver_'. $object_type .'_form';
363
  return $function($form, $object);
364
}
365
366
/**
367
 * Object new/edit validate callback.
368
 */
369
function sweaver_object_form_validate(&$form, &$form_state) {
370
  $name = $form_state['values']['name'];
371
  $check_name = $form_state['values']['check_name'];
372
  $object = sweaver_object_load($name, $form['#object_type']);
373
374
  if (isset($object->name) && $check_name) {
375
    form_set_error('name', t('The machine-readable name already exists'));
376
  }
377
378
  if (!preg_match('!^[a-z0-9_-]+$!', $name)) {
379
    form_set_error('name', t('The machine-readable name must contain only lowercase letters, underscores or hyphens.'));
380
  }
381
}
382
383
/**
384
 * Selector new/edit form.
385
 */
386
function sweaver_selector_form(&$form, $selector = NULL) {
387
388
  // Deny access to edit form for allids, allclasses and alltags.
389
  if (isset($selector->name) && in_array($selector->name, array('allids', 'alltags', 'allclasses'))) {
390
    drupal_set_message(t('This selector cannot be edited.'));
391
    drupal_goto('admin/config/user-interface/sweaver/editor/selectors');
392
  }
393
394
  if (empty($selector)) {
395
    $selector = new stdClass;
396
    $selector->name = '';
397
    $selector->description = '';
398
    $selector->selector_selector = '';
399
    $selector->selector_highlight = FALSE;
400
    $selector->export_type = 1;
401
  }
402
403
  if (!isset($selector->oid)) {
404
    $selector->oid = NULL;
405
  }
406
407
  $form['#object_type'] = 'selector';
408
409
  $form['check_name'] = array(
410
    '#type' => 'value',
411
    '#value' => ($selector->export_type == 1 && !isset($selector->oid)) ? TRUE : FALSE,
412
  );
413
414
  $form['oid'] = array(
415
    '#type' => 'value',
416
    '#value' => $selector->oid,
417
  );
418
419
  $form['name'] = array(
420
    '#title' => t('Machine name'),
421
    '#type' => 'textfield',
422
    '#required' => TRUE,
423
    '#default_value' => $selector->name,
424
    '#description' => t('The machine-readable name of this selector. This name must contain only lowercase letters, numbers, underscores or hyphens and must be unique.'),
425
  );
426
  $form['description'] = array(
427
    '#title' => t('Description'),
428
    '#type' => 'textfield',
429
    '#required' => TRUE,
430
    '#default_value' => $selector->description,
431
    '#description' => t('Description of this selector which will be used in the editor.'),
432
  );
433
  $form['selector_selector'] = array(
434
    '#title' => t('Selector'),
435
    '#type' => 'textfield',
436
    '#required' => TRUE,
437
    '#default_value' => $selector->selector_selector,
438
    '#description' => t('The CSS selector which the editor will act on e.g. a.link'),
439
  );
440
  $form['selector_highlight'] = array(
441
    '#title' => t('Highlight'),
442
    '#type' => 'checkbox',
443
    '#default_value' => $selector->selector_highlight,
444
    '#description' => t('Should this selector be highlighted in the path ?'),
445
  );
446
447
  $form['submit'] = array(
448
    '#type' => 'submit',
449
    '#value' => t('Save'),
450
    '#submit' => array('sweaver_selector_form_submit'),
451
  );
452
453
  return $form;
454
}
455
456
/**
457
 * Selector new/edit submit callback.
458
 */
459
function sweaver_selector_form_submit(&$form, &$form_state) {
460
  $values = $form_state['values'];
461
462
  // Build selector.
463
  $selector = new stdClass;
464
  $selector->oid = $values['oid'];
465
  $selector->name = $values['name'];
466
  $selector->description = $values['description'];
467
  $selector->selector_selector = $values['selector_selector'];
468
  $selector->selector_highlight = $values['selector_highlight'];
469
470
  // Save selector.
471
  $update = (isset($selector->oid) && is_numeric($selector->oid)) ? array('oid') : array();
472
  drupal_write_record('sweaver_selector', $selector, $update);
473
  cache_clear_all('sweaver', 'cache');
474
475
  // Message.
476
  $action = empty($update) ? 'added' : 'updated';
477
  $message = t('Selector %selector has been @action.', array('%selector' => $selector->name, '@action' => $action));
478
479
  // Message and redirect.
480
  drupal_set_message($message);
481
  $form_state['redirect'] = 'admin/config/user-interface/sweaver/editor/selectors';
482
}
483
484
/**
485
 * Property new/edit form.
486
 */
487
function sweaver_property_form(&$form, $property = NULL) {
488
489
  if (empty($property)) {
490
    $property = new stdClass;
491
    $property->name = '';
492
    $property->property = '';
493
    $property->property_parent = '';
494
    $property->description = '';
495
    $property->property_type = '';
496
    $property->property_prefix = '';
497
    $property->property_suffix = '';
498
    $property->property_slider_min = 1;
499
    $property->property_slider_max = 72;
500
    $property->property_options = array();
501
    $property->export_type = 1;
502
  }
503
504
  if (!isset($property->oid)) {
505
    $property->oid = NULL;
506
  }
507
508
  // Parents.
509
  $parents = array('' => '');
510
  $all_properties = sweaver_object_load(NULL, 'property', 'all');
511
  foreach ($all_properties as $key => $prop) {
512
    if ($prop->property_type == 'parent') {
513
      $parents[$key] = $prop->description;
514
    }
515
  }
516
517
  $form['#object_type'] = 'property';
518
519
  $form['check_name'] = array(
520
    '#type' => 'value',
521
    '#value' => ($property->export_type == 1 && !isset($property->oid)) ? TRUE : FALSE,
522
  );
523
524
  $form['oid'] = array(
525
    '#type' => 'value',
526
    '#value' => $property->oid,
527
  );
528
529
  $form['name'] = array(
530
    '#title' => t('Machine name'),
531
    '#type' => 'textfield',
532
    '#required' => TRUE,
533
    '#default_value' => $property->name,
534
    '#description' => t('The machine-readable name of this property. This name must contain only lowercase letters, numbers, underscores or hyphens and must be unique.'),
535
  );
536
  $form['property'] = array(
537
    '#title' => t('CSS property'),
538
    '#type' => 'textfield',
539
    '#required' => FALSE,
540
    '#default_value' => $property->property,
541
    '#description' => t('The actual CSS property. Seperate multiple values by spaces. This value can be empty for parent items.'),
542
  );
543
  $form['property_parent'] = array(
544
    '#title' => t('Parent'),
545
    '#type' => 'select',
546
    '#options' => $parents,
547
    '#default_value' => $property->property_parent,
548
    '#description' => t('The parent of this property. Eg, padding-top should have a parent called padding.'),
549
  );
550
  $form['description'] = array(
551
    '#title' => t('Description'),
552
    '#type' => 'textfield',
553
    '#required' => TRUE,
554
    '#default_value' => $property->description,
555
    '#description' => t('Description of this property which will be used in the editor.'),
556
  );
557
  $form['property_prefix'] = array(
558
    '#title' => t('Prefix'),
559
    '#type' => 'textfield',
560
    '#default_value' => $property->property_prefix,
561
    '#description' => t('Prefix of this property.'),
562
  );
563
  $form['property_suffix'] = array(
564
    '#title' => t('Suffix'),
565
    '#type' => 'textfield',
566
    '#default_value' => $property->property_suffix,
567
    '#description' => t('Suffix of this property.'),
568
  );
569
570
  $types = array(
571
    'parent' => t('Parent'),
572
    'slider' => t('Slider'),
573
    'select' => t('Select'),
574
    'color' => t('Color'),
575
    'image' => t('Image'),
576
    'radio' => t('Radio'),
577
    'checkbox' => t('Checkbox'),
578
  );
579
  $form['property_type'] = array(
580
    '#title' => t('Type'),
581
    '#type' => 'select',
582
    '#options' => $types,
583
    '#default_value' => $property->property_type,
584
    '#description' => t('Selection type of this property. A parent can have children underneath, grouping other stuff together.'),
585
  );
586
  $form['property_slider_min'] = array(
587
    '#title' => t('Slider minimum'),
588
    '#type' => 'textfield',
589
    '#default_value' => $property->property_slider_min,
590
    '#description' => t('Minimum value for the slider, only applicable for the slider.'),
591
  );
592
  $form['property_slider_max'] = array(
593
    '#title' => t('Slider maximum'),
594
    '#type' => 'textfield',
595
    '#default_value' => $property->property_slider_max,
596
    '#description' => t('Maximum value for the slider, only applicable for the slider.'),
597
  );
598
599
  $property_options = '';
600
  sweaver_export_check_serialized_keys($property);
601
  if (is_array($property->property_options)) {
602
    foreach ($property->property_options as $key => $value) {
603
      $property_options .= $key .'|'. $value ."\n";
604
    }
605
  }
606
  $form['property_options'] = array(
607
    '#title' => t('Options'),
608
    '#type' => 'textarea',
609
    '#default_value' => $property_options,
610
    '#description' => t('Options for this property. Enter options per line and separate key and value by |.'),
611
    '#wysiwyg' => FALSE,
612
  );
613
614
  $form['submit'] = array(
615
    '#type' => 'submit',
616
    '#value' => t('Save'),
617
    '#submit' => array('sweaver_property_form_submit'),
618
  );
619
620
  return $form;
621
}
622
623
/**
624
 * Property new/edit submit callback.
625
 */
626
function sweaver_property_form_submit(&$form, &$form_state) {
627
  $values = $form_state['values'];
628
629
  // Build selector.
630
  $property = new stdClass;
631
  $property->oid = $values['oid'];
632
  $property->name = $values['name'];
633
  $property->property = $values['property'];
634
  $property->description = $values['description'];
635
  $property->property_parent = $values['property_parent'];
636
  $property->property_type = $values['property_type'];
637
  $property->property_prefix = $values['property_prefix'];
638
  $property->property_suffix = $values['property_suffix'];
639
  $property->property_slider_min = $values['property_slider_min'];
640
  $property->property_slider_max = $values['property_slider_max'];
641
  $options = array();
642
  $property_options = explode("\n", trim($values['property_options']));
643
  foreach ($property_options as $key => $line) {
644
    $line_explode = explode("|", $line);
645
    if (count($line_explode) == 2) {
646
      $options[$line_explode[0]] = trim($line_explode[1]);
647
    }
648
  }
649
  $property->property_options = serialize($options);
650
651
  // Save property.
652
  $update = (isset($property->oid) && is_numeric($property->oid)) ? array('oid') : array();
653
  drupal_write_record('sweaver_property', $property, $update);
654
  cache_clear_all('sweaver', 'cache');
655
656
  // Message.
657
  $action = empty($update) ? 'added' : 'updated';
658
  $message = t('Property %property has been @action.', array('%property' => $property->name, '@action' => $action));
659
660
  // Message and redirect.
661
  drupal_set_message($message);
662
  $form_state['redirect'] = 'admin/config/user-interface/sweaver/editor/properties';
663
}
664
665
/**
666
 * Type new/edit form.
667
 */
668
function sweaver_type_form(&$form, $type = NULL) {
669
670
  if (empty($type)) {
671
    $type = new stdClass;
672
    $type->name = '';
673
    $type->description = '';
674
    $type->type_options = array();
675
    $type->export_type = 1;
676
  }
677
678
  if (!isset($type->oid)) {
679
    $type->oid = NULL;
680
  }
681
682
  $form['#object_type'] = 'type';
683
684
  $form['check_name'] = array(
685
    '#type' => 'value',
686
    '#value' => ($type->export_type == 1 && !isset($type->oid)) ? TRUE : FALSE,
687
  );
688
689
  $form['oid'] = array(
690
    '#type' => 'value',
691
    '#value' => $type->oid,
692
  );
693
694
  $form['name'] = array(
695
    '#title' => t('Machine name'),
696
    '#type' => 'textfield',
697
    '#required' => TRUE,
698
    '#default_value' => $type->name,
699
    '#description' => t('The machine-readable name of this type. This name must contain only lowercase letters, numbers, underscores or hyphens and must be unique.'),
700
  );
701
  $form['description'] = array(
702
    '#title' => t('Description'),
703
    '#type' => 'textfield',
704
    '#required' => TRUE,
705
    '#default_value' => $type->description,
706
    '#description' => t('Description of this type only to be used for administration forms.'),
707
  );
708
709
  $type_options = sweaver_ctools_object_list('property', -1, TRUE);
710
  sweaver_export_check_serialized_keys($type);
711
  $form['type_options'] = array(
712
    '#title' => t('Options'),
713
    '#type' => 'checkboxes',
714
    '#options' => $type_options,
715
    '#default_value' => $type->type_options,
716
    '#description' => t('Options for this type.'),
717
  );
718
719
  $form['submit'] = array(
720
    '#type' => 'submit',
721
    '#value' => t('Save'),
722
    '#submit' => array('sweaver_type_form_submit'),
723
  );
724
725
  return $form;
726
}
727
728
/**
729
 * Property new/edit submit callback.
730
 */
731
function sweaver_type_form_submit(&$form, &$form_state) {
732
  $values = $form_state['values'];
733
734
  // Build selector.
735
  $type = new stdClass;
736
  $type->oid = $values['oid'];
737
  $type->name = $values['name'];
738
  $type->description = $values['description'];
739
  $options = $values['type_options'];
740
  foreach ($options as $key => $value) {
741
    if ($key !== $value) {
742
      unset($options[$key]);
743
    }
744
  }
745
  $type->type_options = serialize($options);
746
747
  // Save property.
748
  $update = (isset($type->oid) && is_numeric($type->oid)) ? array('oid') : array();
749
  drupal_write_record('sweaver_type', $type, $update);
750
  cache_clear_all('sweaver', 'cache');
751
752
  // Message.
753
  $action = empty($update) ? 'added' : 'updated';
754
  $message = t('Type %type has been @action.', array('%type' => $type->name, '@action' => $action));
755
756
  // Message and redirect.
757
  drupal_set_message($message);
758
  $form_state['redirect'] = 'admin/config/user-interface/sweaver/editor/types';
759
}
760
761
/**
762
 * Export an object.
763
 */
764
function sweaver_object_export($object_type, $object) {
765
  drupal_set_title(check_plain($object->description));
766
  $code = sweaver_export_sweaver_object($object, $object_type);
767
  return drupal_get_form('ctools_export_form', $code, check_plain($object->description));
768
}
769
770
/**
771
 * Delete object form.
772
 */
773
function sweaver_object_delete($form, &$form_state, $redirect, $object_type, $object, $action, $action_message) {
774
  if ($object->export_type != 2) {
775
    $form['#object'] = $object;
776
    $form['#object_type'] = $object_type;
777
    $form['#object_redirect'] = $redirect;
778
    $form['#action_message'] = $action_message;
779
    return confirm_form($form, t('Are you sure you want to @action @type %object?', array('@action' => $action, '@type' => $object_type , '%object' => $object->name)), 'admin/config/user-interface/sweaver/editor/'. $redirect);
780
  }
781
  else {
782
    drupal_goto('admin/config/user-interface/sweaver/editor/'. $redirect);
783
  }
784
}
785
786
/**
787
 * Delete object submit callback.
788
 */
789
function sweaver_object_delete_submit(&$form, &$form_state) {
790
  cache_clear_all('sweaver', 'cache');
791
  $object = $form['#object'];
792
  $redirect = $form['#object_redirect'];
793
  $object_type = $form['#object_type'];
794
  $action_message = $form['#action_message'];
795
  db_query("DELETE FROM {sweaver_" . $object_type . "} WHERE oid = :oid", array(':oid' => $object->oid));
796
  drupal_set_message(t('Selector %selector has been @action_message.', array('@action_message' => $action_message, '%selector' => $object->name)));
797
  $form_state['redirect'] = 'admin/config/user-interface/sweaver/editor/'. $redirect;
798
}
799
800
/**
801
 * Enable or disable an object.
802
 */
803
function sweaver_object_status($redirect, $object, $status) {
804
  ctools_include('export');
805
  ctools_export_set_object_status($object, $status);
806
  cache_clear_all('sweaver', 'cache');
807
  drupal_goto('admin/config/user-interface/sweaver/editor/'. $redirect);
808
}
809
810
/**
811
 * Editor form.
812
 */
813
function sweaver_plugin_editor_config_editor($form, &$form_state) {
814
  $form = array();
815
  $form['#tree'] = TRUE;
816
  $form['#properties_tree'] = array();
817
  $form['#properties_region'] = array();
818
  $form['#containers'] = sweaver_containers();
819
  $sweaver_editor_form_configuration = variable_get('sweaver_editor_form_configuration', array());
820
821
  $order = array();
822
  foreach ($sweaver_editor_form_configuration as $container => $settings) {
823
824
    $form['container_form_'. $container] = array(
825
      '#type' => 'textfield',
826
      '#default_value' => $settings['title'],
827
      '#size' => 15,
828
      '#attributes' => array(
829
        'class' => array('container-label-edit'),
830
      ),
831
    );
832
833
    foreach ($settings['properties'] as $weight => $field) {
834
      $order[$field]['weight'] = $weight;
835
      $order[$field]['container'] = $container;
836
    }
837
  }
838
839
  $new_weight = 100;
840
  $properties = sweaver_object_load(NULL, 'property', 'enabled');
841
  foreach ($properties as $key => $property) {
842
843
    if (!empty($property->property_parent)) {
844
      continue;
845
    }
846
847
    $container = isset($order[$key]) ? $order[$key]['container'] : 'one';
848
    $weight = isset($order[$key]) ? $order[$key]['weight'] : $new_weight;
849
850
    $form['#properties_tree'][$key] = $key;
851
    $form['#properties_region'][$container][$weight] = $key;
852
853
    $form[$key]['name'] = array(
854
      '#markup' => $property->description,
855
    );
856
    $form[$key]['weight'] = array(
857
      '#type' => 'weight',
858
      '#delta' => 50,
859
      '#attributes' => array(
860
        'class' => array('property-weight', 'property-weight-'. $container),
861
      ),
862
      '#default_value' => $weight,
863
    );
864
    $form[$key]['container'] = array(
865
      '#type' => 'select',
866
      '#options' => sweaver_containers(),
867
      '#attributes' => array(
868
        'class' => array('property-container-select', 'property-container-'. $container),
869
      ),
870
      '#default_value' => $container,
871
    );
872
873
    $new_weight++;
874
  }
875
876
  $form['submit'] = array(
877
    '#type' => 'submit',
878
    '#value' => t('Save configuration'),
879
  );
880
881
  return $form;
882
}
883
884
/**
885
 * Editor form submit callback.
886
 */
887
function sweaver_plugin_editor_config_editor_submit(&$form, &$form_state) {
888
889
  $values = $form_state['values'];
890
  $editor_form_configuration = array();
891
892
  // Properties.
893
  foreach ($form['#properties_tree'] as $property_key) {
894
    $property = $values[$property_key];
895
    $editor_form_configuration[$property['container']]['properties'][$property['weight']] = $property_key;
896
  }
897
898
  // Containers title and properties order.
899
  foreach ($form['#containers'] as $container_key => $container) {
900
    $editor_form_configuration[$container_key]['title'] = $values['container_form_'. $container_key];
901
    if (isset($editor_form_configuration[$container_key]['properties'])) {
902
      ksort($editor_form_configuration[$container_key]['properties']);
903
    }
904
    else {
905
      $editor_form_configuration[$container_key]['properties'] = array();
906
    }
907
  }
908
909
  drupal_set_message(t('The configuration options have been saved.'));
910
  variable_set('sweaver_editor_form_configuration', $editor_form_configuration);
911
}