You are here

form_styler.module in jQuery form styler 7

Same filename and directory in other branches
  1. 8 form_styler.module
  2. 7.2 form_styler.module

Attach jQuery form styler plugin to selected forms.

@TODO: Allow change more plugin settings to admin interface.

File

form_styler.module
View source
<?php

/**
 * @file
 * Attach jQuery form styler plugin to selected forms.
 *
 * @TODO: Allow change more plugin settings to admin interface.
 */

/**
 * Implements hook_libraries_info().
 */
function form_styler_libraries_info() {
  $libraries['jquery_form_styler'] = array(
    'name' => 'jQuery form styler',
    'vendor url' => 'https://github.com/Dimox/jQueryFormStyler/',
    'download url' => 'https://github.com/Dimox/jQueryFormStyler/archive/1.7.8.zip',
    'version arguments' => array(
      'file' => 'jquery.formstyler.min.js',
      'pattern' => '/jQuery\\s+Form\\s+Styler\\s+v?([0-9\\.]+)/',
    ),
    'files' => array(
      'js' => array(
        'jquery.formstyler.min.js',
      ),
      'css' => array(
        'jquery.formstyler.css',
      ),
    ),
    'variants' => array(
      'minified' => array(
        'files' => array(
          'js' => array(
            'jquery.formstyler.min.js',
          ),
          'css' => array(
            'jquery.formstyler.css',
          ),
        ),
      ),
      'source' => array(
        'files' => array(
          'js' => array(
            'jquery.formstyler.js',
          ),
          'css' => array(
            'jquery.formstyler.css',
          ),
        ),
      ),
      'onlyjs' => array(
        'files' => array(
          'js' => array(
            'jquery.formstyler.min.js',
          ),
        ),
      ),
    ),
  );
  return $libraries;
}

/**
 * Check if the backstretch libraries have been loaded.
 *
 * @return bool
 *   A boolean indicating the loaded status.
 */
function form_styler_plugin_loaded() {
  $jquery_form_styler = libraries_load('jquery_form_styler');
  return !empty($jquery_form_styler['loaded']);
}

/**
 * Implements hook_permission().
 */
function form_styler_permission() {
  return array(
    'administer form styler' => array(
      'title' => t('Change settings'),
      'description' => t('Perform set form ids for including form styler.'),
    ),
  );
}

/**
 * Implements hook_menu().
 */
function form_styler_menu() {
  $items['admin/config/user-interface/form-styler'] = array(
    'title' => 'Form styler settings',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'form_styler_admin_form',
    ),
    'access arguments' => array(
      'administer form styler',
    ),
  );
  return $items;
}

/**
 * Administration page callbacks for the form_styler module.
 */
