You are here

required_by_role.module in Required by role 7.2

Same filename and directory in other branches
  1. 8 required_by_role.module
  2. 7 required_by_role.module

Allows certain user roles to be exempt from required fields

File

required_by_role.module
View source
<?php

/**
 * @file
 * Allows certain user roles to be exempt from required fields
 */

/**
 * Implements hook_help().
 */
function required_by_role_help($path, $arg) {
  switch ($path) {
    case 'admin/help#required_by_role':
      $output = '';
      $output .= '<p>' . t('The Required by role module provides an easy and flexible way for developers and site builders to determine whether a field (instance) should be <em>required</em> by all users or just for selected user roles.') . '</p>';
      return $output;
  }
}

/**
 * Implements hook_field_info_alter().
 */
function required_by_role_field_info_alter(&$info) {
  foreach ($info as $field_type => $field_type_info) {
    $info[$field_type]['instance_settings'] += array(
      'required_plugin' => array(),
      'required_plugin_options' => array(),
    );
  }
}

/**
 * Function to find out if an element is required or not.
 */
function required_by_role_field_widget_is_required($delta, $field, $instance, $langcode, $form, $form_state) {

  // Speeds up the check for multiple fields.
  if ($delta != 0) {
    return FALSE;
  }
  if (!$instance['required']) {
    global $user;
    $settings = !empty($instance['settings']) ? $instance['settings'] : array();
    $plugin_id = !empty($settings['required_plugin']) ? $settings['required_plugin'] : 'core';
    $context = array(
      'delta' => $delta,
      'field' => $field,
      'instance' => $instance,
      'langcode' => $langcode,
      'form' => $form,
      'form_state' => $form_state,
      'account' => clone $user,
    );
    $plugin = _required_by_role_get_instance($plugin_id);
    return $plugin
      ->isRequired($context);
  }
  return field_widget_is_required($delta, $field, $instance, $langcode, $form, $form_state);
}

/**
 * Implements hook_form_FORM_ID_alter().
 */
function required_by_role_form_field_ui_field_edit_form_alter(&$form, $form_state) {
  $form['instance']['required']['#access'] = FALSE;
  $field_name = $form['#field']['field_name'];

  // Default value needs always to be NOT required.
  $default_value_widget =& $form['instance']['default_value_widget'][$field_name][LANGUAGE_NONE];
  if (isset($default_value_widget[0]['#required'])) {
    $default_value_widget[0]['#required'] = FALSE;
    if (isset($default_value_widget[0]['value']['#required'])) {
      $default_value_widget[0]['value']['#required'] = FALSE;
    }
  }
  else {
    $default_value_widget['#required'] = FALSE;
  }
  if (!empty($form_state['values']['instance']['settings']['required_plugin'])) {
    $plugin_id = $form_state['values']['instance']['settings']['required_plugin'];
  }
  else {
    $plugin_id = $form['#instance']['settings']['required_plugin'] ? $form['#instance']['settings']['required_plugin'] : 'core';
  }
  $plugins_options = required_by_role_get_plugins_as_options();
  if (empty($plugins_options)) {
    $form['message'] = array(
      '#markup' => t('Sorry no required plugins available in the system.'),
    );
  }
  $form['instance']['settings']['required_plugin'] = array(
    '#type' => 'radios',
    '#title' => t('Please choose the required strategy.'),
    '#options' => $plugins_options,
    '#limit_validation_errors' => array(),
    '#default_value' => $plugin_id,
    '#weight' => $form['instance']['required']['#weight'] - 1,
    '#ajax' => array(
      'callback' => 'require_by_role_element_ajax_callback',
      'wrapper' => 'required-ajax-wrapper',
      'effect' => 'fade',
      'speed' => 'fast',
    ),
    '#parents' => array(
      'instance',
      'settings',
      'required_plugin',
    ),
  );
  $plugin = _required_by_role_get_instance($plugin_id);
  $settings = $form['#instance']['settings'];
  $required_plugin = $settings['required_plugin'];
  $required_plugin_options = $settings['required_plugin_options'];

  // If the plugin have changed make sure the options are empty.
  if ($plugin_id != $required_plugin) {
    $required_plugin_options = array();
  }
  $form['instance']['settings']['required_plugin_options'] = $plugin
    ->form($required_plugin_options);
  $form['instance']['settings']['required_plugin_options']['#weight'] = $form['instance']['settings']['required_plugin']['#weight'] + 1;
}

/**
 * Renders the form element to select the required property.
 *
 * @return array
 *   The rendered element.
 */
function require_by_role_element_ajax_callback($form, $form_state) {
  return $form['instance']['settings']['required_plugin_options'];
}

/**
 * Implements hook_ctools_plugin_type().
 */
function required_by_role_ctools_plugin_type() {
  return array(
    'required' => array(
      'use hooks' => FALSE,
    ),
  );
}

/**
 * Helper function to get an instance of the handler class.
 */
function _required_by_role_get_instance($id) {
  $instances =& drupal_static(__FUNCTION__);
  if (!isset($instances[$id])) {
    ctools_include('plugins');
    $plugin = ctools_get_plugins('required_by_role', 'required', $id);
    $class = ctools_plugin_get_class($plugin, 'handler');
    $instances[$id] = new $class();
  }

  // Check that plugin class has inherited proper 'RequiredPlugin' class.
  if (!$instances[$id] instanceof RequiredPlugin) {
    $instances[$id] = NULL;
  }
  return $instances[$id];
}

/**
 * Implements hook_ctools_plugin_directory().
 */
function required_by_role_ctools_plugin_directory($module, $plugin) {
  if ($module == 'required_by_role' && $plugin == 'required') {
    return 'plugins/required';
  }
}

/**
 * Helper function to get the plugins as options for selects or radios.
 */
function required_by_role_get_plugins_as_options() {
  ctools_include('plugins');
  $plugins = ctools_get_plugins('required_by_role', 'required');
  $options = array();
  foreach ($plugins as $id => $plugin) {
    $options[$id] = $plugin['label'];
  }
  return $options;
}

Functions

Namesort descending Description
required_by_role_ctools_plugin_directory Implements hook_ctools_plugin_directory().
required_by_role_ctools_plugin_type Implements hook_ctools_plugin_type().
required_by_role_field_info_alter Implements hook_field_info_alter().
required_by_role_field_widget_is_required Function to find out if an element is required or not.
required_by_role_form_field_ui_field_edit_form_alter Implements hook_form_FORM_ID_alter().
required_by_role_get_plugins_as_options Helper function to get the plugins as options for selects or radios.
required_by_role_help Implements hook_help().
require_by_role_element_ajax_callback Renders the form element to select the required property.
_required_by_role_get_instance Helper function to get an instance of the handler class.