array(), 'imagefield' => array(), 'taxonomy' => array(), 'cck' => array()); foreach ($field_image['widget']['fupload_previewlist_field_settings'] as $key) { $elements = explode("_", $key, 2); if ($field_image['widget']['fupload_previewlist_field_settings'][$key] != FALSE) array_push($fields_preview_list[$elements[0]], $elements[1]); } // checks which fields should be displayed (not for all fields) // prepare token $token_installed = module_exists("token"); // prepare taxonomy $form_taxonomy = array(); if (module_exists("taxonomy") && count($fields_preview_list['taxonomy'])) { $form_taxonomy = array('type' => array('#value' => $node_type), '#node' => (object) array('type' => $node_type)); taxonomy_form_alter($form_taxonomy, array(), $node_type .'_node_form'); // delete all elements without the ones we need foreach ($form_taxonomy['taxonomy'] as $key => $value) { // taxonomy normal if (!in_array($key, $fields_preview_list['taxonomy']) && is_numeric($key)) { unset($form_taxonomy['taxonomy'][$key]); } } foreach ($form_taxonomy['taxonomy']['tags'] as $key => $value) { // taxonomy tags if (!in_array($key, $fields_preview_list['taxonomy'])) { unset($form_taxonomy['taxonomy']['tags'][$key]); } } } // get our preview images $result = db_query("SELECT p.nid, p.fid, f.filename, f.filepath FROM {fupload_previewlist} AS p JOIN {files} AS f ON p.fid = f.fid WHERE p.fieldname = '%s' AND p.uid = %d", $field_name, $user->uid); while ($image = db_fetch_object($result)) { $count += 1; $image_items[$image->fid] = $image->nid; // get title and body fields contents if available and storage mode is single if ($field_image['widget']['fupload_mode'] == "single") { $node = db_query("SELECT title, body FROM {node_revisions} WHERE nid = %d", $image->nid); $node = db_fetch_object($node); } $form[$image->fid] = array( '#type' => 'fieldset', '#title' => t('Image @count', array('@count' => $count)), '#collapsible' => FALSE, '#collapsed' => FALSE, ); $form[$image->fid]['preview_image'] = array( '#prefix' => '
', '#value' => theme('imagecache', $image_node_types[$node_type]['imagecache_preset'], $image->filepath, check_plain($image->filename), check_plain($image->filename), $field_image['widget']['fupload_previewlist_img_attributes']), '#suffix' => '
', '#weight' => -16, ); // node title field if (in_array("title", $fields_preview_list['node'])) { $form[$image->fid]['node_title_' .$image->fid] = array( '#type' => 'textfield', '#title' => check_plain($fields['title_label']), '#default_value' => isset($form_state['values']['node_title_' .$image->fid]) ? $form_state['values']['node_title_' .$image->fid] : $node->title, '#size' => 60, '#required' => TRUE, '#disabled' => FALSE, '#weight' => $fields['extra']['title']['weight'], ); } // filefield / imageField fields if (in_array("title", $fields_preview_list['imagefield']) && $field_image['widget']['custom_title']) { if ($token_installed && !empty($field_image['widget']['title'])) { $default_value = token_replace($field_image['widget']['title']); } else { if (!empty($field_image['widget']['title'])) { $default_value = $field_image['widget']['title']; } else { $default_value = $image->filename; } } $form[$image->fid]['imagefield_title_' .$image->fid] = array( '#type' => 'textfield', '#title' => $field_image['widget']['label'] .' ' .t('title'), '#default_value' => isset($form_state['values']['imagefield_title_' .$image->fid]) ? $form_state['values']['imagefield_title_' .$image->fid] : $default_value, '#size' => 60, '#required' => FALSE, '#disabled' => FALSE, '#weight' => $field_image['widget']['weight'], ); } if (in_array("alt", $fields_preview_list['imagefield']) && $field_image['widget']['custom_alt']) { if ($token_installed && !empty($field_image['widget']['alt'])) { $default_value = token_replace($field_image['widget']['alt']); } else { if (!empty($field_image['widget']['alt'])) { $default_value = $field_image['widget']['alt']; } else { $default_value = $image->filename; } } $form[$image->fid]['imagefield_alt_' .$image->fid] = array( '#type' => 'textfield', '#title' => $field_image['widget']['label'] .' ' .t('alt'), '#default_value' => isset($form_state['values']['imagefield_alt_' .$image->fid]) ? $form_state['values']['imagefield_alt_' .$image->fid] : $default_value, '#size' => 60, '#required' => FALSE, '#disabled' => FALSE, '#weight' => $field_image['widget']['weight'] + 0.3, ); } if (in_array("description", $fields_preview_list['imagefield'])) { $form[$image->fid]['imagefield_description_' .$image->fid] = array( '#type' => 'textfield', '#title' => $field_image['widget']['label'] .' ' .t('description'), '#default_value' => $form_state['values']['imagefield_description_' .$image->fid], '#size' => 60, '#required' => FALSE, '#disabled' => FALSE, '#weight' => $field_image['widget']['weight'] + 0.5, ); } // node body field if (in_array("description", $fields_preview_list['node'])) { $form[$image->fid]['node_body_' .$image->fid] = array( '#type' => 'textarea', '#title' => check_plain($fields['extra']['body_field']['label']), '#default_value' => isset($form_state['values']['node_body_' .$image->fid]) ? $form_state['values']['node_body_' .$image->fid] : '', '#rows' => 5, //'#required' => ($type->min_word_count > 0), // will be checked later via validation hook '#disabled' => FALSE, '#weight' => $fields['extra']['body_field']['weight'], ); $form[$image->fid]['format_' .$image->fid] = filter_form(FILTER_FORMAT_DEFAULT, $fields['extra']['body_field']['weight'], array('format_' .$image->fid)); $form[$image->fid]['format_' .$image->fid]['#weight'] = $fields['extra']['body_field']['weight'] + 0.1; } // taxonomy field if (count($form_taxonomy)) { $form_taxonomy['taxonomy']['#weight'] = $fields['extra']['taxonomy']['weight']; $form[$image->fid]['taxonomy_' .$image->fid] = $form_taxonomy['taxonomy']; } // ckk fields here ... in a future version } // any images uploaded if ($count) { // some images in queue $form['text'] = array('#value' => t('In this step, you can edit the captions of all uploaded images. To complete this task, click the button "Done Editing" at the bottom of this page.'), '#weight' => -19); $form['node_type'] = array('#type' => 'value', '#value' => $node_type); $form['field_name'] = array('#type' => 'value', '#value' => $field_name); $form['storage_mode'] = array('#type' => 'value', '#value' => $field_image['widget']['fupload_mode']); $form['image_items'] = array('#type' => 'value', '#value' => $image_items); $form['#validate'][] = 'fupload_list_images_imagefield_validate'; // some additonal validation of body field and cck $form['submit'] = array('#type' => 'submit', '#value' => t('Done Editing')); // set redirect url if ($field_image['widget']['fupload_previewlist_redirecturl']) { // alternative redirect url provided $form['#redirect'] = $field_image['widget']['fupload_previewlist_redirecturl']; } else { if ($field_image['widget']['fupload_mode'] == "multiple") { $form['#redirect'] = 'node/' .array_pop($image_items); // redirect to updated node } else { $form['#redirect'] = 'node/add/' .str_replace("_", "-", $node_type); // redirect to first upload page again } } } else { // no images in queue $form['text'] = array('#value' => t('No images yet in queue.'), '#weight' => -19); drupal_set_message(t('No images have been found in queue, probably no images have been uploaded yet. Please return to !upload_page if you want to upload some images.', array('!upload_page' => l(t('image upload page'), 'node/add/' .str_replace("_", "-", $node_type)))), 'warning'); } return $form; } function fupload_list_images_imagefield_validate($form, &$form_state) { // validation of some special parts $i = 0; $storage_mode = $form_state['values']['storage_mode']; $type = node_get_types('type', $form_state['values']['node_type']); foreach ($form_state['values']['image_items'] as $fid => $nid) { $i++; // load saved node(s) if ($storage_mode == "multiple" && empty($node)) $node = node_load($nid); if ($storage_mode == "single") $node = node_load($nid); // map some data to our $node to be able to do validation // taxonomy $node->taxonomy = $form_state['values']['taxonomy_' .$fid]; // body field: if min_word_count set, check reality if (!empty($type->min_word_count) && isset($form_state['values']['node_body_' .$fid]) && count(explode(' ', $form_state['values']['node_body_' .$fid])) < $type->min_word_count) { form_set_error('node_body_' .$fid, t('The field %body_label of the @img_number. image is too short. You need at least %words words.', array('%body_label' => $type->body_label, '@img_number' => $i, '%words' => $type->min_word_count))); } // little hack: prevent that body field will be checked again unset($node->body); // call hook_validation node_validate($node); } } function fupload_list_images_imagefield_submit($form, &$form_state) { global $user; // define some basic variables $imagefield_fields = array("title", "description", "alt"); $storage_mode = $form_state['values']['storage_mode']; // get fids (--> nids) of images and start batch process (saving) foreach ($form_state['values']['image_items'] as $fid => $nid) { // split up storage modes to provide a better handling // storage mode: multiple images per node if ($storage_mode == "multiple") { // only load node once if (!isset($node)) $node = node_load($nid); $image_field = $node->$form_state['values']['field_name']; for ($x = 0; $x < count($image_field); $x++) { if ($image_field[$x]['fid'] == $fid) { // found our image to be edited foreach ($imagefield_fields as $key => $value) { if (isset($form_state['values']['imagefield_' .$value .'_' .$fid])) $image_field[$x]['data'][$value] = $form_state['values']['imagefield_' .$value .'_' .$fid]; } break; } } // map our data to $node $node->$form_state['values']['field_name'] = $image_field; } // storage mode: single image per node if ($storage_mode == "single") { $node = node_load($nid); // new changes to node object // basic fields (core modules of drupal) if (isset($form_state['values']['node_title_' .$fid])) $node->title = !empty($form_state['values']['node_title_' .$fid]) ? $form_state['values']['node_title_' .$fid] : $node->title; // work around [#227966] if (isset($form_state['values']['node_body_' .$fid])) $node->body = !empty($form_state['values']['node_body_' .$fid]) ? $form_state['values']['node_body_' .$fid] : $node->body; $node->teaser = node_teaser($node->body, $form_state['values']['format_' .$fid]); if (isset($form_state['values']['format_' .$fid])) $node->format = isset($form_state['values']['format_' .$fid]) ? $form_state['values']['format_' .$fid] : $node->format; if (isset($form_state['values']['taxonomy_' .$fid])) $node->taxonomy = isset($form_state['values']['taxonomy_' .$fid]) ? array_merge($form_state['values']['taxonomy_' .$fid], $node->taxonomy) : $node->taxonomy; // imagefield (cck) $image_field = $node->$form_state['values']['field_name']; foreach ($imagefield_fields as $key => $value) { if (isset($form_state['values']['imagefield_' .$value .'_' .$fid])) $image_field[0]['data'][$value] = $form_state['values']['imagefield_' .$value .'_' .$fid]; } $node->$form_state['values']['field_name'] = $image_field; // cck fields (contributed module) // ... will follow in future version // save changes to node node_save($node); } } // multiple mode: map our new data into node if ($storage_mode == "multiple") node_save($node); // delete preview image list for this user if (!form_get_errors()) db_query("DELETE FROM {fupload_previewlist} WHERE fieldname = '%s' AND uid = %d", $form_state['values']['field_name'], $user->uid); // show message and redirect user to upload page drupal_set_message(t('All images have been saved and published.')); drupal_redirect_form($form); }