diff -urp 5.x-2.0-rc8/imagefield.css 6.x-2.0-rc8/imagefield.css
--- 5.x-2.0-rc8/imagefield.css 2008-04-18 20:31:40.000000000 +1000
+++ 6.x-2.0-rc8/imagefield.css 2008-05-07 23:10:15.000000000 +1000
@@ -1,9 +1,3 @@
-div.imagefield-edit-image-row {
- border: 1px solid #e5e5e5;
- padding: 5px;
- margin-bottom: 10px;
-}
-
div.imagefield-edit-preview img {
border: 1px solid #e5e5e5;
}
@@ -29,3 +23,6 @@ div.imagefield-edit-image-flags div.form
float: right;
}
+div.imagefield-element input.form-submit {
+ margin: 0 0.5em 0 0;
+}
diff -urp 5.x-2.0-rc8/imagefield.info 6.x-2.0-rc8/imagefield.info
--- 5.x-2.0-rc8/imagefield.info 2008-04-21 17:10:12.000000000 +1000
+++ 6.x-2.0-rc8/imagefield.info 2008-05-07 23:10:15.000000000 +1000
@@ -1,7 +1,8 @@
; $Id: imagefield.info,v 1.4.4.3 2008/04/19 23:17:02 dopry Exp $
name = ImageField
description = Defines an image field type.
-dependencies = content
+core = 6.x
+dependencies[] = content
package = CCK
; Information added by drupal.org packaging script on 2008-04-21
Only in 6.x-2.0-rc8: imagefield.info.orig
diff -urp 5.x-2.0-rc8/imagefield.install 6.x-2.0-rc8/imagefield.install
--- 5.x-2.0-rc8/imagefield.install 2007-04-19 07:02:19.000000000 +1000
+++ 6.x-2.0-rc8/imagefield.install 2008-05-07 23:10:15.000000000 +1000
@@ -5,8 +5,29 @@
* Implementation of hook_install().
*/
function imagefield_install() {
+ content_notify('install', 'imagefield');
}
+/**
+ * Implementation of hook_uninstall().
+ */
+function imagefield_uninstall() {
+ content_notify('uninstall', 'imagefield');
+}
+
+/**
+ * Implementation of hook_enable().
+ */
+function imagefield_enable() {
+ content_notify('enable', 'imagefield');
+}
+
+/**
+ * Implementation of hook_disable().
+ */
+function imagefield_disable() {
+ content_notify('disable', 'imagefield');
+}
/**
* Data is now stored in per-field tables.
@@ -73,6 +94,30 @@ function imagefield_update_2() {
return $ret;
}
+/**
+ * Upgrade to CCK 2 and Drupal 6.
+ */
+function imagefield_update_6100() {
+ include_once('./'. drupal_get_path('module', 'content') .'/content_crud.inc');
+ $fields = content_fields();
+ foreach ($fields as $field) {
+ // Convert max_number_images to CCK's multiple limit.
+ if ($field['type'] == 'image' && isset($field['widget']['max_number_images'])) {
+ if ($field['widget']['max_number_images'] == 0) {
+ $field['multiple'] = 1; // 1 means "Unlimited" in CCK.
+ }
+ elseif ($field['widget']['max_number_images'] == 1) {
+ $field['multiple'] = 0; // 0 means "Not Multiple" in CCK.
+ }
+ else {
+ $field['multiple'] == $field['widget']['max_number_images'];
+ }
+ $field = array_merge($field, $field['widget']);
+ content_field_instance_update($field);
+ }
+ }
+ return array();
+}
diff -urp 5.x-2.0-rc8/imagefield.module 6.x-2.0-rc8/imagefield.module
--- 5.x-2.0-rc8/imagefield.module 2008-04-21 16:51:48.000000000 +1000
+++ 6.x-2.0-rc8/imagefield.module 2008-05-07 23:11:45.000000000 +1000
@@ -12,55 +12,14 @@
/**
* Implementation of hook_menu().
*/
-function imagefield_menu($maycache) {
+function imagefield_menu() {
$items = array();
- if ($maycache) {
- $items[] = array(
- 'path' => 'imagefield/js',
- 'callback' => 'imagefield_js',
- //'access' => user_access(),
- 'access' => TRUE,
- 'type' => MENU_CALLBACK
- );
- }
- elseif ($_SESSION['imagefield']) {
- // do this variable_get once....
- $download_method = variable_get('file_downloads', FILE_DOWNLOADS_PUBLIC);
-
- // Iterate over each field stored in session imagefield looking
- // for files in a preview state to add menu items for. This
- // allows us to preview new uploads before a node is submitted.
- foreach ($_SESSION['imagefield'] as $fieldname => $files) {
- // move on to the next field if there is nothing to process in files.
- if (empty($files)) continue;
-
- foreach ($files as $delta => $file) {
- // If the file is not a preview do not display it.
- if (empty($file['preview'])) continue;
-
- // filepath to pass into _imagefield_preview
- $filepath = $file['preview'];
-
- // build url path for private files menu item.
- if ($download_method == FILE_DOWNLOADS_PRIVATE) {
- // strip out the file_directory_path. It shouldn't be a part
- // of the URL with private downloads.
- if (strpos($file['preview'], file_directory_path()) !== FALSE) {
- $file['preview'] = trim(substr($file['preview'], strlen(file_directory_path())), '\\/');
- }
- $file['preview'] = 'system/files/'. $file['preview'];
- }
-
- $items[] = array(
- 'path' => $file['preview'],
- 'callback' => '_imagefield_preview',
- 'callback arguments' => array($filepath),
- 'access' => TRUE,
- 'type' => MENU_CALLBACK,
- );
- }
- }
- }
+ $items['imagefield/js'] = array(
+ 'page callback' => 'imagefield_js',
+ 'access callback' => 'user_access',
+ 'access arguments' => array('access content'),
+ 'type' => MENU_CALLBACK,
+ );
return $items;
}
@@ -106,7 +65,10 @@ function imagefield_perm() {
*/
function imagefield_field_info() {
return array(
- 'image' => array('label' => 'Image'),
+ 'image' => array(
+ 'label' => t('Image'),
+ 'description' => t('Store an image file and text for alt and title tags.'),
+ ),
);
}
@@ -115,14 +77,12 @@ function imagefield_field_info() {
*/
function imagefield_field_settings($op, $field) {
switch ($op) {
- case 'callbacks':
- return array('view' => CONTENT_CALLBACK_CUSTOM);
-
case 'form':
$form = array();
$form['default'] = array(
'#type' => 'fieldset',
'#title' => t('Default image'),
+ '#element_validate' => array('_imagefield_field_settings_default_validate'),
);
// Present a thumbnail of the current default image.
$form['default']['use_default_image'] = array(
@@ -150,7 +110,45 @@ function imagefield_field_settings($op,
);
return $form;
- case 'validate':
+ case 'save':
+ return array('default_image', 'use_default_image');
+
+ case 'database columns':
+ $columns = array(
+ 'fid' => array('type' => 'int', 'not null' => true, 'default' => '0'),
+ 'title' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'default' => '', 'sortable' => true),
+ 'alt' => array('type' => 'varchar', 'length' => 255, 'not null' => true, 'default' => '', 'sortable' => true),
+ );
+ return $columns;
+
+ case 'filters':
+ return array(
+ 'not null' => array(
+ 'operator' => array('=' => t('Has Image')),
+ 'list' => 'views_handler_operator_yesno',
+ 'list-type' => 'select',
+ 'handler' => 'imagefield_views_handler_filter_is_not_null',
+ ),
+ );
+ }
+}
+
+/**
+ * Element specific validation for imagefield default value.
+ *
+ * Validated in a separate function from imagefield_field() to get access
+ * to the $form_state variable.
+ */
+function _imagefield_field_settings_default_validate($element, &$form_state) {
+ // We save the upload here because we can't know the correct
+ // file path until we save the file.
+ if ($file = file_save_upload('default_image_upload', array(), file_directory_path())) {
+ $form_state['values']['default_image'] = (array)$file;
+ }
+
+ return;
+
+ // D6TODO: need to figure out where to put this code:
// We save the upload here because we can't know the correct
// file path until we save the file.
// Check of we got an new upload.
@@ -179,28 +177,8 @@ function imagefield_field_settings($op,
// from validate.
form_set_value(array('#parents' => array('default_image')), (array) $file);
break;
-
- case 'save':
- return array('default_image', 'use_default_image');
-
- case 'database columns':
- $columns = array(
- 'fid' => array('type' => 'int', 'not null' => TRUE, 'default' => '0'),
- 'title' => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => "''", 'sortable' => TRUE),
- 'alt' => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => "''", 'sortable' => TRUE),
- );
- return $columns;
-
- case 'filters':
- return array(
- 'not null' => array(
- 'operator' => array('=' => t('Has Image')),
- 'list' => 'views_handler_operator_yesno',
- 'list-type' => 'select',
- 'handler' => 'imagefield_views_handler_filter_is_not_null',
- ),
- );
- }
+
+
}
/**
@@ -221,16 +199,8 @@ function imagefield_views_handler_filter
}
-function imagefield_default_item() {
- return array(
- 'fid' => 0,
- 'title' => '',
- 'alt' => '',
- );
-}
-
/**
- * Insert a file into the database.
+ * Make a temporary file permanent in the files table.
*
* @param $node
* Node object this file is be associated with.
@@ -238,32 +208,18 @@ function imagefield_default_item() {
* File to be inserted, passed by reference since fid should be attached.
*/
function imagefield_file_insert($node, &$file, $field) {
- $fieldname = $field['field_name'];
-
- // allow tokenized paths.
- if (function_exists('token_replace')) {
- global $user;
- $widget_image_path = token_replace($field['widget']['image_path'], 'user', $user);
- }
- else {
- $widget_image_path = $field['widget']['image_path'];
+ if ($file['flags']['delete'] == TRUE) {
+ // don't delete files if we're creating new revisions, but still return an empty
+ // array...
+ if ($node->old_vid || _imagefield_file_delete($file, $field['field_name'])) {
+ return array();
+ }
}
-
- $filepath = file_create_path($widget_image_path) .'/'. $file['filename'];
-
- if (imagefield_check_directory($widget_image_path) && $file = file_save_upload((object)$file, $filepath)) {
+ elseif (isset($file['fid'])) {
+ $file = (object)$file;
+ file_set_status($file, FILE_STATUS_PERMANENT);
$file = (array)$file;
- $file['fid'] = db_next_id('{files}_fid');
- db_query("INSERT into {files} (fid, nid, filename, filepath, filemime, filesize)
- VALUES (%d, %d, '%s','%s','%s',%d)",
- $file['fid'], $node->nid, $file['filename'], $file['filepath'], $file['filemime'], $file['filesize']);
- module_invoke_all('imagefield_file', 'save', $file);
- return (array)$file;
- }
- else {
- // Include file name in upload error.
- form_set_error(NULL, t('Image upload was unsuccessful.'));
- return FALSE;
+ return $file;
}
}
@@ -278,26 +234,7 @@ function imagefield_file_insert($node, &
* The field definition for this image field.
*/
function imagefield_file_update($node, &$file, $field) {
- $file = (array)$file;
- if ($file['flags']['delete'] == TRUE) {
- // don't delete files if we're creating new revisions, but still return an empty
- // array...
- if ($node->old_vid || _imagefield_file_delete($file, $field['field_name'])) {
- return array();
- }
- }
- if ($file['fid'] == 'upload') {
- return imagefield_file_insert($node, $file, $field);
- }
- else {
- // empty files without fid.
- if ($file['fid'] == 0) {
- $file = array();
- }
- // if fid is not numeric here we should complain.
- // else we update the file table.
- }
- return $file;
+ return imagefield_file_insert($node, $file, $field);
}
/**
@@ -326,7 +263,7 @@ function imagefield_field($op, $node, $f
// called before content.module defaults.
case 'insert':
foreach ($items as $delta => $item) {
- if ($item['flags']['delete']) {
+ if (!empty($item['flags']['delete'])) {
unset($items[$delta]);
}
else {
@@ -334,37 +271,28 @@ function imagefield_field($op, $node, $f
}
}
$items = array_values(array_filter($items)); // compact deltas
- imagefield_clear_field_session($fieldname);
break;
// called before content.module defaults.
case 'update':
foreach ($items as $delta => $item) {
-
- // If we're dealing with a single value field, and we just received
- // a new file item, we need to mark the existing (old) one for
- // deletion. Otherwise, it will become orphaned.
- if (!$field['multiple'] && (count($items) > 1) && ($delta === 0)) {
- $item['flags']['hidden'] = TRUE;
- $item['flags']['delete'] = TRUE;
- }
-
// Update each file item.
$items[$delta] = imagefield_file_update($node, $item, $field);
+ // D6TODO: not sure if this bit is still relevant it was added after quicksketch's patch:
// If the file has been deleted, unset the file entry so that it's
// actually deleted from the database, or at least set it to a
// default item if CCK won't delete it.
if (empty($items[$delta])) {
- if ($field['multiple']) {
+ if ($field['multiple'] != 1) {
unset($items[$delta]);
}
}
}
$items = array_values(array_filter($items)); // compact deltas
- imagefield_clear_field_session($fieldname);
break;
+ // D6TODO: need to review this code
case 'delete revision':
$db_info = content_database_info($field);
foreach ($items as $delta => $item) {
@@ -383,16 +311,27 @@ function imagefield_field($op, $node, $f
}
break;
- case 'view':
- $context = $teaser ? 'teaser' : 'full';
- $formatter = isset($field['display_settings'][$context]['format']) ? $field['display_settings'][$context]['format'] : 'default';
- if ($field['use_default_image'] && empty($items) ) {
- $items[0] = $field['default_image'];
- }
+ case 'sanitize':
foreach ($items as $delta => $item) {
- $items[$delta]['view'] = content_format($field, $item, $formatter, $node);
+ // Cleanup $items during node preview.
+ if (empty($item['fid']) || !empty($item['flags']['delete']) || !empty($item['flags']['hidden'])) {
+ unset($items[$delta]);
+ }
+
+ // Load the complete file if a filepath is not available.
+ if (!empty($item['fid']) && empty($item['filepath'])) {
+ $items[$delta] = array_merge($item, _imagefield_file_load($item['fid']));
+ }
+
+ // Add nid so formatters can create a link to the node.
+ $items[$delta]['nid'] = $node->nid;
+ }
+
+ // If completely empty, check for a default image.
+ if (empty($items) && $field['use_default_image'] && $field['default_image']['fid']) {
+ $items[$field['default_image']['fid']] = $field['default_image'];
+ $items[$field['default_image']['fid']] = $node->nid;
}
- return theme('field', $node, $field, $items, $teaser, $page);
}
}
@@ -402,8 +341,10 @@ function imagefield_field($op, $node, $f
function imagefield_widget_info() {
return array(
'image' => array(
- 'label' => 'Image',
+ 'label' => t('Image'),
'field types' => array('image'),
+ 'multiple values' => CONTENT_HANDLE_MODULE,
+ 'callbacks' => array('default value' => CONTENT_CALLBACK_CUSTOM),
),
);
}
@@ -413,9 +354,6 @@ function imagefield_widget_info() {
*/
function imagefield_widget_settings($op, $widget) {
switch ($op) {
- case 'callbacks':
- return array('default value' => CONTENT_CALLBACK_CUSTOM);
-
case 'form':
$form = array();
$form['max_resolution'] = array(
@@ -434,13 +372,6 @@ function imagefield_widget_settings($op,
'#size' => 6,
'#description' => t('The maximum allowed image file size expressed in kilobytes. Set to 0 for no restriction.')
);
- $form['max_number_images'] = array(
- '#type' => 'textfield',
- '#title' => t('Maximum number of images'),
- '#default_value' => $widget['max_number_images'] ? $widget['max_number_images'] : 0,
- '#size' => 4,
- '#description' => t('The maximum number of images allowed. Set to 0 for no restriction. This only applies if multiple values are enabled.')
- );
$form['image_path'] = array(
'#type' => 'textfield',
'#title' => t('Image path'),
@@ -475,13 +406,13 @@ function imagefield_widget_settings($op,
return $form;
case 'validate':
- // strip slashes from the beginning and end of $widget['image_path']
- $widget['image_path'] = trim($widget['image_path'], '\\/');
- form_set_value(array('#parents' => array('image_path')), $widget['image_path']);
+ if (substr($widget['image_path'], 0, 1) == '/' || substr($widget['image_path'], -1) == '/') {
+ form_set_error('image_path', t('Image paths should not start or end with slashes.'));
+ }
break;
case 'save':
- return array('max_resolution', 'max_filesize', 'max_number_images', 'image_path', 'file_extensions', 'custom_alt', 'custom_title');
+ return array('max_resolution', 'max_filesize', 'image_path', 'file_extensions', 'custom_alt', 'custom_title');
}
}
@@ -489,7 +420,7 @@ function imagefield_widget_settings($op,
* Implementation of hook_form_alter(). Set the appropriate
* attibutes to allow file uploads on the field settings form.
*/
-function imagefield_form_alter($form_id, &$form) {
+function imagefield_form_alter(&$form, $form_state, $form_id) {
if ($form_id == '_content_admin_field') {
$form['#attributes'] = array('enctype' => 'multipart/form-data');
}
@@ -504,57 +435,21 @@ function imagefield_form_alter($form_id,
* @param $form_element
* A form element to throw an error on if the directory is not writable
*/
-function imagefield_check_directory($directory, $form_element = array()) {
+function imagefield_check_directory($directory, $fieldname = NULL) {
foreach (explode('/', $directory) as $dir) {
$dirs[] = $dir;
- $path = file_create_path(implode($dirs, '/'));
- file_check_directory($path, FILE_CREATE_DIRECTORY, $form_element['#parents'][0]);
- }
- return true;
-}
-
-function _imagefield_scale_image($file, $resolution = 0) {
- $info = image_get_info($file['filepath']);
- if ($info) {
- list($width, $height) = explode('x', $resolution);
- if ($width && $height) {
- $result = image_scale($file['filepath'], $file['filepath'], $width, $height);
- if ($result) {
- $file['filesize'] = filesize($file['filepath']);
- drupal_set_message(t('The image %filename was resized to fit within the maximum allowed resolution of %resolution pixels', array('%resolution' => $resolution, '%filename' => $file['filename'])));
- }
- }
- }
- return $file;
-}
-
-function imagefield_clear_session() {
- if (is_array($_SESSION['imagefield']) && count($_SESSION['imagefield'])) {
- foreach (array_keys($_SESSION['imagefield']) as $fieldname) {
- imagefield_clear_field_session($fieldname);
- }
- unset($_SESSION['imagefield']);
- }
-}
-
-function imagefield_clear_field_session($fieldname) {
- if (is_array($_SESSION['imagefield'][$fieldname]) && count($_SESSION['imagefield'][$fieldname])) {
- foreach ($_SESSION['imagefield'][$fieldname] as $delta => $file) {
- if (is_file($file['filepath'])) {
- file_delete($file['filepath']);
- }
+ $path = file_create_path(implode($dirs,'/'));
+ if (!file_check_directory($path, FILE_CREATE_DIRECTORY, $fieldname)) {
+ return FALSE;
}
- unset($_SESSION['imagefield'][$fieldname]);
}
+ return TRUE;
}
function _imagefield_file_delete($file, $fieldname) {
if (is_numeric($file['fid'])) {
db_query('DELETE FROM {files} WHERE fid = %d', $file['fid']);
}
- else {
- unset($_SESSION['imagefield'][$fieldname][$file['sessionid']]);
- }
module_invoke_all('imagefield_file', 'delete', $file);
return file_delete($file['filepath']);
}
@@ -562,378 +457,285 @@ function _imagefield_file_delete($file,
/**
* Implementation of hook_widget().
*/
-function imagefield_widget($op, &$node, $field, &$items) {
- switch ($op) {
- case 'default value':
- return array();
-
- case 'prepare form values':
- _imagefield_widget_prepare_form_values($node, $field, $items);
- return;
-
- case 'form':
- return _imagefield_widget_form($node, $field, $items);
+function imagefield_widget(&$form, &$form_state, $field, $items) {
+ $element = array(
+ '#type' => $field['widget']['type'],
+ '#title' => $field['widget']['label'],
+ '#weight' => $field['widget']['weight'],
+ '#default_value' => $items,
+ '#required' => $field['required'],
+ '#multiple' => $field['multiple'] == 0 ? FALSE : TRUE,
+ '#multiple_limit' => $field['multiple'] == 1 ? 0 : $field['multiple'],
+ '#element_validate' => array('_imagefield_widget_validate'),
+ '#field' => $field,
+ );
+ return $element;
+}
- case 'validate':
- _imagefield_widget_validate($node, $field, $items);
- return;
- }
+/**
+ * Implementation of hook_elements().
+ */
+function imagefield_elements() {
+ $elements = array();
+ $elements['image'] = array(
+ '#input' => TRUE,
+ '#columns' => array('fid', 'title', 'alt'),
+ '#process' => array('imagefield_element_process'),
+ );
+ return $elements;
}
-function _imagefield_widget_prepare_form_values(&$node, $field, &$items) {
+/**
+ * Process the image type element before displaying the field.
+ */
+function imagefield_element_process($element, $edit, &$form_state, $form) {
+ $field = $element['#field'];
$fieldname = $field['field_name'];
- // clean up the session if we weren't posted.
- if (!count($_POST)) {
- imagefield_clear_session();
- }
+ drupal_add_js(drupal_get_path('module', 'imagefield') .'/imagefield.js');
+ drupal_add_css(drupal_get_path('module', 'imagefield') .'/imagefield.css');
- // Attach new files
- if ($file = file_check_upload($fieldname .'_upload')) {
- $file = (array)$file;
+ // Pull in form state saved in storage.
+ form_get_cache($form_state['values']['form_build_id'], $form_state);
+ if (isset($form_state['storage'][$fieldname])) {
+ $form_state['values'][$fieldname] = $form_state['storage'][$fieldname];
+ // Unset the storage to keep the form from unnecessarily rebuilding.
+ unset($form_state['storage'][$fieldname]);
+ }
- // Validation must happen immediately after the image is uploaded so we
- // can discard the file if it turns out not to be a valid mime type
- $valid_image = _imagefield_widget_upload_validate($node, $field, $items, $file);
- //$valid_image = TRUE;
+ // Change the type and theme to prevent FAPI from trying to output with the
+ // theme_image() function.
+ $element['#type'] = 'imagefield';
+ $element['#theme'] = 'imagefield';
+ $element['#tree'] = TRUE;
+ $element['#description'] = t('Changes made to the attachments are not permanent until you save this post.');
- if ($valid_image) {
- $file = _imagefield_scale_image($file, $field['widget']['max_resolution']);
- // Allow tokenized paths if available
- if (function_exists('token_replace')) {
- global $user;
- $widget_image_path = token_replace($field['widget']['image_path'], 'user', $user);
- }
- else {
- $widget_image_path = $field['widget']['image_path'];
- }
- imagefield_check_directory($widget_image_path);
- $filepath = file_create_filename($file['filename'], file_create_path($widget_image_path));
+ // Set an internal flag for requiredness. Prevents FAPI from interfering.
+ $element['#image_required'] = $element['#required'];
+ $element['#required'] = FALSE;
- $file['fid'] = 'upload';
- $file['preview'] = $filepath;
-
- // If a single field, mark any other images for deletion and delete files in session
- if (!$field['multiple']) {
- if (is_array($items)) {
- foreach ($items as $delta => $session_file) {
- $items[$delta]['flags']['hidden'] = TRUE;
- $items[$delta]['flags']['delete'] = TRUE;
- }
- }
- imagefield_clear_field_session($fieldname);
- }
- // Add the file to the session
- $file_id = count($items) + count($_SESSION['imagefield'][$fieldname]);
- $file['sessionid'] = $file_id;
- $_SESSION['imagefield'][$fieldname][$file_id] = $file;
+ $files = array();
+ if (isset($form_state['values'])) {
+ // Set a default value if available.
+ if (!isset($form_state[$fieldname]) && isset($element['#default_value'])) {
+ $form_state['values'][$fieldname] = $element['#default_value'];
}
- else {
- // Delete the invalid file
- file_delete($file['filepath']);
- // If a single field and a valid file is in the session, mark existing image for deletion
- if (!$field['multiple']) {
- if (count($_SESSION['imagefield'][$fieldname]) && count($items)) {
- foreach ($items as $delta => $session_file) {
- $items[$delta]['flags']['hidden'] = TRUE;
- $items[$delta]['flags']['delete'] = TRUE;
- }
- }
+ foreach ($form_state['values'][$fieldname] as $delta => $file) {
+ if (!empty($file['fid'])) {
+ $files[$file['fid']] = array_merge($file, _imagefield_file_load($file['fid']));
}
}
}
- // Load files from preview state. before committing actions.
- if (is_array($_SESSION['imagefield'][$fieldname]) && count($_SESSION['imagefield'][$fieldname])) {
- foreach ($_SESSION['imagefield'][$fieldname] as $delta => $file) {
- $items[] = $file;
- }
- }
-}
-
-function _imagefield_widget_form($node, $field, &$items) {
- drupal_add_js('misc/progress.js');
- drupal_add_js('misc/upload.js');
- drupal_add_js(drupal_get_path('module', 'imagefield') .'/imagefield.js');
- drupal_add_css(drupal_get_path('module', 'imagefield') .'/imagefield.css');
-
- $fieldname = $field['field_name'];
-
- $form = array();
-
- $form[$fieldname] = array(
- '#type' => 'fieldset',
- '#title' => t($field['widget']['label']),
- '#weight' => $field['widget']['weight'],
- '#description' => t('Changes made to the attachments are not permanent until you save this post.'),
- '#collapsible' => TRUE,
- '#collapsed' => FALSE,
- '#tree' => TRUE,
- '#prefix' => '
',
- '#suffix' => '
',
- );
+ $form_state['values'][$fieldname] = $files;
+ $element['#files'] = $files;
- $form[$fieldname]['new'] = array(
- '#tree' => FALSE,
- '#prefix' => '',
- '#suffix' => '
',
- '#weight' => 100,
- );
-
- $max_images = $field['widget']['max_number_images'];
- if ($field['multiple'] && $max_images && $max_images <= count($items)) {
- $form[$fieldname]['#prefix'] = '';
- $form[$fieldname]['new']['#prefix'] = '
';
- $form[$fieldname]['new']['#value'] = format_plural($max_images, 'You can only attach one image to this field. Delete the image if you wish to be able to upload a different one.', 'You can only attach @count images to this field. Delete an image if you wish to be able to upload different images.');
- }
- else {
-
- // multiupload: add an add new field button.
- // onchange ajax upload each file input after validation.
- // update date 'file_inputs' with qty of file inputs.
- // name file inputs $fieldname .'_upload_'. number of file input.
- // inprepare form_values hook iterate over each input.
- // can we display files sizes to predict the total size of an upload.
-
- $extensions_description = empty($field['widget']['file_extensions'])
- ? ''
- : t('
Allowed extensions: %ext', array('%ext' => $field['widget']['file_extensions']));
-
- // Seperate from tree becase of that silly things won't be
- // displayed if they are a child of '#type' = form issue
- $form[$fieldname]['new'][$fieldname .'_upload'] = array(
- '#type' => 'file',
- '#title' => t('Upload a new image'),
- '#description' => $field['widget']['description'] . $extensions_description,
- '#tree' => FALSE,
- '#weight' => 9,
- '#attributes' => array('class' => 'imagefield imagefield-'. $fieldname, 'accept' => str_replace(' ', '|', trim($field['widget']['file_extensions']))),
+ foreach ($files as $fid => &$file) {
+ dvm($file);
+ $element[$fid]['flags']['delete'] = array(
+ '#type' => 'checkbox',
+ '#title' => t('Delete'),
+ '#default_value' => isset($file['flags']['delete']) ? $file['flags']['delete'] : 0,
);
- $form[$fieldname]['new']['upload'] = array(
- '#type' => 'button',
- '#value' => t('Upload'),
- '#name' => 'cck_imagefield_'. $fieldname .'_op',
- '#id' => form_clean_id($fieldname .'-attach-button'),
- '#tree' => FALSE,
- '#weight' => 10,
+ $element[$fid]['admin_preview'] = array(
+ '#type' => 'markup',
+ '#value' => theme('imagefield_image', $file, $file['alt'], $file['title'], array('width' => '150'), FALSE),
);
- // The class triggers the js upload behaviour.
- $form[$fieldname .'-attach-url'] = array('#type' => 'hidden', '#value' => url('imagefield/js', NULL, NULL, TRUE), '#attributes' => array('class' => 'upload'));
- }
-
- // @todo split following if block into its own function.
- // Store the file data object to be carried on.
- if (is_array($items) && count($items)) {
- foreach ($items as $delta => $file) {
- if ($file['filepath'] && !$file['flags']['hidden']) {
- $form[$fieldname][$delta] = array(
- '#theme' => 'imagefield_edit_image_row',
- );
- $form[$fieldname][$delta]['flags']['delete'] = array(
- '#type' => 'checkbox',
- '#title' => t('Delete'),
- '#default_value' => isset($file['flags']['delete']) ? $file['flags']['delete'] : 0,
- );
+ $element[$fid]['description'] = array(
+ '#type' => 'markup',
+ '#value' => '
'. t('Filename: ') .''. $file['filename'],
+ );
- if (function_exists('token_replace')) {
- global $user;
- $filename = $file['fid'] == 'upload' ? file_create_filename($file['filename'], file_create_path(token_replace($field['widget']['image_path'], 'user', $user))) : $file['filepath'];
- }
- else {
- $filename = $file['fid'] == 'upload' ? file_create_filename($file['filename'], file_create_path($field['widget']['image_path'])) : $file['filepath'];
- }
+ $element[$fid]['alt'] = array(
+ '#type' => 'hidden',
+ '#value' => $file['filename'],
+ );
+ // overwrite with an input field if custom_alt is flagged;
+ if ($field['widget']['custom_alt']) {
+ $element[$fid]['alt'] = array(
+ '#type' => 'textfield',
+ '#title' => t('Alternate text'),
+ '#default_value' => $file['alt'],
+ '#description' => t('Alternate text to be displayed if the image cannot be displayed.'),
+ '#maxlength' => 255,
+ '#size' => 10,
+ );
+ }
- $form[$fieldname][$delta]['admin_preview'] = array(
- '#type' => 'markup',
- '#value' => theme('imagefield_image', $file, $file['alt'], $file['title'], array('width' => '150'), FALSE),
- );
+ $element[$fid]['title'] = array(
+ '#type' => 'hidden',
+ '#value' => $file['filename'],
+ );
+ // overwrite with an input field if custom_title is flagged;
+ if ($field['widget']['custom_title']) {
+ $element[$fid]['title'] = array(
+ '#type' => 'textfield',
+ '#title' => t('Title'),
+ '#default_value' => $file['title'],
+ '#description' => t('Text to be displayed on mouse overs.'),
+ '#maxlength' => 255,
+ '#size' => 10,
+ );
+ }
- $form[$fieldname][$delta]['description'] = array(
- '#type' => 'markup',
- '#value' => '
'. t('Filename: ') .''. $file['filename'],
- );
+ if ($file['filepath'] && !empty($file['flags']['hidden'])) {
+ // Render all the form values of this item if it is hidden.
+ $element[$fid]['title'] = array('#type' => 'value', '#value' => $file['title']);
+ $element[$fid]['alt'] = array('#type' => 'value', '#value' => $file['alt']);
+ $element[$fid]['flags']['delete'] = array('#type' => 'value', '#value' => !empty($file['flags']['delete']));
+ }
- $form[$fieldname][$delta]['alt'] = array(
- '#type' => 'hidden',
- '#value' => $file['filename'],
- );
- // overwrite with an input field if custom_alt is flagged;
- if ($field['widget']['custom_alt']) {
- $form[$fieldname][$delta]['alt'] = array(
- '#type' => 'textfield',
- '#title' => t('Alternate text'),
- '#default_value' => $file['alt'],
- '#description' => t('Alternate text to be displayed if the image cannot be displayed.'),
- '#maxlength' => 255,
- '#size' => 10,
- );
- }
+ if ($element['#multiple']) {
+ $element[$fid]['weight'] = array(
+ '#type' => 'weight',
+ '#delta' => max('10', count($element['#files'])),
+ );
+ }
- $form[$fieldname][$delta]['title'] = array(
- '#type' => 'hidden',
- '#value' => $file['filename'],
- );
- // overwrite with an input field if custom_title is flagged;
- if ($field['widget']['custom_title']) {
- $form[$fieldname][$delta]['title'] = array(
- '#type' => 'textfield',
- '#title' => t('Title'),
- '#default_value' => $file['title'],
- '#description' => t('Text to be displayed on mouse overs.'),
- '#maxlength' => 255,
- '#size' => 10,
- );
- }
+ $element[$fid]['flags']['hidden'] = array('#type' => 'value', '#value' => !empty($file['flags']['hidden']));
+ $element[$fid]['filename'] = array('#type' => 'value', '#value' => $file['filename']);
+ $element[$fid]['filepath'] = array('#type' => 'value', '#value' => $file['filepath']);
+ $element[$fid]['filemime'] = array('#type' => 'value', '#value' => $file['filemime']);
+ $element[$fid]['filesize'] = array('#type' => 'value', '#value' => $file['filesize']);
+ $element[$fid]['fid'] = array('#type' => 'hidden', '#value' => $file['fid']);
+ }
- // Special handling for single value fields
- if (!$field['multiple']) {
- $form[$fieldname][$delta]['replace'] = array(
- '#type' => 'markup',
- '#value' => t('If a new image is chosen, the current image will be replaced upon submitting the form.'),
- );
- }
- }
- elseif ($file['filepath'] && $file['flags']['hidden']) {
- // Render all the form values of this item if it is hidden.
- $form[$fieldname][$delta]['flags']['hidden'] = array('#type' => 'value', '#value' => $file['flags']['hidden']);
- $form[$fieldname][$delta]['flags']['delete'] = array('#type' => 'value', '#value' => $file['flags']['delete']);
- $form[$fieldname][$delta]['title'] = array('#type' => 'value', '#value' => $file['title']);
- $form[$fieldname][$delta]['alt'] = array('#type' => 'value', '#value' => $file['alt']);
- }
- if (isset($file['sessionid'])) {
- $form[$fieldname][$delta]['sessionid'] = array('#type' => 'value', '#value' => $file['sessionid']);
- }
- $form[$fieldname][$delta]['filename'] = array('#type' => 'value', '#value' => $file['filename']);
- $form[$fieldname][$delta]['filepath'] = array('#type' => 'value', '#value' => $file['filepath']);
- $form[$fieldname][$delta]['preview'] = array('#type' => 'value', '#value' => $file['preview']);
- $form[$fieldname][$delta]['filemime'] = array('#type' => 'value', '#value' => $file['filemime']);
- $form[$fieldname][$delta]['filesize'] = array('#type' => 'value', '#value' => $file['filesize']);
- $form[$fieldname][$delta]['fid'] = array('#type' => 'value', '#value' => $file['fid']);
- }
+ // Special handling for single value fields
+ if (!$element['#multiple'] && count($element['#files'])) {
+ $element['replace'] = array(
+ '#type' => 'markup',
+ '#value' => t('If a new image is chosen, the current image will be replaced upon submitting the form.'),
+ );
+ }
+ elseif ($element['#multiple_limit'] != 0 && $element['#multiple_limit'] <= count($element['#files'])) {
+ $element['replace'] = array(
+ '#type' => 'markup',
+ '#value' => format_plural($element['#multiple_limit'], 'You can only attach one image to this field. Delete the image if you wish to be able to upload a different one.', 'You can only attach @count images to this field. Delete an image if you wish to be able to upload different images.'),
+ );
}
- // Some useful info for our js callback.
- $form['vid'] = array(
- '#type' => 'hidden',
- '#value' => $node->vid,
+ // multiupload: add an add new field button.
+ // onchange ajax upload each file input after validation.
+ // update date 'file_inputs' with qty of file inputs.
+ // name file inputs $fieldname .'_upload_'. number of file input.
+ // inprepare form_values hook iterate over each input.
+ // can we display files sizes to predict the total size of an upload.
+
+ $extensions_description = empty($field['widget']['file_extensions'])
+ ? ''
+ : t('
Allowed extensions: %ext', array('%ext' => $field['widget']['file_extensions']));
+
+ // Seperate from tree becase of that silly things won't be
+ // displayed if they are a child of '#type' = form issue
+ $element['new'][$fieldname .'_upload'] = array(
+ '#type' => 'file',
+ '#title' => t('Upload a new image'),
+ '#description' => $field['widget']['description'] . $extensions_description,
'#tree' => FALSE,
+ '#weight' => 9,
+ '#attributes' => array('class' => 'imagefield imagefield-'. $fieldname, 'accept' => str_replace(' ', '|', trim($field['widget']['file_extensions']))),
);
- $form['nid'] = array(
- '#type' => 'hidden',
- '#value' => $node->nid,
- '#tree' => FALSE,
- );
- $form['type'] = array(
- '#type' => 'hidden',
- '#value' => $node->type,
- '#tree' => FALSE,
+
+ $element['new']['upload'] = array(
+ '#type' => 'button',
+ '#value' => t('Upload'),
+ '#ahah' => array(
+ 'wrapper' => $element['#id'] .'-wrapper',
+ 'path' => 'imagefield/js/'. $field['type_name'] .'/'. $field['field_name'],
+ 'progress' => array('type' => 'bar', 'message' => t('Uploading image...')),
+ ),
+ '#weight' => 10,
);
- return $form;
+ return $element;
}
/**
* Validate the widget.
*/
-function _imagefield_widget_validate($node, $field, $items) {
-
- if ($field['required']) {
- // Sum all the items marked for deletion, so we can make sure the end user
- // isn't deleting all of the images.
- $deleted = 0;
- foreach ($items as $item) {
- if ($item['flags']['delete']) {
- $deleted++;
- }
- }
+function _imagefield_widget_validate($element, &$form_state) {
+ $field = $element['#field'];
+ $fieldname = $field['field_name'];
+ $items =& $form_state['values'][$fieldname];
+ unset($items['new']);
- if (!count($items)) {
- form_set_error($field['field_name'], t('@field is required. Please upload an image.', array('@field' => $field['widget']['label'])));
- }
- else if (count($items) == $deleted ) {
- form_set_error($field['field_name'], t('@field is required. Please uncheck at least one delete checkbox or upload another image.', array('@field' => $field['widget']['label'])));
- }
+ // Allow tokenized paths.
+ if (function_exists('token_replace')) {
+ global $user;
+ $widget_image_path = token_replace($field['widget']['image_path'], 'user', $user);
+ }
+ else {
+ $widget_image_path = $field['widget']['image_path'];
}
-}
-function _imagefield_widget_upload_validate($node, $field, $items, $file) {
- // initialize our validation state, innocent until proven guilty.
- $valid = TRUE;
+ $validators = array(
+ 'file_validate_extensions' => array($field['widget']['file_extensions']),
+ 'file_validate_size' => array($field['widget']['max_filesize']),
+ 'file_validate_image_resolution' => array($field['widget']['max_resolution']),
+ );
- // Do we even need to test file extensions?
- if (!empty($field['widget']['file_extensions'])) {
- // Pop out the extensions and turn file_extensions into an array.
- $ext = strtolower(array_pop(explode('.', $file['filename'])));
- $allowed_extensions = array_unique(explode(' ', strtolower(trim($field['widget']['file_extensions']))));
- // Is it the file extension in the allowed_extensions array?
- if (!in_array($ext, $allowed_extensions)) {
- // Sorry no..
- form_set_error($field['field_name'], t('Files with the extension %ext are not allowed. Please upload a file with an extension from the following list: %allowed_extensions', array('%ext' => $ext, '%allowed_extensions' => $field['widget']['file_extensions'])));
- $valid = FALSE;
- }
- }
+ $complete_image_path = file_directory_path() .'/'. $widget_image_path;
- // If max filesize is set.
- if (!empty($field['widget']['max_filesize'])) {
- if ($file['filesize'] > ($field['widget']['max_filesize'] * 1024)) {
- form_set_error($field['field_name'], t('The file you uploaded has a filesize greater than the maximum allowed filesize of %sizekb.', array('%size' => $field['widget']['max_filesize'])));
- $valid = FALSE;
+ // Attach new files.
+ if (imagefield_check_directory($widget_image_path, $fieldname .'_upload') && $file = file_save_upload($fieldname .'_upload', $validators, $complete_image_path)) {
+ // If a single field, mark any other images for deletion.
+ if (count($items)) {
+ foreach ($items as $delta => $item_file) {
+ if (!$element['#multiple']) {
+ $items[$delta]['flags']['hidden'] = TRUE;
+ $items[$delta]['flags']['delete'] = TRUE;
+ }
+ if (empty($items[$delta]['fid'])) {
+ unset($items[$delta]);
+ }
+ }
}
+
+ $file = (array)$file;
+ $items[$file['fid']] = $file;
}
- // Is the mime type a match for image.
- if (strpos($file['filemime'], 'image/') !== 0) {
- // sorry no it isn't. do not pass go, do not collect $200.
- form_set_error($field['field_name'], t('Mime Type mismatch. Only image files may be upload. You uploaded a file with mime type: %mime', array('%mime' => $file['filemime'])));
- $valid = FALSE;
+ // Sum all the items marked for deletion.
+ $deleted = 0;
+ foreach ($items as $delta => $item) {
+ if (is_numeric($delta) && !empty($item['flags']['delete'])) {
+ $deleted++;
+ }
}
- // If max number of images is set
- if ($field['multiple'] && !empty($field['widget']['max_number_images'])) {
- $count = count($items) + count($_SESSION['imagefield'][$field['field_name']]);
- if ($count >= $field['widget']['max_number_images']) {
- form_set_error($field['field_name'], t('You are only allowed to upload up to %maximages images.', array('%maximages' => $field['widget']['max_number_images'])));
- $valid = FALSE;
+ // Insure at least one image is going to be saved.
+ if ($element['#image_required']) {
+ if (!count($items)) {
+ form_set_error($field['field_name'] .'_upload', t('@field is required. Please upload an image.', array('@field' => $field['widget']['label'])));
+ }
+ else if (count($items) == $deleted ) {
+ form_set_error($field['field_name'] .'_upload', t('@field is required. Please uncheck at least one delete checkbox or upload another image.', array('@field' => $field['widget']['label'])));
}
}
- return $valid;
+ // Prevent more than the maximum limit.
+ if ($element['#multiple'] && $element['#multiple_limit'] != 0 && count($items) - $deleted > $element['#multiple_limit']) {
+ form_set_error($field['field_name'] .'_upload', t('You are only allowed to upload up to %maximages images.', array('%maximages' => $element['#multiple_limit'])));
+ }
}
-
/**
* Implementation of hook_field_formatter_info().
*/
function imagefield_field_formatter_info() {
$formatters = array(
'default' => array(
- 'label' => 'Default',
+ 'label' => t('Default'),
'field types' => array('image'),
),
);
return $formatters;
}
-/**
- * Implementation of hook_field_formatter().
- */
-function imagefield_field_formatter($field, $item, $formatter, $node = NULL) {
- if (empty($item['fid']) && $field['use_default_image']) {
- $item = $field['default_image'];
- }
- // If there is no image on the database, use default.
- if (empty($item['filepath'])) {
- $item = array_merge($item, _imagefield_file_load($item['fid']));
- }
- if (!empty($item['filepath'])) {
- return theme('imagefield_image', $item, $item['alt'], $item['title']);
- }
-}
-
-function _imagefield_file_load($fid = NULL) {
+function _imagefield_file_load($fid = null) {
// Don't bother if we weren't passed and fid.
if (!empty($fid) && is_numeric($fid)) {
$result = db_query('SELECT * FROM {files} WHERE fid = %d', $fid);
@@ -946,11 +748,96 @@ function _imagefield_file_load($fid = NU
return array();
}
-function theme_imagefield_view_image($file, $alt = '', $title = '', $attributes = NULL, $getsize = TRUE) {
- return theme('imagefield_image', $file, $alt, $title, $attributes , $getsize);
+/**
+ * Implementation of hook_theme().
+ */
+function imagefield_theme() {
+ return array(
+ 'imagefield_image' => array(
+ 'arguments' => array('file' => null, 'alt' => '', 'title' => '', 'attributes' => null, 'getsize' => TRUE),
+ ),
+ 'imagefield' => array(
+ 'arguments' => array('element' => null),
+ ),
+ 'imagefield_row' => array(
+ 'arguments' => array('element' => null),
+ ),
+ 'imagefield_formatter_default' => array(
+ 'arguments' => array('element' => null),
+ ),
+ );
+}
+
+/**
+ * Theme function for 'default' text field formatter.
+ */
+function theme_imagefield_formatter_default($element) {
+ $item = $element['#item'];
+
+ if (!empty($item['filepath'])) {
+ return theme('imagefield_image', $item, $item['alt'], $item['title']);
+ }
+}
+
+/**
+ * FormAPI theme function. Theme the output of an image field.
+ */
+function theme_imagefield(&$element) {
+ $output = '';
+
+ // Always add tabledrag in case a table is created after uploads.
+ if ($element['#multiple']) {
+ drupal_add_tabledrag($element['#id'] .'-table', 'order', 'sibling', $element['#id'] .'-weight');
+ }
+
+ // Print out the existing images.
+ if ($element['#multiple'] && !empty($element['#files'])) {
+ $rows = array();
+ foreach ($element['#files'] as $fid => $file) {
+ $element[$fid]['weight']['#attributes']['class'] = isset($element[$fid]['weight']['#attributes']['class']) ? ($element[$fid]['weight']['#attributes']['class'] .' '. $element['#id'] .'-weight') : $element['#id'] .'-weight';
+
+ $row = array();
+ $row[] = array('data' => '', 'class' => 'content-multiple-drag');
+ $row[] = theme('imagefield_row', $element[$fid]);
+ $row[] = drupal_render($element[$fid]['weight']);
+ $rows[] = array('data' => $row, 'class' => 'draggable');
+ }
+
+ $existing_items = theme('table', array(), $rows, array('id' => $element['#id'] .'-table'));
+ }
+ elseif (!empty($element['#files'])) {
+ foreach ($element['#files'] as $file) {
+ if ($file['fid'] && empty($file['flags']['hidden'])) {
+ $existing_items = '
'. theme('imagefield_row', $element[$file['fid']]) .'
';
+ break;
+ }
+ }
+ }
+
+ if (isset($existing_items)) {
+ $existing_element = array(
+ '#type' => 'element',
+ '#title' => $element['#title'],
+ '#required' => $element['#image_required'],
+ );
+ $output .= theme('form_element', $existing_element, $existing_items);
+ unset($element['new'][$element['#field']['field_name'] .'_upload']['#title']);
+ }
+ else {
+ $element['new'][$element['#field']['field_name'] .'_upload']['#required'] = $element['#image_required'];
+ }
+
+ // Additional image information and upload controls.
+ if (isset($element['replace'])) {
+ $output .= '
'. drupal_render($element['replace']) .'
';
+ }
+ $output .= drupal_render($element['new']);
+ $output = '
'. $output .'
';
+
+ return $output;
}
-function theme_imagefield_edit_image_row($element) {
+function theme_imagefield_row($element) {
$output = '
'. drupal_render($element['admin_preview']) .'
';
$output .= '
';
$output .= '
'. drupal_render($element['flags']) .'
';
@@ -958,43 +845,31 @@ function theme_imagefield_edit_image_row
$output .= '
';
$output .= drupal_render($element['alt']);
$output .= drupal_render($element['title']);
+ $output .= drupal_render($element['fid']);
$output .= '
';
- $output = '
'. $output .'
';
if (isset($element['replace'])) {
$output .= '
'. drupal_render($element['replace']) .'
';
}
return $output;
}
-function theme_imagefield_image($file, $alt = '', $title = '', $attributes = NULL, $getsize = TRUE) {
+function theme_imagefield_image($file, $alt = '', $title = '', $attributes = null, $getsize = true) {
$file = (array)$file;
if (!is_file($file['filepath'])) {
return;
}
+ $image_attributes = array();
if (!$getsize || (list($width, $height, $type, $image_attributes) = @getimagesize($file['filepath']))) {
$attributes = drupal_attributes($attributes);
- $path = ($file['fid'] == 'upload') ? $file['preview'] : $file['filepath'];
$alt = empty($alt) ? $file['alt'] : $alt;
$title = empty($title) ? $file['title'] : $title;
- $url = file_create_url($path);
+ $url = file_create_url($file['filepath']);
return '
 .')
';
}
}
/**
- * Formats an array of images.
- *
- * @param images
- * array of individually themed images
- * @return
- * html string
- */
-function theme_imagefield_multiple($images) {
- return implode("\n", $images);
-}
-
-/**
* Implementation of hook_file_download().
* Replicated from upload.module.
*
@@ -1057,51 +932,40 @@ if (!function_exists('upload_file_downlo
/**
* Menu-callback for JavaScript-based uploads.
*/
-function imagefield_js() {
- // Parse fieldname from submit button.
- $matches = array();
- foreach (array_keys($_POST) as $key) {
- if (preg_match('/cck_imagefield_(.*)_op/', $key, $matches)) {
- break;
- }
- }
- $fieldname = $matches[1];
+function imagefield_js($node_type, $fieldname) {
+ $field = content_fields($fieldname, $node_type);
- $node = (object)$_POST;
- // Load field data.
- $field = content_fields($fieldname, $node->type);
+ $form_state = array('values' => $_POST);
+ $form_state['values'][$fieldname] = isset($form_state['values'][$fieldname]) ? $form_state['values'][$fieldname] : array();
- // Load fid's stored by content.module
- $items = array();
- $values = content_field('load', $node, $field, $items, FALSE, FALSE);
- $items = $values[$fieldname];
+ // Load in the form cache.
+ $form = form_get_cache($_POST['form_build_id'], $form_state);
- // Load additional field data
- imagefield_field('load', $node, $field, $items, FALSE, FALSE);
+ // Find field group if needed and assign the form element by reference.
+ if (function_exists('fieldgroup_get_group') && $group = fieldgroup_get_group($node_type, $fieldname)) {
+ $form_element =& $form[$group][$fieldname];
+ }
+ else {
+ $form_element =& $form[$fieldname];
+ }
- // Handle uploads and validation.
- _imagefield_widget_prepare_form_values($node, $field, $items);
- _imagefield_widget_validate($node, $field, $items);
+ // Handle new uploads.
+ _imagefield_widget_validate($form_element, $form_state);
- if (is_array($node->{$fieldname}) && count($node->{$fieldname}) > 0) {
- foreach ($node->{$fieldname} as $key => $image) {
- // Set the alt and title from POST
- $items[$key]['alt'] = $image['alt'];
- $items[$key]['title'] = $image['title'];
- $items[$key]['flags']['delete'] = $image['flags']['delete'];
- }
- }
+ // Add the new element to the stored form and form_state then resave.
+ $form_element = imagefield_widget($form, $form_state, $field, $form_state['values'][$fieldname]);
+ $form_state['storage'][$fieldname] = $form_state['values'][$fieldname];
+ form_set_cache($_POST['form_build_id'], $form, $form_state);
- // Get our new form baby, yeah tiger, get em!
- $form = _imagefield_widget_form($node, $field, $items);
+ // Render the form for output.
+ $form['#post'] = $_POST;
+ $form['#programmed'] = TRUE;
+ $form_state['submitted'] = FALSE;
- foreach (module_implements('form_alter') as $module) {
- $function = $module .'_form_alter';
- $function('imagefield_js', $form);
- }
- $form = form_builder('imagefield_js', $form);
+ drupal_alter('form', $form, $form_state, 'imagefield_js');
+ $form = form_builder('imagefield_js', $form, $form_state);
- $output = theme('status_messages') . drupal_render($form);
+ $output = theme('status_messages') . drupal_render($form_element);
// We send the updated file attachments form.
print drupal_to_js(array('status' => TRUE, 'data' => $output));