Projet

Général

Profil

Paste
Télécharger (8,39 ko) Statistiques
| Branche: | Révision:

root / drupal7 / sites / all / modules / votingapi / votingapi.api.php @ 503b3f7b

1
<?php
2

    
3
/**
4
 * @file
5
 * Provides hook documentation for the VotingAPI module.
6
 */
7

    
8

    
9
/**
10
 * Adds to or changes the calculated vote results for a piece of content.
11
 *
12
 * VotingAPI calculates a number of common aggregate functions automatically,
13
 * including the average vote and total number of votes cast. Results are grouped
14
 * by 'tag', 'value_type', and then 'function' in the following format:
15
 *
16
 *   $results[$tag][$value_type][$aggregate_function] = $value;
17
 *
18
 * If no custom tag is being used for votes, the catch-all "vote" tag should be
19
 * used. In cases where custom tags are used to vote on different aspects of a
20
 * piece of content, a catch-all "vote" value should still be calculated for use
21
 * on summary screens, etc.
22
 *
23
 * @param $vote_results
24
 *   An alterable array of aggregate vote results.
25
 * @param $content_type
26
 *   A string identifying the type of content being rated. Node, comment,
27
 *   aggregator item, etc.
28
 * @param $content_id
29
 *   The key ID of the content being rated.
30
 *
31
 * @see votingapi_recalculate_results()
32
 */
33
function hook_votingapi_results_alter(&$vote_results, $content_type, $content_id) {
34
  // We're using a MySQLism (STDDEV isn't ANSI SQL), but it's OK because this is
35
  // an example. And no one would ever base real code on sample code. Ever. Never.
36

    
37
  $sql  = "SELECT v.tag, STDDEV(v.value) as standard_deviation ";
38
  $sql .= "FROM {votingapi_vote} v ";
39
  $sql .= "WHERE v.content_type = '%s' AND v.content_id = %d AND v.value_type = 'percent' ";
40
  $sql .= "GROUP BY v.tag";
41

    
42
  $aggregates = db_query($sql, $content_type, $content_id);
43

    
44
  // VotingAPI wants the data in the following format:
45
  // $vote_results[$tag][$value_type][$aggregate_function] = $value;
46

    
47
  while ($aggregate = db_fetch_array($aggregates)) {
48
    $vote_results[$result['tag']]['percent']['standard_deviation'] = $result['standard_deviation'];
49
  }
50
}
51

    
52

    
53
/**
54
 * Adds to or alters metadata describing Voting tags, value_types, and functions.
55
 *
56
 * If your module uses custom tags or value_types, or calculates custom aggregate
57
 * functions, please implement this hook so other modules can properly interperet
58
 * and display your data.
59
 *
60
 * Three major bins of data are stored: tags, value_types, and aggregate result
61
 * functions. Each entry in these bins is keyed by the value stored in the actual
62
 * VotingAPI tables, and contains an array with (minimally) 'name' and
63
 * 'description' keys. Modules can add extra keys to their entries if desired.
64
 *
65
 * @param $data
66
 *   An alterable array of aggregate vote results.
67
 *
68
 * @see votingapi_metadata()
69
 */
70
function hook_votingapi_metadata_alter(&$data) {
71
  // Document several custom tags for rating restaurants and meals.
72
  $data['tags']['bread'] = array(
73
    'name' => t('Bread'),
74
    'description' => t('The quality of the food at a restaurant.'),
75
    'module' => 'mymodule', // This is optional; we can add it for our own purposes.
76
  );
77
  $data['tags']['circuses'] = array(
78
    'name' => t('Circuses'),
79
    'description' => t('The quality of the presentation and atmosphere at a restaurant.'),
80
    'module' => 'mymodule',
81
  );
82

    
83
  // Document two custom aggregate function.
84
  $data['functions']['standard_deviation'] = array(
85
    'name' => t('Standard deviation'),
86
    'description' => t('The standard deviation of all votes cast on a given piece of content. Use this to find controversial content.'),
87
    'module' => 'mymodule',
88
  );
89
  $data['functions']['median'] = array(
90
    'name' => t('Median vote'),
91
    'description' => t('The median vote value cast on a given piece of content. More accurate than a pure average when there are a few outlying votes.'),
92
    'module' => 'mymodule',
93
  );
94
}
95

    
96

    
97
/**
98
 * Return metadata used to build Views relationships on voting data.
99
 *
100
 * VotingAPI can store votes on any entity in the Drupal database: its content_type
101
 * and content_id columns can be used to store "node"/1, "comment"/2, and so
102
 * on. This hook is used to tell VotingAPI what Views base table the content_type
103
 * field corresponds to, and what field in that base table contains the value in
104
 * votingapi's content_id table.
105
 *
106
 * @return
107
 *   An array of records containing 'description', 'content_type', 'base_table',
108
 *   and 'content_id_column' entries.
109
 */
