如何仅为自定义类型覆盖模板“folder_full_view_item.pt”?

2024-05-05

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


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

具有以下结构:

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

Plone 中的默认步骤是:

  1. 模板folder_full_view.pt calls folder_full_view_item.pt via item.getObject().folder_full_view_item().
  2. Products.CMFPlone 的模板folder_full_view_item.pt添加不同的 ViewletManager(内容标题上方等)并通过调用项目的布局use-macro="item_macro".
  3. 项目的模板(document_view, mytype_view等)也包括在内。

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

UPDATE

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

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

Set the 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

add 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.pt, folder_full_view.pt, and 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/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()

UPDATE 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

UPDATE 3

电话item.getObject().folder_full_view_item()似乎没有经历“通常”的层!

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

in folder_full_view替代呼叫item.getObject().folder_full_view_item() with 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.pt in example.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 form folder_full_view并使其通过“通常的”发布/图层流程?

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


而不是覆盖folder_full_view_item.pt你应该宁愿创建您自己的自定义默认模板 http://plone.org/documentation/kb/creating-a-custom-template-for-a-plone-content-type适合您的内容类型MyType.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何仅为自定义类型覆盖模板“folder_full_view_item.pt”? 的相关文章

随机推荐