修复和改进 TextHelper
TextHelper 是 CakePHP 中一个非常实用的工具。但是,某些函数的行为很奇怪,其他函数则缺失。因此,我对它进行了如下扩展。一般来说,我创建了一个新的助手,该助手在“/app/view/helpers/Text2Helper.php”中具有以下文件
<?php
App::import('Helper', 'Text');
class Text2Helper extends TextHelper {
public function function_name($parameters) {
// some code
// if you want to extend functionality, maybe you want
// to call the parent function
parent::function_name($parameters);
}
}
?>
您可以在此文件中覆盖和创建新的函数。(参见:https://ask.cakephp.org/questions/view/how_can_i_extend_the_core_helpers)
请注意,您不能在控制器中将“Text2”添加到 $helpers 数组中来使用该助手。不幸的是,您不能全局指定始终使用 Text2Helper 而不是 TextHelper!您唯一能做的事情是在您的视图中添加以下内容
$this->Text = $this->Text2;
我希望看到一个为助手创建别名的功能!这将使工作更轻松,更美观。(http://cakebaker.42dh.com/2008/10/18/dont-abuse-the-apphelper-to-extend-the-core-helpers/#comment-110649)
所以让我们从我的修改开始
1.) 增强 toList() 功能 我添加了指定每个项目应该如何显示的功能(一些周围代码等等)。因此,我添加了参数 $phrase。_key_ 将被当前元素的键替换,_item_ 将被当前元素的值替换。
<?php
public function toList($list, $and = 'and', $separator = ', ', $phrase = '_item_') {
foreach($list as $key => &$item)
$item = str_replace(array('_key_', '_item_'), array($key, $item), $phrase);
return parent::toList($list, $and, $separator);
}
?>
2.) 修复 truncate() 目前 truncate() 函数只在空格处断开。因此,当您只有换行符或制表符时,代码不会断开。这就是为什么即使非常长的字符串也可能导致“…”的原因。因此,我添加了 3 个修复。
2.1.) 修复标点符号 有些人不添加点、逗号等的空格。因此,我在每个字符之后添加了一个空格
<?php
// 1. fix punctuation
if ($options['fix_punctuation']) {
$punctuation = ',.;:';
$text = preg_replace('/(['.$punctuation.'])[\s]*/', '\1 ', $text);
}
?>
2.2.) 修复空格 所有可能的空格符号(如换行符、制表符等)都用一个空格字符替换
<?php
// 2. fix spaces
if ($options['fix_spaces']) {
//$spaces = " \t\r\n"; // use preg_replace() or str_replace() or strtr()
$text = preg_replace('/[[:space:]]+/', ' ', $text); // [:space:] equal \s
}
?>
2.3.) 切换到剪切而不是清除 当返回的字符串仍然只是 '...' 时,设置 'exact' => true(剪切而不是搜索空格)
<?php
// get truncated string
$result = parent::truncate($text, $length, $options);
// 3. fix long strings: cut instead of clear
if ($options['fix_longStr']) {
if ($result === $options['ending']) {
$options['exact'] = true;
$result = parent::truncate($text, $length, $options);
}
}
?>
所以这里是我的 truncate 函数的完整代码
<?php
public function truncate($text, $length = 100, $options = array()) {
$default = array(
'fix_punctuation' => true,
'fix_spaces' => true,
'fix_longStr' => true, 'ending' => '...'
);
$options = array_merge($default, $options);
// 1. fix punctuation
if ($options['fix_punctuation']) {
$punctuation = ',.;:';
$text = preg_replace('/(['.$punctuation.'])[\s]*/', '\1 ', $text);
}
// 2. fix spaces
if ($options['fix_spaces']) {
//$spaces = " \t\r\n"; // use preg_replace() or str_replace() or strtr()
$text = preg_replace('/[[:space:]]+/', ' ', $text); // [:space:] equal \s
}
// get truncated string
$result = parent::truncate($text, $length, $options);
// 3. fix long strings: cut instead of clear
if ($options['fix_longStr']) {
if ($result === $options['ending']) {
$options['exact'] = true;
$result = parent::truncate($text, $length, $options);
}
}
// return truncated string
return $result;
}
?>
3.) 添加 wordwrap() 此函数在最大字符数后自动插入换行符。请注意,这在您的 CSS 样式中具有“text-align: justify;”时最有用。否则,在您的 CSS 中设置“word-wrap: break-word;”以让浏览器完成工作通常更好。这是因为大多数字体中不同字符的宽度不同。
所以这里是我的代码
<?php
/**
* Splits string in lines of given length.
* Note: Perhaps it's better to set the following css option: "word-wrap: break-word;"
* because it handles the different widths of the characters correctly
*
* @param string $text String to wrap.
* @param integer $length Maximum length (number of characters) of returned lines.
* @param bool $cut If the cut is set to TRUE, the string is always wrapped at or before the specified width. So only if you have a word that is larger than the given width, it is broken apart.
* @param bool $htmlBreak Inserts '<br />' on every newline.
* @return string Wrapped string.
*/
public function wordwrap($text, $length = 100, $cut = true, $htmlBreak = true) {
$text = wordwrap($text, $length, "\n", $cut);
return (($htmlBreak)?nl2br($text):$text);
}
?>
希望您能找到这些信息有用。如果您是 CakePHP 团队的一员,请考虑将这些修复添加到原始 TextHelper 中 ;)