function form_styler_admin_form($form, $form_state) {
  $library = libraries_detect('jquery_form_styler');
  if (empty($library['installed'])) {
    $error_message = isset($library['error message']) ? $library['error message'] : '';
    $placeholders = array(
      '!error' => $error_message,
      '!form_styler' => l(t('jQuery form styler plugin'), $library['download url']),
      '%path' => 'sites/all/libraries',
    );
    $message = t('!error You need to download the !form_styler, extract the archive, rename it to "jquery_form_styler" and place the plugin directory in the %path directory on your server.', $placeholders);
    drupal_set_message($message, 'error');
    return array();
  }

  // Vertical Tabs group.
  $form['form_styler'] = array(
    '#type' => 'vertical_tabs',
    '#weight' => 99,
  );

  // Create settings form fieldsets.
  $form['plugin'] = array(
    '#type' => 'fieldset',
    '#title' => t('Main settings and performance'),
    '#collapsible' => TRUE,
    '#collapsed' => FALSE,
    '#group' => 'form_styler',
  );
  $form['themes'] = array(
    '#type' => 'fieldset',
    '#title' => t('Theme Overrides'),
    '#collapsible' => TRUE,
    '#collapsed' => TRUE,
    '#group' => 'form_styler',
  );
  $description_options = array(
    '!plugin_link' => url($library['vendor url'], array(
      'externak' => TRUE,
    )),
  );
  $form['options'] = array(
    '#type' => 'fieldset',
    '#title' => t('JS settigns'),
    '#collapsible' => TRUE,
    '#collapsed' => TRUE,
    '#group' => 'form_styler',
    '#description' => t('Allow to chage default options of plugin. More information about options you can see at <a href="!plugin_link">Plugin page</a>.', $description_options),
  );

  // Textfield for form ids.
  $form['plugin']['form_styler_ids'] = array(
    '#title' => t('Form ids'),
    '#type' => 'textarea',
    '#description' => t('Specify the id of form for which you want to use form styler'),
    '#default_value' => variable_get('form_styler_ids', ''),
  );

  // Allow users to select form styler plugin variant.
  $form['plugin']['form_styler_variants'] = array(
    '#title' => t('Select variant'),
    '#type' => 'radios',
    '#options' => array(
      'minified' => t('Compressed'),
      'source' => t('Uncompressed'),
      'onlyjs' => t('Only compressed js (without css)'),
    ),
    '#description' => t('Select variants for attaching form styler'),
    '#default_value' => variable_get('form_styler_variants', 'minified'),
  );

  // Get Theme overrides information.
  $themes = list_themes();
  $theme_default = variable_get('theme_default', FALSE);
  $admin_theme = variable_get('admin_theme', FALSE);

  // Header form theme ovverides table.
  $header = array(
    t('Theme'),
    t('Status'),
    t('Operations'),
  );
  $rows = array();
  $link_options = array(
    'query' => drupal_get_destination(),
    'fragment' => 'edit-form-styler',
  );
  foreach ($themes as $theme_key => $theme) {

    // Skip disabled themes, but only if they are not configured as admin
    // theme. This is an inconsistency in drupal core, that you can select a
    // disabled theme as admin theme.
    if (!$theme->status && $theme_key !== $admin_theme) {
      continue;
    }
    $theme_name = $theme->info['name'];

    // Provide additional information for default and admin themes.
    if ($theme_key === $theme_default && ($theme_key === $admin_theme || empty($admin_theme))) {
      $theme_name .= ' (' . t('default/admin theme') . ')';
    }
    elseif ($theme_key === $theme_default) {
      $theme_name .= ' (' . t('default theme') . ')';
    }
    elseif ($theme_key === $admin_theme) {
      $theme_name .= ' (' . t('admin theme') . ')';
    }
    $status = theme_get_setting('form_styler_all_forms', $theme_key);

    // Create the table rows.
    $rows[] = array(
      $theme_name,
      $status ? t('Enabled on all forms') : t('Disabled'),
      l(t('Configure'), 'admin/appearance/settings/' . $theme_key, $link_options),
    );
  }

  // Attach theme overrides information table to form.
  $form['themes']['overrides'] = array(
    '#theme' => 'table',
    '#header' => $header,
    '#rows' => $rows,
  );
  $default_options = form_styler_get_default_options();
  foreach ($default_options as $option_name => $option) {
    $type = isset($option['type']) ? $option['type'] : 'textfield';
    $option_key = 'form_styler_opt_' . $option_name;
    $form['options'][$option_key] = array(
      '#type' => $type,
      '#title' => $option['title'],
      '#default_value' => variable_get($option_key, $option['default']),
    );
    if (isset($option['description'])) {
      $form['options'][$option_key]['#description'] = $option['description'];
    }
    if (isset($option['related'])) {
      $form['options'][$option_key]['#states'] = array(
        'visible' => array(
          ':input[name="form_styler_opt_' . $option['related']['field'] . '"]' => $option['related']['condition'],
        ),
      );
    }
  }
  return system_settings_form($form);
}

/**
 * Implements hook_form_alter().
 */
