Этот вопрос возник в замешательстве. Некоторые из его частей, хотя и, особенно, некоторые ответы, могут быть полезны для кого-то. Поэтому я задам этот вопрос без изменений, и я попытаюсь переформулировать вопрос here.Как переопределить шаблон "folder_full_view_item.pt" только для пользовательского типа?
Переопределение шаблона folder_full_view_item.pt
с z3c.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 template
folder_full_view_item.pt
добавляет разные ViewletManagers (abovecontenttitle и т. Д.) И вызывает макет элемента черезuse-macro="item_macro"
. - Шаблон товара (
document_view
,mytype_view
и т.п.) входит в комплект.
Что мне нужно - это способ переопределить шаблон folder_full_view_item.pt
. Вызов на шаге №2 переопределенного шаблона folder_full_view_item.pt
для MyType
и Plone's 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
игнорируется:
Установите 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
пробег Buildout с 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.pt
, folder_full_view.pt
и 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()
, кажется, не пройти через "обычные" слои!
Я проверил следующее в примере выше:
в 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.pt
в 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
, форму folder_full_view
и заставить его пройти через «обычный» процесс публикации/слоев?
Может кто-нибудь дать подсказку, для какой части zope/plone отвечает за этот «процесс публикации/слоев»?
Фактически то, что мне нужно, это переопределить folder_full_view_item. Я хочу показать MyType со своим собственным представлением/шаблоном в закрывающей папке, в которой выбран layout_full_view. В папке folder_full_view вложенной папки вызывается «item.getObject(). Folder_full_view_item()», которая, в свою очередь, вызывает шаблон MyType. folder_full_view_item не только вызывает шаблон MyType, но и добавляет некоторые дополнительные элементы, которые мне не нужны. – wolfrevo