110
function hook_votingapi_relationships() {
111
  $relationships[] = array(
112
    // 'description' is used to construct the field description in the Views UI.
113
    'description' => t('users'),
114

    
115
    // 'content_type' contain the value that your module stores in the voting
116
    // api 'content_type' column. 'node', 'comment', etc.
117
    'content_type' => 'user',
118

    
119
    // 'base_table' contain the name of the Views base table that stores the
120
    // data your votes apply to.
121
    'base_table' => 'user',
122

    
123
    // 'content_id_column' contains the name of the views field that represents
124
    // your base_table's primary key. This column will be joined against the
125
    // voting api 'content_id' column.
126
    'content_id_column' => 'uid',
127

    
128
    // VotingAPI constructs pseudo-tables so that multiple relationships can
129
    // point to the same base table (normal and translation-based votes nodes
130
    // for example. These two columns allow you to override the names of the
131
    // pseudo-tables. You probably don't need to change this part unless you're
132
    // nedjo.
133
    'pseudo_vote' => 'votingapi_vote_special',
134
    'pseudo_cache' => 'votingapi_cache_special',
135
  );
136
}
137

    
138
/**
139
 * Returns callback functions and descriptions to format a VotingAPI Views field.
140
 *
141
 * Loads all votes for a given piece of content, then calculates and caches the
142
 * aggregate vote results. This is only intended for modules that have assumed
143
 * responsibility for the full voting cycle: the votingapi_set_vote() function
144
 * recalculates automatically.
145
 *
146
 * @param $field
147
 *   A Views field object. This can be used to expose formatters only for tags,
148
 *   vote values, aggregate functions, etc.
149
 * @return
150
 *   An array of key-value pairs, in which each key is a callback function and
151
 *   each value is a human-readable description of the formatter.
152
 *
153
 * @see votingapi_set_votes()
154
 */
155
function hook_votingapi_views_formatters($field) {
156
  if ($field->field == 'value') {
157
    return array('mymodule_funky_formatter' => t('MyModule value formatter'));
158
  }
159
  if ($field->field == 'tag') {
160
    return array('mymodule_funky_tags' => t('MyModule tag formatter'));
161
  }
162
}
163

    
164
/**
165
 * Save a vote in the database.
166
 *
167
 * @param $vote
168
 *   See votingapi_add_votes() for the structure of this array, with the
169
 *   defaults loaded from votingapi_prep_vote().
170
 */
171
function hook_votingapi_storage_add_vote(&$vote) {
172
  _mongodb_votingapi_prepare_vote($criteria);
173
  mongodb_collection('votingapi_vote')->insert($vote);
174
}
175

    
176
/**
177
 * Delete votes from the database.
178
 *
179
 * @param $votes
180
 *   An array of votes to delete. Minimally, each vote must have the 'vote_id'
181
 *   key set.
182
 * @param $vids
183
 *   A list of the 'vote_id' values from $voes.
184
 */
185
function hook_votingapi_storage_delete_votes($votes, $vids) {
186
  mongodb_collection('votingapi_vote')->delete(array('vote_id' => array('$in' => array_map('intval', $vids))));
187
}
188

    
189
/**
190
 * Select invidual votes from the database
191
 *
192
/**
193
 * Select individual votes from the database.
194
 *
195
 * @param $criteria
196
 *   A keyed array used to build the select query. Keys can contain
197
 *   a single value or an array of values to be matched.
198
 *   $criteria['vote_id']       (If this is set, all other keys are skipped)
199
 *   $criteria['entity_id']
200
 *   $criteria['entity_type']
201
 *   $criteria['value_type']
202
 *   $criteria['tag']
203
 *   $criteria['uid']
204
 *   $criteria['vote_source']
205
 *   $criteria['timestamp']   If this is set, records with timestamps
206
 *      GREATER THAN the set value will be selected. Defaults to
207
 *      REQUEST_TIME - variable_get('votingapi_anonymous_window', 3600); if
208
 *      the anonymous window is above zero.
209
 * @param $limit
210
 *   An integer specifying the maximum number of votes to return. 0 means
211
 *   unlimited and is the default.
212
 * @return
213
 *   An array of votes matching the criteria.
214
 */
215
function hook_votingapi_storage_select_votes($criteria, $limit) {
216
  _mongodb_votingapi_prepare_vote($criteria);
217
  $find = array();
218
  foreach ($criteria as $key => $value) {
219
    $find[$key] = is_array($value) ? array('$in' => $value) : $value;
220
  }
221
  $cursor = mongodb_collection('votingapi_vote')->find($find);
222
  if (!empty($limit)) {
223
    $cursor->limit($limit);
224
  }
225
  $votes = array();
226
  foreach ($cursor as $vote) {
227
    $votes[] = $vote;
228
  }
229
  return $votes;
230
}
231

    
232
/**
233
 * TODO
234
 *
235
 */
236
function hook_votingapi_storage_standard_results($entity_id, $entity) {
237
  // TODO
238
}