207 lines
7.5 KiB
Plaintext
207 lines
7.5 KiB
Plaintext
<?php
|
|
// $Id: image_annotate.module,v 1.6 2009/03/06 16:46:22 hunvreus Exp $
|
|
/**
|
|
* Implementation of hook_comment
|
|
*/
|
|
function image_annotate_comment(&$comment, $op) {
|
|
if (user_access('create image annotations') || user_access('administer image annotations')) {
|
|
if ($op == 'insert' || $op == 'update') {
|
|
if (is_numeric($_POST['image-annotate']) && $_POST['image-annotate']) {
|
|
global $user;
|
|
$field = preg_replace("/[^a-zA-Z0-9_s]/", "", $_POST['image-annotate-field']);
|
|
// TODO: check position.size is inside the picture
|
|
$top = (int)$_POST['image-annotate-top'];
|
|
$left = (int)$_POST['image-annotate-left'];
|
|
$width = (int)$_POST['image-annotate-width'];
|
|
$height = (int)$_POST['image-annotate-height'];
|
|
if (arg(1) == 'reply') {
|
|
db_query('INSERT INTO {image_annotate} (cid, field_name, size_width, size_height, position_top, position_left) VALUES (%d, \'%s\', %d, %d, %d, %d)', $comment['cid'], $field, $width, $height, $top, $left);
|
|
}
|
|
else if (arg(1) == 'edit' && (user_access('administer image annotations') || (user_access('create image annotations') && $comment['uid'] == $user->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) . '"<span class="author"> '. t('by') .' '. $author . '</span>';
|
|
if (user_access('access comments')) $text .= '<span class="actions">» '. l(t('View comment'), $_GET['q'], array('fragment'=>'comment-'. $note->cid)) .'</span>';
|
|
$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'),
|
|
));
|
|
|
|
module_load_include('module', 'jquery_ui');
|
|
// 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);
|
|
}
|