You are here

33 使用module_implements替代module_invoke_all

admin 的头像
Submitted by admin on 星期六, 2015-09-19 03:11

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

axel.rutz还发现了一个bughttp://drupal.org/node/1149684),就是如果向多个字段添加验证规则的话,只有最后一个起作用,我最终是这样解决这个问题的,将field_validation_field_attach_validate里面的代码:

 

$errors[$rule['field_name']][$langcode] = module_invoke_all("field_validation_validate", $rule['validator'], $items, $rule);

替换为:

//module_invoke_all does not work here, so i call it directly.

foreach (module_implements("field_validation_validate") as $module) {

  $function = $module . '_' . "field_validation_validate";

  if (function_exists($function)) {

    $function($rule['validator'], $rule, $langcode, $items,  $errors);

  }

}

 

module_invoke_allmodule_implements的转换,是一个进步,使我认识到module_invoke_all是无法传递引用的。field_validation_field_validation_validate也做了相应的调整,这是调整后的样子:

/**

 * Implements hook_field_validation_validate().

 */

function field_validation_field_validation_validate($validator_name, $rule, $langcode, $items, &$errors) {

  if (!empty($items)) {

    switch ($validator_name) {

      case "regex":

        mb_regex_encoding('UTF-8');

        $regex = $rule['data'];

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

          if ($item['value'] != '' && (!mb_ereg("$regex", $item['value']))) {

    $errors[$rule['field_name']][$langcode][$delta][] = array(

              'error' => 'regex_'.$rule['ruleid'], 

              'message' => t($rule['error_message']),

            );

          }

        }

        break;

    }

  }

}

这里可以传递引用参数&$errors了,这里还有另外一个改进,就是为错误消息使用了t函数。


Drupal版本: