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
<?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
}