1
|
<?php
|
2
|
/**
|
3
|
* @file css_injector.admin.inc
|
4
|
* Administrative interface for CSS Injector.
|
5
|
*/
|
6
|
|
7
|
/**
|
8
|
* Form builder function for CSS Injector's main admin page.
|
9
|
*/
|
10
|
function css_injector_admin_form($form, &$form_state) {
|
11
|
$rules = _css_injector_load_rule(NULL, TRUE);
|
12
|
$path = drupal_get_path('module', 'css_injector') . '/';
|
13
|
$form = array();
|
14
|
$form['#tree'] = TRUE;
|
15
|
|
16
|
// Adding css stylesheet for icons.
|
17
|
$form['#attached']['css'] = array(
|
18
|
drupal_get_path('module', 'css_injector') . '/css_injector.css',
|
19
|
);
|
20
|
|
21
|
foreach ($rules as $rule) {
|
22
|
$form['rules'][$rule['crid']]['#rule'] = $rule;
|
23
|
$form['rules'][$rule['crid']]['edit'] = array(
|
24
|
'#type' => 'submit',
|
25
|
'#value' => t('Edit rule'),
|
26
|
'#name' => 'edit' . $rule['crid'],
|
27
|
'#submit' => array('css_injector_admin_edit_button'),
|
28
|
'#attributes' => array('class' => array('css-inject-edit')),
|
29
|
'#crid' => $rule['crid'],
|
30
|
);
|
31
|
$form['rules'][$rule['crid']]['delete'] = array(
|
32
|
'#type' => 'submit',
|
33
|
'#value' => t('Delete rule'),
|
34
|
'#name' => 'delete' . $rule['crid'],
|
35
|
'#submit' => array('css_injector_admin_delete_button'),
|
36
|
'#attributes' => array('class' => array('css-inject-delete')),
|
37
|
'#crid' => $rule['crid'],
|
38
|
);
|
39
|
}
|
40
|
return $form;
|
41
|
}
|
42
|
|
43
|
/**
|
44
|
* Edit button callback for the CSS rule listing form.
|
45
|
*/
|
46
|
function css_injector_admin_edit_button($form, &$form_state) {
|
47
|
$button = $form_state['triggering_element'];
|
48
|
$crid = $button['#crid'];
|
49
|
$form_state['redirect'] = 'admin/config/development/css-injector/edit/' . $crid;
|
50
|
}
|
51
|
|
52
|
/**
|
53
|
* Delete button callback for the CSS rule listing form.
|
54
|
* Redirects the user to the confirmation form.
|
55
|
*/
|
56
|
function css_injector_admin_delete_button($form, &$form_state) {
|
57
|
$button = $form_state['triggering_element'];
|
58
|
$crid = $button['#crid'];
|
59
|
$form_state['redirect'] = 'admin/config/development/css-injector/delete/' . $crid;
|
60
|
}
|
61
|
|
62
|
/**
|
63
|
* Theme function for the CSS Injector admin overview form.
|
64
|
*/
|
65
|
function theme_css_injector_admin_form($variables) {
|
66
|
$form = $variables['form'];
|
67
|
$headers = array(t('Title'), t('Location'), t('Actions'));
|
68
|
$rows = array();
|
69
|
if (!empty($form['rules'])) {
|
70
|
foreach (element_children($form['rules']) as $crid) {
|
71
|
$row = array();
|
72
|
$rule = $form['rules'][$crid]['#rule'];
|
73
|
$row[] = check_plain($rule['title']);
|
74
|
$row[] = _css_injector_rule_uri($rule['crid']);
|
75
|
$row[] = drupal_render($form['rules'][$crid]);
|
76
|
$rows[] = $row;
|
77
|
}
|
78
|
}
|
79
|
|
80
|
$link = l(t('Create a new rule'), 'admin/config/development/css-injector/add');
|
81
|
$row = array();
|
82
|
if (empty($rows)) {
|
83
|
$row[] = array(
|
84
|
'data' => t('No CSS injection rules have been set up yet. !url.', array('!url' => $link)),
|
85
|
'colspan' => 3,
|
86
|
);
|
87
|
}
|
88
|
else {
|
89
|
$row[] = array(
|
90
|
'data' => t('!url.', array('!url' => $link)),
|
91
|
'colspan' => 3,
|
92
|
);
|
93
|
}
|
94
|
$rows[] = $row;
|
95
|
|
96
|
$output = theme('table', array('header' => $headers, 'rows' => $rows));
|
97
|
$output .= drupal_render_children($form);
|
98
|
return $output;
|
99
|
}
|
100
|
|
101
|
/**
|
102
|
* Form builder function for the CSS rule edit form.
|
103
|
*/
|
104
|
function css_injector_edit($form, $form_state, $crid = NULL) {
|
105
|
if (isset($crid)) {
|
106
|
$rule = _css_injector_load_rule($crid, TRUE);
|
107
|
$path = _css_injector_rule_uri($rule['crid']);
|
108
|
if (file_exists($path)) {
|
109
|
$rule['css_text'] = file_get_contents($path);
|
110
|
}
|
111
|
else {
|
112
|
$rule['css_text'] = '';
|
113
|
}
|
114
|
}
|
115
|
else {
|
116
|
$rule = array(
|
117
|
'title' => '',
|
118
|
'rule_type' => CSS_INJECTOR_PAGES_NOTLISTED,
|
119
|
'rule_themes' => '',
|
120
|
'rule_conditions' => '',
|
121
|
'media' => 'all',
|
122
|
'preprocess' => 1,
|
123
|
'css_text' => '',
|
124
|
'enabled' => 1,
|
125
|
);
|
126
|
}
|
127
|
|
128
|
// Adding css stylesheet for icons.
|
129
|
$form['#attached']['js'] = array(
|
130
|
drupal_get_path('module', 'css_injector') . '/ace/ace.js',
|
131
|
drupal_get_path('module', 'css_injector') . '/syntax_highlighter.js',
|
132
|
);
|
133
|
|
134
|
$form['#attached']['css'] = array(
|
135
|
drupal_get_path('module', 'css_injector') . '/syntax_highlighter.css',
|
136
|
);
|
137
|
|
138
|
if (isset($crid)) {
|
139
|
$form['crid'] = array(
|
140
|
'#type' => 'value',
|
141
|
'#value' => $crid,
|
142
|
);
|
143
|
}
|
144
|
|
145
|
$form['title'] = array(
|
146
|
'#type' => 'textfield',
|
147
|
'#title' => t('Title'),
|
148
|
'#default_value' => $rule['title'],
|
149
|
'#required' => TRUE,
|
150
|
);
|
151
|
|
152
|
$form['css_text'] = array(
|
153
|
'#type' => 'textarea',
|
154
|
'#title' => t('CSS code'),
|
155
|
'#rows' => 10,
|
156
|
'#default_value' => $rule['css_text'],
|
157
|
'#required' => TRUE,
|
158
|
);
|
159
|
|
160
|
$form['css_text_ace'] = array(
|
161
|
'#prefix' => '<span class="disable-ace">Disable syntax highlighter</span>',
|
162
|
'#markup' => '<div class="ace-editor"><div id="editor">' . $rule['css_text'] . '</div></div>',
|
163
|
);
|
164
|
|
165
|
// Get info of site themes.
|
166
|
$themes = array();
|
167
|
$theme_list = list_themes();
|
168
|
$default_theme = variable_get('theme_default');
|
169
|
foreach ($theme_list as $single_theme) {
|
170
|
$themes[$single_theme->name] = $single_theme->info['name'];
|
171
|
}
|
172
|
$rule['rule_themes'] = unserialize($rule['rule_themes']);
|
173
|
|
174
|
$form['conditional']['rule_themes'] = array(
|
175
|
'#type' => 'select',
|
176
|
'#title' => 'Themes to show on',
|
177
|
'#default_value' => isset($rule['rule_themes']) ? $rule['rule_themes'] : $default_theme,
|
178
|
'#options' => $themes,
|
179
|
'#description' => t('Select themes css will be applied to. @theme theme is selected by default.', array('@theme' => $themes[$default_theme])),
|
180
|
'#multiple' => TRUE,
|
181
|
);
|
182
|
|
183
|
// Shamelessly ripped from block.module. Who doesn't use this snippet
|
184
|
// of code, really?
|
185
|
$php_access = (user_access('use PHP for settings') && module_exists('php'));
|
186
|
$options = array(
|
187
|
CSS_INJECTOR_PAGES_NOTLISTED => t('Add on every page except the listed pages.'),
|
188
|
CSS_INJECTOR_PAGES_LISTED => t('add on only the listed pages.')
|
189
|
);
|
190
|
$description = t("Enter one page per line as Drupal paths. The '*' character is a wildcard. Example paths are %blog for the blog page and %blog-wildcard for every personal blog. %front is the front page.", array('%blog' => 'blog', '%blog-wildcard' => 'blog/*', '%front' => '<front>'));
|
191
|
|
192
|
if ($php_access) {
|
193
|
$options[CSS_INJECTOR_PHP] = t('Add if the following PHP code outputs a nonzero value (PHP-mode, experts only).');
|
194
|
$description .= ' ' . t('If the PHP-mode is chosen, enter PHP code between %php. Note that executing incorrect PHP-code can break your Drupal site.', array('%php' => '<?php ?>'));
|
195
|
}
|
196
|
$form['conditional']['rule_type'] = array(
|
197
|
'#type' => 'radios',
|
198
|
'#title' => t('Add the CSS on specific pages'),
|
199
|
'#options' => $options,
|
200
|
'#default_value' => $rule['rule_type'],
|
201
|
);
|
202
|
$form['conditional']['rule_conditions'] = array(
|
203
|
'#type' => 'textarea',
|
204
|
'#title' => t('Pages'),
|
205
|
'#default_value' => $rule['rule_conditions'],
|
206
|
'#description' => $description,
|
207
|
);
|
208
|
$form['media'] = array(
|
209
|
'#type' => 'select',
|
210
|
'#title' => t('Media'),
|
211
|
'#options' => array(
|
212
|
'all' => t('All'),
|
213
|
'screen' => t('Screen'),
|
214
|
'print' => t('Print'),
|
215
|
'IE 7' => t('IE7'),
|
216
|
'IE 8' => t('IE8'),
|
217
|
'IE 9' => t('IE9'),
|
218
|
),
|
219
|
'#default_value' => $rule['media'],
|
220
|
);
|
221
|
|
222
|
$form['preprocess'] = array(
|
223
|
'#type' => 'checkbox',
|
224
|
'#title' => t('Preprocess CSS'),
|
225
|
'#default_value' => $rule['preprocess'],
|
226
|
);
|
227
|
$form['enabled'] = array(
|
228
|
'#type' => 'checkbox',
|
229
|
'#title' => t('Enable rule'),
|
230
|
'#default_value' => isset($rule['enabled']) ? $rule['enabled'] : 1,
|
231
|
);
|
232
|
|
233
|
$form['buttons']['save'] = array(
|
234
|
'#type' => 'submit',
|
235
|
'#value' => t('Save'),
|
236
|
'#submit' => array('css_injector_edit_save'),
|
237
|
);
|
238
|
$form['buttons']['save_and_continue'] = array(
|
239
|
'#type' => 'submit',
|
240
|
'#value' => t('Save and Continue Editing'),
|
241
|
'#submit' => array('css_injector_edit_save_and_continue'),
|
242
|
);
|
243
|
|
244
|
if (!empty($rule['crid'])) {
|
245
|
$form['buttons']['delete'] = array(
|
246
|
'#type' => 'submit',
|
247
|
'#value' => t('Delete'),
|
248
|
'#crid' => $rule['crid'],
|
249
|
'#submit' => array('css_injector_admin_delete_button'),
|
250
|
);
|
251
|
}
|
252
|
|
253
|
return $form;
|
254
|
}
|
255
|
|
256
|
/**
|
257
|
* Validation callback for the CSS rule edit form.
|
258
|
*/
|
259
|
function css_injector_edit_validate($form, &$form_state) {
|
260
|
$directory = drupal_realpath('public://css_injector');
|
261
|
if (!file_prepare_directory($directory, FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS)) {
|
262
|
form_error($form, t('The directory %directory is not writable', array('%directory' => $directory)));
|
263
|
}
|
264
|
}
|
265
|
|
266
|
/**
|
267
|
* Submit button callback for the CSS rule edit form.
|
268
|
*/
|
269
|
function css_injector_edit_save($form, &$form_state) {
|
270
|
//$themes = implode('//', $form_state['values']['themes']);
|
271
|
$rule = $form_state['values'];
|
272
|
$crid = !empty($form_state['values']['crid']) ? $form_state['values']['crid'] : NULL;
|
273
|
// Serialize themes list before inserting to databse.
|
274
|
$rule['rule_themes'] = serialize($rule['rule_themes']);
|
275
|
drupal_write_record('css_injector_rule', $rule, empty($crid) ? array() : 'crid');
|
276
|
// Unserialize themes list for form state.
|
277
|
$rule['rule_themes'] = unserialize($rule['rule_themes']);
|
278
|
$form_state['values']['rule'] = $rule;
|
279
|
file_unmanaged_save_data($rule['css_text'], _css_injector_rule_uri($rule['crid']), FILE_EXISTS_REPLACE);
|
280
|
_css_injector_load_rule(NULL, TRUE);
|
281
|
|
282
|
drupal_set_message(t('Your CSS injection rule %title was saved.', array('%title' => $rule['title'])));
|
283
|
$form_state['redirect'] = 'admin/config/development/css-injector';
|
284
|
}
|
285
|
|
286
|
/**
|
287
|
* Save and continue callback for the CSS rule edit form.
|
288
|
*/
|
289
|
function css_injector_edit_save_and_continue($form, &$form_state) {
|
290
|
css_injector_edit_save($form, $form_state);
|
291
|
$form_state['redirect'] = 'admin/config/development/css-injector/edit/' . $form_state['values']['rule']['crid'];
|
292
|
}
|
293
|
|
294
|
|
295
|
/**
|
296
|
* Menu callback -- ask for confirmation of rule deletion.
|
297
|
*/
|
298
|
function css_injector_delete_confirm($form, &$form_state, $crid) {
|
299
|
$form['crid'] = array(
|
300
|
'#type' => 'value',
|
301
|
'#value' => $crid,
|
302
|
);
|
303
|
|
304
|
$rule = _css_injector_load_rule($crid);
|
305
|
return confirm_form($form,
|
306
|
t('Are you sure you want to delete %title?', array('%title' => $rule['title'])),
|
307
|
isset($_GET['destination']) ? $_GET['destination'] : 'admin/config/development/css-injector',
|
308
|
t('This action cannot be undone.'),
|
309
|
t('Delete'),
|
310
|
t('Cancel')
|
311
|
);
|
312
|
}
|
313
|
|
314
|
/**
|
315
|
* Execute node deletion.
|
316
|
*/
|
317
|
function css_injector_delete_confirm_submit($form, &$form_state) {
|
318
|
if ($form_state['values']['confirm']) {
|
319
|
_css_injector_delete_rule($form_state['values']['crid']);
|
320
|
}
|
321
|
|
322
|
$form_state['redirect'] = 'admin/config/development/css-injector';
|
323
|
return;
|
324
|
}
|