Drupal专业开发指南 第11章 Drupal过滤器系统(filter)(1)

操纵用户输入:过滤器系统

译者:老葛       Eskalate科技公司

如果你需要自己格式化输入信息的话,那么向网站添加内容将是一个繁琐的工作。相反,如果想让网站上输入文本有个好看的外观的话,那么你需要懂得HTML---但是大多数用户都不了解这一知识。对于我们这些了解HTML的人,如果在头脑风暴会议或者文章创作期间,不断的停下来并向要发布的文章中插入HTML标签的话,这也是件令人头痛的事情。段落标签、链接标签、换行标签。。。太烦了。幸好,Drupal提供了预建的称为过滤器的程序,使得数据输入更加容易并且有效。过滤器进行文本操作,比如为URL添加链接,将换行符转化为<p> <br />标签,甚至包括过滤有害的HTML。钩子函数hook_filter()负责创建钩子和操纵用户提交的数据。大多数过滤器通常负责一个操作,比如“取消所有的超链接”、“为这篇文章添加一个随机图片”,或者甚至“将它翻译为pirate-speak”(参看pirate.module  http://drupal.org/project/pirate)。

 

过滤器和输入格式

假定你已经理解了过滤器是做什么的,而且你知道自己想找的是已安装的过滤器列表,你还是不会很容易的在后台管理接口找到它。为了让过滤器履行它们的工作,你必须将其指定到如图11-1所示的Drupal输入格式上。输入格式将过滤器组合在一起,这样当内容提交时可以一起运行它们。这比为每一个提交的内容选择一些过滤器要容易很多。为了查看已安装的过滤器列表,你可以到Administer Site configuration

Input formats里面,通过配置一个已存在的输入格式或者新建一个输入格式来查看。

 

提示 一个Drupal输入格式由一组过滤器构成。

 

Drupal自带了3中输入格式(参看图11-2):

Filtered HTML 3个过滤器构成:HTML过滤器,用于过滤HTML标签以阻止跨站脚本攻击(通常简称为 XSS);Line break converter过滤器用于将回车转换为它们的HTML对应标签;URL过滤器,用于将web链接和e-mail地址转化为超链接。

Full HTML 它不对HTML进行限制,但是它使用了Line break converter过滤器。

PHP Code 有一个名为PHP evaluator的过滤器构成,它负责执行发布节点里面的PHP脚本。一般情况下,不要让用户能够选用使用PHP evaluator的输入格式。如果用户可以运行PHP的话,那么它们可以使用PHP做任何PHP能做到的事情,包括让你的站点当掉,或者更坏的是删除了你的所有数据。

 

警告 在你的站点上对任何用户启用PHP Code输入格式都会带来安全隐患。一个好的原则是尽量不要使用这一输入格式,能不用就不用,能少用就少用,而且只有超级用户才可以使用(用户ID为1的用户)。

 

11-1. 位于“Add input format”(“添加输入格式”)表单中的已安装的过滤器列表

 

11-2 Drupal自带了3种可配置的输入格式

 

因为输入格式是一组过滤器,所以可对它们进行扩展。你可以添加或者删除过滤器,如图11-3所示。你可以修改输入格式的名称,删除一个过滤器,或者甚至可以重排输入格式中过滤器的执行顺序从而避免冲突。例如,你想在运行HTML过滤器之前运行URL过滤器,这样HTML过滤器就可以检查由URL过滤器生成的<a>标签了。

 

 

11-3. 输入格式由一组过滤器构成。本土展示了Drupal默认输入格式的构成,可以扩展这些输入格式格式

 

 

注意 输入格式(过滤器组)可以通过管理接口层面进行控制。开发者在定义过滤器的时候不用考虑输入格式。该工作由Drupal站点管理员负责。

 

安装过滤器

安装过滤器与安装模块的流程是一样的,如图11-4所示,这是因为过滤器位于模块文件中。对过滤器的启用或禁用,只需要在Administer Site building Modules下面启用或者禁用相应的模块就可以了。一旦安装了过滤器,就可以导航到Administer Site configuration Input formats,以将新填的过滤器指定到你选的输入格式中。

11-4 在模块中创建的过滤器

 

知道什么时候使用过滤器

如果你可以使用其他钩子来操纵文本,那么你可能会想为什么这时候还需要过滤器呢。例如可以非常容易的使用hook_nodeapi()为URL添加超链接,这比URL过滤器还好用。但是考虑一下这种情况,你需要为节点的主体字段使用5个不同的过滤器。现在假定你查看默认页面http://example.com/?q=node,它一次展示10个节点。那么算一下,现在为了展示这个页面你就需要运行50个过滤器,而对文本的过滤操作是很费资源的。这同时也意味着无论什么时候展示一个节点,都需要运行这些过滤操作,即便是文本没有被修改的情况。你在一次又一次的无谓的运行这一操作。

 

过滤器系统有一个缓存层,极大的提升了性能。一旦为给定的文本片段运行了所有的过滤器以后,该文本的过滤后的版本将被存储在cache_filter表中,在文本被再次修改以前缓存的内容不变(使用过滤文本的MD5哈希值来判断是否被修改)。现在让我们回到前面的例子中,当文本没有被修改时,我们就可以绕过过滤器直接从缓存表中加载10个节点的数据了---速度快多了!图11-5给出了过滤器系统处理流程的概貌。

 

 

提示 MD5是一个用来计算文本字符串的哈希值的算法。Drupal使用它来得到一个高效的数据库中索引列,用来查找节点过滤后的数据。

 

现在你应该有了比刚才更聪明的想法了,“好吧,如果在我们的nodeapi钩子函数中直接将过滤后的文本保存到node表中,那不更好么?它的运行结果和过滤器系统可是一样的啊。” 尽管这一方法也解决了性能问题,但是你破坏了Drupal架构的一个基本原则:永不修改用户的原始数据。假定你的一个初级用户回过来想编辑一个已发布的节点时,当他看到很多内容都被隐藏了的时侯,我想他十有八九会向你打电话寻求支持的。过滤器系统的目标是保持原始数据不变,而在Drupal框架中使用缓存了的数据过滤后的副本。你将会在其它的Drupal API中一次又一次的看到这一原则。

 

 

 

注意 即便是在Drupal中仅用了页面缓存,过滤器系统仍将对它的数据进行缓存。如果你看到的还是以前的内容时,而看不到新加的内容时,可以试着清空cache_filter表。

 

 

 

 

 

 

11-5 文本过滤系统的生命周期

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值