Расширить HTML_BBCodeParser_Filter - PullRequest
       12

Расширить HTML_BBCodeParser_Filter

1 голос
/ 12 октября 2009

Я пытаюсь добавить дополнительные теги в пакет PEAR BBCodeParser http://pear.php.net/package/HTML_BBCodeParser/docs/latest/li_HTML_BBCodeParser.html,, чтобы сделать это, я считаю, что мне нужно поместить Object.php в \ php5.3.0 \ PEAR \ pear \ HTML \ BBCodeParser \ Filter и вызвать addFilter.

Object.php

<?php
/*
 New filter
 @todo Lots
*/
require_once 'HTML/BBCodeParser/Filter.php';

class HTML_BB_CodeParser_Filter_Object extends HTML_BBCodeParser_Filter {

var $_definedTags = array( 'object' => array ( 'htmlopen' => 'object',
          'htmlclose' => 'object',
          'allowed' => 'all',
          'attributes' => array()
              )
    )

}
?>

extbbcode.php

<?php
/*
 The test display page
*/
error_reporting(E_STRICT); 
require_once('HTML/BBCodeParser.php');

$parser = new HTML_BBCodeParser();

$parser->addFilter('object');

$parser->setText('[b]bold[/b] [object]test[/object]');
$parser->parse();
$parsed = $parser->getParsed();

echo htmlentities($parsed, ENT_QUOTES). ' | ';
echo $parsed;
?>

Когда я просматриваю extbbcode.php, я просто получаю эту ошибку

Строгие стандарты: Нестатический метод PEAR :: getStaticProperty () не должен вызываться статически, предполагая $ this из несовместимого контекста в D: \ wamp \ bin \ php \ php5.3.0 \ PEAR \ pear \ HTML \ BBCodeParser. php на линии 169

Если я закомментирую $ parser-> addFilter ('object'); затем она работает как положено, т.е. выдает корректный вывод. Я также могу указать существующий фильтр, например

$parser->addFilter('basic');
$parser->addFilter('images');

Basic.php , Images.php

Если я вызываю addFilter с недопустимым фильтром (т. Е. Файл не существует), я получаю сообщение «Не удалось загрузить фильтр $ filter».

Может кто-то заметить, что я делаю не так? Мне кажется, что Object.php включен, но выдает эти странные сообщения STRICT. Так что моя проблема определенно с этим файлом.

Если кто-то имеет опыт работы с этим классом или тем сообщением об ошибке и может указать мне правильное направление, я был бы очень рад :)

BBCodeParser.php

function addFilter($filter)
{
    $filter = ucfirst($filter);
    if (!array_key_exists($filter, $this->_filters)) {
        $class = 'HTML_BBCodeParser_Filter_'.$filter;
        @include_once 'HTML/BBCodeParser/Filter/'.$filter.'.php';
        if (!class_exists($class)) {
            PEAR::raiseError("Failed to load filter $filter", null, PEAR_ERROR_DIE);
        }
        $this->_filters[$filter] = new $class;
        $this->_definedTags = array_merge(
            $this->_definedTags,
            $this->_filters[$filter]->_definedTags
        );
    }
}

edit: удалось заставить PEAR работать на моем локальном WAMP, поэтому я могу упростить вопрос, исключив другую проблему, с которой я столкнулся.

1 Ответ

1 голос
/ 01 июня 2010

Вы можете добавить свой фильтр непосредственно в класс BBCode.

class HTML_BBCodeParser_Custom_Filter extends HTML_BBCodeParser  
{  
    var $_definedTags =   
        array('block' => array( 'htmlopen'  => 'blockquote',  
                    'htmlclose' => 'blockquote',  
                    'allowed'   => 'all',  
                    'attributes'=> array()  
                  ),  
              'line' =>  array( 'htmlopen'  => 'hr',  
                    'htmlclose' => '',  
                    'allowed'   => 'all',  
                    'attributes'=> array()  
                  ),
            );  

}

$BBCodeParser = new HTML_BBCodeParser();

$FilterName = 'Custom_Filter';
$BBCodeParser->_filters[$FilterName] = new HTML_BBCodeParser_Custom_Filter();
    $BBCodeParser->_definedTags = array_merge(
            $BBCodeParser->_definedTags,
            $BBCodeParser->_filters[$FilterName]->_definedTags);

echo $BBCodeParser->qparse("[block]This is a blockquote. [line][/block]");

Раскрытие: пользовательский класс тегов был взят из здесь , а код для помещения тегов непосредственно в класс был взят из фактического исходного кода PEAR (HTML_BBCodeParser :: addfilter).

...