You are here

2.2 简洁的module文件

admin 的头像
Submitted by admin on 星期日, 2015-09-20 07:16

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com

再来看module文件,不足100行的代码:

/**

 * Implements hook_field_attach_validate().

 */

function field_validation_field_attach_validate($entity_type, $entity, &$errors) {

  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);

  

  //Using ctools to get validation rules of this bundle.

  ctools_include('export');

  $rules = ctools_export_load_object('field_validation_rule', 'conditions', array('entity_type' => $entity_type, 'bundle' => $bundle));

  if($rules){

    foreach ($rules as $rule) {

  //Disabled by Ctools.

  if(!empty($rule->disabled)){

    continue;

  }

  ctools_include('plugins');

  $plugin = ctools_get_plugins('field_validation', 'validator', $rule->validator);

  $class = ctools_plugin_get_class($plugin, 'handler');

  if(empty($class)){

    continue;

  }

  if (!is_subclass_of($rule->validator, 'field_validation_validator')) {

    drupal_set_message(t("Plugin '@validator' should extends 'field_validation_validator'.", array('@validator' => $rule->validator)));

    continue;

  }

      $field_name = $rule->field_name;

      $field = field_info_field($field_name);

  $instance = field_info_instance($entity_type, $field_name, $bundle);

      $languages = field_available_languages($entity_type, $field);

      foreach ($languages as $langcode) {

        //debug($errors);

        $items = isset($entity->{$field_name}[$langcode]) ? $entity->{$field_name}[$langcode] : array();

//print debug($rule);

    

    foreach($items as $delta => $item){

  $validator = new $class($entity_type, $entity, $field, $instance, $langcode, $items, $delta, $item, $rule, $errors);

  $break = $validator->validate();

  if(!empty($break)){

    break;

  }

}

      }  

    }

  }

}

 

/**

 * Implements hook_field_delete().

 */

function field_validation_field_delete($entity_type, $entity, $field, $instance, $langcode, &$items) {

  //$rules = field_validation_get_field_rules($instance);

  $rules = array();

  if ($rules) {

    foreach (array_keys($rules) as $ruleid) {

      db_delete('field_validation_rule')->condition('ruleid', $ruleid)->execute();

    }

  }

}

 

/**

 * Implements hook_ctools_plugin_type().

 *

 */

function field_validation_ctools_plugin_type() {

  return array(

    'validator' => array(

      'use hooks' => FALSE,

    ),

  );

}

 

/**

 * Implementation of hook_ctools_plugin_directory().

 */

function field_validation_ctools_plugin_directory($module, $plugin) {

  if ($module == 'field_validation' && $plugin == 'validator') {

    return 'plugins/' . $plugin;

  }

}

 

/**

 * Implementation of hook_ctools_plugin_api().

 *

 * Tell Ctools that we support the default_field_validation_rules API.

 */

function field_validation_ctools_plugin_api($owner, $api) {

  if ($owner == 'field_validation' && $api == 'default_field_validation_rules') {

    return array('version' => 2);

  }

}

    写的非常的简洁,另外,在后面的版本,我删除了field_validation_field_delete这个钩子函数,由于我们的验证规则,不仅仅存放在数据库里面了,所以这个钩子实现变得有些多余。

    这里我们使用field_validation_ctools_plugin_type,定义了一种新的插件类型validator,这里'use hooks'设置为了FALSE,我通常喜欢使用这种方式,我们这里是不允许通过钩子的形式定义插件;不过在Feeds模块里面,就是使用的钩子形式,但是在很多其它的模块里面,都不使用这个方式;使用field_validation_ctools_plugin_directory定义了插件所在的目录,这里是plugins\validator目录。


Drupal版本: