Создание пользовательских тегов "html" для CMS? - PullRequest
3 голосов
/ 10 июля 2010

Я работаю с 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?

Ответы [ 2 ]

11 голосов
/ 10 июля 2010

Я написал класс, который делает именно то, что вы просите для моих собственных 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 Функция: теги / 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>
3 голосов
/ 10 июля 2010

Я не уверен на 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">, даже с возможностью добавления под-тегов для структурированной информации вместо kludgy {placeholder} s ирегулярные выражения и т. д.

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

...