1
|
<?php
|
2
|
|
3
|
/**
|
4
|
* @file
|
5
|
* Provides the theming functions for fivestar
|
6
|
*/
|
7
|
|
8
|
/**
|
9
|
* Show a preview of a widget using a custom CSS file.
|
10
|
*/
|
11
|
function theme_fivestar_preview_widget($variables) {
|
12
|
$path = drupal_get_path('module', 'fivestar');
|
13
|
$form = array(
|
14
|
'#post' => array(),
|
15
|
'#programmed' => FALSE,
|
16
|
'#tree' => FALSE,
|
17
|
'#parents' => array(),
|
18
|
'#array_parents' => array(),
|
19
|
'#required' => FALSE,
|
20
|
'#attributes' => array(),
|
21
|
'#title_display' => 'before',
|
22
|
);
|
23
|
$form_state = form_state_defaults();
|
24
|
$form_state['values'] = array();
|
25
|
$form_state['process_input'] = array();
|
26
|
$form_state['complete form'] = array();
|
27
|
|
28
|
$form['vote'] = array(
|
29
|
'#type' => 'fivestar',
|
30
|
'#stars' => 5,
|
31
|
'#auto_submit' => FALSE,
|
32
|
'#allow_clear' => TRUE,
|
33
|
'#widget' => array(
|
34
|
'name' => isset($variables['name']) ? $variables['name'] : 'default',
|
35
|
'css' => isset($variables['css']) && $variables['css'] != 'default' ? $variables['css'] : FALSE,
|
36
|
),
|
37
|
);
|
38
|
|
39
|
// Attach necessary JS settings
|
40
|
$settings = array(
|
41
|
'titleUser' => t('Your rating') .': ',
|
42
|
'titleAverage' => t('Average') .': ',
|
43
|
'feedbackSavingVote' => t('Saving your vote...'),
|
44
|
'feedbackVoteSaved' => t('Your vote has been saved.'),
|
45
|
'feedbackDeletingVote' => t('Deleting your vote...'),
|
46
|
'feedbackVoteDeleted' => t('Your vote has been deleted.'),
|
47
|
);
|
48
|
|
49
|
drupal_add_js(array('fivestar' => $settings), 'setting');
|
50
|
|
51
|
$form = form_builder('fivestar_preview', $form, $form_state);
|
52
|
|
53
|
$output = '<div class="fivestar-star-preview fivestar-' . $form['vote']['#widget']['name'] . '">';
|
54
|
$output .= drupal_render_children($form);
|
55
|
$output .= '</div>';
|
56
|
|
57
|
return $output;
|
58
|
}
|
59
|
|
60
|
function theme_fivestar_preview($variables) {
|
61
|
extract($variables, EXTR_SKIP);
|
62
|
$values = array(
|
63
|
'average' => 50,
|
64
|
'user' => 80,
|
65
|
'count' => 20,
|
66
|
);
|
67
|
$settings = array(
|
68
|
'stars' => $stars,
|
69
|
'allow_clear' => $unvote,
|
70
|
'style' => $style,
|
71
|
'text' => $text,
|
72
|
'title' => $title,
|
73
|
'autosubmit' => FALSE,
|
74
|
'tag' => 'vote',
|
75
|
);
|
76
|
|
77
|
$form = drupal_get_form('fivestar_custom_widget', $values, $settings);
|
78
|
$form = drupal_render($form);
|
79
|
// This regex is sadly necessary because having duplicate form_tokens or
|
80
|
// form_id elements can cause the content type form to choke. Forms inside of
|
81
|
// forms is also frowned upon, so this removes the wrapping form tag as well.
|
82
|
$form = str_replace(array('<form', '</form>'), array('<div', '</div>'), $form);
|
83
|
$form = preg_replace('/( method=".*?")|( action=".*?")|(<input.*?name="(form_token|form_id|destination|form_build_id)".*?\/>)/', '', $form);
|
84
|
return $form;
|
85
|
}
|
86
|
|
87
|
function theme_fivestar_preview_wrapper($variables) {
|
88
|
return '<div class="fivestar-preview fivestar-preview-'. $variables['type'] .'">'. $variables['content'] .'</div>';
|
89
|
}
|
90
|
|
91
|
/**
|
92
|
* Theme function for 'default' fivestar field formatter.
|
93
|
*
|
94
|
* This themes static stars. That is, pairs of stars where neither set
|
95
|
* of stars is "exposed". Exposed stars are clickable and displayed in a
|
96
|
* form. Theming of exposed stars is handled by the form array (and calls
|
97
|
* the same theme functions called at the end of this function).
|
98
|
*/
|
99
|
function theme_fivestar_formatter_default($variables) {
|
100
|
$element = $variables['element'];
|
101
|
if (empty($element['#instance_settings']['stars'])) {
|
102
|
$element['#instance_settings']['stars'] = 5;
|
103
|
}
|
104
|
|
105
|
// Add CSS and JS
|
106
|
$path = drupal_get_path('module', 'fivestar');
|
107
|
drupal_add_js($path . '/js/fivestar.js');
|
108
|
drupal_add_css($path . '/css/fivestar.css');
|
109
|
|
110
|
$variables = array(
|
111
|
'rating' => $element['#rating'],
|
112
|
'stars' => $element['#instance_settings']['stars'],
|
113
|
'widget' => $element['#widget'],
|
114
|
);
|
115
|
$star_display = theme('fivestar_static', $variables);
|
116
|
return theme('fivestar_static_element', array('description' => $element['#description'], 'star_display' => $star_display, 'is_form' => FALSE));
|
117
|
}
|
118
|
|
119
|
/**
|
120
|
* Theme function for 'rating' fivestar field formatter.
|
121
|
*/
|
122
|
function theme_fivestar_formatter_rating($variables) {
|
123
|
$element = $variables['element'];
|
124
|
|
125
|
if (empty($element['#item']['average'])) {
|
126
|
$element['#item']['average'] = 0;
|
127
|
}
|
128
|
// Get number of stars.
|
129
|
$stars = (empty($element['#instance_settings']['stars'])) ? 5 : $element['#instance_settings']['stars'];
|
130
|
$average = $element['#item']['average'];
|
131
|
// Rating is X out of Y stars.
|
132
|
$rating = round(($average/100) * $stars, 1);
|
133
|
$output = $rating . '/' . $stars;
|
134
|
|
135
|
return $output;
|
136
|
}
|
137
|
|
138
|
/**
|
139
|
* Theme function for 'percentage' fivestar field formatter.
|
140
|
*/
|
141
|
function theme_fivestar_formatter_percentage($variables) {
|
142
|
$element = $variables['element'];
|
143
|
|
144
|
if (empty($element['#item']['average'])) {
|
145
|
$element['#item']['average'] = 0;
|
146
|
}
|
147
|
|
148
|
return round($element['#item']['average'], 1) . '%';
|
149
|
}
|
150
|
|
151
|
/**
|
152
|
* Theme the fivestar form element by adding necessary css and javascript.
|
153
|
*/
|
154
|
function theme_fivestar($variables) {
|
155
|
$element = $variables['element'];
|
156
|
|
157
|
return theme('form_element', array('element' => $element));
|
158
|
}
|
159
|
|
160
|
/**
|
161
|
* Theme the straight HTML version of the fivestar select list. This is used
|
162
|
* to remove the wrapping 'form-item' div from the select list.
|
163
|
*/
|
164
|
function theme_fivestar_select($variables) {
|
165
|
$element = $variables['element'];
|
166
|
element_set_attributes($element, array('id', 'name', 'size'));
|
167
|
_form_set_class($element, array('form-select'));
|
168
|
return '<select' . drupal_attributes($element['#attributes']) . '>' . form_select_options($element) . '</select>';
|
169
|
}
|
170
|
/**
|
171
|
* Display a plain HTML view-only version of the widget with a specified rating.
|
172
|
*
|
173
|
* @param $rating
|
174
|
* The desired rating to display out of 100 (i.e. 80 is 4 out of 5 stars).
|
175
|
* @param $stars
|
176
|
* The total number of stars this rating is out of.
|
177
|
* @param $tag
|
178
|
* Allows multiple ratings per node.
|
179
|
* @return
|
180
|
* A themed HTML string representing the star widget.
|
181
|
*/
|
182
|
function theme_fivestar_static($variables) {
|
183
|
$rating = $variables['rating'];
|
184
|
$stars = $variables['stars'];
|
185
|
$tag = $variables['tag'];
|
186
|
$widget = $variables['widget'];
|
187
|
if($widget['name'] != 'default') {
|
188
|
drupal_add_css($widget['css']);
|
189
|
}
|
190
|
|
191
|
$output = '<div class="fivestar-' . $widget['name'] . '">';
|
192
|
$output .= '<div class="fivestar-widget-static fivestar-widget-static-'. $tag .' fivestar-widget-static-'. $stars . ' clearfix">';
|
193
|
if (empty($stars)) {
|
194
|
$stars = 5;
|
195
|
}
|
196
|
$numeric_rating = $rating/(100/$stars);
|
197
|
for ($n=1; $n <= $stars; $n++) {
|
198
|
$star_value = ceil((100/$stars) * $n);
|
199
|
$prev_star_value = ceil((100/$stars) * ($n-1));
|
200
|
$zebra = ($n % 2 == 0) ? 'even' : 'odd';
|
201
|
$first = $n == 1 ? ' star-first' : '';
|
202
|
$last = $n == $stars ? ' star-last' : '';
|
203
|
$output .= '<div class="star star-'. $n .' star-'. $zebra . $first . $last .'">';
|
204
|
if ($rating < $star_value && $rating > $prev_star_value) {
|
205
|
$percent = (($rating - $prev_star_value) / ($star_value - $prev_star_value)) * 100;
|
206
|
$output .= '<span class="on" style="width: '. $percent .'%">';
|
207
|
}
|
208
|
elseif ($rating >= $star_value) {
|
209
|
$output .= '<span class="on">';
|
210
|
}
|
211
|
else {
|
212
|
$output .= '<span class="off">';
|
213
|
}
|
214
|
if ($n == 1)$output .= $numeric_rating;
|
215
|
$output .= '</span></div>';
|
216
|
}
|
217
|
$output .= '</div></div>';
|
218
|
return $output;
|
219
|
}
|
220
|
|
221
|
/**
|
222
|
* Display the text associated with a static star display.
|
223
|
*
|
224
|
* Note that passing in explicit data types is extremely important when using
|
225
|
* this function. A NULL value will exclude the value entirely from display,
|
226
|
* while a 0 value indicates that the text should be shown but it has no value
|
227
|
* yet.
|
228
|
*
|
229
|
* All ratings are from 0 to 100.
|
230
|
*
|
231
|
* @param $user_rating
|
232
|
* The current user's rating.
|
233
|
* @param $average
|
234
|
* The average rating.
|
235
|
* @param $votes
|
236
|
* The total number of votes.
|
237
|
* @param $stars
|
238
|
* The number of stars being displayed.
|
239
|
* @return
|
240
|
* A themed HTML string representing the star widget.
|
241
|
*/
|
242
|
function theme_fivestar_summary($variables) {
|
243
|
$microdata = $variables['microdata'];
|
244
|
extract($variables, EXTR_SKIP);
|
245
|
$output = '';
|
246
|
$div_class = '';
|
247
|
$average_rating_microdata = '';
|
248
|
if (isset($user_rating)) {
|
249
|
$div_class = isset($votes) ? 'user-count' : 'user';
|
250
|
$user_stars = round(($user_rating * $stars) / 100, 1);
|
251
|
$output .= '<span class="user-rating">'. t('Your rating: <span>!stars</span>', array('!stars' => $user_rating ? $user_stars : t('None'))) .'</span>';
|
252
|
}
|
253
|
if (isset($user_rating) && isset($average_rating)) {
|
254
|
$output .= ' ';
|
255
|
}
|
256
|
if (isset($average_rating)) {
|
257
|
$div_class = isset($votes) ? 'average-count' : 'average';
|
258
|
$average_stars = round(($average_rating * $stars) / 100, 1);
|
259
|
if (!empty($microdata['average_rating']['#attributes'])) {
|
260
|
$average_rating_microdata = drupal_attributes($microdata['average_rating']['#attributes']);
|
261
|
}
|
262
|
$output .= '<span class="average-rating">'. t('Average: <span !microdata>!stars</span>', array('!stars' => $average_stars, '!microdata' => $average_rating_microdata)) .'</span>';
|
263
|
}
|
264
|
if (isset($user_rating) && isset($average_rating)) {
|
265
|
$div_class = 'combo';
|
266
|
}
|
267
|
|
268
|
if (isset($votes) && !(isset($user_rating) || isset($average_rating))) {
|
269
|
$output .= ' <span class="total-votes">'. format_plural($votes, '<span>@count</span> vote', '<span>@count</span> votes') .'</span>';
|
270
|
$div_class = 'count';
|
271
|
}
|
272
|
elseif (isset($votes)) {
|
273
|
$output .= ' <span class="total-votes">('. format_plural($votes, '<span>@count</span> vote', '<span>@count</span> votes') .')</span>';
|
274
|
}
|
275
|
|
276
|
if ($votes === 0) {
|
277
|
$output = '<span class="empty">'. t('No votes yet') .'</span>';
|
278
|
}
|
279
|
|
280
|
$output = '<div class="fivestar-summary fivestar-summary-'. $div_class . '">'. $output .'</div>';
|
281
|
return $output;
|
282
|
}
|
283
|
|
284
|
/**
|
285
|
* Display a static fivestar value as stars with a title and description.
|
286
|
*/
|
287
|
function theme_fivestar_static_element($variables) {
|
288
|
$output = '';
|
289
|
if (isset($variables['is_form']) && !$variables['is_form']) {
|
290
|
$output .= '<div class="fivestar-static-item">';
|
291
|
}
|
292
|
else {
|
293
|
$output .= '<div class="fivestar-static-form-item">';
|
294
|
}
|
295
|
$element = array(
|
296
|
'#type' => 'item',
|
297
|
'#title' => $variables['title'],
|
298
|
'#description' => $variables['description'],
|
299
|
'#children' => $variables['star_display'],
|
300
|
);
|
301
|
|
302
|
$output .= theme('form_element', array('element' => $element));
|
303
|
$output .= '</div>';
|
304
|
return $output;
|
305
|
}
|