在编写CodeIgniter库时如何定义PECL bbcode扩展回调?

时间:2015-02-27 20:30:19

标签: php codeigniter callback bbcode pecl

我正在围绕PHP bbcode PECL扩展程序编写CodeIgniter库,但我在回调时遇到了一些问题。

我在库构造函数中设置了处理程序:

function __construct() {

    $basic = array(
        'url' => array(
            'type' => BBCODE_TYPE_OPTARG,
            'open_tag' => '<a href="{PARAM}" rel="nofollow">',
            'close_tag' => '</a>',
            'childs'=>'i,b,u,strike,center,img',
            'param_handling' => array($this, 'url')
            )
    );
    $this->handler = bbcode_create($basic); 
}

public function parse($bbcode_string) {
    return bbcode_parse($this->handler, htmlentities($bbcode_string));
}

正如您所注意到的,它使用回调来处理允许进入URL的内容。我用它来插入&#34;退出重定向&#34;页

public static function url($content, $argument) {
    if (!$argument) $argument = $content;
    $url = parse_url($argument);

    if (!isset($url['host'])) {
        if (strlen($argument) > 0 && $argument[0] != '/') return false;
        $destination = '//'.$_SERVER['HTTP_HOST'].$argument;
    } elseif ($url['host'] != $_SERVER['HTTP_HOST']) {
        $destination = '//'.$_SERVER['HTTP_HOST'].'/exit?'.urlencode($argument);
    } else {
        $destination = $argument;
    }

    return htmlspecialchars($destination);
}

我还有一个小功能可以帮助我在工作时测试它:

function test() {
    $string = '[url]http://www.google.com[/url]';
    echo '<pre>';
    die($this->parse($string));
}

如果从库中调用test()方法,这一切都可以正常。例如,如果我在构造函数的底部抛出$this->test(),那么一切都与我期望的完全一样。但是,从其他地方(例如在控制器中)调用$this->bbcode->test(),我会收到以下错误:

**A PHP Error was encountered**
Severity: Warning
Message:  Invalid callback , no array or string given
Filename: libraries/bbcode.php
Line Number: 122

**A PHP Error was encountered**
Severity: Warning
Message:  bbcode_parse(): function `' is not callable
Filename: libraries/bbcode.php
Line Number: 122

<a href="" rel="nofollow">http://www.google.com</a>

回调未执行,因此链接的href属性为空。第122行引用我的parse函数中的单行代码:

return bbcode_parse($this->handler, htmlentities($bbcode_string));

如何解决此回调函数,以便在从控制器内部调用$this->bbcode->test()时找到它?


现在我更加困惑......

因此,希望将这一切都放在我身后,我将这些回调函数放在帮手中,这样我就可以直接调用它们了。所以我现在有这样的代码:

function __construct() {

    $basic = array(
        'url' => array(
            'type' => BBCODE_TYPE_OPTARG,
            'open_tag' => '<a href="{PARAM}" rel="nofollow">',
            'close_tag' => '</a>',
            'childs'=>'i,b,u,strike,center,img',
            'param_handling' => 'bbcode_url'
            )
    );
    $this->handler = bbcode_create($basic);   
}

有了上述内容,我收到以下错误:

**A PHP Error was encountered**
Severity: Warning
Message: Invalid callback 6.7949295043945E-5, no array or string given
Filename: libraries/bbcode.php
Line Number: 176

**A PHP Error was encountered**
Severity: Warning
Message: bbcode_parse(): function `6.7949295043945E-5' is not callable
Filename: libraries/bbcode.php
Line Number: 176

(第176行是parse()函数的新位置)

嗯......我甚至都不知道发生了什么。每次尝试都会更改6.7949295043945E-5个数字。

1 个答案:

答案 0 :(得分:0)

我发现的唯一解决办法就是不要在构造函数中设置处理程序。相反,parse()方法包含 bbcode_create()调用和bbcode_parse()调用。也就是说,为每个要解析的bbcode字符串新创建bbcode_handler

这对我来说似乎是不必要的浪费。但是,在这个项目的整个生命周期中,我极不可能花费甚至十分之一的时间来试图解决这个问题&#34;正确&#34;所以我是称之为一天。

我发布了这个&#34;解决方案&#34;这是为了防止其他人遇到这个问题,从而可以节省几个小时的时间。痛。也就是说,我真的想知道到底发生了什么,以及如何正确地做到这一点。