Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<?php
// $Id
/**
* @file
* Allows administrators to inject CSS into the page output based on
* configurable rules. Useful for adding simple CSS tweaks without modifying
* a site's official theme.
*/
/**
* Implementation of hook_init.
* Checks to see whether any CSS files should be added to the current page,
* based on rules configured by the site administrator.
*/
function css_injector_init() {
$css_rules = _css_injector_load_rule();
foreach($css_rules as $css_rule) {
if (_css_injector_evaluate_rule($css_rule)) {
drupal_add_css(file_create_path($css_rule['file_path']), 'module', $css_rule['media'], $css_rule['preprocess']);
}
}
}
/**
* Implementation of hook_menu.
* Defines menu callbacks for CSS Injector's configuration pages.
*/
function css_injector_menu() {
$items = array(
'admin/settings/css_injector' => array(
'title' => 'CSS injector',
'description' => 'Add CSS to the page output based on configurable rules.',
'page callback' => 'drupal_get_form',
'page arguments' => array('css_injector_admin_form'),
'access callback' => 'user_access',
'access arguments' => array('administer css injection'),
'file' => 'css_injector.admin.inc',
),
'admin/settings/css_injector/edit' => array(
'title' => 'Edit CSS injector rule',
'page callback' => 'drupal_get_form',
'page arguments' => array('css_injector_edit'),
'file' => 'css_injector.admin.inc',
),
'admin/settings/css_injector/add' => array(
'title' => 'Add CSS injector rule',
'page callback' => 'drupal_get_form',
'page arguments' => array('css_injector_edit'),
'file' => 'css_injector.admin.inc',
),
'admin/settings/css_injector/delete' => array(
'title' => 'Add CSS injector rule',
'page callback' => 'drupal_get_form',
'page arguments' => array('css_injector_delete_confirm'),
'file' => 'css_injector.admin.inc',
),
);
return $items;
}
function css_injector_theme() {
$items['css_injector_admin_form'] = array(
'arguments' => array('form' => array()),
'file' => 'css_injector.admin.inc',
);
return $items;
}
function css_injector_perm() {
return array('administer css injection');
}
/**
* Helper function to load all CSS injection rules
*/
function _css_injector_load_rule($crid = NULL, $reset = FALSE) {
static $rules;
if (!isset($rules) || $reset) {
if (!$reset && ($cache = cache_get('css_injector:rules')) && !empty($cache->data)) {
$rules = $cache->data;
}
else {
$rules = array();
$results = db_query("SELECT * FROM {css_injector_rule}");
while ($rule = db_fetch_array($results)) {
$rules[$rule['crid']] = $rule;
}
cache_set('css_injector:rules', $rules);
}
}
if (is_numeric($crid)) {
return $rules[$crid];
}
else {
return $rules;
}
}
/**
* Helper function to delete an existing rule and its accompanying file
*/
function _css_injector_delete_rule($crid) {
if ($rule = _css_injector_load_rule($crid)) {
file_delete(file_create_path($rule['file_path']));
db_query("DELETE FROM {css_injector_rule} WHERE crid = %d", $crid);
}
}
/**
* Helper function to determine whether a rule's conditions are met
*/
function _css_injector_evaluate_rule($css_rule = array()) {
// Match path if necessary
if (!empty($css_rule['rule_conditions'])) {
if ($css_rule['rule_type'] < 2) {
$path = drupal_get_path_alias($_GET['q']);
// Compare with the internal and path alias (if any).
$page_match = drupal_match_path($path, $css_rule['rule_conditions']);
if ($path != $_GET['q']) {
$page_match = $page_match || drupal_match_path($_GET['q'], $css_rule['rule_conditions']);
}
// When $css_rule['rule_type'] has a value of 0, the rule is matched on
// all pages except those listed in $css_rule['rule_conditions']. When set to 1, it
// is displayed only on those pages listed in $css_rule['rule_type'].
$page_match = !($css_rule['rule_type'] xor $page_match);
}
else {
$page_match = drupal_eval($css_rule['rule_conditions']);
}
}
else {
$page_match = TRUE;
}
return $page_match;
}