Plone, создавая виджет из формы - PullRequest
1 голос
/ 12 июня 2011

У меня есть фрагмент HTML-контента, который мне постоянно приходится обновлять на моей домашней странице.В идеале я хочу перейти на страницу, заполнить форму, чтобы данные формы заполнили фрагмент HTML (viewlet?)

Открыть для любых предложений.(создание пользовательского типа контента с использованием mysql db для его заполнения. что угодно!)

Ответы [ 2 ]

2 голосов
/ 12 июня 2011

Вы можете сделать это элегантно с помощью интерфейса маркера и archetypes.schemaextender . Предполагая, что ваша домашняя страница настроена как главная страница на новом сайте Plone - документ сделал вид сайта Plone по умолчанию - добавьте в свой пользовательский продукт interfaces.py:

class IHomepage(Interface):
    """Marker interface flagging a document as the homepage.
    """

А до configure.zcml:

<class class="Products.ATContentTypes.interfaces.document.IATDocument">
  <allow interface=".interfaces.IHomepage" />
</class>

В ZMI на вкладке Интерфейсы для главной страницы установите IHomepage в качестве предоставленного интерфейса.

Теперь вы можете зарегистрировать schemaextender, который применяется только к вашему объекту первой страницы.

Создать новый файл schemaextender.py.

from zope.component import adapts
from zope.interface import implements

from Products.Archetypes import atapi

from archetypes.schemaextender.field import ExtensionField
from archetypes.schemaextender.interfaces import ISchemaExtender

from interfaces import IHomepage

class HomepageBlurbTextField(ExtensionField, atapi.TextField):
    """Extra text for the homepage.
    """

class HomepageExtender(object):
    adapts(IHomepage)
    implements(ISchemaExtender)

    fields = [
        HomepageBlurbTextField('blurb',
            required=True,
            searchable=True,
            storage=atapi.AnnotationStorage(),
            validators=('isTidyHtmlWithCleanup',),
            default_output_type='text/x-html-safe',
            widget=atapi.RichWidget(
                label=u"Blurb",
                description=u"Make the site sound cool.",
                rows=25,
                allow_file_upload=False),
        ),

    ]

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

    def getFields(self):
        return self.fields

Добавить к configure.zcml:

<adapter factory=".schemaextender.HomepageExtender" />

(Это простой пример; см. Документацию к archetypes.schemaextender, чтобы узнать о более продвинутых функциях, таких как переупорядочение полей, регистрация только для определенного слоя браузера и т.

Перезапустите сайт, отредактируйте первую полосу и - эй presto - новое поле для вашей рекламы.

Теперь все, что вам нужно сделать, это отобразить его. Вы можете делать то, что вам нравится здесь, просто не забудьте зарегистрироваться для вашего IHomepage интерфейса. Допустим, вы хотели, чтобы объявление появилось в заголовке страницы:

In browser/viewlets.py:

from Acquisition import aq_inner
from plone.app.layout.viewlets import common

class HomepageHeaderViewlet(common.ViewletBase):

    @property
    def blurb(self):
        context = aq_inner(self.context)
        return context.getField('blurb').get(context)

В browser/homepageheader.pt:

<div id="homepage-blurb" tal:content="structure view/blurb|nothing" />

В browser/configure.zcml:

<browser:viewlet
    name="example.homepageheader"
    for="..interfaces.IHomepage"
    manager="plone.app.layout.viewlets.interfaces.IPortalTop"
    class=".viewlets.HomepageHeaderViewlet"
    template="homepageheader.pt"
    permission="zope.Public"
    />
0 голосов
/ 13 июня 2011

Это зависит от вашего варианта использования, но часто вы можете обойтись без кодирования, используя что-то вроде коллективный портлет с несколькими статическими текстовыми портлетами для создания нужной страницы. С plone.app.theming у вас есть возможность изменить HTML для ваших нужд.

например, наша новая домашняя страница http://www.pretaweb.com была создана с использованием plone.app.theming, коллективного.portletpage и Products.ContentWellPortlets.

Products.Collage - это еще одна альтернатива портлетной странице, которую мы также использовали.

...