empty the filter cache to correct image paths that are pointing to the old address. Note that this will only work for images that have been inserted using filter tags.', array('!empty-cache' => url('imagefield_assist/cache/clear'))); case 'imagefield_assist/template': return '
%image
%caption
'; } } /** * Implementation of hook_theme(). */ function imagefield_assist_theme() { return array( 'imagefield_assist_inline' => array( 'arguments' => array('node' => NULL, 'size' => NULL, 'attributes' => NULL), ), 'imagefield_assist_filter' => array( 'arguments' => array('text' => NULL), ), 'imagefield_assist_popup' => array( 'arguments' => array('content' => NULL, 'attributes' => NULL), ), 'imagefield_assist_page' => array( 'arguments' => array('content' => NULL, 'attributes' => NULL), ), 'imagefield_assist_legacy' => array(), ); } /** * Implementation of hook_menu(). */ function imagefield_assist_menu() { $items = array(); $items['imagefield_assist/cache/clear'] = array( 'title' => t('Empty Cache'), 'page callback' => 'imagefield_assist_cache_clear', 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, ); $items['imagefield_assist/load'] = array( 'title' => 'ImageField assist', 'page callback' => 'imagefield_assist_loader', 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, ); // Page callbacks called internally by imagefield_assist/load. $items['imagefield_assist/header'] = array( 'title' => 'ImageField assist header', 'page callback' => 'imagefield_assist_header', 'page arguments' => array(2), 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, ); $items['imagefield_assist/thumbs'] = array( 'title' => 'ImageField assist thumbnails', 'page callback' => 'imagefield_assist_thumbs', 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, ); $items['imagefield_assist/upload'] = array( 'title' => 'ImageField assist upload', 'page callback' => 'imagefield_assist_upload', 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, ); $items['imagefield_assist/properties'] = array( 'title' => 'ImageField assist properties', 'page callback' => 'imagefield_assist_properties', 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, ); $items['imagefield_assist/preview'] = array( 'title' => t('Image Preview'), 'page callback' => 'imagefield_assist_preview', 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, ); $items['imagefield_assist/download'] = array( 'title' => t('Image Preview'), 'page callback' => 'imagefield_assist_download', 'page arguments' => array(2), 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, ); $items['imagefield_assist/imginfo'] = array( 'title' => t('Image Preview'), 'page callback' => 'imagefield_assist_image_info', 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, ); // Popup images page. $items['imagefield_assist/popup'] = array( 'title' => 'Popup image', 'page callback' => 'imagefield_assist_popup', 'access callback' => 'user_access', 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, ); // Insert callback (only for inserting HTML, not filter tag). $items['imagefield_assist/insert_html'] = array( 'title' => 'Insert callback', 'page callback' => 'imagefield_assist_insert_html', 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, ); $items['admin/settings/imagefield_assist'] = array( 'title' => 'ImageField assist', 'description' => 'Change settings for the Image assist module.', 'page callback' => 'drupal_get_form', 'page arguments' => array('imagefield_assist_admin_settings'), 'access arguments' => array('administer site configuration'), ); return $items; } /** * Implementation of hook_init(). */ function imagefield_assist_init() { $path = drupal_get_path('module', 'imagefield_assist'); // Lightbox2 integration scripts if (user_access('download original image')){ $orig_text = variable_get('lightbox2_download_link_text', t('Download Original') ); drupal_add_js(array('ifa_lightbox2_original' => "
$orig_text"), 'setting'); } drupal_add_js($path .'/imagefield_assist_lightbox.js', 'module'); if (arg(0) == 'imagefield_assist') { // Suppress Administration menu. module_invoke('admin_menu', 'suppress'); drupal_add_css($path .'/imagefield_assist_popup.css', 'module', 'all', FALSE); } else { drupal_add_js($path .'/imagefield_assist.js'); if (variable_get('imagefield_assist_page_styling', 'yes') == 'yes') { drupal_add_css($path .'/imagefield_assist.css'); } } } /** * Implementation of hook_perm(). */ function imagefield_assist_perm() { return array('access imagefield_assist', 'access all images', 'upload images', 'access advanced options', 'use original size'); } /** * Implementation of hook_elements(). */ function imagefield_assist_elements() { $type['textarea'] = array( '#process' => 'imagefield_assist_textarea' ); return $type; } /** * Preview image * TODO: use drupal_redirect * TODO: use imagecache_create_path */ function imagefield_assist_preview() { if (!arg(2)) exit; $image = current(imagefield_assist_load_imagefields( array('fid' => arg(2) ))); if (!empty($image)) { if (arg(3) && arg(3) != 'fullsize') { header('Location: '. url(file_directory_path() .'/imagecache/'. arg(3) .'/'. $image->path)); } else { header('Location: '. url(file_create_path($image->path))); } } exit; } /** * Download image */ function imagefield_assist_download($fid){ $image = $image = current(imagefield_assist_load_imagefields(array('fid' => $fid))); header("Pragma: public"); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Content-Type: application/force-download"); header( "Content-Disposition: attachment; filename=".basename($image->path)); header( "Content-Description: File Transfer"); @readfile($image->path); exit(); } /** * Ajax Image Default Size */ function imagefield_assist_image_info() { if (!arg(2)) exit; $image = current(imagefield_assist_load_imagefields( array('fid' => arg(2) ))); $info = image_get_info(file_create_path($image->path)); print drupal_to_js($info); exit; } /** * Add JavaScript settings for generating the image link underneath textareas. */ function imagefield_assist_textarea($element) { static $initialized = FALSE; if (!user_access('access imagefield_assist')) { return $element; } $link = variable_get('imagefield_assist_link', 'icon'); if ($link == 'icon' || $link == 'text') { if (_imagefield_assist_textarea_match($element['#id']) && _imagefield_assist_page_match() && !strstr($_GET['q'], 'imagefield_assist')) { if (!$initialized) { // Add settings. $settings['link'] = $link; if ($link == 'icon') { $settings['icon'] = drupal_get_path('module', 'imagefield_assist') .'/add-image.jpg'; } drupal_add_js(array('imagefield_assist' => $settings), 'setting'); $initialized = TRUE; } // Attach behavior. // @todo Some browsers do not support underscores in CSS classes. if (!isset($element['#attributes']['class'])) { $element['#attributes']['class'] = 'imagefield_assist'; } else { $element['#attributes']['class'] .= ' imagefield_assist'; } } } return $element; } /** * Implementation of hook_block(). * * Generates a block that references the other places the current image is used. * The block is only visible when looking at the full view of an image. */ function imagefield_assist_block($op = 'list', $delta = 0) { if ($op == 'list') { $blocks[0]['info'] = t('Image reference'); return $blocks; } else if ($op == 'view') { switch ($delta) { case 0: // Since blocks aren't passed node objects (which makes sense) we need // to determine if we are viewing a node and grab its nid. if (arg(0) == 'node' && is_numeric(arg(1))) { $block['subject'] = t('This image appears in...'); $block['content'] = imagefield_assist_get_references(arg(1)); return $block; } break; } } } /** * Implementation of hook_settings(). */ function imagefield_assist_admin_settings() { require_once drupal_get_path('module', 'imagefield_assist') .'/includes/imagefield_assist.token.inc'; // Access settings. $form['access'] = array( '#type' => 'fieldset', '#title' => t('Access settings'), '#collapsible' => TRUE, '#collapsed' => TRUE, ); $form['access']['imagefield_assist_paths_type'] = array( '#type' => 'radios', '#title' => t('Display Image assist on paths'), '#default_value' => variable_get('imagefield_assist_paths_type', 2), '#options' => array(t('on specific paths'), t('not on specific paths'), t('all paths')), ); $form['access']['imagefield_assist_paths'] = array( '#type' => 'textarea', '#title' => t('Paths'), '#default_value' => variable_get('imagefield_assist_paths', "node/*\ncomment/*"), '#cols' => 40, '#rows' => 5, '#description' => t("Enter one page per line as Drupal paths. The '*' character is a wildcard. Example paths are %blog for the blog page and %blog-wildcard for every personal blog. %front is the front page.", array('%blog' => 'blog', '%blog-wildcard' => 'blog/*', '%front' => '')), ); $form['access']['imagefield_assist_textareas_type'] = array( '#type' => 'radios', '#title' => t('Display Image assist on text areas'), '#default_value' => variable_get('imagefield_assist_textareas_type', 2), '#options' => array(t('Show on every textarea except the listed textareas.'), t('Show on only the listed textareas.'), t('Show on all textareas.')), ); $form['access']['imagefield_assist_textareas'] = array( '#type' => 'textarea', '#title' => t('Text areas'), '#default_value' => variable_get('imagefield_assist_textareas', "edit-body\nedit-comment"), '#cols' => 40, '#rows' => 5, '#description' => t("Enter one text area form-id per line. Form-id's are used by Drupal to typify them, which allows themers and coders to modify certain form fields, but not all. Find form-id's using this method: view the source of the webpage, then search for the string that's just above the text area and you'll see the form-id nearby. The '*' character is a wildcard. For example, you can specify all CCK fields as %cck-example.", array('%cck-example' => 'edit-field-*')), ); $form['access']['imagefield_assist_link'] = array( '#type' => 'select', '#title' => t('Textarea image link'), '#default_value' => variable_get('imagefield_assist_link', 'icon'), '#options' => array('icon' => t('Show icon'), 'text' => t('Show text link'), 'none' => t('Do not show a link')), '#description' => t('Choose what to show under the textareas for which Image assist is enabled.'), ); if (module_exists('taxonomy')) { $vocs = array(0 => '<'. t('none') .'>'); foreach (taxonomy_get_vocabularies() as $vid => $voc) { $vocs[$vid] = $voc->name; } if (count($vocs) > 1) { $form['access']['imagefield_assist_vocabs'] = array( '#type' => 'select', '#multiple' => TRUE, '#title' => t('Select the vocabularies to use for Image assist'), '#default_value' => variable_get('imagefield_assist_vocabs', array()), '#options' => $vocs, '#description' => t('Select the vocabularies you want to be able to filter thumbnails by. This setting changes the behavior of Image assist at startup from loading all image thumbnails to displaying a list of image names until a filter is chosen.'), ); } } // Presets selection $form['presets'] = array( '#type' => 'fieldset', '#title' => t('Imagecache Presets'), '#collapsible' => TRUE, '#collapsed' => TRUE, ); $presets = imagecache_presets(); foreach($presets as $preset){ $form['presets']['imagefield_assist_'.$preset['presetid']] = array( '#type' => 'checkbox', '#title' => t($preset['presetname']), '#default_value' => variable_get('imagefield_assist_'.$preset['presetid'], TRUE), ); } // Other properties. $form['properties'] = array( '#type' => 'fieldset', '#title' => t('Image property dialog settings'), '#collapsible' => TRUE, '#collapsed' => TRUE, ); $form['properties']['imagefield_assist_default_link_behavior'] = array( '#type' => 'select', '#title' => t('Default link behavior'), '#default_value' => variable_get('imagefield_assist_default_link_behavior', 'none'), '#options' => array('none' => t('Not a link'), 'node' => t('Link to image page'), 'popup' => t('Open in popup window'), 'url' => t('Go to URL')), '#description' => t('The link behavior can be overridden when inserting images by users with the proper permissions, but these defaults will still be used for everyone else.'), ); $form['properties']['imagefield_assist_default_link_url'] = array( '#type' => 'textfield', '#title' => t('Default URL'), '#default_value' => variable_get('imagefield_assist_default_link_url', 'http://'), '#size' => 30, '#maxlength' => 255, '#description' => t('The default URL is used when Go to URL is choosen as the link behavior.'), ); $form['properties']['imagefield_assist_default_insert_mode'] = array( '#type' => 'select', '#title' => t('Default insert mode'), '#default_value' => variable_get('imagefield_assist_default_insert_mode', 'none'), '#options' => array('filtertag' => t('Filter Tag'), 'html' => t('HTML Code')), '#description' => t('The insert behavior can be overridden by users with the %permission permission when inserting images. Warning: If images are inserted as HTML, Image Assist is not able to correct a link or image URL afterwards. Please also note that users will not be able to edit already inserted images when using HTML code and the TinyMCE plugin.', array('%permission' => t('access advanced options'))), ); // Image display settings. $form['display'] = array( '#type' => 'fieldset', '#title' => t('Image display settings'), '#collapsible' => TRUE, '#collapsed' => TRUE, ); $form['display']['imagefield_assist_page_styling'] = array( '#type' => 'select', '#title' => t('Include imagefield_assist.css on all pages for styling inline images?'), '#default_value' => variable_get('imagefield_assist_page_styling', 'yes'), '#options' => array('yes' => t('yes'), 'no' => t('no')), '#description' => t('Advanced users can customize their theme\'s CSS file so that inclusion of the imagefield_assist.css file will not be necessary. See notes at the bottom of imagefield_assist.css for details.'), ); $form['lightbox'] = array( '#type' => 'fieldset', '#title' => t('Lightbox2 integration settings'), '#collapsible' => TRUE, '#collapsed' => TRUE, ); $presets = imagefield_assist_get_presets(); if (module_exists('lightbox2')) { $form['lightbox']['imagefield_assist_lightbox_preset'] = array ( '#type' => 'select', '#title' => t('ImageCache preset for Lightbox2 "full" view'), '#options' => $presets, '#default_value' => variable_get('imagefield_assist_lightbox_preset','fullsize'), ); } else { $form['lightbox'][] = array ('#value' => t('This setting requires Lightbox2 module:') . ' project page'); } return system_settings_form($form); } /** * Implementation of hook_filter(). */ function imagefield_assist_filter($op, $delta = 0, $format = -1, $text = '') { switch ($op) { case 'list': return array(0 => t('Inline images')); case 'description': return t('Add images to your posts with Imagefield assist.'); case 'process': $processed = FALSE; foreach (imagefield_assist_get_macros($text) as $unexpanded_macro => $macro) { $expanded_macro = imagefield_assist_render_image($macro); $text = str_replace($unexpanded_macro, $expanded_macro, $text); $processed = TRUE; } return $processed ? theme('imagefield_assist_filter', $text) : $text; default: return $text; } } /** * Implementation of hook_filter_tips(). */ function imagefield_assist_filter_tips($delta, $format, $long = FALSE) { return t('Images can be added to this post.'); } /** * Implementation of hook_nodeapi(). * * - Clear input filter cache. * - Keep track of where images are used. * - Catch nids of recently uploaded images. */ function imagefield_assist_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) { // @todo cleanup if source nodetype updated //cache_clear_all(NULL, 'cache_filter'); } /** * Menu callback; clears relevant caches, redirecting to previous page */ function imagefield_assist_cache_clear() { $core = array('cache_filter', 'cache_page'); foreach ($core as $table) { cache_clear_all('*', $table, TRUE); } drupal_set_message(t('Cache cleared.')); drupal_goto('admin/settings/imagefield_assist'); } /** * @defgroup imagefield_assist_pages Imagefield Assist Pages * @{ * All but imagefield_assist_loader() are in frames. */ /** * Output main imagefield_assist interface HTML. * * @todo Remove hard-coded TinyMCE integration. */ function imagefield_assist_loader() { $path = drupal_get_path('module', 'imagefield_assist'); $caller = arg(2) ? arg(2) : 'textarea'; drupal_add_js($path .'/imagefield_assist_popup.js'); if (module_exists('wysiwyg') && ($editor = wysiwyg_get_editor($caller))) { if ($editor['name'] == 'tinymce') { drupal_add_js($editor['library path'] .'/tiny_mce_popup.js'); } } elseif (module_exists('tinymce') && $caller == 'tinymce') { drupal_add_js(drupal_get_path('module', 'tinymce') .'/tinymce/jscripts/tiny_mce/tiny_mce_popup.js'); } else { $caller = 'textarea'; } drupal_add_js($path .'/imagefield_assist_'. $caller .'.js'); $output = ''."\n"; $output .= "\n"; $output .= "\n"; $output .= ''. t('Add image') ."\n"; $output .= drupal_get_js(); $output .= "\n\n"; $output .= ''."\n"; $output .= ''."\n"; $output .= ''."\n"; $output .= "\n"; $output .= "\n"; echo $output; exit; } /** * Fetch the number of nodes for terms of given vocabulary ids. * * Note that this does not count nodes of subterms, as opposed to * taxonomy_term_count_nodes(). * * @param $vids * An array of taxonomy vocabulary ids. * * @return * An array keyed by term ids with the count of nodes for each term. */ function _imagefield_assist_term_count_nodes($vids) { $count = array(); $result = db_query(db_rewrite_sql('SELECT t.tid, COUNT(n.nid) AS count FROM {term_node} t INNER JOIN {node} n ON t.vid = n.vid INNER JOIN {term_data} td ON td.tid = t.tid WHERE n.status = 1 AND td.vid IN ('. db_placeholders($vids) .') GROUP BY t.tid'), implode(',', $vids)); while ($term = db_fetch_object($result)) { $count[$term->tid] = $term->count; } return $count; } function imagefield_assist_header($mode) { // Mode may be 'uploading', 'properties' or 'browse'. $output = drupal_get_form('imagefield_assist_header_form', $mode); echo theme('imagefield_assist_page', $output, array('id' => 'imagefield_assist_header', 'onload' => 'parent.initHeader();', 'class' => 'imagefield_assist')); exit; } function imagefield_assist_header_form(&$form_state, $mode) { global $user; // Upload image. if ($mode == 'uploading') { $form[] = array('#value' => '
'); $form[] = array('#value' => ''. t('Upload: ') .''. t('Fill in the form below to upload a new image.')); $form[] = array('#value' => '
'); $form['startover'] = array( '#type' => 'button', '#value' => t('Start Over'), '#button_type' => 'button', '#attributes' => array('onclick' => 'parent.onClickStartOver();'), ); $form[] = array('#value' => '
'); } elseif ($mode == 'properties') { $form[] = array('#value' => '
'); $form[] = array('#value' => ''. t('Properties: ') .''. t('Change how the image is displayed.')); $form[] = array('#value' => '
'); $form['startover'] = array( '#type' => 'button', '#value' => t('Start Over'), '#button_type' => 'button', '#attributes' => array('onclick' => 'parent.onClickStartOver()'), ); $form[] = array('#value' => '
'); } // Browse images. else { $form[] = array('#value' => '
'); // @todo : Filter images? if (user_access('upload images')) { $form['upload'] = array( '#type' => 'button', '#value' => t('Upload'), '#suffix' => ' '. t('a new image'), '#button_type' => 'button', '#attributes' => array('onclick' => 'parent.onClickUpload()'), ); } $form[] = array('#value' => '
'); $form['cancel'] = array( '#type' => 'button', '#value' => t('Cancel'), '#button_type' => 'button', '#attributes' => array('onclick' => 'parent.cancelAction()'), ); $form[] = array('#value' => '
'); } return $form; } /** * Interface for adding images. Uses the regular image node form. */ function imagefield_assist_upload() { global $user; module_load_include('inc', 'node', 'node.pages'); module_load_include('inc', 'content', 'includes/content.crud'); // Get all type and field info for this database. $content_info = _content_type_info(); if ( ! in_array('ifa_upload', array_keys($content_info['content types']) )) { $output = t('You must import the ifa_upload content file using CCK Content Copy import form.
You can use the contents of the bundled ifa_upload_content_type file.'); } else { if (user_access('upload images')) { drupal_add_js('$(document).ready(parent.initUpload);', 'inline'); // Define an empty node and fetch an image node form $node = array( 'uid' => $user->uid, 'name' => $user->name, 'type' => 'ifa_upload', 'status' => 0, 'form_display_mode' => 'imagefield_assist' ); $output .= drupal_get_form('ifa_upload_node_form', $node); } else { $output = t('Your account does not have image uploading privileges.'); } } echo theme( 'imagefield_assist_page', $output, array('id' => 'imagefield_assist_upload', 'class' => 'imagefield_assist') ); exit; } /** * Implementation of hook_form_alter(). * * Reroute submit button callback to our own handler to be able to redirect * the user after saving the node. * * @see imagefield_assist_node_form_submit() */ function imagefield_assist_form_alter(&$form, &$form_state, $form_id) { if ($form_id=='ifa_upload_node_form') { // Remove unwanted Form Objects $form['menu']['#access'] = $form['revision_information']['#access'] = $form['author']['#access'] = $form['options']['#access'] = $form['comment_settings']['#access'] = $form['buttons']['preview']['#access'] = $form['title']['#access'] = $form['path']['#access'] = FALSE; // Override submit callback $form['buttons']['submit']['#submit'] = array('imagefield_assist_node_form_submit'); } } /** * Submit callback for image_node_form. */ function imagefield_assist_node_form_submit($form, &$form_state) { // Execute regular node submit handler. $form_state['values']['title']=$form_state['values']['field_ifa_upload'][0]['filename']; node_form_submit($form, $form_state); if ($form_state['values']['field_ifa_upload'][0]['fid'] && $form_state['nid'] && isset($form['#node']->form_display_mode)) { // Send to different url. $form_state['redirect'] = 'imagefield_assist/properties/'. $form_state['values']['field_ifa_upload'][0]['fid']; } } /** * Implementation of hook_imagecache_default_presets(). */ function imagefield_assist_imagecache_default_presets() { $presets = array(); $presets['ifa_crop_100_75'] = array( 'presetname' => 'ifa_crop_100_75', 'title' => t('Scale and Crop 100x75'), 'actions' => array( 0 => array( 'weight' => '0', 'module' => 'imagecache', 'action' => 'imagecache_scale_and_crop', 'data' => array( 'width' => '100', 'height' => '75', ), ), ), ); $presets['ifa_200'] = array( 'presetname' => 'ifa_200', 'title' => t('Scale to 200'), 'actions' => array( 0 => array( 'weight' => '0', 'module' => 'imagecache', 'action' => 'imagecache_scale', 'data' => array( 'width' => '200', 'height' => '200', ), ), ), ); $presets['ifa_thumbnail'] = array( 'presetname' => 'ifa_thumbnail', 'title' => t('Scale to 100'), 'actions' => array( 0 => array( 'weight' => '0', 'module' => 'imagecache', 'action' => 'imagecache_scale', 'data' => array( 'width' => '100', 'height' => '100', ), ), ), ); return $presets; } /** * Detect ImageField Field instances and load Images * * @todo Caching * * @param $filters * Keyed array of filters * 'fid' - File ID * 'node_types' - Node Types that can be used * 'user' - Author of the containing node * 'op' - AND / OR , defaults to AND * @return * Array of Image stdClass objects */ function imagefield_assist_load_imagefields( $filters=array() ) { module_load_include('inc', 'content', 'includes/content.crud'); // Build an array of queries for each field instance $queries=array(); // Find field instances of ImageField; // @todo static, caching, performance? $all_fields = content_fields(); foreach ($all_fields as $name=>$field) { if (preg_match('_imagefield_', $field['widget']['module'])) { $dbfield = content_database_info($field); $queries[]=sprintf( "SELECT nid,%s FROM {%s} WHERE %s", $dbfield['columns']['fid']['column'] .' as fid, '. $dbfield['columns']['data']['column'] .' as data', $dbfield['table'], $dbfield['columns']['fid']['column'] .' IS NOT NULL' ); } } $all_fields = NULL; if (!empty($filters)) { $_filters = array(); if (is_numeric($filters['fid'])) { $_filters[] = sprintf('images.fid = %d', $filters['fid']); } if (is_numeric($filters['nid'])) { $_filters[] = sprintf('n.nid = %d', $filters['nid']); } if (is_array($filters['node_types'])) { $_filters[] = sprintf('n.type IN (\'%s\')', implode('\',\'', $filters['node_types'])); } $_operator = ($filters['op']) ? $filters['op'] : ' AND '; } $qry_filters=''; if (!empty($_filters)) { $qry_filters=sprintf("WHERE %s", implode($_operator, $_filters)); } $images = array(); if (!empty($queries)) { // The final query joining node and files tables $query=sprintf( "SELECT DISTINCT(images.fid), f.filepath as path, n.nid, images.data FROM (%s) as images LEFT JOIN {node} n ON n.nid = images.nid LEFT JOIN {files} f on f.fid = images.fid %s ORDER BY n.changed DESC", implode(" UNION ", $queries), $qry_filters ); if ($filters['count'] && $filters['count'] > 0) { $result = pager_query($query,$filters['count']); } else { $result = db_query($query); } while ($img = db_fetch_object($result)) { $images[]=$img; } } return $images; } /** * Load the thumbnail display pane. * TODO: use theme_table * */ function imagefield_assist_thumbs() { global $user; $output = ''; $count = variable_get('imagefield_assist_count',4); $images = imagefield_assist_load_imagefields(array('count' => $count)); if (!empty($images)) { $output .=""; foreach ($images as $n => $img) { $output .= ''; // Line break if ( ($n+1) % 4 == 0 ) $output .= ''; } $output .="
'. l( theme('imagecache', 'ifa_thumbnail', file_create_path($img->path)), 'imagefield_assist/properties/'. $img->fid, array('html' => TRUE) ) .'
"; } else { $output = t('No Images added yet. Click the upload button above to start.'); } echo theme('imagefield_assist_page', $output, array('id' => 'imagefield_assist_thumbs', 'onload' => 'parent.initThumbs();', 'class' => 'imagefield_assist')); if ($count > 0) { echo theme('pager', variable_get('imagefield_assist_count',0)); } exit; } /** * Load the image properties pane. */ function imagefield_assist_properties() { $fid = arg(2); // Update is put into a hidden field so the javascript can see it. $update = (arg(3)) ? 1 : 0; $img = imagefield_assist_load_imagefields(array('fid' => $fid)); if (!empty($img)) { $output = drupal_get_form('imagefield_assist_properties_form', $img[0] , $update); } else { $output = t('Image not found'); } echo theme('imagefield_assist_page', $output, array('id' => 'imagefield_assist_properties', 'onload' => 'parent.initProperties();', 'class' => 'imagefield_assist')); exit; } /** * Convert a node field value to text for usage in a textfield. * @todo Check if this is needed */ function imagefield_assist_sanitize($text) { return check_plain(trim(preg_replace("/[\r\n]+/", ' ', strip_tags($text)))); } /** * Imagecache presets for displaying image * @todo add to settings form * @todo reenable other when figured out how to do it */ function imagefield_assist_get_presets() { if (user_access('access advanced options')) { // DRET: ADDED TO AVOID "None, use original size" in no ADVANCED USER $presets['fullsize']=t('None, use original size'); } foreach ( imagecache_presets() as $preset) { if(variable_get('imagefield_assist_'.$preset['presetid'],FALSE)) $presets[$preset['presetname']]= ($preset['title']) ? $preset['title'] : $preset['presetname']; } //$presets['other'] = t('Other'); return $presets; } /** * Construct the image properties form. */ function imagefield_assist_properties_form($form_state, &$img, $update) { require_once drupal_get_path('module', 'imagefield_assist') .'/includes/imagefield_assist.token.inc'; $image_info = image_get_info(file_create_path($img->path)); $image_info['aspect_ratio'] = $image_info['height'] / $image_info['width']; $properties_image = theme('imagecache', 'ifa_thumbnail', file_create_path($img->path)); // Get actual image size. $properties_size = array('width' => '100', 'height' => '75');//image_get_info($img->path); // Create an array of image derivative choices // @todo use imagecache profiles instead // Add a choice for 'other' if the user has the proper permission to create // custom sizes. $derivatives=imagefield_assist_get_presets(); // Use 'preview' size by default. $default_size = image_get_info(file_create_path($img->path)); $default_width = $default_size['width']; $default_height = $default_size['height']; // Calculate the aspect ratio to keep in a hidden field // // When 'other' is chosen, the custom size will always follow the aspect ratio. // It doesn't really matter what this value is here because the actual custom // image will be created when the filter tag is processed. The size, of course, // is a bounding box. If it a user stretches an image placeholder out of // proportion in the WYSIWYG editor, the image will never be out of proportion // on the processed page. $aspect_ratio = ($default_height > 0 ? round($default_width / $default_height, 6) : 1); // Create the form. $form[] = array('#value' => '
'); $form[] = array('#value' => ''); $form[] = array('#value' => '
'); $form[] = array('#value' => $properties_image); $form[] = array('#value' => ''. $node->title .''); // Image node properties fieldset. $form['properties'] = array('#type' => 'fieldset', '#title' => t('Image properties')); $form['properties'][] = array('#value' => '
'. t('Size') .':
'. strtr('@widthx@height px', array('@width' => $image_info['width'], '@height' => $image_info['height'])) .'
'); $img_data = unserialize($img->data); if (!empty($img_data)) { $img_data_labels=array( 'title' => t('Title'), 'description' => t('Description'), 'alt' => t('Alternative text') ); foreach ($img_data as $key => $data) { if ($data) { $form['properties'][] = array( '#value' => '
'. $img_data_labels[$key] . ':
'. $img_data[$key] .'
'); } } //$form['properties'][] = array('#value' => '
'. print_r($img_data,TRUE) .'
'); } #$form['properties'][] = array('#value' => '
'. print_r(, TRUE) .'
'); $form[] = array('#value' => '
'); $form['title'] = array( '#type' => 'textfield', '#title' => t('Title (optional)'), '#default_value' => isset($img_data['title']) ? $img_data['title'] : '', '#size' => 50, '#maxlength' => 255, '#description' => NULL, '#attributes' => array('onblur' => 'parent.updateCaption()'), ); $form['desc'] = array( '#type' => 'textfield', '#title' => t('Description (optional)'), '#default_value' => isset($img_data['description']) ? $img_data['description'] : '', '#size' => 50, '#maxlength' => 255, '#description' => NULL, '#attributes' => array('onblur' => 'parent.updateCaption()'), ); // Size. $form[] = array('#value' => '
'); $form[] = array('#value' => '
'); $form[] = array('#value' => ''); $form['size_label'] = array( '#type' => 'select', '#options' => $derivatives, '#attributes' => array('onchange' => 'parent.onChangeSizeLabel()'), ); $form['default_size'] = array('#type' => 'hidden', '#value' => sprintf('%sx%s', $default_width, $default_height)); $form[] = array('#value' => '
'); $form['width'] = array( '#type' => 'textfield', '#default_value' => $default_width, '#size' => 4, '#maxlength' => 4, '#attributes' => array('onblur' => 'parent.onChangeWidth()'), ); $form[] = array('#value' => ' x '); $form['height'] = array( '#type' => 'textfield', '#default_value' => $default_height, '#size' => 4, '#maxlength' => 4, '#attributes' => array('onblur' => 'parent.onChangeHeight()'), ); $form[] = array('#value' => '
'); $form[] = array('#value' => '
'); // Alignment. $form['align'] = array( '#type' => 'select', '#title' => t('Alignment'), '#default_value' => variable_get('imagefield_assist_default_alignment', 'left'), '#options' => array('left' => t('left'), 'right' => t('right'), 'none' => t('none'), 'center' => t('center')), '#prefix' => '
', '#suffix' => '
', ); $form[] = array('#value' => '
'); // Link. if (user_access('access advanced options')) { $form[] = array('#value' => ''); } else { $form['link'] = array( '#type' => 'hidden', '#value' => variable_get('imagefield_assist_default_link_behavior', 'none'), ); $form['url'] = array( '#type' => 'hidden', '#value' => variable_get('imagefield_assist_default_link_url', 'http://'), ); $form['link_options_visible'] = array( '#type' => 'hidden', '#value' => 0, ); } // Default link url is needed for JS to indicate if an url has been entered. $form['default_url'] = array( '#type' => 'hidden', '#value' => variable_get('imagefield_assist_default_link_url', 'http://'), ); // Support for Lightbox2 //$lightbox_enable = module_exists('lightbox2') ? TRUE : FALSE ; $form['lightbox'] = array( '#type' => 'checkbox', '#type' => 'hidden', // DRET: ADDED TO HIDE CHECKOBX FOR LIGHTBOX (sorry, in this situation I didn't find a solution to restrict using only fod Advantage user) '#title' => 'Lightbox2', '#default_value' => 'checked', // DRET: ADDED TO MAKE LIGHTBOX ALWAYS CHECKED '#description' => t('Enable Lightbox2 to diplay nice frame when clicking. Requires Lightbox2 module'), '#disabled' => module_exists('lightbox2') ? FALSE : TRUE, '#return_value' => 'true', ); // Insert Mode (HTML or Filter Tag). if (user_access('access advanced options')) { $form[] = array('#value' => '
'); $form['insertmode'] = array( '#type' => 'select', '#title' => t('Insert mode'), '#default_value' => variable_get('imagefield_assist_default_insert_mode', 'filtertag'), '#options' => array('filtertag' => t('Filter Tag'), 'html' => t('HTML Code')), ); $form[] = array('#value' => '
'); } else { $form['insertmode'] = array( '#type' => 'hidden', '#value' => variable_get('imagefield_assist_default_insert_mode', 'filtertag'), ); } // Hidden Fields. $form['fid'] = array( '#type' => 'hidden', '#value' => $img->fid, ); $form['update'] = array( '#type' => 'hidden', '#value' => $update, ); $form['aspect'] = array( '#type' => 'hidden', '#value' => $aspect_ratio, ); // Buttons. $form['buttons'] = array( '#prefix' => '
', '#suffix' => '
', ); $form['#attributes']['onsubmit'] = 'return parent.insertImage();'; $form['buttons']['insert'] = array( '#type' => 'submit', '#value' => ($update) ? t('Update') : t('Insert'), '#attributes' => array('style' => 'float: left;'), ); $form['buttons']['cancel'] = array( '#type' => 'button', '#value' => t('Cancel'), '#button_type' => 'button', '#attributes' => array('onclick' => 'return parent.cancelAction();', 'style' => 'float: right;'), ); $form[] = array('#value' => '
'); $form['#attributes']['name'] = 'imagefield_assist'; return $form; } function imagefield_assist_properties_form_validate($form, &$form_state) { $html = imagefield_assist_render_image($form_state['values']); imagefield_assist_set_htmlcode($html); drupal_goto('imagefield_assist/insert_html'); } /** * Store image tag or HTML in session. * * Used for saving HTML code so it can be inserted instead of the filter tags. * * @param string $htmlcode * A filter tag or HTML code. If omitted, session variable is emptied. * * @return string * A previously stored value in the user session. */ function imagefield_assist_set_htmlcode($htmlcode = NULL) { if (isset($htmlcode)) { $_SESSION['htmlcode'] = urlencode($htmlcode); } else { $html = urldecode($_SESSION['htmlcode']); $_SESSION['htmlcode'] = ''; return $html; } } function imagefield_assist_insert_html() { $output = drupal_get_form('imagefield_assist_insert_html_form'); echo theme('imagefield_assist_page', $output, array('id' => 'imagefield_assist_insert_html', 'onload' => 'parent.insertImage();', 'class' => 'imagefield_assist')); // @todo fix this! #drupal_set_message(theme('imagefield_assist_page', $output, array('id' => 'imagefield_assist_insert_html', 'onload' => 'parent.insertImage();', 'class' => 'imagefield_assist'))); #watchdog('debug_ifa', ''); } function imagefield_assist_insert_html_form() { $htmlcode = imagefield_assist_set_htmlcode(); $form[] = array( '#id' => 'finalhtmlcode', '#type' => 'hidden', '#value' => $htmlcode, ); $form['insertmode'] = array( '#type' => 'hidden', '#value' => 'html2', ); return $form; } /** * @} End of "defgroup imagefield_assist_pages". */ /** * @defgroup imagefield_assist_image Imagefield Assist Image Generation * @{ * Functions used in image.module vs. imagefield_assist.module (simplified): * * image.module: * - image_display() * - is called for galleries, image nodes, image blocks, etc * (everytime in image is shown) * - returns * - can be passed a specific standard size only * - may call _image_build_derivatives() * - calls theme_image() to create the tag * _image_build_derivatives() * - rebuilds all standard image sizes for a particular node * * imagefield_assist.module: (more complicated, but more flexible) * - image_display() * - is called for thumbnails browsing, inline images, etc (everytime in image is shown) * - returns * - can be passed EITHER a specific standard size only OR a custom size * - may call _image_build_derivatives() * - calls theme_image() to create the tag * _image_build_derivatives() * - rebuilds only a specfic image size (standard or custom size) */ /** * Create an IMG tag for an image. * * This is nearly identical to image_display, but * - it uses a more efficient regenerate images routine * - the size attribute can be a custom size OR a standard size */ function imagefield_assist_display(&$node, $size = NULL, $attributes = array()) { // Custom size should include values for label, width, and height. if (is_array($size) && !empty($size['key']) && !empty($size['width']) && !empty($size['height'])) { $label = $size['key']; } // Standard size. elseif ($size) { // Size can be an array without the width and/or height. if (is_array($size)) { // Size is no longer an array. $size = $size['key']; } $label = $size; } // Assign preview size if no size specified. else { $label = IMAGE_THUMBNAIL; } // Regenerate images if necessary. $regen = FALSE; if (!isset($node->images[$label])) { $regen = TRUE; } elseif (!is_file(file_create_path($node->images[$label]))) { $regen = TRUE; } elseif (filemtime(file_create_path($node->images[$label])) < variable_get('image_updated', 0)) { $regen = TRUE; } else { // If $size is not an array, try to find the corresponding predefined size. // _image_build_derivatives() blindly assigns the *original* image file to // all derivative image sizes that are smaller than the original image size. // Without re-assigning the actual derivative size definition, imagefield_assist // would assume that this derivative size does not exist, delete the // *original* file and subsequently fail to generate derivative images. // Also, when one predefined size has changed, the derivative sizes need to // be updated. if (!is_array($size)) { foreach (image_get_sizes() as $std_size) { if (isset($std_size['key']) && $std_size['key'] == $label) { $size = $std_size; break; } } } if (is_array($size)) { $info = image_get_info(file_create_path($node->images[$label])); if (($info['width'] != $size['width']) && ($info['height'] != $size['height'])) { $regen = TRUE; } } } if ($regen) { _imagefield_assist_build_derivatives($node, $size); } return image_display($node, $label); } /** * Generate a image derivative * * @see _image_build_derivatives() in image.module * @todo remove * * @param $node * @param $size * An array containing the keys 'label', 'width', 'height'. */ function _imagefield_assist_build_derivatives(&$node, $size = NULL) { // Verify the image module and toolkit settings. /*if (!_image_check_settings()) { return FALSE; }*/ $info = image_get_info(file_create_path($node->images[IMAGE_ORIGINAL])); // Custom size. if (is_array($size) && !empty($size['key']) && !empty($size['width']) && !empty($size['height'])) { $sizes = array($size['key'] => $size); } // Standard size. elseif ($size) { // Size can be an array without the width and/or height. if (is_array($size)) { $size = $size['key']; } $sizes = image_get_sizes(); $sizes = array($size => $sizes[$size]); } // No size given: rebuild derivatives for all standard sizes. else { $sizes = image_get_sizes(); } foreach ($sizes as $key => $size) { $size['key'] = $key; _imagefield_assist_remove($node, $size); if (is_array($size) && ($size['label']) && ($size['width']) && ($size['height'])) { if ($info['width'] > $size['width'] || $info['height'] > $size['height']) { $source = file_create_path($node->images[IMAGE_ORIGINAL]); $destination = _image_filename(basename($source), $key, FALSE); $destination_path = file_create_path($destination); if (!image_scale($source, $destination_path, $size['width'], $size['height'])) { drupal_set_message(t('Unable to create %label image', array('%label' => $size['label'])), 'error'); } else { // Set default file permissions for webserver-generated files. @chmod($destination_path, 0664); $node->images[$key] = $destination; _image_insert($node, $key, $destination_path); } } else { $node->images[$key] = $node->images[IMAGE_ORIGINAL]; } } } } function _imagefield_assist_remove($node, $size) { $result = db_query("SELECT * FROM {files} f INNER JOIN {image} i ON f.fid = i.fid WHERE i.nid = %d AND f.filename = '%s'", $node->nid, $size['key']); while ($file = db_fetch_object($result)) { // Never delete original image. if ($file->filepath != $node->images[IMAGE_ORIGINAL]) { // Delete image file. file_delete(file_create_path($file->filepath)); // Delete file reference in database. db_query("DELETE FROM {files} WHERE fid = %d AND filename = '%s'", $file->fid, $size['key']); db_query("DELETE FROM {image} WHERE nid = %d AND fid = '%d'", $node->nid, $file->fid); } } } /** * Return image HTML. * @todo http://drupal.org/node/516982 : Title, Description, Link, Alignement not shown */ function imagefield_assist_render_image($attributes = array()) { global $user; if ($attributes['fid']) { $image = current(imagefield_assist_load_imagefields(array('fid' => $attributes['fid']))); if (!$image) return ''; $caption = ''; if ($attributes['title'] && $attributes['desc']) { $caption = ''. $attributes['title'] .': '. $attributes['desc']; } elseif ($attributes['title']) { $caption = ''. $attributes['title'] .''; } elseif ($attributes['desc']) { $caption = $attributes['desc']; } // Always define an alignment class, even if it is 'none'. $output = ''; // Get preset: comes from 'preset' attribute from filter and 'size_label' from html insert. if (isset($attributes['preset'])) { $preset = empty($attributes['preset']) ? 'fullsize' : $attributes['preset']; } else { $preset = isset($attributes['size_label']) ? $attributes['size_label'] : 'fullsize'; } $img_path = ($preset == 'fullsize')? $img_path = file_create_url($image->path): $img_path = imagecache_create_url($preset, $image->path); if ($preset != 'fullsize' && isset($attributes['size_label'])) { $width = $height = ''; } else { $width = 'width="' . $attributes['width'] . '"'; $height = 'height="' . $attributes['height'] . '"'; } // DRET: Revoving the "title" froma IMG Tag (W3c standard respect) $img_tag = sprintf( '%s', $img_path, $attributes['alt'], $attributes['title'], $width, $height ); $link = $attributes['link']; $url = ''; // Backwards compatibility: Also parse link/url in the format link=url,foo. if (strpos($link, ',') !== FALSE) { list($link, $url) = explode(',', $link, 2); } elseif (isset($attributes['url'])) { $url = $attributes['url']; } if ($attributes['lightbox']['#checked']){ $preset = variable_get('imagefield_assist_lightbox_preset','fullsize'); if ($preset=='fullsize') { $link = file_create_url($image->path); } else { $link = imagecache_create_url($preset, $image->path); } // Lightbox Output code $output .= <<$img_tag LINK; } elseif ($link == 'node') { $output .= l($img_tag, 'node/'.$image->nid, array('html' => TRUE)); } elseif ($link == 'popup') { $width = $attributes['width'] ? $attributes['width'] : 400; $height = $attributes['height'] ? $attributes['height'] : 300; $output .= l($img_tag, $img_path, array('attributes' => array('onclick' => 'launch_popup("'.$image->path.'", '. $width.', '.$height.'); return false;', 'target' => '_blank'), 'html' =>TRUE)); } elseif ($link == 'url') { $output .= l($img_tag, $url, array('html' => TRUE)); } else { $output .= $img_tag; } // DRET: Removing Title/Image description under the Image (but not in ALT property of Img Tag) // if ($caption) { // if ($attributes['align'] != 'center') { // Reduce the caption width slightly so the variable width of the text // doesn't ever exceed image width. // $width = $attributes['width'] - 2; // $output .= ''. $caption .''; // } // else { // $output .= ''. $caption .''; // } // } $output .= ''; return $output; } } function imagefield_assist_popup() { $path = $_GET['q']; $path = substr($path,44); $path = file_create_url($path); $content = ''; $attributes = array('id' => 'imagefield_assist_popup'); echo theme('imagefield_assist_popup', $content, $attributes); exit; } /** * @} End of "defgroup imagefield_assist_image". */ /** * @defgroup imagefield_assist_reference Imagefield Assist Image Referencing Routines * @{ */ /** * Update the map table * * Look for any images linked in this content and keep a reference of them. */ function imagefield_assist_map_save($node) { $content = $node->body; // If CCK is used, image macros can be found in fields other than the body. // Get all the fields that use text filtering and extract their content: if (function_exists('content_types')) { $type = content_types($node->type); if (!empty($type['fields'])) { foreach ($type['fields'] as $field) { // Distinguish between plain text fields and filtered fields: if (!empty($field['text_processing'])) { if (count($node->{$field['field_name']})) { foreach ($node->{$field['field_name']} as $field_instance) { $content .= $field_instance['value']; } } } } } } // Get all the macros from the content: $macros = (array)imagefield_assist_get_macros($content); // Save the image references: db_query('DELETE FROM {imagefield_assist_map} WHERE nid = %d', $node->nid); $nids = array(); foreach ($macros as $m) { if (!isset($nids[$m['nid']]) && is_numeric($m['nid'])) { db_query('INSERT INTO {imagefield_assist_map} (nid, iid) VALUES(%d, %d)', $node->nid, $m['nid']); $nids[$m['nid']] = $m['nid']; } } } /** * Delete references to a non-existant node. * * If a node is being deleted update the map table. The node can either be an * image node or a node containing one ore more images. Note: nodes that link * to image nodes that are deleted will still be broken. */ function imagefield_assist_map_delete($node) { db_query('DELETE FROM {imagefield_assist_map} WHERE nid = %d OR iid = %d', $node->nid, $node->nid); } /** * Load the image map for a given nid. */ function imagefield_assist_map_load($nid) { $imagemap = array(); $result = db_query('SELECT * FROM {image} i INNER JOIN {imagefield_assist_map} iam ON i.nid = iam.iid WHERE i.nid = %d', $nid); while ($data = db_fetch_object($result)) { $imagemap[] = $data->nid; } return $imagemap; } /** * Return a list of node links for a given nid. */ function imagefield_assist_get_references($nid, $limit = 10) { $and_clause = array(); $images = imagefield_assist_map_load($nid); foreach ($images as $id) { $and_clause[] = 'n.nid = '. $id; } $and_clause = implode(' OR ', $and_clause); if ($images) { return node_title_list(db_query_range(db_rewrite_sql("SELECT n.nid, n.title FROM {node} n WHERE n.status = 1 AND $and_clause ORDER BY n.nid DESC"), 0, (int) $limit)); } } /** * @} End of "defgroup imagefield_assist_reference". */ /** * @defgroup imagefield_assist_macro Imagefield Assist Filter macro parsing * @{ */ /** * Return all imagefield_assist macros as an array. */ function imagefield_assist_get_macros($text) { $m = array(); preg_match_all('/ \[ ( [^\[\]]+ )* \] /x', $text, $matches); // Don't process duplicates. $tag_match = (array) array_unique($matches[1]); foreach ($tag_match as $macro) { $current_macro = '['. $macro .']'; $param = array_map('trim', explode('|', $macro)); // The first macro param is assumed to be the function name. $func_name = array_shift($param); if ($func_name == 'imagefield_assist') { $vars = array(); foreach ($param as $p) { $pos = strpos($p, '='); $varname = trim(substr($p, 0, $pos)); $varvalue = substr($p, $pos + 1); $vars[$varname] = trim($varvalue); } // The full unaltered filter string is the key for the array of filter // attributes. $m[$current_macro] = $vars; } } return $m; } /** * Determine if imagefield_assist can render the current page. * @see block_list(). * * @return * TRUE if can render, FALSE if not allowed. */ function _imagefield_assist_page_match() { $must_match = variable_get('imagefield_assist_paths_type', 2); if ($must_match == 2) { return TRUE; } else { $paths = variable_get('imagefield_assist_paths', "node/*\ncomment/*"); $path = drupal_get_path_alias($_GET['q']); $regexp = '/^('. preg_replace(array('/(\r\n?|\n)/', '/\\\\\*/', '/(^|\|)\\\\($|\|)/'), array('|', '.*', '\1'. variable_get('site_frontpage', 'node') .'\2'), preg_quote($paths, '/')) .')$/'; $match = preg_match($regexp, $path); return $match != $must_match; } } /** * Determine if imagefield_assist can render the current textarea. * @see block_list(). * * @return * TRUE if can render, FALSE if not allowed. */ function _imagefield_assist_textarea_match($formid) { $must_match = variable_get('imagefield_assist_textareas_type', 2); if ($must_match == 2) { return TRUE; } else { $formids = variable_get('imagefield_assist_textareas', "edit-body\nedit-comment"); $regexp = '/^('. preg_replace(array('/(\r\n?|\n)/', '/\\\\\*/'), array('|', '.*'), preg_quote($formids, '/')) .')$/'; // Compare with the form id. $page_match = preg_match($regexp, $formid); // When $must_match has a value of 0, imagefield_assist is displayed on // all pages except those listed in imagefield_assist_textareas. When set to 1, it // is displayed only on those textareas listed in imagefield_assist_textareas. $page_match = !($must_match xor $page_match); return $page_match; } } /** * @} End of "defgroup imagefield_assist_macro". */ /** * @defgroup imagefield_assist_theme Imagefield Assist Theme functions * @{ * * @ingroup themeable */ function theme_imagefield_assist_inline($node, $size, $attributes) { $caption = ''; if ($attributes['title'] && $attributes['desc']) { $caption = ''. $attributes['title'] .': '. $attributes['desc']; } elseif ($attributes['title']) { $caption = ''. $attributes['title'] .''; } elseif ($attributes['desc']) { $caption = $attributes['desc']; } // Change the node title because imagefield_assist_display() uses the node title for // alt and title. $node->title = strip_tags($caption); $img_tag = imagefield_assist_display($node, $size); // Always define an alignment class, even if it is 'none'. $output = ''; $link = $attributes['link']; $url = ''; // Backwards compatibility: Also parse link/url in the format link=url,foo. if (strpos($link, ',') !== FALSE) { list($link, $url) = explode(',', $link, 2); } elseif (isset($attributes['url'])) { $url = $attributes['url']; } if ($link == 'node') { $output .= l($img_tag, 'node/'. $node->nid, array('html' => TRUE)); } elseif ($link == 'popup') { $popup_size = variable_get('imagefield_assist_popup_label', IMAGE_PREVIEW); $info = image_get_info(file_create_path($node->images[$popup_size])); $width = $info['width']; $height = $info['height']; $popup_url = file_create_url($node->images[variable_get('imagefield_assist_popup_label', IMAGE_PREVIEW)]); $output .= l( $img_tag, $popup_url, array( 'attributes' => array('onclick' => "launch_popup({$node->nid}, {$width}, {$height}); return false;", 'target' => '_blank'), 'html' => TRUE) ); } elseif ($link == 'url') { $output .= l($img_tag, $url, array('html' => TRUE)); } else { $output .= $img_tag; } if ($caption) { if ($attributes['align'] != 'center') { $info = image_get_info(file_create_path($node->images[$size['key']])); // Reduce the caption width slightly so the variable width of the text // doesn't ever exceed image width. $width = $info['width'] - 2; $output .= ''. $caption .''; } else { $output .= ''. $caption .''; } } $output .= ''; return $output; } function theme_imagefield_assist_filter($text) { // The div tag added to the end of each node is necessary to clear the // floating properties of inline images immediately after a node's content. return $text .'
'; } function theme_imagefield_assist_popup($content, $attributes = NULL) { $title = drupal_get_title(); $output = ''."\n"; $output .= "\n"; $output .= "\n"; $output .= ''. $title ."\n"; $output .= drupal_get_html_head(); $output .= drupal_get_css(); $output .= "\n"; $output .= '\n"; $output .= "\n"; $output .= l($content, '', array('attributes' => array('onclick' => 'javascript:window.close();'), 'html' => TRUE)); $output .= "\n"; $output .= ''; $output .= ''; return $output; } function theme_imagefield_assist_page($content, $attributes = NULL) { $title = drupal_get_title(); $output = ''."\n"; $output .= ''."\n"; $output .= "\n"; $output .= ''. $title ."\n"; // Note on CSS files from Benjamin Shell: // Stylesheets are a problem with image assist. Image assist works great as a // TinyMCE plugin, so I want it to LOOK like a TinyMCE plugin. However, it's // not always a TinyMCE plugin, so then it should like a themed Drupal page. // Advanced users will be able to customize everything, even TinyMCE, so I'm // more concerned about everyone else. TinyMCE looks great out-of-the-box so I // want image assist to look great as well. My solution to this problem is as // follows: // If this image assist window was loaded from TinyMCE, then include the // TinyMCE popups_css file (configurable with the initialization string on the // page that loaded TinyMCE). Otherwise, load drupal.css and the theme's // styles. This still leaves out sites that allow users to use the TinyMCE // plugin AND the Add Image link (visibility of this link is now a setting). // However, on my site I turned off the text link since I use TinyMCE. I think // it would confuse users to have an Add Images link AND a button on the // TinyMCE toolbar. // // Note that in both cases the imagefield_assist.css file is loaded last. This // provides a way to make style changes to imagefield_assist independently of how it // was loaded. $output .= drupal_get_html_head(); $output .= drupal_get_js(); $output .= "\n\n"; // Ensure that imagefield_assist.js is imported last. $path = drupal_get_path('module', 'imagefield_assist') .'/imagefield_assist_popup.css'; $output .= "\n"; $output .= "\n"; $output .= '\n"; $output .= theme_status_messages(); $output .= "\n"; $output .= $content; $output .= "\n"; $output .= ''; $output .= ''; return $output; } /** * @} End of "defgroup imagefield_assist_theme". */ /** * Implementation of hook_wysiwyg_plugin(). */ function imagefield_assist_wysiwyg_plugin($editor, $version) { switch ($editor) { case 'tinymce': if ($version > 3) { return array( 'imagefield_assist' => array( 'path' => drupal_get_path('module', 'imagefield_assist') .'/drupalimage/editor_plugin.js', 'buttons' => array('imagefield_assist' => t('ImageField Assist')), 'url' => 'http://drupal.org/project/imagefield_assist', 'extended_valid_elements' => array('img[class|src|border=0|alt|title|width|height|align|name|style]'), 'load' => TRUE, ), ); } break; } } /** * @defgroup imagefield_assist_legacy Imagefield Assist Legacy functions * @{ * Used for backwards compatibility with original imagefield_assist module. */ /** * Load all images into a static array. */ function imagefield_assist_load_images($tid = NULL, $uid = NULL) { static $image; if ($tid) { foreach ($tid as $key => $term) { if ($term == 0) { unset($tid[$key]); } } $image = NULL; } $where = ''; if ($uid > 0) { $image = NULL; $where = 'AND n.uid = '. db_escape_string($uid); } if (!$image) { $result = db_query(db_rewrite_sql("SELECT n.nid, n.title, r.teaser, i.*, f.* FROM {node} n INNER JOIN {node_revisions} r ON r.nid = n.nid AND r.vid = n.nid INNER JOIN {image} i ON n.nid = i.nid AND n.type = 'image' INNER JOIN {files} f ON f.fid = i.fid ". $where ." ORDER BY n.changed DESC")); while ($node = db_fetch_object($result)) { $node->filepath = file_create_path($node->filepath); $dim = getimagesize($node->filepath, $info); $node->width = $dim[0]; $node->height = $dim[1]; $image[$node->nid][$node->filename] = $node; if ($tid) { $tid2 = array(); foreach (taxonomy_node_get_terms($node) as $term) { $tid2[] = $term->tid; } if (array_intersect($tid, $tid2) == $tid) { $img[$node->nid][$node->filename] = $node; } } } $image = ($tid) ? $img : $image; // Note: If we didn't use "LIKE 'image/%%'" here we could load other files. // Might be interesting to expand on this someday. if ($image) { $result = db_query(db_rewrite_sql("SELECT n.nid, n.title, r.teaser, i.*, f.* FROM {image} i, {node} n INNER JOIN {node_revisions} r ON r.nid = n.nid AND r.vid = n.nid INNER JOIN {files} f ON f.fid = i.fid WHERE i.nid = n.nid AND f.filemime LIKE 'image/%%' AND n.nid NOT IN (". implode(array_keys($image), ', ') .") ". $where ." ORDER BY n.changed DESC")); while ($node = db_fetch_object($result)) { $node->filepath = file_create_path($node->filepath); $dim = getimagesize($node->filepath, $info); $node->width = $dim[0]; $node->height = $dim[1]; $image[$node->nid][IMAGE_THUMBNAIL] = $node; $image[$node->nid][IMAGE_ORIGINAL] = $node; if ($tid) { $tid2 = array(); foreach (taxonomy_node_get_terms($node) as $term) { $tid2[] = $term->tid; } if (array_intersect($tid, $tid2) == $tid) { $img[$node->nid][IMAGE_THUMBNAIL] = $node; $img[$node->nid][IMAGE_ORIGINAL] = $node; } } } $image = ($tid) ? $img : $image; } } return $image; } /** * Load an image from the database. */ function imagefield_assist_load_image($id, $derivatives = TRUE) { kpr(debug_backtrace()); $node = db_fetch_object(db_query(db_rewrite_sql('SELECT n.nid, n.title, i.*, f.* FROM {image} i, {node} n INNER JOIN {files} f ON f.fid = i.fid WHERE f.nid = n.nid AND f.fid = %d'), $id)); $node->filepath = file_create_path($node->filepath); if (!$derivatives) { $dim = getimagesize($node->filepath, $info); $node->width = $dim[0]; $node->height = $dim[1]; $image[$node->filename] = $node; } else { $image_module_image = FALSE; if (function_exists('image_get_sizes')) { foreach (image_get_sizes() as $size) { if ($size['label'] == $node->filename) { $image_module_image = TRUE; $result = db_query(db_rewrite_sql('SELECT n.nid, n.title, r.teaser, i.*, f.* FROM {image} i, {node} n INNER JOIN {node_revisions} r ON r.nid = n.nid AND r.vid = n.nid INNER JOIN {files} f ON f.fid = i.fid WHERE i.nid = n.nid AND n.nid = %d'), $node->nid); while ($node = db_fetch_object($result)) { $node->filepath = file_create_path($node->filepath); $dim = getimagesize($node->filepath, $info); $node->width = $dim[0]; $node->height = $dim[1]; $image[$node->filename] = $node; } break; } } } if (!$image_module_image) { $dim = getimagesize($node->filepath, $info); $node->width = $dim[0]; $node->height = $dim[1]; $image[IMAGE_THUMBNAIL] = $node; $image[IMAGE_ORIGINAL] = $node; } } return $image; } /** * Attach the thumbnail metadata to the image object. * * Unfortunately we have to query the database since the thumbnail can be named * something entirely different from the original image. */ function _imagefield_assist_get_thumbnail(&$image) { static $thumbs = array(); if ($thumbs[$image->nid] === NULL) { $thumbpath = file_create_path(db_result(db_query("SELECT f.filepath FROM {image} i INNER JOIN {files} f ON f.fid = i.fid WHERE i.nid = %d AND f.filename = '%s'", $image->nid, IMAGE_THUMBNAIL))); // In old versions of image.module thumbs were named 'thumb_filename.ext'. if (!file_exists($thumbpath)) { $pos = strrpos($image->filepath, '/') + 1; $thumbpath = file_create_path(substr($image->filepath, 0, $pos) .'thumb_'. substr($image->filepath, $pos)); } $img->thumbpath = is_file($thumbpath) && preg_match('|^'. variable_get('file_directory_path', 'files') .'\/'. variable_get('image_default_path', 'images') .'\/|', $image->filepath) ? $thumbpath : $image->filepath; $dim = getimagesize($img->thumbpath, $info); $img->thumbwidth = $dim[0]; $img->thumbheight = $dim[1]; $thumbs[$image->nid] = $img; } if ($thumbs[$image->nid]) { foreach ($thumbs[$image->nid] as $key => $value) { $image->$key = $value; } } } function theme_imagefield_assist_legacy() { return '
%alt
%caption
'; } /** * @} End of "defgroup imagefield_assist_legacy". */