uid))) { db_query('UPDATE {image_annotate} SET size_width = %d, size_height = %d, position_top = %d, position_left = %d WHERE cid = %d', $width, $height, $top, $left, arg(2)); } } } } } /** * Implementation of CCK's hook_field_formatter_info(). */ function image_annotate_field_formatter_info() { $formatters = array( 'image_annotate' => array( 'label' => t('Image with annotations'), 'field types' => array('image', 'filefield'), 'suitability callback' => 'image_annotate_handles_file', 'css' => array(drupal_get_path('module','image_annotate') .'/tag.css'), 'description' => t('Display a picture and its annotations.'), ), ); return $formatters; } /** * Implementation of hook_link(). */ function image_annotate_link($type, $object, $teaser = FALSE) { if ($type == 'comment') { if (user_access('view image annotations') || user_access('create image annotations') || user_access('administer image annotations')) { $note = db_fetch_object(db_query('SELECT aid, field_name FROM {image_annotate} WHERE cid = %d', $object->cid)); if ($note->aid) { $links = array( 'image_annotate_link' => array( 'title' => t('View image note'), 'href' => $_GET['q'], 'fragment' => 'image-annotate-add-'. $note->field_name, 'attributes' => array( 'title' => t('go to the picture'), 'class' => 'image-annotate-link', 'rel' => 'image-annotate-'. $note->aid, ), ), ); return $links; } } } } /** * Implementation of hook_menu() */ function image_annotate_menu() { $items = array(); $items['content/image-annotate/create'] = array( 'title' => 'Save note', 'page callback' => '_image_annotate_note_create', 'access callback' => 'image_annotate_user_access', 'type' => MENU_CALLBACK, ); $items['content/image-annotate/edit'] = array( 'title' => 'Note edit form', 'page callback' => '_image_annotate_note_edit', 'access callback' => 'image_annotate_user_access', 'type' => MENU_CALLBACK, ); return $items; } /** * Implementation of hook_nodeapi(). */ function image_annotate_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) { switch ($op) { case 'delete': db_query("DELETE FROM {image_annotate} WHERE nid = %d", $node->nid); break; } } /** * Implementation of hook_perm(). */ function image_annotate_perm() { return array('administer image annotations', 'create image annotations', 'view image annotations'); } /** * Implementation of hook_theme */ function image_annotate_theme() { return array( 'image_annotate_formatter_image_annotate' => array( 'arguments' => array('element' => null), ), ); } /** * Return permissions for editing/creating annotations for the current user. */ function image_annotate_user_access() { return user_access('administer image annotations') || user_access('create image annotations'); } /** * Theme function for the image annotate formatter */ function theme_image_annotate_formatter_image_annotate($element) { drupal_add_js('misc/collapse.js'); if (empty($element['#item'])) return ''; $item = $element['#item']; $field = content_fields($element['#field_name']); if (empty($item['fid']) && $field['use_default_image']) $item = $field['default_image']; if (empty($item['filepath'])) $item = array_merge($item, field_file_load($item['fid'])); if (user_access('view image annotations') || user_access('create image annotations') || user_access('administer image annotations')) { // Retrieve all the annotations for that image field // We sort by area (height*width) to make sure small annotations are always on the top and avoid having some unhoverable ones $result = db_query('SELECT i.*, c.uid, c.comment, u.name FROM {image_annotate} i JOIN {comments} c ON i.cid = c.cid JOIN {users} u ON c.uid = u.uid WHERE i.field_name = \'%s\' AND c.nid = %d ORDER BY (i.size_height*i.size_width) ASC', $field['field_name'], $element['#node']->vid); // Build the array of notes settings global $user; $notes = array(); while ($note = db_fetch_object($result)) { $editable = user_access('administer image annotations') || (user_access('create image annotations') && $note->uid && $note->uid == $user->uid); $author = theme('username', $note); $text = '"'. check_plain($note->comment) . '" '. t('by') .' '. $author . ''; if (user_access('access comments')) $text .= 'ยป '. l(t('View comment'), $_GET['q'], array('fragment'=>'comment-'. $note->cid)) .''; $notes[] = array( 'aid' => $note->aid, 'cid' => $note->cid, 'uid' => $note->uid, 'height' => $note->size_height, 'width' => $note->size_width, 'top' => $note->position_top, 'left' => $note->position_left, 'text' => $text, 'editable' => $editable, ); } // Build the field settings $settings = array(array( 'nid' => $element['#node']->nid, 'field' => $field['field_name'], 'notes' => $notes, 'editable' => user_access('administer image annotations') || user_access('create image annotations'), )); // Load all the JS and CSS magic drupal_add_js(array('imageAnnotate' => $settings), 'setting'); jquery_ui_add(array('ui.resizable', 'ui.draggable')); drupal_add_js(drupal_get_path('module', 'image_annotate') .'/tag.js'); drupal_add_css(drupal_get_path('module', 'image_annotate') .'/tag.css'); $class = 'imagefield imagefield-'. $field['field_name'] .' image-annotate-'. $field['field_name']; return theme('imagefield_image', $item, $item['alt'], $item['title'], array('class' => $class)); } else { return theme('imagefield_image', $item, $item['alt'], $item['title']); } } /** * Display the create form of a comment/note */ function _image_annotate_note_create($nid) { if (user_access('post comments') && user_access('access comments')) { print drupal_get_form('comment_form', array('nid' => $nid)); } } /** * Display the edit form of a comment/note */ function _image_annotate_note_edit($aid) { $cid = db_result(db_query('SELECT cid FROM {image_annotate} WHERE aid = %d', $aid)); include_once(drupal_get_path('module','comment') .'/comment.pages.inc'); print comment_edit($cid); }