作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com
我们回到admin/structure/property_validation,对于每个验证规则,它右边都有一组操作链接,默认为编辑,我们展开所有的操作链接,点击导出(Export)链接。下面是唯一性验证导出后的代码:
$rule = new stdClass();
$rule->disabled = FALSE; /* Edit this to true to make a default rule disabled initially */
$rule->api_version = 2;
$rule->rulename = 'Breadcrumb path unique';
$rule->name = 'breadcrumb_path_unique';
$rule->property_name = 'path';
$rule->entity_type = 'breadcrumb2';
$rule->bundle = 'breadcrumb2';
$rule->validator = 'property_validation_unique_validator';
$rule->settings = array(
'data' => 'entity',
);
$rule->error_message = 'Breadcrumb path should be unique.';
我们这里的导出,是基于Crools的Export插件功能的。可能读到这里的时候,很多人会问,Crools是怎么智能的导出代码呢?有兴趣的可以阅读以下ctools\includes\export.inc里面的ctools_export_object函数,这个函数负责导出对象。我开始的时候,对这个导出机制也理解的不是很透彻,后来阅读了这个函数的源代码,才知道有些东西是怎么来的,在哪里定义的。
接着,我们在module文件里面,追加以下代码:
/**
* Implementation of hook_ctools_plugin_api().
*
* Tell Ctools that we support the default_property_validation_rules API.
*/
function breadcrumb2_ctools_plugin_api($owner, $api) {
if ($owner == 'property_validation' && $api == 'default_property_validation_rules') {
return array('version' => 2);
}
}
这里我们实现了hook_ctools_plugin_api,通过这个钩子函数,我们告诉Ctools,我们实现了默认的property_validation验证规则,如果你熟悉了钩子函数以后,你发现所有的钩子函数都是很类似的,这里也一样。钩子函数里面的逻辑通常都比较简单。
接下来,我们新建一个breadcrumb2.default_property_validation_rules.inc文件,在里面添加以下代码:
<?php
/**
* @file
* Provides default property validation rules for breadcrumb path.
*/
/**
* Implementation of hook_default_property_validation_rule().
*
* Provide default validation rules.
*/
function breadcrumb2_default_property_validation_rule() {
$export = array();
$rule = new stdClass();
$rule->disabled = FALSE; /* Edit this to true to make a default rule disabled initially */
$rule->api_version = 2;
$rule->rulename = 'Breadcrumb path unique';
$rule->name = 'breadcrumb_path_unique';
$rule->property_name = 'path';
$rule->entity_type = 'breadcrumb2';
$rule->bundle = 'breadcrumb2';
$rule->validator = 'property_validation_unique_validator';
$rule->settings = array(
'data' => 'entity',
);
$rule->error_message = 'Breadcrumb path should be unique.';
$export['breadcrumb_path_unique'] = $rule;
$rule = new stdClass();
$rule->disabled = FALSE; /* Edit this to true to make a default rule disabled initially */
$rule->api_version = 2;
$rule->rulename = 'Breadcrumb path valid path';
$rule->name = 'breadcrumb_path_valid_path';
$rule->property_name = 'path';
$rule->entity_type = 'breadcrumb2';
$rule->bundle = 'breadcrumb2';
$rule->validator = 'property_validation_url_validator';
$rule->settings = array(
'external' => 0,
'internal' => 1,
);
$rule->error_message = 'Breadcrumb path should be a valid path.';
$export['breadcrumb_path_valid_path'] = $rule;
return $export;
}
通过钩子hook_default_property_validation_rule可以定义验证规则。这个钩子函数里面,代码都是我们使用Ctools导出来的,将导出的代码,复制过来的时候,我们需要稍微的调整一下代码格式。
现在我们清除缓存,重新回到admin/structure/property_validation,此时右边的操作链接里面,“删除”(delete)链接没有了,换成了恢复(revert):
而在存储(Storage)里面,也显示的是“Overridden”了。如果我们恢复(Revert)一下,“Overridden”就变成“Default”了。这里的配置和Views里面是一致的。
Field validation模块,正在日趋流行,但是安装量还没有达到3,4万的规模,之所以集成它,主要为了大家展示一下Ctools导出插件的具体应用,另外老葛也希望,Breadcrumb2这个模块可以为Field validation模块带来更多的安装量。我们下面来看看Views的集成,这是项目中经常用的。