You are here

better_field_descriptions.admin.inc in Better Field Descriptions 7

Functionality and helper functions for Better field descriptions.

File

better_field_descriptions.admin.inc
View source
<?php

/**
 * @file
 * Functionality and helper functions for Better field descriptions.
 */

/**
 * Implements hook_admin_settings_form().
 */
function better_field_descriptions_admin_settings_form($form, &$form_state) {
  $entity_types = entity_get_info();
  $entity_types_list = array();
  foreach ($entity_types as $key => $entity_type_data) {
    $entity_types_list[$key] = $key;
  }
  $entity_type = variable_get('better_field_descriptions_default_entity', 'node');
  $form['entity_types'] = array(
    '#type' => 'select',
    '#title' => 'Select entity type',
    '#options' => $entity_types_list,
    '#default_value' => $entity_type,
    '#ajax' => array(
      'callback' => 'better_field_descriptions_load_entity_type',
      'wrapper' => 'entity_type_fields-fieldset-wrapper',
    ),
  );
  $entity_type = !empty($form_state['values']['entity_types']) ? $form_state['values']['entity_types'] : variable_get('better_field_descriptions_default_entity', 'node');
  $form['entity_type_fields'] = array(
    '#type' => 'fieldset',
    '#title' => $entity_type,
    '#collapsible' => TRUE,
    '#collapsed' => FALSE,
    '#prefix' => '<div id="entity_type_fields-fieldset-wrapper">',
    '#suffix' => '</div>',
  );

  // Get info on bundles.
  $bundles = field_info_bundles($entity_type);

  // Get list of fields selected for better descriptions.
  $bfds = variable_get('better_field_descriptions_settings', array());
  $form['entity_type_fields']['descriptions'] = array(
    '#type' => 'markup',
    '#markup' => t('Select fields that should have better descriptions.'),
  );
  $form['entity_type_fields']['bundles'] = array(
    '#type' => 'item',
    '#prefix' => '<div id="better-descriptions-form-id-wrapper">',
    '#suffix' => '</div>',
    '#tree' => TRUE,
  );
  foreach ($bundles as $bundle_machine_name => $bundle) {

    // Array to hold fields in the node.
    $fields_instances = array();

    // Get info on pseudo fields, like title.
    $extra_fields = field_info_extra_fields($entity_type, $bundle_machine_name, 'form');
    if (isset($extra_fields['title'])) {
      $fields_instances['title'] = $extra_fields['title']['label'];
    }

    // Get info on regular fields to the bundle.
    $fields = field_info_instances($entity_type, $bundle_machine_name);
    foreach ($fields as $field_machine_name => $field) {
      $fields_instances[$field_machine_name] = $field['label'] . ' (' . $field_machine_name . ')';
    }

    // Compute default values.
    $default_values = array();
    if (isset($bfds[$bundle_machine_name])) {
      $default_values = array_intersect_key($bfds[$bundle_machine_name], $fields_instances);
    }

    // Generate checkboxes.
    $form['entity_type_fields']['bundles'][$bundle_machine_name] = array(
      '#type' => 'checkboxes',
      '#title' => $bundle['label'],
      '#options' => $fields_instances,
      '#default_value' => $default_values,
      '#description' => t('Choose which fields should have better descriptions.'),
    );
  }
  $form['#submit'] = array(
    'better_field_descriptions_admin_settings_submit',
  );
  return system_settings_form($form);
}

/**
 * Function to return form with existing form fields.
 */
function better_field_descriptions_load_entity_type($form, $form_state) {
  return $form['entity_type_fields'];
}

/**
 * Implements hook_submit().
 */
function better_field_descriptions_admin_settings_submit($form, &$form_state) {

  // Instead of changing values, we just set all values anew on each submit.
  variable_del('better_field_descriptions_settings');

  // We don't want our settings to contain 0-values, only selected values.
  $bfds = array();
  foreach ($form_state['values']['bundles'] as $bundle_machine_name => $bundle) {
    foreach ($bundle as $field_machine_name => $value) {

      // $value is (int) 0 if the field was not selected in the form.
      if (is_string($value)) {
        $bfds[$bundle_machine_name][$field_machine_name] = $field_machine_name;
      }
    }
  }
  variable_set('better_field_descriptions_settings', $bfds);
  variable_set('better_field_descriptions_default_entity', $form_state['values']['entity_types']);
}

/**
 * Implements hook_form().
 */
function better_field_descriptions_fields_form($form, &$form_state) {

  // Get entity type.
  $entity_type = variable_get('better_field_descriptions_default_entity', 'node');

  // Get better descriptions settings.
  $bfds = variable_get('better_field_descriptions_settings', array());

  // Get existing descriptions for fields.
  $bfd = variable_get('better_field_descriptions', array());

  // Use default template if not configured.
  if (isset($bfd['template']) == FALSE || empty($bfd['template'])) {
    $bfd['template'] = 'better-field-descriptions-text';
  }

  // Regex for locating all template files starting with 'better-descriptions'.
  $regex = '/^better-field-descriptions.*\\.tpl\\.php$/i';

  // Fetching template files from this module.
  $path = drupal_get_path('module', 'better_field_descriptions');
  $templates_module = drupal_system_listing($regex, $path, 'name', 0);

  // Fetching template files from themes.
  $templates_system = drupal_system_listing($regex, "themes", 'name', 0);

  // Merges all template files allowing theme templates to override the modules
  // templates.
  $templates = array_merge($templates_module, $templates_system);
  $form['#templates'] = $templates;

  // Collects all templates found into array for select list.
  $better_descriptions_templates = array();
  foreach ($templates as $template) {
    $path = $template->uri;

    // Removing the '.tpl' if exists.
    if (($pos = strpos($template->name, '.')) !== FALSE) {
      $template = substr($template->name, 0, $pos);
    }
    $better_descriptions_templates[$template] = $template;
  }

  // Possible positions for the better description.
  $positions = array(
    0 => t('Above title and input'),
    1 => t('Below title and input'),
    2 => t('Between title and input'),
  );
  $form['entity_type'] = array(
    '#type' => 'markup',
    '#markup' => '<h1>Entity type: ' . $entity_type . '</h1>',
  );
  $form['descriptions'] = array(
    '#type' => 'markup',
    '#markup' => t('Add/edit better descriptions to the fields below.'),
  );
  $form['bundles'] = array(
    '#type' => 'item',
    '#prefix' => '<div id="better-field-descriptions-form-id-wrapper">',
    '#suffix' => '</div>',
    '#tree' => TRUE,
  );

  // Template selection.
  $form['bundles']['template'] = array(
    '#type' => 'select',
    '#title' => t('Select template for the descriptions'),
    '#options' => $better_descriptions_templates,
    '#default_value' => $bfd['template'],
    '#description' => t('Changing this value will trigger a theme registry rebuild. You can also provide your own template, consult the documentation.'),
  );

  // Setting label, default if not set.
  if (isset($bfd['default_label']) == FALSE) {
    $default_label = t('Description');
  }
  else {
    $default_label = $bfd['default_label'];
  }
  $form['bundles']['default_label'] = array(
    '#type' => 'textfield',
    '#title' => 'Default label for all field descriptions.',
    '#default_value' => $default_label,
    '#description' => t('This label will be used if not set in each of the fields below.'),
  );

  // Setting description display defaults if not set
  if (isset($bfd['hide_default_descriptions']) == FALSE) {
    $hide_defaults = FALSE;
  }
  else {
    $hide_defaults = $bfd['hide_default_descriptions'];
  }
  $form['bundles']['hide_default_descriptions'] = array(
    '#type' => 'checkbox',
    '#title' => t('Hide default descriptions?'),
    '#default_value' => $hide_defaults,
    '#description' => t('Hide default descriptions where a "better description" exists.'),
  );

  // Get info on bundles.
  $bundles = field_info_bundles($entity_type);
  foreach ($bfds as $bundle_machine_name => $fields) {

    // Check if node type exist.
    $extra_fields = field_info_extra_fields($entity_type, $bundle_machine_name, 'form');
    if (!empty($extra_fields)) {

      // Array to hold fields in the node.
      $fields_instances = [];

      // Get info on pseudo fields, like title.
      $extra_fields = field_info_extra_fields($entity_type, $bundle_machine_name, 'form');
      if (isset($extra_fields['title'])) {
        $fields_instances['title'] = $extra_fields['title'];
      }

      // Get info on regular fields to the bundle.
      $fields_instances += field_info_instances($entity_type, $bundle_machine_name);

      // Wrapping each bundle in a collapsed fieldset.
      $form['bundles'][$bundle_machine_name] = [
        '#type' => 'fieldset',
        '#title' => $bundles[$bundle_machine_name]['label'],
        '#collapsible' => TRUE,
        '#collapsed' => TRUE,
        '#prefix' => '<div id="better-field-descriptions-form-id-wrapper">',
        '#suffix' => '</div>',
      ];
      foreach ($fields as $field_machine_name) {
        if (!empty($fields_instances[$field_machine_name])) {

          // Descriptions.
          $bfd_description = '';
          if (isset($bfd[$bundle_machine_name][$field_machine_name]['description'])) {
            $bfd_description = $bfd[$bundle_machine_name][$field_machine_name]['description'];
          }
          $form['bundles'][$bundle_machine_name][$field_machine_name]['description'] = [
            '#type' => 'textarea',
            '#title' => $fields_instances[$field_machine_name]['label'] . ' (' . $field_machine_name . ')',
            '#default_value' => filter_xss($bfd_description, _field_filter_xss_allowed_tags()),
            '#description' => t('Instructions to present to the user below this field on the editing form.<br />Allowed HTML tags: @tags', [
              '@tags' => _field_filter_xss_display_allowed_tags(),
            ]),
          ];

          // Label.
          $bfd_label = '';
          if (isset($bfd[$bundle_machine_name][$field_machine_name]['label'])) {
            $bfd_label = $bfd[$bundle_machine_name][$field_machine_name]['label'];
          }
          $form['bundles'][$bundle_machine_name][$field_machine_name]['label'] = [
            '#type' => 'textfield',
            '#title' => 'Label for this field description',
            '#default_value' => filter_xss($bfd_label),
            '#description' => t('Label for this field description.'),
          ];
          $position = 1;
          if (isset($bfd[$bundle_machine_name][$field_machine_name]['position'])) {
            $position = $bfd[$bundle_machine_name][$field_machine_name]['position'];
          }

          // Position of description.
          $form['bundles'][$bundle_machine_name][$field_machine_name]['position'] = [
            '#type' => 'radios',
            '#title' => 'Position of description.',
            '#options' => $positions,
            '#default_value' => $position,
            '#description' => t('Position the description field above or below the input field. When choosing the between-option the #title of the field will be used as label (if label is left blank) and the original field #title will be set as invisible.'),
          ];
        }
      }
    }
  }
  $form['#submit'] = array(
    'better_field_descriptions_fields_submit',
  );
  return system_settings_form($form);
}

/**
 * Implements hook_submit().
 */
function better_field_descriptions_fields_submit($form, &$form_state) {
  $bfd = variable_get('better_field_descriptions', array());
  $template = $form_state['values']['bundles']['template'];
  $template_uri = $form_state['complete form']['#templates'][$template . '.tpl']->uri;
  $form_state['values']['bundles']['template_uri'] = $template_uri;

  // If the template is changed, do a theme registry rebuild.
  if (isset($bfd['template']) && $template != $bfd['template']) {
    drupal_theme_rebuild();
  }

  // Setting variables.
  variable_del('better_field_descriptions');
  variable_set('better_field_descriptions', $form_state['values']['bundles']);
}

Functions

Namesort descending Description
better_field_descriptions_admin_settings_form Implements hook_admin_settings_form().
better_field_descriptions_admin_settings_submit Implements hook_submit().
better_field_descriptions_fields_form Implements hook_form().
better_field_descriptions_fields_submit Implements hook_submit().
better_field_descriptions_load_entity_type Function to return form with existing form fields.