修复和改进 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 中 ;)