function form_styler_form_alter(&$form, &$form_state, $form_id) {

  // Check enabled for all forms in theme.
  $attach = theme_get_setting('form_styler_all_forms');

  // Check form ids for attaching plugin.
  if (!$attach) {
    $raw_ids = str_replace('#', '', variable_get('form_styler_ids', ''));
    $ids = explode(PHP_EOL, variable_get('form_styler_ids', ''));
    $ids = array_filter(array_map('trim', $ids));
    $attach = in_array($form_id, $ids);
  }

  // Comparing for default HTML-id.
  if (!$attach && isset($form['#id'])) {
    $html_id = $form['#id'];
    $attach = in_array($html_id, $ids);
  }
  if ($attach) {

    // Check librari is instaled or not.
    $library_name = 'jquery_form_styler';
    if (($library = libraries_detect($library_name)) && !empty($library['installed'])) {

      // Check selected variant.
      $variant = variable_get('form_styler_variants', 'minified');
      $module_path = drupal_get_path('module', 'form_styler');
      $form['#attributes']['class'][] = 'form-styler-ready';
      $form['#attached']['js'][] = $module_path . '/js/form_styler-init.js';
      if ($variant !== 'onlyjs') {
        $form['#attached']['css'][] = $module_path . '/css/form_styler.css';
      }
      $form['#attached']['libraries_load'][] = array(
        $library_name,
        $variant,
      );
      $default_options = form_styler_get_default_options();

      // Attach form styler settings.
      $settings = array();
      foreach ($default_options as $option_name => $option) {
        $option_key = 'form_styler_opt_' . $option_name;
        $value = variable_get($option_key, $option['default']);
        if (isset($option['translatable'])) {
          $translatable = $option['translatable'];
        }
        else {
          $translatable = FALSE;
        }
        $settings['options'][$option_name] = $translatable ? t($value) : $value;
      }
      $form['#attached']['js'][] = array(
        'data' => array(
          'form_styler_settings' => $settings,
        ),
        'type' => 'setting',
      );
    }
    else {

      // Log the error message if plugin not installed.
      $error_message = $library['error message'];
      watchdog('form_styler', $error_message, array(), WATCHDOG_ERROR);
    }
  }
}

/**
 * Implements hook_form_FORM_ID_alter().
 */
function form_styler_form_system_theme_settings_alter(&$form, $form_state) {

  // Ignore global theme settings.
  if (empty($form_state['build_info']['args'][0])) {
    return;
  }
  $form['form_styler'] = array(
    '#type' => 'fieldset',
    '#title' => t('jQuery form styler'),
    '#description' => t('You can optionally enable form_styler for all forms on this theme.'),
  );
  $form['form_styler']['form_styler_all_forms'] = array(
    '#type' => 'checkbox',
    '#title' => t('Enable on all forms'),
    '#default_value' => theme_get_setting('form_styler_all_forms', $form_state['build_info']['args'][0]),
  );
}

/**
 * Implements hook_get_default_options().
 */
function form_styler_get_default_options() {

  // Create JavaScript settings options.
  // @todo allow to edit more options
  $defaultOptions = array(
    'filePlaceholder' => array(
      'default' => 'File not selected',
      'title' => t('File select placeholder'),
      'translatable' => TRUE,
    ),
    'fileBrowse' => array(
      'default' => 'Browse...',
      'title' => 'File browse button text',
      'translatable' => TRUE,
    ),
    'selectPlaceholder' => array(
      'default' => 'Select...',
      'title' => t('Select field placeholder'),
      'translatable' => TRUE,
    ),
    'selectSearch' => array(
      'default' => FALSE,
      'title' => t('Show search field'),
      'type' => 'checkbox',
    ),
    'selectSearchLimit' => array(
      'default' => 10,
      'title' => t('Options count for search'),
      'description' => t('Minimal options count for show search field in select box'),
      'related' => array(
        'field' => 'selectSearch',
        'condition' => array(
          'checked' => TRUE,
        ),
      ),
    ),
  );
  return $defaultOptions;
}

Functions

Namesort descending Description
form_styler_admin_form Administration page callbacks for the form_styler module.
form_styler_form_alter Implements hook_form_alter().
form_styler_form_system_theme_settings_alter Implements hook_form_FORM_ID_alter().
form_styler_get_default_options Implements hook_get_default_options().
form_styler_libraries_info Implements hook_libraries_info().
form_styler_menu Implements hook_menu().
form_styler_permission Implements hook_permission().
form_styler_plugin_loaded Check if the backstretch libraries have been loaded.