作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com
这是module文件的代码:
<?php
/**
* @file
* Add validation rules to webforms
*/
include_once DRUPAL_ROOT . '/' . drupal_get_path('module', 'field_validation') . '/' . 'field_validation.validators.inc';
include_once DRUPAL_ROOT . '/' . drupal_get_path('module', 'field_validation') . '/' . 'field_validation.rules.inc';
/**
* Implements hook_menu().
*/
function field_validation_menu() {
$items = array();
foreach (entity_get_info() as $entity_type => $entity_info) {
if ($entity_info['fieldable']) {
foreach ($entity_info['bundles'] as $bundle_name => $bundle_info) {
if (isset($bundle_info['admin'])) {
// Extract path information from the bundle.
$path = $bundle_info['admin']['path'];
if (isset($bundle_info['admin']['bundle argument'])) {
$bundle_arg = $bundle_info['admin']['bundle argument'];
$bundle_pos = (string) $bundle_arg;
}
else {
$bundle_arg = $bundle_name;
$bundle_pos = '0';
}
// This is the position of the %field_ui_menu placeholder in the
// items below.
$field_position = count(explode('/', $path)) + 1;
// Extract access information, providing defaults.
$access = array_intersect_key($bundle_info['admin'], drupal_map_assoc(array('access callback', 'access arguments')));
$access += array(
'access callback' => 'user_access',
'access arguments' => array('administer site configuration'),
);
$items["$path/fields/%field_ui_menu/validation"] = array(
'load arguments' => array($entity_type, $bundle_arg, $bundle_pos, '%map'),
'title' => 'Validation',
'page callback' => 'field_validation_manage',
'page arguments' => array($field_position),
'type' => MENU_LOCAL_TASK,
'file' => 'field_validation.admin.inc',
) + $access;
$items[$path.'/fields/%field_ui_menu/validation/add'] = array(
'load arguments' => array($entity_type, $bundle_arg, $bundle_pos, '%map'),
'title' => 'Add validation',
'page callback' => 'drupal_get_form',
'page arguments' => array('field_validation_manage_rule', $field_position, 'add'),
'type' => MENU_CALLBACK,
'file' => 'field_validation.admin.inc',
) + $access;
$items["$path/fields/%field_ui_menu/validation/edit"] = array(
'load arguments' => array($entity_type, $bundle_arg, $bundle_pos, '%map'),
'title' => 'Edit rule',
'page callback' => 'drupal_get_form',
'page arguments' => array('field_validation_manage_rule', $field_position, 'edit'),
'type' => MENU_CALLBACK,
'file' => 'field_validation.admin.inc',
) + $access;
$items["$path/fields/%field_ui_menu/validation/delete"] = array(
'load arguments' => array($entity_type, $bundle_arg, $bundle_pos, '%map'),
'title' => 'Delete rule',
'page callback' => 'drupal_get_form',
'page arguments' => array('field_validation_delete_rule', $field_position+3),
'type' => MENU_CALLBACK,
'file' => 'field_validation.admin.inc',
) + $access;
}
}
}
}
return $items;
}
/**
* Implements hook_theme().
*/
function field_validation_theme() {
return array(
'field_validation_manage_add_rule' => array(
'variables' => array(
'instance' => NULL,
),
),
'field_validation_manage_overview' => array(
'variables' => array(
'rules' => NULL,
'instance' => NULL,
),
),
);
}
/**
* Implements hook_field_attach_validate().
*/
function field_validation_field_attach_validate($entity_type, $entity, &$errors) {
//ToDo;
list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
$rules = field_validation_get_bundle_rules($entity_type, $bundle);
if($rules){
foreach ($rules as $rule) {
$field_name = $rule['field_name'];
$field = field_info_field($field_name);
$languages = field_available_languages($entity_type, $field);
foreach ($languages as $langcode) {
$items = isset($entity->{$field_name}[$langcode]) ? $entity->{$field_name}[$langcode] : array();
$errors[$rule['field_name']][$langcode] = module_invoke_all("field_validation_validate", $rule['validator'], $items, $rule);
}
}
}
}
/**
* Theme the 'add rule' list
*/
function theme_field_validation_manage_add_rule($variables) {
$instance = $variables['instance'];
$output = '';
$validators = field_validation_get_validators();
if ($validators) {
$output = '<h3>' . t('Add a validation rule') . '</h3>';
$output .= '<dl>';
foreach ($validators as $validator_key => $validator_info) {
$item = '';
$path = isset($_GET['q']) ? $_GET['q'] : '';
$url = $path.'/add/' . $validator_key;
$components = ' (' . implode(', ', $validator_info['component_types']) . ')';
$item = '<dt>' . l($validator_info['name'], $url, array("query" => drupal_get_destination())) . '</dt>';
$item .= '<dd>';
if ($validator_info['description']) {
$item .= $validator_info['description'] . ' ';
}
$item .= $components . '</dd>';
$output .= $item;
}
$output .= '</dl>';
}
return $output;
}
/**
* Implements hook_field_delete().
*/
function field_validation_field_delete($entity_type, $entity, $field, $instance, $langcode, &$items) {
$rules = field_validation_get_field_rules($instance);
if ($rules) {
foreach (array_keys($rules) as $ruleid) {
field_dynamic_delete_rule($ruleid);
}
}
}
/**
* Save a validation rule. Data comes from the admin form
* or nodeapi function in case of node clone
*/
function field_validation_rule_save($values) {
// save rules data
if ($values['action'] == 'add') {
drupal_write_record('field_validation_rule', $values);
$ruleid = $values['ruleid'];
if ($ruleid) {
module_invoke_all('field_validation', 'rule', 'add', $values);
}
}
if ($values['action'] == 'edit') {
drupal_write_record('field_validation_rule', $values, 'ruleid');
$ruleid = $values['ruleid'];
if ($ruleid) {
module_invoke_all('field_validation', 'rule', 'edit', $values);
}
}
}