imageeditor_imagefield.module in Image Editor 7
Allows online editing of image field items using different image editing services.
File
imageeditor_imagefield/imageeditor_imagefield.moduleView source
<?php
/**
* @file
* Allows online editing of image field items using different image editing services.
*/
/**
* Implements hook_permission().
*/
function imageeditor_imagefield_permission() {
return array(
'use imageeditor_imagefield' => array(
'title' => t('Use Image Editor for Image Field'),
'description' => t('Allows to use different image editors to create/edit image field items.'),
),
);
}
/**
* Implements hook_element_info_alter().
*/
function imageeditor_imagefield_element_info_alter(&$type) {
if (!empty($type['managed_file'])) {
$type['managed_file']['#after_build'][] = 'imageeditor_imagefield_element_process';
}
if (!empty($type['mfw_managed_file'])) {
$type['mfw_managed_file']['#after_build'][] = 'imageeditor_imagefield_element_process';
}
}
/**
* Process function for image editor-enabled fields.
*/
function imageeditor_imagefield_element_process($element) {
// Bail out early if the needed properties aren't available. This happens
// most frequently when editing a field configuration.
// Bail out if user doesn't have permission to use imageeditor.
if (!isset($element['#entity_type']) || !user_access('use imageeditor_imagefield')) {
return $element;
}
$instance = field_info_instance($element['#entity_type'], $element['#field_name'], $element['#bundle']);
if (!in_array($instance['widget']['type'], array(
'image_image',
'image_miw',
)) || !imageeditor_imagefield_enabled($instance['widget']['settings'])) {
return $element;
}
static $conf_added;
$widget_settings = $instance['widget']['settings'];
if (empty($conf_added)) {
$conf_added['imageeditor_imagefield'] = FALSE;
}
if (!array_key_exists($element['#field_name'], $conf_added)) {
$conf_added[$element['#field_name']] = FALSE;
}
$conf_array = array();
// Field specific settings.
if (!$conf_added[$element['#field_name']]) {
$conf_added[$element['#field_name']] = TRUE;
$conf_array[$element['#field_name']] = array(
'imageeditor_icons_position' => $widget_settings['imageeditor_icons_position'],
'imageeditor_replace' => $widget_settings['imageeditor_replace'],
);
$editors = array();
foreach (imageeditor_info('editor') as $codename => $editor) {
if ($instance['widget']['settings'][$codename . '_enabled']) {
$editors[$codename] = $instance['widget']['settings'][$codename . '_position'];
}
}
$uploaders = array();
foreach (imageeditor_info('uploader') as $codename => $uploader) {
if ($instance['widget']['settings'][$codename . '_enabled']) {
$uploaders[$codename] = $instance['widget']['settings'][$codename . '_position'];
}
}
// Image Editor initialization.
imageeditor_initialize($editors, $uploaders);
$conf_array[$element['#field_name']]['editors'] = $editors;
$conf_array[$element['#field_name']]['uploaders'] = $uploaders;
}
// Field item specific settings.
$conf_array[$element['#field_name']]['items'][] = array(
'element_id' => $element['#id'],
'element_id_pattern' => preg_replace('/-upload$/', '', $element['#id']),
'remove_button_id' => $element['remove_button']['#id'],
);
if (!$conf_added['imageeditor_imagefield']) {
$conf_added['imageeditor_imagefield'] = TRUE;
$path = drupal_get_path('module', 'imageeditor_imagefield');
drupal_add_js($path . '/js/imageeditor_imagefield.js', array(
'scope' => 'footer',
'weight' => 10,
));
}
drupal_add_js(array(
'imageeditor_imagefield' => $conf_array,
), 'setting');
return $element;
}
/**
* Checks that Image Editor for Image Field is enabled on this field.
*/
function imageeditor_imagefield_enabled($settings) {
$enabled = FALSE;
foreach (imageeditor_info('editor') as $codename => $editor) {
if (isset($settings[$codename . '_enabled']) && $settings[$codename . '_enabled']) {
$enabled = TRUE;
}
}
foreach (imageeditor_info('uploader') as $codename => $uploader) {
if (isset($settings[$codename . '_enabled']) && $settings[$codename . '_enabled']) {
$enabled = TRUE;
}
}
return $enabled;
}
/**
* Implements hook_form_FORM_ID_alter().
*/
function imageeditor_imagefield_form_field_ui_field_edit_form_alter(&$form, $form_state) {
if (in_array($form['instance']['widget']['type']['#value'], array(
'image_image',
'image_miw',
))) {
//$instance = field_info_instance($form['instance']['entity_type']['#value'], $form['instance']['field_name']['#value'], $form['instance']['bundle']['#value']);
//$instance = $form['#instance'];
$form['instance']['widget']['settings']['imageeditor'] = imageeditor_imagefield_field_widget_settings_form($form['#instance']);
if (array_key_exists('filefield_sources', $form['instance']['widget']['settings'])) {
$settings = $form['#instance']['widget']['settings']['filefield_sources'];
$source_imageeditor = array(
'#type' => 'fieldset',
'#title' => t('Create new image options'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#weight' => 20,
);
$source_imageeditor['source_imageeditor_image'] = array(
'#type' => 'managed_file',
'#title' => t('Starting image'),
'#description' => t('Provide starting image/canvas to edit/draw on.'),
'#default_value' => array_key_exists('source_imageeditor', $settings) ? $settings['source_imageeditor']['source_imageeditor_image'] : 0,
'#upload_location' => $form['#field']['settings']['uri_scheme'] . '://imageeditor/imagefield',
);
$form['instance']['widget']['settings']['filefield_sources']['source_imageeditor'] = $source_imageeditor;
$form['#submit'][] = 'imageeditor_imagefield_source_imageeditor_submit';
}
}
}
/**
* Handle file usage for default image for "create image from" feature.
*/
function imageeditor_imagefield_source_imageeditor_submit($form, &$form_state) {
$old_fid = $form['instance']['widget']['settings']['filefield_sources']['source_imageeditor']['source_imageeditor_image']['#default_value'];
$new_fid = $form_state['values']['instance']['widget']['settings']['filefield_sources']['source_imageeditor']['source_imageeditor_image'];
if (!$old_fid && $new_fid || $old_fid && $new_fid && $old_fid != $new_fid) {
$file = file_load($new_fid);
$file->status = FILE_STATUS_PERMANENT;
file_save($file);
// Record that the module is using the file.
file_usage_add($file, 'imageeditor_imagefield', 'field', 0);
}
if ($old_fid && $new_fid && $old_fid != $new_fid || $old_fid && !$new_fid) {
$file = file_load($old_fid);
file_usage_delete($file, 'imageeditor_imagefield', 'field', 0);
file_delete($file);
}
}
/**
* Implements hook_field_widget_info_alter().
* A list of settings needed by Image Editor module on widgets.
*/
function imageeditor_imagefield_field_widget_info_alter(&$info) {
// Image Editor options.
$settings = array(
'imageeditor_icons_position' => 'bottom',
'imageeditor_replace' => 0,
);
// Enabled image editors.
foreach (imageeditor_info('editor') as $codename => $editor) {
$settings[$codename . '_enabled'] = 0;
$settings[$codename . '_position'] = 0;
}
// Enabled uploaders.
foreach (imageeditor_info('uploader') as $codename => $uploader) {
$settings[$codename . '_enabled'] = 0;
$settings[$codename . '_position'] = 0;
}
foreach (array(
'image_image',
'image_miw',
) as $value) {
if (isset($info[$value]['settings'])) {
$info[$value]['settings'] += $settings;
//$info[$value]['settings']['imageeditor'] = $settings;
$info[$value]['settings']['filefield_sources']['imageeditor']['source_imageeditor_image'] = 0;
}
}
}
/**
* Configuration form for editing Image Editor settings for a field instance.
*/
function imageeditor_imagefield_field_widget_settings_form($instance) {
$settings = $instance['widget']['settings'];
//$settings = $instance['widget']['settings']['imageeditor'];
imageeditor_admin_css();
$form = array(
'#type' => 'fieldset',
'#title' => t('Image editor'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#weight' => 20,
'#parents' => array(
'instance',
'widget',
'settings',
),
'#theme' => 'imageeditor_imagefield_field_widget_settings_form',
);
$form['editors'] = array(
'#type' => 'item',
'#title' => t('Enabled Image Editors'),
'#description' => t('Choose enabled image editors for this field and their order.'),
);
$position = 0;
foreach (imageeditor_info('editor') as $codename => $editor) {
$position++;
$form[$codename . '_enabled'] = array(
'#type' => 'checkbox',
'#title' => theme('imageeditor_admin_item', array(
'name' => $editor['name'],
'class' => $editor['class'],
'codename' => $codename,
)) . $editor['name'] . ' (<a href="' . $editor['site'] . '" target="_blank">' . t('site') . '</a>)',
'#default_value' => isset($settings[$codename . '_enabled']) ? $settings[$codename . '_enabled'] : 0,
);
$form[$codename . '_description'] = array(
'#type' => 'markup',
'#markup' => $editor['description'],
);
$form[$codename . '_api_key'] = array(
'#type' => 'markup',
'#markup' => $editor['api_key'] ? l(variable_get($editor['api_key_codename']) ? t('Already set') : t('Required'), 'admin/config/media/imageeditor') : t('Not needed'),
);
$form[$codename . '_position'] = array(
'#type' => 'textfield',
'#default_value' => isset($settings[$codename . '_position']) ? $settings[$codename . '_position'] : $position,
'#size' => 3,
'#maxlenth' => 4,
'#attributes' => array(
'class' => array(
'imageeditor-position',
),
),
);
}
$form['uploaders'] = array(
'#type' => 'item',
'#title' => t('Enabled Upload services'),
'#description' => t('Choose enabled upload services to upload images to if your images are not available from external network.'),
);
$position = 0;
foreach (imageeditor_info('uploader') as $codename => $uploader) {
$position++;
$form[$codename . '_enabled'] = array(
'#type' => 'checkbox',
'#title' => theme('imageeditor_admin_item', array(
'name' => $uploader['name'],
'class' => $uploader['class'],
'codename' => $codename,
)) . $uploader['name'] . ' (<a href="' . $uploader['site'] . '" target="_blank">' . t('site') . '</a>)',
'#default_value' => isset($settings[$codename . '_enabled']) ? $settings[$codename . '_enabled'] : 0,
);
$form[$codename . '_description'] = array(
'#type' => 'markup',
'#markup' => $uploader['description'],
);
$form[$codename . '_api_key'] = array(
'#type' => 'markup',
'#markup' => $uploader['api_key'] ? l(variable_get($uploader['api_key_codename']) ? t('Already set') : t('Required'), 'admin/config/media/imageeditor') : t('Not needed'),
);
$form[$codename . '_position'] = array(
'#type' => 'textfield',
'#default_value' => isset($settings[$codename . '_position']) ? $settings[$codename . '_position'] : $position,
'#size' => 3,
'#maxlenth' => 4,
'#attributes' => array(
'class' => array(
'imageuploader-position',
),
),
);
}
$form['imageeditor_icons_position'] = array(
'#type' => 'radios',
'#title' => t('Icons position'),
'#description' => t('Choose icons position on the widget.'),
'#options' => array(
'top' => t('Top'),
'bottom' => t('Bottom'),
),
'#default_value' => $settings['imageeditor_icons_position'],
'#weight' => 20,
);
$form['imageeditor_replace'] = array(
'#type' => 'checkbox',
'#title' => t('Replace original images'),
'#description' => t('When editing images replace the original image with the edited one.'),
'#default_value' => $settings['imageeditor_replace'],
'#weight' => 30,
);
return $form;
}
/**
* Implements hook_theme().
*/
function imageeditor_imagefield_theme($existing, $type, $theme, $path) {
return array(
'imageeditor_imagefield_field_widget_settings_form' => array(
'render element' => 'form',
),
);
}
function theme_imageeditor_imagefield_field_widget_settings_form($variables) {
$form = $variables['form'];
$output = drupal_render($form['editors']);
$header = array(
t('Name'),
t('Description'),
t('API key'),
t('Position'),
);
$rows = array();
$imageeditors = imageeditor_info('editor');
$imageeditors_sort = array();
foreach ($imageeditors as $codename => $editor) {
$imageeditors_sort[$codename] = $form[$codename . '_position'];
}
asort($imageeditors_sort);
foreach ($imageeditors_sort as $codename => $position) {
$row = array();
$row[] = drupal_render($form[$codename . '_enabled']);
$row[] = drupal_render($form[$codename . '_description']);
$row[] = drupal_render($form[$codename . '_api_key']);
$row[] = drupal_render($form[$codename . '_position']);
$rows[] = array(
'data' => $row,
'class' => array(
'draggable',
),
);
}
drupal_add_tabledrag('imageeditors-table', 'order', 'sibling', 'imageeditor-position');
$output .= theme('table', array(
'header' => $header,
'rows' => $rows,
'attributes' => array(
'id' => 'imageeditors-table',
),
));
$output .= drupal_render($form['uploaders']);
$rows = array();
$imageuploaders = imageeditor_info('uploader');
$imageuploaders_sort = array();
foreach ($imageuploaders as $codename => $uploader) {
$imageuploaders_sort[$codename] = $form[$codename . '_position'];
}
asort($imageuploaders_sort);
foreach ($imageuploaders_sort as $codename => $position) {
$row = array();
$row[] = drupal_render($form[$codename . '_enabled']);
$row[] = drupal_render($form[$codename . '_description']);
$row[] = drupal_render($form[$codename . '_api_key']);
$row[] = drupal_render($form[$codename . '_position']);
$rows[] = array(
'data' => $row,
'class' => array(
'draggable',
),
);
}
drupal_add_tabledrag('imageuploaders-table', 'order', 'sibling', 'imageuploader-position');
$output .= theme('table', array(
'header' => $header,
'rows' => $rows,
'attributes' => array(
'id' => 'imageuploaders-table',
),
));
$output .= drupal_render_children($form);
return $output;
}
/**
* Implements hook_filefield_sources_info().
*/
function imageeditor_imagefield_filefield_sources_info() {
$sources = array();
if (!user_access('use imageeditor_imagefield')) {
return $sources;
}
$sources['imageeditor'] = array(
'name' => t('Image editor: Create new image'),
'label' => t('Create image'),
'description' => t('Create new image in image editors.'),
'process' => 'imageeditor_imagefield_filefield_source_imageeditor_process',
'weight' => 5,
);
return $sources;
}
function imageeditor_imagefield_filefield_source_imageeditor_process($element, &$form_state, $form) {
$instance = field_info_instance($element['#entity_type'], $element['#field_name'], $element['#bundle']);
if (!in_array($instance['widget']['type'], array(
'image_image',
'image_miw',
))) {
return $element;
}
static $conf_added;
if (!$conf_added) {
$conf_added = TRUE;
if (!empty($instance['widget']['settings']['filefield_sources']['source_imageeditor']['source_imageeditor_image'])) {
$file = file_load($instance['widget']['settings']['filefield_sources']['source_imageeditor']['source_imageeditor_image']);
$url = file_create_url($file->uri);
drupal_add_js(array(
'imageeditor_imagefield' => array(
$element['#field_name'] => array(
'source_imageeditor_image' => $url,
),
),
), 'setting');
}
else {
drupal_add_js(array(
'imageeditor_imagefield' => array(
$element['#field_name'] => array(
'source_imageeditor_image' => FALSE,
),
),
), 'setting');
}
}
$element['imageeditor'] = array(
'#type' => 'markup',
'#markup' => '<div></div>',
'#prefix' => '<div class="filefield-source filefield-source-imageeditor">',
'#suffix' => '</div>',
);
return $element;
}