这一章很短很简单,如果你需要手工的对输入信息进行格式化,那么向网站添加内容将是一个繁琐的工作。相反,如果想让网站上的文本内容看起来很漂亮,那么你需要懂得HTML— 但是大多数用户都不了解这一知识。对于我们中的那些熟悉HTML的人,如果在头脑风暴会议或者文章创作期间,不断的暂停,并向我们的文章中插入HTML标签,这也会令人头痛。段落标签、链接标签、换行标签。。。太烦了。幸好,Drupal提供了预制的程序,这就是过滤器,它使得数据输入更加方便和高效。过滤器执行文本处理,比如为URL添加链接,将换行符转化为<p> 和 <br />标签,甚至包括过滤有害的HTML。钩子hook_filter()负责创建过滤器和处理用户提交的数据。
当然,Drupal 过滤器可以创建链接,格式化你的内容,将文本转换为pirate-speak,但是它能够聪明到帮我们写日志么,或者至少能够把我们创造性火花碰撞出来么?当然,它可以做到这一点!让我们创建一个带有过滤器的模块,用来向日志条目中插入随机的句子。我们将启用这一模块,这样当你在编写文章中绞尽脑汁毫无灵感并需要一些火花时,你可以简单的键入[juice!],当你保存文章时,它将会被替换为一个随机生成的句子。如果你需要更多的智慧火花时,你可以在一个文章中多次插入[juice!]标签。
creativejuice.info
name = Creative Juice description = "Adds a random sentence filter to content." package = Pro Drupal Development core = 7.x files[] = creativejuice.module php = 5.2
creativejuice.module
<?php
/**
* @file
* A silly module to assist whizbang novelists who are in a rut by providing a
* random sentence generator for their posts.
*/
/**
* Implement hook_filter_info().
*/
function creativejuice_filter_info()
{
$filters = array();
$filters['creativejuice'] = array(
'title' => t('Creative Juice filter'),
'description' => t('Enables users to insert random sentences into their post'),
'process callback' => '_creativejuice_filter_process',
'tips callback' => '_creativejuice_filter_tips'
);
return $filters;
}
/**
* Creativejuice filter process callback
*
* The actual filtering is performed here. The supplied text should be
* returned, once any necessary substitutions have taken place.
* 实际的过滤是在这里发生的,返回替代之后的内容
*/
function _creativejuice_filter_process($text, $filter, $format)
{
while(strpos($text, '[juice!]') !== FALSE) // strpos — 查找字符串首次出现的位置
{
$sentence = creativejuice_sentence();
$text = preg_replace('&\[juice!\]&', $sentence, $text, 1);
}
return $text;
}
/**
* Generate a random sentence.
* 生成一串随机句子数组
*/
function creativejuice_sentence()
{
$beginnings = array();
$beginnings[] = t('A majority of us believe');
$beginnings[] = t('Generally speaking,');
$beginnings[] = t('As times carry on');
$beginnings[] = t('Barren in intellect,');
$beginnings[] = t('Deficient in insight,');
$beginnings[] = t('As blazing blue sky pours down torrents of light,');
$beginnings[] = t('Aloof from the motley throng,');
$beginnings[] = t('While crafting a new Drupal module,');
$middles = array();
$middles[] = t('life flowed in its accustomed stream');
$middles[] = t('he ransacked the vocabulary');
$middles[] = t('the grimaces and caperings of buffoonery sting');
$middles[] = t('the mind freezes at the thought');
$middles[] = t('reverting to another matter enables freedom');
$middles[] = t('he lived as modestly as a hermit');
$middles[] = t('the coder repeatedly invoked hooks');
$ends = array();
$ends[] = t('through the red tape of officialdom.');
$ends[] = t('as it set anew in some fresh and appealing form.');
$ends[] = t('supported by evidence.');
$ends[] = t('as fatal as the fang of the most venomous snake.');
$ends[] = t('as full of spirit as a gray squirrel.');
$ends[] = t('as dumb as a fish.');
$ends[] = t('like a damp-handed auctioneer.');
$ends[] = t('like a bald ferret.');
$ends[] = t('with a frozen, sharpened badger.');
$ends[] = t('and achieve CMS nirvanna.');
// For every phrase group, pick a random value.
$sentence = array(
$beginnings[mt_rand(0, count($beginnings) - 1)], // mt_rand() 使用 Mersenne Twister 算法返回随机整数。
$middles[mt_rand(0, count($middles) - 1)],
$ends[mt_rand(0, count($ends) - 1)]
);
// Take the three random values from the sentence groups,
// implode them together, and return the sentence.
// 用空格组合起来,然后返回
return implode(' ', $sentence);
}
/**
* Filter tips callback for creative juice filter.
*
* The tips callback allows filters to provide help text to users during the content
* editing process. Short tips are provided on the content editing screen, while
* long tips are provided on a separate linked page. Short tips are optional,
* but long tips are highly recommended.
*/
function _creativejuice_filter_tips($filter, $format, $long = FALSE)
{
if($long)
{
// Detailed explanation for http://example.com/?q=filter/tips page.
return t('The Creative Juice filter is for those times when your
brain is incapable of being creative. These times come for everyone,
when even strong coffee and a barrel of jelly beans do not
create the desired effect. When that happens, you can simply enter
the [juice!] tag into your posts...');
}
else
{
// Short explanation for underneath a post's textarea.
return t('Insert a random sentence into your post with the [juice!] tag.');
}
}
测试效果,我们写一点什么:

保存之后被替换为:

这个功能其实没有特别大的作用吧,当然有些词语需要过滤的,你懂的。
知识共享署名-非商业性使用-相同方式共享:码农场 » Chapter 12: Manipulating User Input: The Filter System
码农场