required_by_role.module in Required by role 7.2
Same filename and directory in other branches
Allows certain user roles to be exempt from required fields
File
required_by_role.moduleView 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
Name | 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. |