Как определить обратный вызов расширения bbcode PECL при написании библиотеки CodeIgniter?

Я пишу библиотеку CodeIgniter вокруг PHP bbcode Расширение PECL, но у меня возникли проблемы с обратными вызовами.

Я установил обработчик в конструкторе библиотеки:

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. Я использую это, чтобы вставить страницу «перенаправление выхода»

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 меняется с каждой попыткой.

2

Решение

Единственное решение, которое я нашел, это просто не устанавливать обработчик в конструкторе. Вместо этого parse() метод содержит и то и другое bbcode_create() вызов и bbcode_parse() вызов. Это bbcode_handler создается заново для каждой строки bbcode, которая будет проанализирована.

Это кажется излишне расточительным для меня. Но в течение срока службы этого проекта крайне маловероятно, что это будет стоить даже десятой части времени, которое я потратил, пытаясь разобраться в этом «должным образом», поэтому я называю это днем.

Я выкладываю это «решение» здесь на тот случай, если кто-нибудь еще столкнется с этим вопросом и тем самым сможет избавить себя от нескольких часов боли. Тем не менее, я действительно хотел бы знать, что происходит на земле, и как сделать это правильно.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector