gpt4 book ai didi

templates - 如何仅针对自定义类型覆盖模板 "folder_full_view_item.pt"?

转载 作者:行者123 更新时间:2023-12-02 23:10:15 26 4
gpt4 key购买 nike

这个问题以一种令人困惑的方式演变。不过,它的某些部分,特别是一些答案,可能对某人有用。因此,我将不修改此问题,并尝试重新表述问题 here .

覆盖模板 folder_full_view_item.ptz3c.jbot将覆盖所有内容类型的模板。
如何仅针对单个内容类型覆盖它 MyType在具有多种类型的产品中?

具有以下结构:

Folder (layout=folder_full_view)
Document (layout=document_view)
MyType (layout=mytype_view)

Plone 中的默认步骤是:
  • 模板folder_full_view.pt电话folder_full_view_item.pt来自 item.getObject().folder_full_view_item() .
  • Products.CMFPlone 的模板 folder_full_view_item.pt添加不同的 ViewletManagers(abovecontenttitle 等)并通过 use-macro="item_macro" 调用项目的布局.
  • 包含项目的模板( document_viewmytype_view 等)。

  • 我需要的是一种覆盖模板的方法 folder_full_view_item.pt .在步骤#2 中调用覆盖的模板 folder_full_view_item.ptMyType和 Plone 的 folder_full_view_item.pt对于所有其他内容类型。

    更新

    好像是模板 folder_full_view_item.pt不能被覆盖(不使用 jbot)。来电 item.getObject().folder_full_view_item()在模板中 folder_full_view.pt似乎也没有通过“queryMultiAdapter”。

    我在这里展示了重现它的所有步骤并确认 folder_full_view_item被忽略:

    设置 PLONE_HOME路径并删除现有 exaple.theme如有必要:

    PLONE_HOME=/path/to/Plone-4.3.2
    cd ${PLONE_HOME}/zeocluster/src
    rm -rf ${PLONE_HOME}/zeocluster/src/example.theme
    sed -i '/example\.theme/d' ${PLONE_HOME}/zeocluster/buildout.cfg

    使用 develop.cfg 运行构建:

    sudo -u plone_buildout ${PLONE_HOME}/zeocluster/bin/buildout -c ${PLONE_HOME}/zeocluster/develop.cfg
    cd ${PLONE_HOME}/zeocluster/src
    rm -rf /home/Plone-4.3.2/zeocluster/src/example.theme
    sudo -u plone_buildout ${PLONE_HOME}/zeocluster/bin/paster create \
    --no-interactive \
    --overwrite \
    -o ${PLONE_HOME}/zeocluster/src \
    -t plone3_theme example.theme \
    expert_mode=all \
    namespace_package=example \
    package=theme \
    skinname='ExampleTheme' \
    skinbase='Sunburst Theme' \
    empty_styles=False \
    include_doc=True \
    version=1.0 \
    description='An installable theme for Plone 3' \
    add_profile=True \
    long_description= \
    author= \
    author_email= \
    keywords='web zope plone theme' \
    url='http://svn.plone.org/svn/collective/' \
    license_name=GPL \
    zip_safe=False \
    zope2product=True

    添加 example.theme扩建:
    sed -i '79i\ \ \ \ example.theme' ${PLONE_HOME}/zeocluster/buildout.cfg
    sed -i '102i\ \ \ \ src/example.theme' ${PLONE_HOME}/zeocluster/buildout.cfg

    注册 browser:pages
    cat << EOF > ${PLONE_HOME}/zeocluster/src/example.theme/example/theme/configure.zcml
    <configure
    xmlns:browser="http://namespaces.zope.org/browser"
    xmlns="http://namespaces.zope.org/zope"
    xmlns:five="http://namespaces.zope.org/five"
    xmlns:cmf="http://namespaces.zope.org/cmf"
    xmlns:i18n="http://namespaces.zope.org/i18n"
    i18n_domain="example.theme">

    <five:registerPackage package="." initialize=".initialize" />
    <include package=".browser" />
    <include file="skins.zcml" />
    <include file="profiles.zcml" />
    <i18n:registerTranslations directory="locales" />

    <browser:page
    for="*"
    name="folder_full_view_item"
    template="folder_full_view_item.pt"
    layer="example.theme.browser.interfaces.IThemeSpecific"
    permission="zope2.View"
    />

    <browser:page
    for="Products.ATContentTypes.content.folder.ATFolder"
    name="folder_full_view"
    template="folder_full_view.pt"
    layer="example.theme.browser.interfaces.IThemeSpecific"
    permission="zope2.View"
    />

    <browser:page
    for="Products.ATContentTypes.content.document.ATDocument"
    name="document_view"
    template="document_view.pt"
    layer="example.theme.browser.interfaces.IThemeSpecific"
    permission="zope2.View"
    />

    </configure>
    EOF

    将原始文件( document_view.ptfolder_full_view.ptfolder_full_view_item.pt )复制到主题:

    cp -f ${PLONE_HOME}/buildout-cache/eggs/Products.CMFPlone-4.3.2-py2.7.egg/Products/CMFPlone/skins/plone_content/document_view.pt \
    ${PLONE_HOME}/zeocluster/src/example.theme/example/theme/document_view.pt
    cp -f ${PLONE_HOME}/buildout-cache/eggs/Products.CMFPlone-4.3.2-py2.7.egg/Products/CMFPlone/skins/plone_content/folder_full_view_item.pt \
    ${PLONE_HOME}/zeocluster/src/example.theme/example/theme/folder_full_view_item.pt
    cp -f ${PLONE_HOME}/buildout-cache/eggs/Products.CMFPlone-4.3.2-py2.7.egg/Products/CMFPlone/skins/plone_content/folder_full_view.pt \
    ${PLONE_HOME}/zeocluster/src/example.theme/example/theme/folder_full_view.pt

    稍微修改覆盖模板以识别它们:

    sed -i '/<metal:content-core define-macro="content-core">/a overriden template at '${PLONE_HOME}'/zeocluster/src/example.theme/example/theme/document_view.pt' \
    ${PLONE_HOME}/zeocluster/src/example.theme/example/theme/document_view.pt
    sed -i '/<metal:entries fill-slot="entries">/a overriden template at '${PLONE_HOME}'/zeocluster/src/example.theme/example/theme/folder_full_view.pt' \
    ${PLONE_HOME}/zeocluster/src/example.theme/example/theme/folder_full_view.pt
    sed -i '/<div tal:replace="structure provider:plone.abovecontenttitle" \/>/i overriden template at '${PLONE_HOME}'/zeocluster/src/example.theme/example/theme/folder_full_view_item.pt' \
    ${PLONE_HOME}/zeocluster/src/example.theme/example/theme/folder_full_view_item.pt
    chown -R plone_buildout example.theme

    运行 buildout 并开始 plone:

    sudo -u plone_buildout ${PLONE_HOME}/zeocluster/bin/buildout -c ${PLONE_HOME}/zeocluster/develop.cfg
    ${PLONE_HOME}/zeocluster/bin/zeoserver restart
    ${PLONE_HOME}/zeocluster/bin/client1 fg

    如果您想以编程方式创建测试数据(例如从 ipython),那么您可以执行以下操作:

    utils.sync()
    plone_site_name = 'Plone'
    # delete 'Plone' site if existing
    if app.hasObject(plone_site_name): app.manage_delObjects(plone_site_name)
    from Products.CMFPlone.factory import addPloneSite
    # create 'Plone' site
    plone_site = addPloneSite(
    app,
    plone_site_name,
    profile_id=('Products.CMFPlone:plone',),
    extension_ids=('plonetheme.classic:default',
    'plonetheme.sunburst:default',),
    setup_content=False,
    )
    plone_site = app[plone_site_name]
    # install 'plone.app.theming' and 'example.theme'
    plone_site.portal_quickinstaller.installProduct('plone.app.theming')
    plone_site.portal_quickinstaller.installProduct('example.theme')
    # create some content
    plone_site.invokeFactory('Document', 'document')
    folder_id = plone_site.invokeFactory('Folder', 'folder')
    plone_site[folder_id].setLayout('folder_full_view')
    plone_site[folder_id].invokeFactory('Document', 'document')
    utils.commit()

    更新 2

    按照建议添加以下内容也不起作用:

    从 zope.interface.Interface 定义一个子类:

    cat << EOF >> ${PLONE_HOME}/zeocluster/src/example.theme/example/theme/browser/interfaces.py
    from zope.interface import Interface
    class IMyLayer(Interface):
    """ """
    EOF

    将其注册为浏览器层:

    cat << EOF > ${PLONE_HOME}/zeocluster/src/example.theme/example/theme/profiles/default/browserlayer.xml
    <?xml version="1.0"?>
    <layers>
    <layer name="imylayer" interface="example.theme.browser.interfaces.IMyLayer" />
    </layers>
    EOF

    为该层注册浏览器:页面:

    sed -i 's/layer="example.theme.browser.interfaces.IThemeSpecific"/layer="example.theme.browser.interfaces.IMyLayer"/' \
    ${PLONE_HOME}/zeocluster/src/example.theme/example/theme/configure.zcml

    更新 3

    来电 item.getObject().folder_full_view_item()似乎没有通过“通常”层!

    我已经用上面的例子测试了以下内容:

    folder_full_view替代电话 item.getObject().folder_full_view_item()item.getObject().document_view()
    修改原版 document_view.pt
    echo "original document_view" > ${PLONE_HOME}/buildout-cache/eggs/Products.CMFPlone-4.3.2-py2.7.egg/Products/CMFPlone/skins/plone_content/document_view.pt

    修改 document_view.ptexample.theme
    echo "overriden document_view" > /home/Plone-4.3.2/zeocluster/src/example.theme/example/theme/document_view.pt

    调用文档使用覆盖 document_view.pt
    curl -s 'http://localhost:8080/Plone/document' | grep "document_view"
    overriden document_view

    但调用文件夹(其中包含文档)使用原始 document_view.pt
    curl -s 'http://localhost:8080/Plone/folder' | grep "document_view"
    original document_view

    因此,核心问题似乎是:

    去电话 item.getObject().template_name()通过“通常的”发布/图层过程在模板中?

    如果没有,如何调用类似 folder_full_view_item 的模板表格 folder_full_view并让它通过“通常的”发布/图层过程?

    有人可以提示 zope/plone 的哪一部分负责这个“发布/图层过程”?

    最佳答案

    而不是覆盖 folder_full_view_item.pt你应该宁愿create your own custom default template为您的内容类型 MyType .

    关于templates - 如何仅针对自定义类型覆盖模板 "folder_full_view_item.pt"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21464202/

    26 4 0