Создаете собственные html-теги для CMS?

Я работаю с CMS для веб-приложения на PHP, которому необходимо сократить процесс вставки (встраивания) материалов, таких как видео с YouTube или Vimeo, написав следующее, которые хранятся в базе данных:

<youtube id="wfI0Z6YJhL0" />

Что выведет следующее после какой-то замены:

<!-- Custom formatting before object !-->
<object width="640" height="385"><param name="movie" value="http://www.youtube-nocookie.com/v/wfI0Z6YJhL0&amp;hl=sv_SE&amp;fs=1?rel=0&amp;color1=0xe1600f&amp;color2=0xfebd01"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube-nocookie.com/v/wfI0Z6YJhL0&amp;hl=sv_SE&amp;fs=1?rel=0&amp;color1=0xe1600f&amp;color2=0xfebd01" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object>
<!-- Custom formatting after object !-->

Как я мог сделать это в PHP?


person Industrial    schedule 10.07.2010    source источник
comment
Зависит от CMS и от того, поддерживает ли она уже такое, или вам придется создавать ее с нуля. Как бы вы это ни делали, вы, вероятно, захотите использовать что-то помимо разделителей тегов HTML, чтобы обернуть ваш тег, иначе синтаксический анализ и замена будут чертовски медленными. Я настоятельно рекомендую [] или {}, последнее особенно распространено в инструментах шаблонов PHP.   -  person cHao    schedule 10.07.2010
comment
Все это будет использоваться в пользовательской cms. Я, как вы говорите, уверен, что это можно сделать с помощью скобок []/{}, но я не уверен, как это сделать. Не могли бы вы привести пример?   -  person Industrial    schedule 10.07.2010


Ответы (2)


Я написал класс, который делает именно то, что вы просите для моей собственной cms. Я загрузил src для вас, так как, хотя я никогда не выпускал его, исходный код выпущен под лицензией в стиле BSD. Пользовательские теги

Это в основном позволяет вам делать именно то, что вы просите. В классе есть несколько примеров пользовательских тегов, поэтому я не буду вставлять сюда код. Дайте мне знать, как вы идете.

Изменить 1: Пример кода по запросу. :-)

Редактировать 2: я должен добавить, что он поддерживает скрытые пользовательские теги.

Редактировать 3: он также поддерживает встроенные шаблоны и замену тегов, т.е.

<ct:inline some="attribute">
    This is an in line template. <br />
    This is a #{tag} that can be accessed by the callback function
</ct:inline>

PHP/HTML: example.php

<?php

$current_dir = dirname(__FILE__).DIRECTORY_SEPARATOR;
require_once dirname($current_dir).DIRECTORY_SEPARATOR.'customtags.php';

$ct = new CustomTags(array(
    'parse_on_shutdown'     => true,
    'tag_directory'         => $current_dir.'tags'.DIRECTORY_SEPARATOR,
    'sniff_for_buried_tags' => true
));

?><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
   "http://www.w3.org/TR/html4/strict.dtd">

<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>untitled</title>
    <meta name="generator" content="TextMate http://macromates.com/">
    <meta name="author" content="Oliver Lillie">
    <!-- Date: 2010-07-10 -->
</head>
<body> 

    <ct:youtube id="wfI0Z6YJhL0" />

</body>
</html>

Функция пользовательского тега PHP: tags/youtube/tag.php:

function ct_youtube($tag)
{
    return '<object id="'.$tag['attributes']->id.'" value="http://www.youtube.com/v/'.$tag['attributes']->id.'" /><param ......>';
}

Вывод:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
   "http://www.w3.org/TR/html4/strict.dtd"> 

<html lang="en"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
    <title>untitled</title> 
    <meta name="generator" content="TextMate http://macromates.com/"> 
    <meta name="author" content="Oliver Lillie"> 
    <!-- Date: 2010-07-10 --> 
</head> 
<body> 

    <object id="wfI0Z6YJhL0" value="http://www.youtube.com/v/wfI0Z6YJhL0" /><param ......> 

</body> 
</html>
person buggedcom    schedule 10.07.2010
comment
@buggedcom звучит очень интересно. Редактирование примера кода здесь было бы интересно для быстрого сравнения для будущих пользователей. - person Pekka; 10.07.2010
comment
Я только что протестировал пример сценария, сравнивающий simpleHTMLDom с CustomTags, и сравнение было таким: simpleHTMLdom -> Время: 0,0057680606842 секунды, использование памяти: 0,608268737793 МБ, пик использования памяти: 0,654273986816 МБ. CustomTags: время: 0,00264501571655 секунд, использование памяти: 0,452098846436 МБ, пиковое использование памяти: 0,518165588379 МБ. Оказывается, пользовательские теги немного лучше с точки зрения производительности, поэтому я бы использовал их, если вам не нужны другие особенности, которые использует simpleHTMLDom. - person buggedcom; 10.07.2010
comment
Я думал о том, чтобы сделать надлежащий выпуск этого, но не было времени. У него есть большой потенциал для обеспечения кросс-функционала cms, т.е. тегов видео, тегов swf и т.д. и т.п. Однажды я займусь этим... - person buggedcom; 10.07.2010
comment
У меня очень похожая проблема, и похоже, что это может быть просто решением Я искал. Теперь, если бы я только мог найти в июле, когда вы разместили это... - person Snekse; 15.10.2010
comment
Это тоже звучит очень интересно. Используя что-то подобное на работе в Java, я искал альтернативу PHP. Мне нравится возможность скрывать внутренний код в файлах тегов. - person Intellix; 02.08.2011

Я не уверен на 100%, как он будет реагировать на нестандартные теги, но если он сработает, simpleHTMLdom идеально подойдет для этого.

$html = str_get_html('....');

потом что-то в духе...

$element = $html->find('youtube',0 ); // Finds first element
                                      // - use "foreach" loop for final version 
$element->tag = 'object';
$element->value = "http://www.youtube.com/v/".$element->id;
$element->innertext= "<param ......>"

....

echo $html;

вы получаете дрейф.

Прелесть этого подхода заключается в том, что каждое конкретное расширение может добавлять свои данные в чистой HTML-нотации <tagname attribute="value">, даже с возможностью добавления вложенных тегов для структурированной информации вместо неуклюжих {placeholder}, регулярных выражений и так далее.

Я никогда не пробовал это, и у меня нет времени, чтобы проверить это прямо сейчас, но если вы решите попробовать, мне было бы интересно узнать, оказался ли этот способ полезным.

person Pekka    schedule 10.07.2010
comment
Это должно работать нормально, так как Simple DOM будет анализировать XML, а не только HTML, несмотря на его имя. Я сделал простой механизм обработки замены контента так, как вы описываете, хотя я использовал span:s с определенными классами, указав параметры в содержащих комментарии html. - person nikc.org; 10.07.2010
comment
он действительно работает. Я провел сравнение, и он работает нормально, однако он использует немного больше ресурсов, чем пользовательские теги, предположительно потому, что пользовательские теги предназначены специально для обеспечения определенного уровня функциональности, поэтому, если вам это не нужно, я бы пошел с CustomTags - person buggedcom; 10.07.2010