/[drupal]/contributions/modules/recommended_nodes/recommended_nodes.module
ViewVC logotype

Contents of /contributions/modules/recommended_nodes/recommended_nodes.module

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.9 - (show annotations) (download) (as text)
Wed May 14 20:28:36 2008 UTC (18 months, 1 week ago) by mcarbone
Branch: MAIN
CVS Tags: HEAD
Branch point for: DRUPAL-5
Changes since 1.8: +49 -31 lines
File MIME type: text/x-php
upgraded for Drupal 5 compatibility
1 <?php
2 // $Id: recommended_nodes.module,v 1.8 2006/07/05 20:02:15 drumm Exp $
3
4 function recommended_nodes_perm() {
5 return array(
6 'recommend posts',
7 );
8 }
9
10 function recommended_nodes_menu($may_cache) {
11 $items = array();
12
13 if ($may_cache) {
14 $items[] = array(
15 'path' => 'admin/settings/recommended_nodes',
16 'title' => t('Recommended Nodes'),
17 'description' => t('Modify initial and half life settings.'),
18 'callback' => 'drupal_get_form',
19 'callback arguments' => array('recommended_nodes_settings'),
20 );
21 $items[] = array(
22 'path' => 'recommended_nodes_ajax',
23 'callback' => '_recommended_nodes_ajax',
24 'type' => MENU_CALLBACK,
25 'access' => user_access('recommend posts'),
26 );
27 }
28
29 return $items;
30 }
31
32 function recommended_nodes_settings() {
33 $form = array();
34
35 $form['recommended_nodes_half_life'] = array(
36 '#type' => 'textfield',
37 '#title' => t('Recommend half life'),
38 '#description' => t('A measure of time, in hours, of when a recommendation from a user will be worth half its value. This time is based on when a post is created.'),
39 '#default_value' => variable_get('recommended_nodes_half_life', '4'),
40 '#size' => 3,
41 );
42 $form['recommended_nodes_initial_points'] = array(
43 '#type' => 'textfield',
44 '#title' => t('Initial recommendation points'),
45 '#description' => t('How many points the original recommendation will be worth.'),
46 '#default_value' => variable_get('recommended_nodes_initial_points', '10'),
47 '#size' => 3,
48 );
49
50 return system_settings_form($form);
51 }
52
53 function _recommended_nodes_settings_submit() {
54 _recommended_nodes_update();
55 }
56
57 function recommended_nodes_block($op = 'list', $delta = NULL, $edit = array()) {
58 switch ($op) {
59 case 'list':
60 return array(
61 'recommend_node' => array(
62 'info' => t('Recommend post'),
63 ),
64 'recommended_nodes' => array(
65 'info' => t('Recommended posts'),
66 ),
67 );
68
69 case 'view':
70 switch ($delta) {
71 case 'recommend_node':
72 if (user_access('recommend posts') && arg(0) == 'node' && is_numeric(arg(1))) {
73 $node = node_load(arg(1));
74 if (variable_get('recommended_nodes_'. $node->type, FALSE)) {
75 return array(
76 'subject' => t('Recommend post'),
77 'content' => _recommended_nodes_recommend_node(arg(1)),
78 );
79 }
80 }
81 break;
82
83 case 'recommended_nodes':
84 $result = db_query_range(db_rewrite_sql('SELECT r.nid, n.title FROM {recommended_nodes_node} r LEFT JOIN {node} n ON n.nid = r.nid ORDER BY r.score DESC'), 0, variable_get('recommended_nodes_count', '10'));
85 $list = array();
86 while ($node = db_fetch_object($result)) {
87 $list[$node->nid] = $node->title;
88 }
89 return array(
90 'subject' => t('Recommended posts'),
91 'content' => theme('recommended_nodes_recommended_posts_block', $list),
92 );
93 }
94
95 case 'configure':
96 switch ($delta) {
97 case 'recommended_nodes':
98 $form = array();
99 $form['recommended_nodes_count'] = array(
100 '#type' => 'textfield',
101 '#title' => t('Number of recommended posts'),
102 '#description' => t('This is the total number of posts that can appear on the front page in the "Recommended posts" block.'),
103 '#default_value' => variable_get('recommended_nodes_count', '10'),
104 '#size' => 3,
105 );
106 $form['recommended_nodes_required_recommendations'] = array(
107 '#type' => 'textfield',
108 '#title' => t('Number of recommendations required to be listed'),
109 '#default_value' => variable_get('recommended_nodes_required_recommendations', '1'),
110 '#size' => 3,
111 );
112 return $form;
113 }
114
115 case 'save':
116 switch ($delta) {
117 case 'recommended_nodes':
118 variable_set('recommended_nodes_count', $edit['recommended_nodes_count']);
119 variable_set('recommended_nodes_required_recommendations', $edit['recommended_nodes_required_recommendations']);
120 }
121 }
122 }
123
124 function recommended_nodes_form_alter($form_id, &$form) {
125 if (isset($form['#node_type']->type)) {
126 // Node settings
127 if ($form_id == 'node_type_form') {
128 $form['workflow']['recommended_nodes'] = array(
129 '#type' => 'checkbox',
130 '#title' => t('Can be recommended'),
131 '#default_value' => variable_get('recommended_nodes_'. $form['#node_type']->type, FALSE),
132 );
133 }
134 }
135 else if ($form_id == 'recommended_nodes_settings') {
136 $form['#submit']['_recommended_nodes_settings_submit'] = array();
137 }
138 }
139
140 function _recommended_nodes_recommend_node($nid) {
141 global $user;
142
143 list($recommenders, $recommended) = _recommended_nodes_get_recommenders($nid);
144
145 $output = drupal_get_form('recommend_node_form', $nid, $recommended);
146 $output .= '<h3 id="recommenders-title"><a href="#toggle">'. t('Recommenders') .'</a></h3>';
147 $output .= '<p id="recommenders">'. theme('recommended_nodes_recommenders', $recommenders) .'</p>';
148
149 drupal_add_js(drupal_get_path('module', 'recommended_nodes') .'/recommended_nodes.js');
150 drupal_add_css(drupal_get_path('module', 'recommended_nodes') .'/recommended_nodes.css');
151
152 return $output;
153 }
154
155 function _recommended_nodes_ajax($nid) {
156 global $user;
157
158 $node = node_load($nid);
159
160 $recommend = db_result(db_query("SELECT nid FROM {recommended_nodes_recommendations} WHERE nid = %d AND uid = %d", $node->nid, $user->uid));
161 if (!$recommend) {
162 db_query('INSERT INTO {recommended_nodes_recommendations} (nid, uid) VALUES (%d, %d)', $node->nid, $user->uid);
163 }
164 else {
165 db_query('DELETE FROM {recommended_nodes_recommendations} WHERE nid = %d AND uid = %d', $node->nid, $user->uid);
166 }
167
168 _recommended_nodes_update($node->nid);
169
170 list($recommenders, $recommended) = _recommended_nodes_get_recommenders($nid);
171
172 if ($recommended) {
173 $recommenders[$user->uid] = l($user->name, 'user/'. $user->uid);
174 }
175 else {
176 unset($recommenders[$user->uid]);
177 }
178
179 print drupal_to_js(array(
180 'title' => $recommended ? t('Unrecommend') : t('Recommend'),
181 'recommenders' => theme('recommended_nodes_recommenders', $recommenders),
182 ));
183 exit;
184 }
185
186 function recommend_node_form($nid = NULL, $recommended = FALSE) {
187 $form = array();
188 $form['recommend'] = array(
189 '#type' => 'submit',
190 '#value' => $recommended ? t('Unrecommend') : t('Recommend'),
191 );
192 $form['uri'] = array(
193 '#type' => 'hidden',
194 '#value' => url('recommended_nodes_ajax/'. $nid),
195 '#id' => 'recommend-uri',
196 );
197 return $form;
198 }
199
200 function recommend_node_form_submit($form_id, $form_values) {
201 global $user;
202 $node = node_load(arg(1));
203
204 switch ($form_values['recommend']) {
205 case t('Recommend'):
206 db_query('INSERT INTO {recommended_nodes_recommendations} (nid, uid) VALUES (%d, %d)', $node->nid, $user->uid);
207 if (arg(0) == 'node') {
208 drupal_set_message(t('Recommended %title.', array('%title' => theme('placeholder', $node->title))));
209 }
210 break;
211
212 case t('Unrecommend'):
213 db_query('DELETE FROM {recommended_nodes_recommendations} WHERE nid = %d AND uid = %d', $node->nid, $user->uid);
214 if (arg(0) == 'node') {
215 drupal_set_message(t('Unrecommended %title.', array('%title' => theme('placeholder', $node->title))));
216 }
217 break;
218 }
219
220 _recommended_nodes_update($node->nid);
221 }
222
223 function recommended_nodes_nodeapi($node, $op, $teaser = NULL, $page = NULL) {
224 switch ($op) {
225 case 'delete':
226 db_query('DELETE FROM {recommended_nodes_recommendations} WHERE nid = %d', $node->nid);
227 db_query('DELETE FROM {recommended_nodes_node} WHERE nid = %d', $node->nid);
228 break;
229 }
230 }
231
232 function _recommended_nodes_get_recommenders($nid) {
233 global $user;
234
235 $result = db_query('SELECT r.uid, u.name FROM {recommended_nodes_recommendations} r INNER JOIN {users} u ON u.uid = r.uid WHERE r.nid = %d', $nid);
236 $recommenders = array();
237 $recommended = FALSE;
238 while ($recommendation = db_fetch_object($result)) {
239 $recommenders[$recommendation->uid] = l($recommendation->name, 'user/'. $recommendation->uid);
240 if ($user->uid == $recommendation->uid) {
241 $recommended = TRUE;
242 }
243 }
244
245 return array($recommenders, $recommended);
246 }
247
248 function theme_recommended_nodes_recommenders($recommenders) {
249 if (count($recommenders) > 0) {
250 return implode(', ', $recommenders);
251 }
252 else {
253 return t('No recommenders');
254 }
255 }
256
257 function theme_recommended_nodes_recommended_posts_block($list) {
258 $posts = array();
259 foreach ($list as $nid => $title) {
260 $posts[] = l($title, 'node/'. $nid);
261 }
262 return theme('item_list', $posts);
263 }
264
265 function recommended_nodes_cron() {
266 if (time() - variable_get('recommended_nodes_last_cron', 0) > 3600) {
267 // Update them all hourly.
268 _recommended_nodes_update();
269 variable_set('recommended_nodes_last_cron', time());
270 }
271 }
272
273 /**
274 * Update the score of a single node, or all nodes.
275 *
276 * @param $nid
277 * If we only need to update one node, the node's nid; othewise, NULL.
278 */
279 function _recommended_nodes_update($nid = NULL) {
280 if (isset($nid)) {
281 db_query('DELETE FROM {recommended_nodes_node} WHERE nid = %d', $nid);
282 $result = db_query('SELECT n.nid, count(n.nid) AS count, count(n.nid) * %d / pow(2, floor((UNIX_TIMESTAMP() - n.created) / 3600) / %d) AS score FROM {recommended_nodes_recommendations} r LEFT JOIN {node} n ON n.nid = r.nid WHERE n.nid = %d GROUP BY n.nid', variable_get('recommended_nodes_initial_points', '10'), variable_get('recommended_nodes_half_life', '4'), $nid);
283 }
284 else {
285 db_query('DELETE FROM {recommended_nodes_node}');
286 $result = db_query('SELECT n.nid, count(n.nid) AS count, count(n.nid) * %d / pow(2, floor((UNIX_TIMESTAMP() - n.created) / 3600) / %d) AS score FROM {recommended_nodes_recommendations} r LEFT JOIN {node} n ON n.nid = r.nid GROUP BY n.nid', variable_get('recommended_nodes_initial_points', '10'), variable_get('recommended_nodes_half_life', '4'));
287 }
288
289 while ($node = db_fetch_object($result)) {
290 if ($node->count >= (int) variable_get('recommended_nodes_required_recommendations', '1')) {
291 db_query('INSERT INTO {recommended_nodes_node} (nid, score) VALUES (%d, %f)', $node->nid, $node->score);
292 }
293 }
294 }

  ViewVC Help
Powered by ViewVC 1.1.2