'Delete activty comment', 'page callback' => 'drupal_get_form', 'page arguments' => array('activity_comments_comment_delete', 3), 'access callback' => 'activity_comments_delete_access', 'access arguments' => array(3), 'type' => MENU_CALLBACK, ); $items['activity/comments/insert'] = array( 'title' => 'List activty comments', 'page callback' => 'activity_comments_comment_insert', 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, ); return $items; } /** * Access callback to determine if you can delete the comment */ function activity_comments_delete_access($acid) { if (user_access('administer activity comments')) { return TRUE; } // quick query to determine if the uid is the same and // if the user can delete comments if (user_access('activity comments delete own')) { $uid = db_result(db_query("SELECT uid FROM {activity_comments} WHERE cid = %d", $acid)); return ($uid == $GLOBALS['user']->uid); } return FALSE; } /** * Delete comment form build */ function activity_comments_comment_delete($form_state, $cid) { $form['#cid'] = $cid; $text = db_result(db_query("SELECT comment FROM {activity_comments} WHERE cid = %d", $cid)); $comment_text = truncate_utf8(check_plain($text), 30, TRUE, TRUE); return confirm_form($form, t('Would you like to delete this comment: !comment', array('!comment' => $comment_text)), $_REQUEST['destination']); } /** * Form submit for the delete form */ function activity_comments_comment_delete_submit($form, &$form_state) { db_query("DELETE FROM {activity_comments} WHERE cid = %d", $form['#cid']); } /** * Insert comments menu callback. */ function activity_comments_comment_insert() { // We're starting in step #3, preparing for #4. $form_state = array('storage' => NULL, 'submitted' => FALSE); $form_build_id = $_POST['form_build_id']; // Step #4. $form = form_get_cache($form_build_id, $form_state); // Preparing for #5. $args = $form['#parameters']; $form_id = array_shift($args); $form_state['post'] = $form['#post'] = $_POST; $form['#programmed'] = $form['#redirect'] = FALSE; // Step #5. drupal_process_form($form_id, $form, $form_state); // Step #6 and #7 and #8. $form = drupal_rebuild_form($form_id, $form_state, $args, $form_build_id); // Step #9. // search for activity_comments_wrap and remove it from the pre render $key = array_search('activity_comments_wrap', $form['#pre_render']); if ($key !== FALSE) { unset($form['#pre_render'][$key]); } $output = theme('status_messages') . drupal_render($form); // Final rendering callback. drupal_json(array('status' => TRUE, 'data' => $output)); } /** * List comments menu callback. */ function activity_comments_list($aid = 0) { if (!empty($aid)) { $items = array(); $result = db_query('SELECT * FROM {activity_comments} WHERE aid = %d', $aid); while($row = db_fetch_array($result)) { $items[] = $row; } return drupal_json(array('status' => TRUE, 'data' => theme('activity_comments_comments', $items))); } else { return drupal_json(array('status' => FALSE, 'data' => '')); } } /** * Add comment form. */ function activity_comments_form($form_state, $aid, $limit, $direction) { $form['activity_form_items'] = array( '#access' => user_access('activity post comments'), '#prefix' => '
', '#suffix' => '
', ); $form['activity_form_items']['activity_comment'] = array( '#type' => 'textarea', '#rows' => 2, '#resizable' => FALSE, '#attributes' => array('class' => 'activity-comment-text'), '#default_value' => t('Write a Comment'), ); $form['aid'] = array( '#type' => 'value', '#value' => $aid, ); $form['direction'] = array( '#type' => 'value', '#value' => $direction, ); $form['activity_form_items']['activity_save_comment'] = array( '#type' => 'submit', '#value' => t('Add'), '#ahah' => array( 'path' => 'activity/comments/insert', 'wrapper' => 'activity-comments-' . $aid, 'method' => 'replace', 'effect' => 'fade', ), '#id' => 'activity-comment-save-comment-' . $aid, ); // fetch all the comments for this $result = db_query("SELECT ac.cid, ac.comment, ac.timestamp, ac.uid, u.name FROM {activity_comments} ac INNER JOIN {users} u ON ac.uid = u.uid WHERE ac.aid = %d ORDER BY timestamp %s", $aid, $direction); $items = array(); while ($comment_obj = db_fetch_object($result)) { $items[] = $comment_obj; } // put all the comments into a markup for the form $form['comments'] = array( '#value' => theme('activity_comments_comments', $aid, $items, $limit), '#weight' => -10, ); // show all $form['show_all'] = array( '#prefix' => '', '#value' => '' . t('Show all !plural', array('!plural' => format_plural(count($items), '1 comment', '@count comments'))) . '', '#suffix' => '', '#weight' => -11, '#access' => count($items) > $limit, ); $form['#attributes'] = array('class' => 'activity_comment-comment-form'); // after build to add js $form['#after_build'][] = 'activity_comments_add_js'; $form['#pre_render'][] = 'activity_comments_wrap'; return $form; } /** * Implementation of hook_submit() for activity_comments_form. */ function activity_comments_form_submit($form, &$form_state) { global $user; //store the activity comment $record = new stdClass; $record->comment = $form_state['values']['activity_comment']; $record->uid = $user->uid; $record->aid = $form_state['values']['aid']; $record->timestamp = time(); drupal_write_record('activity_comments', $record); drupal_alter('activity_comment', $record); db_query("UPDATE {activity_comments_stats} SET comment_count = comment_count + 1, changed = %d WHERE aid = %d", time(), $form['aid']['#value']); if (!db_affected_rows()) { db_query("INSERT INTO {activity_comments_stats} (aid, changed, comment_count) VALUES (%d, %d, 1)", $form['aid']['#value'], time()); } } /** * FAPI pre_render function */ function activity_comments_wrap($form) { // wrap the form so we can use ahah on it $wrap['wrapper'] = array( '#prefix' => '
', '#suffix' => '
', ); return array_merge($wrap['wrapper'], $form); } /** * After build function to add the js to the page */ function activity_comments_add_js($form, $form_state) { static $js_added = FALSE; if (!$js_added) { $js_added = TRUE; drupal_add_js(drupal_get_path('module', 'activity_comments') . '/activity_comments.js'); // set the settings for the default text as well drupal_add_js(array('activity_comments' => array('destination' => drupal_get_destination())), 'setting'); drupal_add_js(array('activity_comments' => array('default_text' => $form['activity_form_items']['activity_comment']['#default_value'])), 'setting'); } return $form; } /** * Implementation of hook_views_api(). */ function activity_comments_views_api() { return array( 'api' => 2, 'path' => drupal_get_path('module', 'activity_comments') . '/views', ); } /** * Implementation of hook_theme(). */ function activity_comments_theme($existing, $type, $theme, $path) { return array( 'activity_comments_comments' => array( 'arguments' => array('aid' => 0, 'comments' => array(), 'limit' => 10), ), 'activity_comments_comment' => array( 'arguments' => array('comment' => NULL), 'template' => 'activity-comment', ), ); } /** * Theme up all the comments */ function theme_activity_comments_comments($aid, $comments = array(), $limit = 10) { $items = array(); $count = 0; foreach($comments as $comment) { $hide = (++$count > $limit); $classes = 'activity-comment-wrapper'; if ($hide) { $classes .= ' activity-comment-hidden'; } $items[] = array( 'data' => theme('activity_comments_comment', $comment), 'class' => $classes, ); } return theme('item_list', $items, NULL, 'ul', array('id' => 'activity_comments-'. $aid, 'class' => 'activity-comment-list')); } /** * Preprocess the comment display to add in the sanitized variables */ function template_preprocess_activity_comments_comment(&$vars, $hook) { $vars['username'] = theme('username', $vars['comment']); $vars['comment_value'] = check_markup($vars['comment']->comment); $vars['date'] = format_date($vars['comment']->timestamp); if (activity_comments_delete_access($vars['comment']->cid)) { $vars['delete_link'] = l(t('Delete'), 'activity/comments/delete/' . $vars['comment']->cid, array('query' => drupal_get_destination())); } }