2014-01-30 2 views
3

Этот вопрос возник в замешательстве. Некоторые из его частей, хотя и, особенно, некоторые ответы, могут быть полезны для кого-то. Поэтому я задам этот вопрос без изменений, и я попытаюсь переформулировать вопрос 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 являются:

  1. Шаблон folder_full_view.pt вызовы folder_full_view_item.pt через item.getObject().folder_full_view_item().
  2. Products.CMFPlone template folder_full_view_item.pt добавляет разные ViewletManagers (abovecontenttitle и т. Д.) И вызывает макет элемента через use-macro="item_macro".
  3. Шаблон товара (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 отвечает за этот «процесс публикации/слоев»?

ответ

1

Вместо того, чтобы переопределять folder_full_view_item.pt, вы должны указать create your own custom default template для вашего содержимого. Тип MyType.

+0

Фактически то, что мне нужно, это переопределить folder_full_view_item. Я хочу показать MyType со своим собственным представлением/шаблоном в закрывающей папке, в которой выбран layout_full_view. В папке folder_full_view вложенной папки вызывается «item.getObject(). Folder_full_view_item()», которая, в свою очередь, вызывает шаблон MyType. folder_full_view_item не только вызывает шаблон MyType, но и добавляет некоторые дополнительные элементы, которые мне не нужны. – wolfrevo

1

Для переопределения этого шаблона вам понадобятся 2 вещи: уровень браузера и представление, которое будет использоваться в контексте вашего типа контента.

Во-первых, объявить слой браузера:

from zope.interface import Interface 

class IMyLayer(Interface): 
    """A layer specific for this add-on product. 
    """ 

Этот браузер слой должен быть установлен с типом контента. Создание browserlayer.xml файла со следующим:

<?xml version="1.0"?> 
<layers> 
    <layer name="my.type" interface="my.type.interfaces.IMyLayer" /> 
</layers> 

Тогда вид будет активен, когда вы находитесь в контексте вашего типа контента и, когда ваш браузер слой активен:

from five import grok 

class FolderFullViewItem(grok.View): 
    """Override folder_full_view_item for MyType. 
    """ 
    grok.context(IMyType) 
    grok.layer(IMyLayer) 
    grok.name('folder_full_view_item') 
    grok.template('folder_full_view_item') 
    grok.require('zope2.View') 

На sc.blog у нас есть аналогичный прецедент, на котором мы переопределяем folder_summary_view и folder_full_view, взгляните на него.

Кроме того, не забудьте ознакомиться с главой Layers, посвященной документации разработчиков Plone.

+1

Я точно хочу ** переопределить ** 'folder_full_view_item.pt', а не' folder_full_view.pt'. В приведенном выше примере 'sc.blog' вы просто переопределяете' folder_full_view.pt', который вызывает Plone 'folder_full_view_item.pt'. Я знаю, что я мог бы перезаписать 'folder_full_view.pt' для' MyType', и там вместо другого 'folder_full_view_item.pt' вызывается другой шаблон, но это не то, что я прошу. Пожалуйста, внимательно прочитайте мой вопрос. – wolfrevo

+0

, если вы внимательно прочитаете мой ответ, вы заметите, что 'grok.context (IMyType)' выполняет эту работу. – hvelarde

+0

Не могли бы вы отменить ответ? Наш проект grokless – wolfrevo

1

Попробуйте использовать tal:condition="python:item_type=='MyType'" и item_type!='MyType' для различных потребностей отображения. Надеюсь, это полезно.

+0

Я точно хочу ** переопределить ** 'folder_full_view_item.pt'. Пожалуйста, внимательно прочитайте вопрос. – wolfrevo

0

Как шкурки-инструмент, кажется устаревшим и, вероятно, будет участвовать производительность потери, я предпочел бы пойти с выделенным браузера ракурса для настраиваемого-ContentType тоже, но ответить на вопрос:

Вы можете использовать collective.editskinswitcher (спасибо M. v. Rees!), Не переписывая слишком много и даже получая некоторые приятные и простые в настройке dev-функции на этом пути (просмотр посетителей, хотя и фактически выполненный вход в систему, посредством URL-различия , например).

В этом случае, мы воспользуемся возможностью, чтобы установить скин-свойство на folderish CONTENTTYPE-объекта и грубо говоря, эти шаги должны сделать сделку:

  • Поместите заказной folder_full_view_item.pt -template в любой из скинов для вашей темы.

  • О создании вашего ContentType, добавить событие-приемник, который устанавливает свеже родился объект, skin_name на имя-кожи вашей темы (посмотреть на c.editskinswitcher для методов и реквизита, ссылающийся HTTP-запрос @@switchDefaultSkin?skin_name=YourTheme , btw).

  • Установите еще одну тему-скин как глобальное значение по умолчанию для всех других контекстов в свойствах portal_skins.

+0

Большое спасибо за ваш ответ!Это именно то, что мы сейчас используем: сочетание тем/скинов, которые мы переключаем с помощью 'collect.editskinswitcher'. Действительно, благодаря Маурицу! Но, в стороне от того, что это жонглирование и борьба с библиотеками (и документация!) Иногда становится настоящей лавой, я действительно и очень очень заинтересован в ответе на мои вопросы: (1) это или невозможно переопределить ' folder_full_view_item.pt', как предлагают большинство людей (в высшей степени)? и (2) есть ли другой способ вызвать этот шаблон, чем через item.getObject(). folder_full_view_item() '? – wolfrevo

+1

С другой стороны, я очень благодарен за четкое заявление разработчиков plone о том, что libs/tools являются «устаревшими», «старомодными», «старыми» и т. Д. И т. Д.? Но на этом форуме действительно не место жаловаться на это ;-) Даже если я очень ценю ваши усилия @ ida-ebkes, это не отвечает на мой вопрос. – wolfrevo

+0

Квест превратился в роман (aka tl; dr) и сейчас поднимается несколько очков. Относительно (1) вашего комментария: На этот вопрос уже много ответов, не стесняйтесь проявлять свою признательность с помощью upvotes (я сделал). Относительно (2): всегда есть способ;) Но, возможно, вы хотите открыть новый квест с этой конкретной точкой. О тирадах во втором комментарии: скин-инструмент определенно склонен к устареванию, но есть кое-что, что нужно сделать, прежде чем настало время для прощания. Вероятно, это должно быть лучше документировано и обсуждено, как вы предлагаете, что поднимает следующий квест: –

Смежные вопросы