Найти вхождения HTML в пользовательском теге, выполнить функцию и заменить тег на вывод функции - PullRequest
1 голос
/ 12 марта 2011

Это, вероятно, очень простой вопрос, поэтому извиняюсь за то, что не усложняю!

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

Чтобы сделать эту CMS расширяемойнасколько это возможно, я хочу использовать «модули».Следовательно, в файлы шаблонов я хочу поместить пользовательские теги HTML, которые представляют модули.

Это будет выглядеть так:

<p><Module name="newsTicker" property="value" anotherProperty="anotherValue" /></p>

Я получаю файл шаблона с помощью:

ob_start();
include "templatefile.tpl";
$buffer= ob_get_contents();
ob_end_clean();

Теперь я хочу просмотреть содержимое $buffer и для каждого вхождения <Module name="moduleName" /> Я хочу include "moduleName.class.php", создать новый экземпляр этого класса, запустить функцию getOutput()этого модуля и поместите возвращаемое значение туда, где раньше был тег <Module />.

Я понятия не имею, как это сделать ...: / Есть идеи?

Если выне понимаю думать о тикере новостей.Я могу написать некоторый код, который просматривает таблицу новостей в моей базе данных и составляет список из 10 последних новостей, а затем выводит его в формате html <ul>.Я хочу абстрагировать это, чтобы его можно было использовать на многих страницах.Так что в моем шаблоне для домашней страницы у меня может быть тег <Module name="newsTicker" />.Теперь, когда я захожу на домашнюю страницу, мне нужно просмотреть tpl-файл домашней страницы, и я найду, где он говорит <Module name="newsTicker" />, я извлечу атрибут name и включу класс, основанный на этом имени (в данном случаеэто будет newsTicker.class.php).У него будет функция с именем getOutput(), поэтому я смогу выполнить что-то похожее на: $output = $current_module->getOutput();, а затем мне нужно вернуться к моему файлу tpl и изменить исходный <Module name="newsTicker" /> для содержимого $output.

Спасибо за вашу помощь.:)

Том

1 Ответ

2 голосов
/ 12 марта 2011
  • Используйте DOMDocument для поиска Module элементов (я бы использовал строчные буквы только лично).
  • Храните атрибут name.
  • include_once класс, основанный на name атрибут (пропустить при использовании автозагрузки).
  • Использовать $class = new $name.
  • Удалить оригинальный элемент Module DOM и appendChild из $class->getOutput().
...