2

WordPress のテンプレート テーマ エンジンのようなものを実現したい場合、Pyramid、トラバーサル、およびデータベースとして MongoDB を使用してどのように実現すればよいでしょうか。

Extending An Existing Pyramid Applicationで調べてみましたが、まったく意味がありません...


基本的に、管理者コントロール パネルで、所有者が に移動するwww.mydomain.com/admin/templateと、ページには、たとえば /static/themes/ にあるすべてのテーマ フォルダーが表示されます。

管理者がテーマ「mybluetheme」を選択すると、テーマが MongoDB に保存されます。そのため、 で表示するとwww.mydomain.com/、「mybluetheme」を使用してテーマが表示されます。明日、管理者が「mygreentheme」を選択すると、サイトは「mygreentheme」をレンダリングします。

4

1 に答える 1

3

wordpress テンプレート テーマ エンジンについて何も知らないので、いくつかの基準に応じてベース テンプレートを交換する方法を紹介したいと思います。

from pyramid.renderers import get_renderer
from pyramid.security import authenticated_userid

class Theme(object):

    def __init__(self, context, request):
        self.context = context
        self.request = request

    @property
    def layout(self):
        if utils.likes_blue_color(authenticated_userid(self.request)):
            template_name = 'templates/blue_layout.pt'
        else:
            template_name = 'templates/green_layout.pt'
        return get_renderer(template_name).implementation()

@view_config(...)
def index(context, request):

    theme = Theme(context, request)

    return { 'context':context,
             'request': request,
             'theme':theme,
           }

レイアウトテンプレートは次のようになります

<html ...
     metal:define-macro="master">
....
<metal:sidebar define-slot="sidebar">...</metal:sidebar>
<metal:body define-slot="main">...</metal:body>
</html>

そして、残りのテンプレートはそれを次のように使用します。

<html ...
    metal:use-macro="theme.layout.macros['master']">

<metal:main fill-slot="main">
    Hi there!
</metal:main>
</html>

このアプローチを使用すると、いくつかのパラメーター (リクエストの値、Cookie、データベースのユーザー設定など) に基づいて基本テンプレートを交換できます。

Jinja2 テンプレートの場合、アプローチは似ています。ビュー関数で必要なベース テンプレートを特定し、ベース テンプレート オブジェクトへの参照、またはベース テンプレートのファイル名を関数に渡します。Jinja2 のドキュメントから、{% extends my_base_template_passed_from_the_view_function %}構文が機能する可能性があるようです。それ以外の場合は、カスタム テンプレート ローダーを指定して、条件に基づいて別のテンプレートをロードする必要がある場合があります。

于 2012-12-11T21:28:54.070 に答える