t('Operations'), 'colspan' => 2, )); $rows = array(); foreach ($presets as $name => $preset) { $rows[] = array( l($preset['title'], 'admin/config/media/imageflow/edit/' . $name), l(t('edit'), 'admin/config/media/imageflow/edit/' . $name), // Hide the delete link for the 'default' set. ($name == 'default') ? '' : l(t('delete'), 'admin/config/media/imageflow/delete/' . $name), ); } return theme('table', array( 'header' => $header, 'rows' => $rows, 'empty' => t('There are currently no presets. Add a new one.', array('!url' => url('admin/config/media/imageflow/add'))), )); } /** * Form builder; Form for adding a new preset. */ function imageflow_form_preset_add($form, &$form_state) { $form['title'] = array( '#type' => 'textfield', '#maxlength' => '255', '#title' => t('Title'), '#description' => t('A human-readable title for this preset.'), '#required' => TRUE, ); $form['name'] = array( '#type' => 'machine_name', '#maxlength' => '255', '#machine_name' => array( 'source' => array('title'), 'exists' => 'imageflow_preset_exists', ), '#required' => TRUE, ); $form['actions'] = array( '#type' => 'actions', 'submit' => array( '#type' => 'submit', '#value' => t('Create new preset'), ), 'cancel' => array( '#type' => 'link', '#title' => t('Cancel'), '#href' => 'admin/config/media/imageflow', ), ); return $form; } /** * Submit handler for adding a new preset. */ function imageflow_form_preset_add_submit($form, &$form_state) { $preset = array( 'name' => $form_state['values']['name'], 'title' => $form_state['values']['title'], 'options' => array( 'buttons' => TRUE, ), ); if (module_exists('imagecache_reflect')) { $preset['imagestyle'] = 'imageflow_reflect'; } $preset = imageflow_preset_save($preset, TRUE); drupal_set_message(t('preset %name was created.', array('%name' => $preset['name']))); $form_state['redirect'] = 'admin/config/media/imageflow/edit/' . $preset['name']; } /** * Theme to embed tables into forms. */ function theme_imageflow_form_table($variables) { $form = $variables['form']; $rows = array(); foreach (element_children($form) as $row_key) { $row = array(); foreach (element_get_visible_children($form[$row_key]) as $cell_key) { $cell = array('data' => drupal_render($form[$row_key][$cell_key])); if (!empty($form[$row_key][$cell_key]['#table_attributes'])) { $cell += $form[$row_key][$cell_key]['#table_attributes']; } $row[] = $cell; } $rows[] = $row; } $variables = array(); foreach ($form as $key => $value) { if (element_property($key)) { $variables[substr($key, 1)] = $value; } } $variables['rows'] = $rows; return theme('table', $variables); } /** * Option elements. * * This function returns an array defining the form elements used to * edit the different options. */ function imageflow_option_elements() { return array( 'animationSpeed' => array( '#type' => 'textfield', '#title' => t('Animation speed'), '#description' => t('Animation speed in ms.'), '#element_validate' => array('_imageflow_validate_integer'), '#default_value' => 50, ), 'aspectRatio' => array( '#type' => 'textfield', '#title' => t('Aspect ratio'), '#description' => t('Aspect ratio of the ImageFlow container (width divided by height).'), '#element_validate' => array('_imageflow_validate_number'), '#default_value' => 1.964, ), 'buttons' => array( '#type' => 'checkbox', '#title' => t('Buttons'), '#description' => t('Toggle navigation buttons.'), '#default_value' => TRUE, ), 'captions' => array( '#type' => 'checkbox', '#title' => t('Captions'), '#description' => t('Disables / enables the captions.'), '#default_value' => TRUE, ), 'circular' => array( '#type' => 'checkbox', '#title' => t('Circular'), '#description' => t('Toggle circular rotation.'), '#default_value' => TRUE, ), 'glideToStartID' => array( '#type' => 'checkbox', '#title' => t('Glide to start ID'), '#description' => t('Toggle glide animation to start ID.'), '#default_value' => TRUE, ), 'imageCursor' => array( '#type' => 'textfield', '#title' => t('Image cursor'), '#description' => t('Cursor type for the images (try "pointer").'), '#default_value' => 'default', ), 'imageFocusM' => array( '#type' => 'textfield', '#title' => t('imageFocusM'), '#description' => t('Multiplicator for the focussed image size in percent.'), '#element_validate' => array('_imageflow_validate_integer'), '#default_value' => 1.0, ), 'imageFocusMax' => array( '#type' => 'textfield', '#title' => t('imageFocusMax'), '#description' => t('Maximum number of images on each side of the focussed one.'), '#element_validate' => array('_imageflow_validate_integer'), '#default_value' => 4, ), 'imageScaling' => array( '#type' => 'checkbox', '#title' => t('imageScaling'), '#description' => t('Toggle image scaling.'), '#default_value' => TRUE, ), 'imagesHeight' => array( '#type' => 'textfield', '#title' => t('imagesHeight'), '#description' => t('Height of the images div container in percent.'), '#element_validate' => array('_imageflow_validate_opacity'), '#default_value' => 0.67, ), 'imagesM' => array( '#type' => 'textfield', '#title' => t('imagesM'), '#description' => t('Multiplicator for all images in percent.'), '#element_validate' => array('_imageflow_validate_opacity'), '#default_value' => 1.0, ), 'opacity' => array( '#type' => 'checkbox', '#title' => t('Opacity'), '#description' => t('Disables / enables image opacity.'), '#default_value' => TRUE, ), 'percentLandscape' => array( '#type' => 'textfield', '#title' => t('percentLandscape'), '#description' => t('Scale landscape format.'), '#element_validate' => array('_imageflow_validate_integer'), '#default_value' => 118, ), 'percentOther' => array( '#type' => 'textfield', '#title' => t('percentOther'), '#description' => t('Scale portrait and square format.'), '#element_validate' => array('_imageflow_validate_integer'), '#default_value' => 100, ), 'preloadImages' => array( '#type' => 'checkbox', '#title' => t('preloadImages'), '#description' => t('Disables / enables the loading bar and image preloading.'), '#default_value' => TRUE, ), 'scrollbarP' => array( '#type' => 'textfield', '#title' => t('scrollbarP'), '#description' => t('Width of the scrollbar in percent.'), '#element_validate' => array('_imageflow_validate_opacity'), '#default_value' => 0.6, ), 'slider' => array( '#type' => 'checkbox', '#title' => t('slider'), '#description' => t('Disables / enables the scrollbar.'), '#default_value' => TRUE, ), 'sliderCursor' => array( '#type' => 'textfield', '#title' => t('sliderCursor'), '#description' => t('Cursor type for the slider (try "default").'), '#default_value' => 'e-resize', ), 'sliderWidth' => array( '#type' => 'textfield', '#title' => t('sliderWidth'), '#description' => t('Width of the slider in px.'), '#element_validate' => array('_imageflow_validate_integer'), '#default_value' => 14, ), 'slideshow' => array( '#type' => 'checkbox', '#title' => t('slideshow'), '#description' => t('Toggle slideshow.'), '#default_value' => TRUE, ), 'slideshowSpeed' => array( '#type' => 'textfield', '#title' => t('slideshowSpeed'), '#description' => t('Time between slides in ms.'), '#element_validate' => array('_imageflow_validate_integer'), '#default_value' => 1500, ), 'slideshowAutoplay' => array( '#type' => 'checkbox', '#title' => t('slideshowAutoplay'), '#description' => t('Toggle automatic slideshow play on startup.'), '#default_value' => TRUE, ), 'startID' => array( '#type' => 'textfield', '#title' => t('startID'), '#description' => t('Glide to this image number on startup.'), '#element_validate' => array('_imageflow_validate_integer'), '#default_value' => 1, ), 'startAnimation' => array( '#type' => 'checkbox', '#title' => t('startAnimation'), '#description' => t('Animate images moving in from the right on startup.'), '#default_value' => TRUE, ), 'xStep' => array( '#type' => 'textfield', '#title' => t('xStep'), '#description' => t('Step width on the x-axis in px.'), '#element_validate' => array('_imageflow_validate_integer'), '#default_value' => 150, ), ); } /** * Returns the form element to use to edit the given option. */ function imageflow_option_element($option, $value) { $elements = imageflow_option_elements(); $element = isset($elements[$option]) ? $elements[$option] : array('#type' => 'textfield'); if ($value !== NULL) { if ($element['#type'] == 'select') { if ($value === TRUE) { $value = 'true'; } elseif ($value === FALSE) { $value = 'false'; } } $element['#default_value'] = $value; } return $element; } /** * Form builder; Form to edit a given preset. */ function imageflow_form_preset_edit($form, &$form_state, $preset) { if (empty($form_state['preset'])) { $form_state['preset'] = $preset; } else { $preset = $form_state['preset']; } $form['title'] = array( '#type' => 'textfield', '#maxlength' => '255', '#title' => t('Title'), '#default_value' => $preset['title'], '#description' => t('A human-readable title for this preset.'), '#required' => TRUE, ); $form['imagestyle'] = array( '#title' => t('Image style'), '#type' => 'select', '#default_value' => $preset['imagestyle'], '#empty_option' => t('None (original image)'), '#options' => image_style_options(FALSE), ); if (!module_exists('imagecache_reflect')) { $form['imagestyle'] += array( '#description' => t("Install the image reflect module to add a reflection preset."), ); } if (module_exists('colorbox')) { $form['lightbox'] = array( '#title' => t('OnClick behavior'), '#type' => 'select', '#default_value' => $preset['lightbox'], '#options' => array( 'normal' => t('Normal url'), 'colorbox' => t('Colorbox'), 'colorboxiframe' => t('Colorbox iframe'), ), ); } // Option table. $form['options'] = array( '#theme' => 'imageflow_form_table', '#tree' => TRUE, '#header' => array(t('Name'), t('Value'), t('Operations')), ); $i = 0; foreach ($preset['options'] as $key => $value) { $option_element = imageflow_option_element($key, $value); $form['options'][] = array( 'name' => array( '#type' => 'item', '#title' => check_plain($key), '#description' => isset($option_element['#title']) ? $option_element['#title'] : '', ), 'value' => $option_element + array( '#option_name' => $key, '#title_display' => 'none', ), 'delete' => array( '#type' => 'submit', '#name' => 'button_del_' . $i++, '#value' => t('Delete'), '#submit' => array('imageflow_form_preset_edit_submit_delete'), '#limit_validation_errors' => array(), ), ); } // 'Add option' row at the end of the table. $options = array_diff(array_keys(imageflow_option_elements()), array_keys($preset['options'])); $options = empty($options) ? array() : array_combine($options, $options); $form['options'][] = array( 'add_option_row' => array( '#table_attributes' => array('colspan' => '3', 'class' => array('container-inline')), '#tree' => FALSE, 'new_option' => array( '#type' => 'select', '#options' => $options, '#empty_option' => t('Select or enter:'), ), 'new_option_custom' => array( '#type' => 'textfield', '#states' => array( 'visible' => array( ':input[name="new_option"]' => array('value' => ''), ), ), ), 'button_add' => array( '#type' => 'submit', '#name' => 'add_option', '#value' => t('Add option'), '#submit' => array('imageflow_form_preset_edit_submit_add'), '#limit_validation_errors' => array( array('new_option'), array('new_option_custom'), ), ), ), ); $form['actions'] = array( '#type' => 'actions', 'submit' => array( '#type' => 'submit', '#name' => 'submit', '#value' => t('Save preset'), ), 'cancel' => array( '#type' => 'link', '#title' => t('Cancel'), '#href' => 'admin/config/media/imageflow', ), ); return $form; } /** * Validate a form element that should have an integer value. */ function _imageflow_validate_integer($element, &$form_state) { $value = $element['#value']; if ($value !== '' && (!is_numeric($value) || intval($value) != $value || $value < 0)) { form_error($element, t('%name must be a positive integer.', array('%name' => $element['#title']))); } } /** * Validate a form element that should have a number as value. */ function _imageflow_validate_number($element, &$form_state) { $value = $element['#value']; if ($value !== '' && !is_numeric($value)) { form_error($element, t('%name must be a number.', array('%name' => $element['#option_name']))); } } /** * Validate a form element that should have a value between 0 and 1. */ function _imageflow_validate_opacity($element, &$form_state) { $value = $element['#value']; if ($value !== '' && (!is_numeric($value) || $value < 0 || $value > 1)) { form_error($element, t('%name must be a value between 0 and 1.', array('%name' => $element['#option_name']))); } } /** * Submit handler for 'Add option' button; Add a new option to the set. */ function imageflow_form_preset_edit_submit_add($form, &$form_state) { $preset = &$form_state['preset']; if (!empty($form_state['values']['new_option'])) { $new_option_element = 'new_option'; } elseif (!empty($form_state['values']['new_option_custom'])) { $new_option_element = 'new_option_custom'; } if (isset($new_option_element)) { $new_option = $form_state['values'][$new_option_element]; if (!array_key_exists($new_option, $preset['options'])) { // Add the new option with a NULL value. // The input element cares for a default value. $preset['options'][$new_option] = NULL; // Reset the input field. $form_state['input'][$new_option_element] = ''; drupal_set_message(t('Option %name added.', array('%name' => $new_option))); } else { form_set_error($new_option_element, t('This set already includes the %name option.', array('%name' => $new_option))); } } $form_state['rebuild'] = TRUE; } /** * Submit handler for 'Delete' buttons; Delete an option from the set. */ function imageflow_form_preset_edit_submit_delete($form, &$form_state) { $preset = &$form_state['preset']; $rowindex = $form_state['triggering_element']['#parents'][1]; $option = $form['options'][$rowindex]['value']['#option_name']; unset($preset['options'][$option]); drupal_set_message(t('Option %name removed.', array('%name' => $option))); $form_state['rebuild'] = TRUE; } /** * Submit handler for 'Save preset' button; Save the changed preset. */ function imageflow_form_preset_edit_submit($form, &$form_state) { $preset = &$form_state['preset']; $preset['title'] = $form_state['values']['title']; $preset['imagestyle'] = $form_state['values']['imagestyle']; if (isset($form_state['values']['lightbox'])) { $preset['lightbox'] = $form_state['values']['lightbox']; } if (isset($form_state['values']['options'])) { foreach ($form_state['values']['options'] as $index => $values) { $element = $form['options'][$index]['value']; $value = $values['value']; if ($value !== '') { if ($element['#type'] == 'checkbox') { $value = (bool) $value; } elseif (is_numeric($value)) { $value = (float) $value; } elseif (strcasecmp($value, 'true') == 0) { $value = TRUE; } elseif (strcasecmp($value, 'false') == 0) { $value = FALSE; } } $option = $element['#option_name']; $preset['options'][$option] = $value; } } imageflow_preset_save($preset); drupal_set_message(t('preset %name changed.', array('%name' => $preset['name']))); $form_state['redirect'] = 'admin/config/media/imageflow'; } /** * Form builder; Form to delete a given preset. */ function imageflow_preset_form_delete($form, &$form_state, $preset) { $form_state['preset'] = &$preset; return confirm_form($form, t('Are you sure you want to delete the preset %name?', array('%name' => $preset['name'])), 'admin/config/media/imageflow', NULL, t('Delete'), t('Cancel') ); } /** * Submit handler for deleting an preset. */ function imageflow_preset_form_delete_submit($form, &$form_state) { $preset = &$form_state['preset']; if ($preset['name'] == 'default') { // Prevent deletion of the default set so we can fall back to it. drupal_set_message(t('The default preset may not be deleted!', 'error')); } else { imageflow_preset_delete($preset); drupal_set_message(t('preset %name was deleted.', array('%name' => $preset['name']))); } $form_state['redirect'] = 'admin/config/media/imageflow'; } /** * Form builder; Form for advanced module settings. */ function imageflow_form_settings() { $form = array(); $form['library'] = array( '#type' => 'fieldset', '#title' => 'Imageflow Library', ); $variant = variable_get('imageflow_library_variant', 'source'); $library = libraries_detect('imageflow'); $path = $library['library path']; if (!$path) { drupal_set_message(t('Imageflow library not found.'), 'error'); $form['library']['missing'] = array( '#type' => 'item', '#title' => t('Library missing'), '#description' => t('The Imageflow library cannot be found.'), ); } else { $form['library']['variant'] = array( '#type' => 'radios', '#title' => t('Library variant'), '#default_value' => $variant, '#options' => array( 'source' => t('Source'), 'minified' => t('Minified'), ), '#description' => t('Choose whether to use the source or minified version of the imageflow library.'), '#required' => TRUE, ); $file = $path . '/' . key($library['variants'][$variant]['files']['js']); $form['library']['lib_js_file'] = array( '#type' => 'item', '#title' => t('Current JS file'), '#markup' => $file ? t('@file', array('@file' => $file)) : t('Unknown'), ); $file = $path . '/' . key($library['variants'][$variant]['files']['css']); $form['library']['lib_css_file'] = array( '#type' => 'item', '#title' => t('Current CSS file'), '#markup' => $file ? t('@file', array('@file' => $file)) : t('Unknown'), ); $form['library']['info'] = array( '#theme' => 'imageflow_form_table', '#header' => array(t('Name'), t('Value')), '#empty' => t('Library not found!'), ); $info = array('name', 'vendor url', 'download url', 'library path'); foreach ($library as $key => $value) { if (in_array($key, $info)) { $form['library']['info'][] = array( array( '#markup' => check_plain(ucfirst($key)), ), array( '#markup' => t('@file', array('@file' => $value)), ), ); } } $form['library']['button_clearcache'] = array( '#type' => 'submit', '#name' => 'button_clearcache', '#value' => t('Clear cache'), '#submit' => array('imageflow_form_settings_submit_clearcache'), ); $form['library']['button_submit'] = array( '#type' => 'submit', '#name' => 'button_submit', '#value' => t('Submit'), '#submit' => array('imageflow_form_settings_submit'), ); } return $form; } /** * Submit handler for the advanced module settings form button 'Clear cache'. */ function imageflow_form_settings_submit_clearcache($form, &$form_state) { libraries_flush_caches(); drupal_set_message(t('Cache cleared.')); } /** * Submit handler for the advanced module settings. */ function imageflow_form_settings_submit($form, &$form_state) { $value = $form_state['values']['variant']; variable_set('imageflow_library_variant', $value); drupal_set_message(t('Library variant %value saved.', array('%value' => $value))); }