<?php
function image_style_list() {
$page = array();
$styles = entity_load_multiple('image_style');
$page['image_style_list'] = array(
'#markup' => theme('image_style_list', array(
'styles' => $styles,
)),
'#attached' => array(
'css' => array(
drupal_get_path('module', 'image') . '/image.admin.css' => array(),
),
),
);
return $page;
}
function image_style_form($form, &$form_state, $style) {
$title = t('Edit style %name', array(
'%name' => $style
->label(),
));
drupal_set_title($title, PASS_THROUGH);
$form_state['image_style'] = $style;
$form['#tree'] = TRUE;
$form['#attached']['css'][drupal_get_path('module', 'image') . '/image.admin.css'] = array();
$form['preview'] = array(
'#type' => 'item',
'#title' => t('Preview'),
'#markup' => theme('image_style_preview', array(
'style' => $style,
)),
);
$form['label'] = array(
'#type' => 'textfield',
'#title' => t('Administrative label'),
'#default_value' => $style
->label(),
'#required' => TRUE,
);
$form['name'] = array(
'#type' => 'machine_name',
'#default_value' => $style
->id(),
'#machine_name' => array(
'exists' => 'image_style_load',
),
'#required' => TRUE,
);
$form['effects'] = array(
'#theme' => 'image_style_effects',
);
if (!empty($style->effects)) {
foreach ($style->effects as $key => $effect) {
$form['effects'][$key]['#weight'] = isset($form_state['input']['effects']) ? $form_state['input']['effects'][$key]['weight'] : NULL;
$form['effects'][$key]['label'] = array(
'#markup' => $effect['label'],
);
$form['effects'][$key]['summary'] = array(
'#markup' => isset($effect['summary theme']) ? theme($effect['summary theme'], array(
'data' => $effect['data'],
)) : '',
);
$form['effects'][$key]['weight'] = array(
'#type' => 'weight',
'#title' => t('Weight for @title', array(
'@title' => $effect['label'],
)),
'#title_display' => 'invisible',
'#default_value' => $effect['weight'],
);
$links = array();
if (isset($effect['form callback'])) {
$links['edit'] = array(
'title' => t('edit'),
'href' => 'admin/config/media/image-styles/edit/' . $style
->id() . '/effects/' . $key,
);
}
$links['delete'] = array(
'title' => t('delete'),
'href' => 'admin/config/media/image-styles/edit/' . $style
->id() . '/effects/' . $key . '/delete',
);
$form['effects'][$key]['operations'] = array(
'#type' => 'operations',
'#links' => $links,
);
$form['effects'][$key]['configure'] = array(
'#type' => 'link',
'#title' => t('edit'),
'#href' => 'admin/config/media/image-styles/edit/' . $style
->id() . '/effects/' . $key,
'#access' => isset($effect['form callback']),
);
$form['effects'][$key]['remove'] = array(
'#type' => 'link',
'#title' => t('delete'),
'#href' => 'admin/config/media/image-styles/edit/' . $style
->id() . '/effects/' . $key . '/delete',
);
}
}
$new_effect_options = array();
foreach (image_effect_definitions() as $effect => $definition) {
$new_effect_options[$effect] = check_plain($definition['label']);
}
$form['effects']['new'] = array(
'#tree' => FALSE,
'#weight' => isset($form_state['input']['weight']) ? $form_state['input']['weight'] : NULL,
);
$form['effects']['new']['new'] = array(
'#type' => 'select',
'#title' => t('Effect'),
'#title_display' => 'invisible',
'#options' => $new_effect_options,
'#empty_option' => t('Select a new effect'),
);
$form['effects']['new']['weight'] = array(
'#type' => 'weight',
'#title' => t('Weight for new effect'),
'#title_display' => 'invisible',
'#default_value' => count($form['effects']) - 1,
);
$form['effects']['new']['add'] = array(
'#type' => 'submit',
'#value' => t('Add'),
'#validate' => array(
'image_style_form_add_validate',
),
'#submit' => array(
'image_style_form_submit',
'image_style_form_add_submit',
),
);
$form['actions'] = array(
'#type' => 'actions',
);
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => t('Update style'),
);
return $form;
}
function image_style_form_add_validate($form, &$form_state) {
if (!$form_state['values']['new']) {
form_error($form['effects']['new']['new'], t('Select an effect to add.'));
}
}
function image_style_form_add_submit($form, &$form_state) {
$style = $form_state['image_style'];
$effect = image_effect_definition_load($form_state['values']['new']);
if (isset($effect['form callback'])) {
$path = 'admin/config/media/image-styles/edit/' . $style
->id() . '/add/' . $form_state['values']['new'];
$form_state['redirect'] = array(
$path,
array(
'query' => array(
'weight' => $form_state['values']['weight'],
),
),
);
}
else {
$effect = array(
'name' => $effect['name'],
'data' => array(),
'weight' => $form_state['values']['weight'],
);
image_effect_save($style, $effect);
drupal_set_message(t('The image effect was successfully applied.'));
}
}
function image_style_form_submit($form, &$form_state) {
$style = $form_state['image_style'];
if (!empty($form_state['values']['effects'])) {
foreach ($form_state['values']['effects'] as $ieid => $effect_data) {
if (isset($style->effects[$ieid])) {
$effect = array(
'name' => $style->effects[$ieid]['name'],
'data' => $style->effects[$ieid]['data'],
'weight' => $effect_data['weight'],
'ieid' => $ieid,
);
$style->effects[$ieid] = $effect;
}
}
}
if (isset($form_state['values']['name']) && $style
->id() != $form_state['values']['name']) {
$old_style = $style;
$data = array(
'effects' => $style->effects,
'name' => $form_state['values']['name'],
);
$style = entity_create('image_style', $data);
}
$style
->set('label', $form_state['values']['label']);
$style
->save();
if (isset($old_style)) {
image_style_delete($old_style, $style
->id());
}
if ($form_state['values']['op'] == t('Update style')) {
drupal_set_message(t('Changes to the style have been saved.'));
}
$form_state['redirect'] = 'admin/config/media/image-styles/edit/' . $style
->id();
}
function image_style_add_form($form, &$form_state) {
$form['label'] = array(
'#type' => 'textfield',
'#title' => t('Administrative label'),
'#default_value' => '',
'#required' => TRUE,
);
$form['name'] = array(
'#type' => 'machine_name',
'#machine_name' => array(
'exists' => 'image_style_load',
),
'#default_value' => '',
'#required' => TRUE,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Create new style'),
);
return $form;
}
function image_style_add_form_submit($form, &$form_state) {
$style = array(
'name' => $form_state['values']['name'],
'label' => $form_state['values']['label'],
);
$style = entity_create('image_style', $style);
$style
->save();
drupal_set_message(t('Style %name was created.', array(
'%name' => $style
->label(),
)));
$form_state['redirect'] = 'admin/config/media/image-styles/edit/' . $style
->id();
}
function image_style_delete_form($form, &$form_state, $style) {
$form_state['image_style'] = $style;
$replacement_styles = array_diff_key(image_style_options(), array(
$style
->id() => '',
));
$form['replacement'] = array(
'#title' => t('Replacement style'),
'#type' => 'select',
'#options' => $replacement_styles,
'#empty_option' => t('No replacement, just delete'),
);
return confirm_form($form, t('Optionally select a style before deleting %style', array(
'%style' => $style
->label(),
)), 'admin/config/media/image-styles', t('If this style is in use on the site, you may select another style to replace it. All images that have been generated for this style will be permanently deleted.'), t('Delete'), t('Cancel'));
}
function image_style_delete_form_submit($form, &$form_state) {
$style = $form_state['image_style'];
image_style_delete($style, $form_state['values']['replacement']);
drupal_set_message(t('Style %name was deleted.', array(
'%name' => $style
->label(),
)));
$form_state['redirect'] = 'admin/config/media/image-styles';
}
function image_effect_form($form, &$form_state, $style, $effect) {
if (!isset($effect['form callback'])) {
drupal_goto('admin/config/media/image-styles/edit/' . $style
->id());
}
$form_state['image_style'] = $style;
$form_state['image_effect'] = $effect;
if (!empty($effect['ieid'])) {
$title = t('Edit %label effect', array(
'%label' => $effect['label'],
));
}
else {
$title = t('Add %label effect', array(
'%label' => $effect['label'],
));
}
drupal_set_title($title, PASS_THROUGH);
$form['#attached']['css'][drupal_get_path('module', 'image') . '/image.admin.css'] = array();
$form['ieid'] = array(
'#type' => 'value',
'#value' => !empty($effect['ieid']) ? $effect['ieid'] : NULL,
);
$form['name'] = array(
'#type' => 'value',
'#value' => $effect['name'],
);
$form['data'] = call_user_func($effect['form callback'], $effect['data']);
$form['data']['#tree'] = TRUE;
$form['weight'] = array(
'#type' => 'hidden',
'#value' => isset($_GET['weight']) ? intval($_GET['weight']) : (isset($effect['weight']) ? $effect['weight'] : count($style->effects)),
);
$form['actions'] = array(
'#type' => 'actions',
);
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => !empty($effect['ieid']) ? t('Update effect') : t('Add effect'),
);
$form['actions']['cancel'] = array(
'#type' => 'link',
'#title' => t('Cancel'),
'#href' => 'admin/config/media/image-styles/edit/' . $style
->id(),
);
return $form;
}
function image_effect_form_submit($form, &$form_state) {
form_state_values_clean($form_state);
$effect = $form_state['values'];
$style = $form_state['image_style'];
image_effect_save($style, $effect);
drupal_set_message(t('The image effect was successfully applied.'));
$form_state['redirect'] = 'admin/config/media/image-styles/edit/' . $style
->id();
}
function image_effect_delete_form($form, &$form_state, $style, $effect) {
$form_state['image_style'] = $style;
$form_state['image_effect'] = $effect;
$question = t('Are you sure you want to delete the @effect effect from the %style style?', array(
'%style' => $style
->label(),
'@effect' => $effect['label'],
));
return confirm_form($form, $question, 'admin/config/media/image-styles/edit/' . $style
->id(), '', t('Delete'));
}
function image_effect_delete_form_submit($form, &$form_state) {
$style = $form_state['image_style'];
$effect = $form_state['image_effect'];
image_effect_delete($style, $effect);
drupal_set_message(t('The image effect %name has been deleted.', array(
'%name' => $effect['label'],
)));
$form_state['redirect'] = 'admin/config/media/image-styles/edit/' . $style
->id();
}
function image_effect_color_validate($element, &$form_state) {
if ($element['#value'] != '') {
$hex_value = preg_replace('/^#/', '', $element['#value']);
if (!preg_match('/^#[0-9A-F]{3}([0-9A-F]{3})?$/', $element['#value'])) {
form_error($element, t('!name must be a hexadecimal color value.', array(
'!name' => $element['#title'],
)));
}
}
}
function image_effect_scale_validate($element, &$form_state) {
if (empty($element['width']['#value']) && empty($element['height']['#value'])) {
form_error($element, t('Width and height can not both be blank.'));
}
}
function image_resize_form($data) {
$form['width'] = array(
'#type' => 'number',
'#title' => t('Width'),
'#default_value' => isset($data['width']) ? $data['width'] : '',
'#field_suffix' => ' ' . t('pixels'),
'#required' => TRUE,
'#min' => 1,
);
$form['height'] = array(
'#type' => 'number',
'#title' => t('Height'),
'#default_value' => isset($data['height']) ? $data['height'] : '',
'#field_suffix' => ' ' . t('pixels'),
'#required' => TRUE,
'#min' => 1,
);
return $form;
}
function image_scale_form($data) {
$form = image_resize_form($data);
$form['#element_validate'] = array(
'image_effect_scale_validate',
);
$form['width']['#required'] = FALSE;
$form['height']['#required'] = FALSE;
$form['upscale'] = array(
'#type' => 'checkbox',
'#default_value' => isset($data['upscale']) ? $data['upscale'] : 0,
'#title' => t('Allow Upscaling'),
'#description' => t('Let scale make images larger than their original size'),
);
return $form;
}
function image_crop_form($data) {
$data += array(
'width' => '',
'height' => '',
'anchor' => 'center-center',
);
$form = image_resize_form($data);
$form['anchor'] = array(
'#type' => 'radios',
'#title' => t('Anchor'),
'#options' => array(
'left-top' => t('Top') . ' ' . t('Left'),
'center-top' => t('Top') . ' ' . t('Center'),
'right-top' => t('Top') . ' ' . t('Right'),
'left-center' => t('Center') . ' ' . t('Left'),
'center-center' => t('Center'),
'right-center' => t('Center') . ' ' . t('Right'),
'left-bottom' => t('Bottom') . ' ' . t('Left'),
'center-bottom' => t('Bottom') . ' ' . t('Center'),
'right-bottom' => t('Bottom') . ' ' . t('Right'),
),
'#theme' => 'image_anchor',
'#default_value' => $data['anchor'],
'#description' => t('The part of the image that will be retained during the crop.'),
);
return $form;
}
function image_rotate_form($data) {
$form['degrees'] = array(
'#type' => 'number',
'#default_value' => isset($data['degrees']) ? $data['degrees'] : 0,
'#title' => t('Rotation angle'),
'#description' => t('The number of degrees the image should be rotated. Positive numbers are clockwise, negative are counter-clockwise.'),
'#field_suffix' => '°',
'#required' => TRUE,
);
$form['bgcolor'] = array(
'#type' => 'textfield',
'#default_value' => isset($data['bgcolor']) ? $data['bgcolor'] : '#FFFFFF',
'#title' => t('Background color'),
'#description' => t('The background color to use for exposed areas of the image. Use web-style hex colors (#FFFFFF for white, #000000 for black). Leave blank for transparency on image types that support it.'),
'#size' => 7,
'#maxlength' => 7,
'#element_validate' => array(
'image_effect_color_validate',
),
);
$form['random'] = array(
'#type' => 'checkbox',
'#default_value' => isset($data['random']) ? $data['random'] : 0,
'#title' => t('Randomize'),
'#description' => t('Randomize the rotation angle for each image. The angle specified above is used as a maximum.'),
);
return $form;
}
function theme_image_style_list($variables) {
$styles = $variables['styles'];
$header = array(
t('Style name'),
t('Operations'),
);
$rows = array();
foreach ($styles as $style) {
$row = array();
$row[] = l($style
->label(), 'admin/config/media/image-styles/edit/' . $style
->id());
$links = array();
$links['edit'] = array(
'title' => t('edit'),
'href' => 'admin/config/media/image-styles/edit/' . $style
->id(),
'class' => array(
'image-style-link',
),
);
$links['delete'] = array(
'title' => t('delete'),
'href' => 'admin/config/media/image-styles/delete/' . $style
->id(),
'class' => array(
'image-style-link',
),
);
$row[] = array(
'data' => array(
'#type' => 'operations',
'#links' => $links,
),
);
$rows[] = $row;
}
if (empty($rows)) {
$rows[] = array(
array(
'colspan' => 4,
'data' => t('There are currently no styles. <a href="!url">Add a new one</a>.', array(
'!url' => url('admin/config/media/image-styles/add'),
)),
),
);
}
return theme('table', array(
'header' => $header,
'rows' => $rows,
));
}
function theme_image_style_effects($variables) {
$form = $variables['form'];
$rows = array();
foreach (element_children($form) as $key) {
$row = array();
$form[$key]['weight']['#attributes']['class'] = array(
'image-effect-order-weight',
);
if ($key != 'new') {
$summary = drupal_render($form[$key]['summary']);
$row[] = drupal_render($form[$key]['label']) . (empty($summary) ? '' : ' ' . $summary);
$row[] = drupal_render($form[$key]['weight']);
$row[] = array(
'data' => $form[$key]['operations'],
);
}
else {
$row[] = '<div class="image-style-new">' . drupal_render($form['new']['new']) . drupal_render($form['new']['add']) . '</div>';
$row[] = drupal_render($form['new']['weight']);
$row[] = '';
}
$rows[] = array(
'data' => $row,
'class' => array(
'draggable',
),
);
}
$header = array(
t('Effect'),
t('Weight'),
t('Operations'),
);
if (count($rows) == 1 && (!isset($form['new']['#access']) || $form['new']['#access'])) {
array_unshift($rows, array(
array(
'data' => t('There are currently no effects in this style. Add one by selecting an option below.'),
'colspan' => 4,
),
));
}
$output = theme('table', array(
'header' => $header,
'rows' => $rows,
'attributes' => array(
'id' => 'image-style-effects',
),
));
drupal_add_tabledrag('image-style-effects', 'order', 'sibling', 'image-effect-order-weight');
return $output;
}
function theme_image_style_preview($variables) {
$style = $variables['style'];
$sample_image = config('image.settings')
->get('preview_image');
$sample_width = 160;
$sample_height = 160;
$original_path = $sample_image;
$original_image = image_get_info($original_path);
if ($original_image['width'] > $original_image['height']) {
$original_width = min($original_image['width'], $sample_width);
$original_height = round($original_width / $original_image['width'] * $original_image['height']);
}
else {
$original_height = min($original_image['height'], $sample_height);
$original_width = round($original_height / $original_image['height'] * $original_image['width']);
}
$original_attributes = array_intersect_key($original_image, array(
'width' => '',
'height' => '',
));
$original_attributes['style'] = 'width: ' . $original_width . 'px; height: ' . $original_height . 'px;';
$preview_file = image_style_path($style
->id(), $original_path);
if (!file_exists($preview_file)) {
image_style_create_derivative($style, $original_path, $preview_file);
}
$preview_image = image_get_info($preview_file);
if ($preview_image['width'] > $preview_image['height']) {
$preview_width = min($preview_image['width'], $sample_width);
$preview_height = round($preview_width / $preview_image['width'] * $preview_image['height']);
}
else {
$preview_height = min($preview_image['height'], $sample_height);
$preview_width = round($preview_height / $preview_image['height'] * $preview_image['width']);
}
$preview_attributes = array_intersect_key($preview_image, array(
'width' => '',
'height' => '',
));
$preview_attributes['style'] = 'width: ' . $preview_width . 'px; height: ' . $preview_height . 'px;';
$output = '<div class="image-style-preview preview clearfix">';
$original_url = file_create_url($original_path);
$output .= '<div class="preview-image-wrapper">';
$output .= t('original') . ' (' . l(t('view actual size'), $original_url) . ')';
$output .= '<div class="preview-image original-image" style="' . $original_attributes['style'] . '">';
$output .= '<a href="' . $original_url . '">' . theme('image', array(
'uri' => $original_path,
'alt' => t('Sample original image'),
'title' => '',
'attributes' => $original_attributes,
)) . '</a>';
$output .= '<div class="height" style="height: ' . $original_height . 'px"><span>' . $original_image['height'] . 'px</span></div>';
$output .= '<div class="width" style="width: ' . $original_width . 'px"><span>' . $original_image['width'] . 'px</span></div>';
$output .= '</div>';
$output .= '</div>';
$preview_url = file_create_url($preview_file) . '?cache_bypass=' . REQUEST_TIME;
$output .= '<div class="preview-image-wrapper">';
$output .= check_plain($style
->label()) . ' (' . l(t('view actual size'), file_create_url($preview_file) . '?' . time()) . ')';
$output .= '<div class="preview-image modified-image" style="' . $preview_attributes['style'] . '">';
$output .= '<a href="' . file_create_url($preview_file) . '?' . time() . '">' . theme('image', array(
'uri' => $preview_url,
'alt' => t('Sample modified image'),
'title' => '',
'attributes' => $preview_attributes,
)) . '</a>';
$output .= '<div class="height" style="height: ' . $preview_height . 'px"><span>' . $preview_image['height'] . 'px</span></div>';
$output .= '<div class="width" style="width: ' . $preview_width . 'px"><span>' . $preview_image['width'] . 'px</span></div>';
$output .= '</div>';
$output .= '</div>';
$output .= '</div>';
return $output;
}
function theme_image_anchor($variables) {
$element = $variables['element'];
$rows = array();
$row = array();
foreach (element_children($element) as $n => $key) {
$element[$key]['#attributes']['title'] = $element[$key]['#title'];
unset($element[$key]['#title']);
$row[] = drupal_render($element[$key]);
if ($n % 3 == 3 - 1) {
$rows[] = $row;
$row = array();
}
}
return theme('table', array(
'header' => array(),
'rows' => $rows,
'attributes' => array(
'class' => array(
'image-anchor',
),
),
));
}
function theme_image_resize_summary($variables) {
$data = $variables['data'];
if ($data['width'] && $data['height']) {
return check_plain($data['width']) . 'x' . check_plain($data['height']);
}
else {
return $data['width'] ? t('width @width', array(
'@width' => $data['width'],
)) : t('height @height', array(
'@height' => $data['height'],
));
}
}
function theme_image_scale_summary($variables) {
$data = $variables['data'];
return theme('image_resize_summary', array(
'data' => $data,
)) . ' ' . ($data['upscale'] ? '(' . t('upscaling allowed') . ')' : '');
}
function theme_image_crop_summary($variables) {
return theme('image_resize_summary', $variables);
}
function theme_image_rotate_summary($variables) {
$data = $variables['data'];
return $data['random'] ? t('random between -@degrees° and @degrees°', array(
'@degrees' => str_replace('-', '', $data['degrees']),
)) : t('@degrees°', array(
'@degrees' => $data['degrees'],
));
}