Форум сайта python.su
Пишу некую плагинную систему и необходимо, чтобы плагины могли изменять шаблоны (jinja2).
Например добавить кусок текста или заменить его и т.д.
Пока придумал два варианта:
1. Плагин наследует от нужных шаблонов
Соответственно все выглядит как наследование шаблона с переопределением блоков, если они определены и т.д.
Внутри все будет реализовано через TemplateLoader
при регистрации плагина его шаблоны регистрируются и загрузчик вначале ищет шаблон в папке плагина (или плагинов) а затем уже в остальных.
Если произошло наследование шаблона то процесс поиска повторяется за исключением того что из поиска убирается ТЕКУЩИЙ шаблон и ОБРАБОТАННЫЕ шаблоны плагинов, чтобы имена переопределяемых шаблонов совпадали.
пример:
# системный шаблон - template1
text
{% block content %}
bla bla bla
{% endblock %}
continue
-----
# шаблон плагина - template1 (с таким же именем)
{% extends "template1" %} {# будет найден системный шаблон или шаблон другого плагина с таким же именем #}
{% block content %}
привет из плагина
{{ super () }}
тра та та
{% endblock %}
....
{# регистрируем места вставок в шаблоне #}
{{ reg_ins_point('point_name_1') }}
....
{{ reg_ins_point('point_name_2') }}
@ins_point('point_name') # указываем что хотим вставить содержимое в точку point_name_1
def point_content():
return 'template', {} # возвращаем шаблон и параметры для рендеринга
Офлайн
По какому пути пошел? Тоже интересует эта тема.
У меня сейчас финальная страничка строится из десятка разных шаблонов, за каждый кусок отвечает отдельный класс/метод, некоторые куски приезжают к клиенту через аджакс, и при плагинной подмене я заменяю целиком шаблон(1 кусок).
Сейчас есть идея хранить эти куски у клиента и использовать по надобности, вот и думаю что оптимальней было-б эти куски хранить в 1 файле (шаблоне), но как лучше сделать плагинную подмену…
Офлайн
По первому, на мой взгляд гибче получается, так как во втором случае мы можем вставить что-то только в точку point_name, а так и до, и после и вместо. Также если блоков - которые нужно изменять несколько - все находится - в одном месте, а не требует нескольких описаний точек вставки. Также уже сразу по структуре шаблонов понятно что и где меняется, не надо смотреть в исходный код.
Офлайн