You are here

imageeditor_imagefield.module in Image Editor 7

Allows online editing of image field items using different image editing services.

File

imageeditor_imagefield/imageeditor_imagefield.module
View 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;
}

Functions