Включите скрипты Python с надстройкой Plone

У меня есть надстройка Plone (созданная через Zope), которая включает Javascript и файлы шаблонов страниц. Некоторым функциям Javascript необходимо вызывать скрипты Python (через вызовы AJAX) — как включить эти скрипты Python в мой аддон, не проходя через ZMI?

У меня есть папка «браузер», которая содержит файл «configure.zcml» — регистрацию каталогов ресурсов и моих файлов шаблонов. Я бы предположил, что регистрация файлов Python будет аналогична этому или аналогична тому, как регистрируются файлы Javascript, но, возможно, нет?


person lightningmanic    schedule 01.06.2011    source источник


Ответы (1)


Вы регистрируете свой python как Views в объекте контента:

<browser:page
 for="**INTERFACE**"
 name="**name**"
 class="**class**"
 attribute="**method**"
 permission="zope2.View"
 />

Где ИНТЕРФЕЙС — это интерфейс объекта, для которого вы хотите иметь представление, имя — это имя представления (т. е. http://path-to-object/@@name), класс — это класс Python, в котором определен ваш скрипт, а attribute – необязательный метод класса (по умолчанию он __call__). Строго говоря, я думаю, что класс — это любой вызываемый объект, а не обязательно метод класса.

Это сценарий, который я использую для действия kss (почти то же самое, что и написание ваших собственных сценариев AJAX) — вашему классу может потребоваться наследовать от BrowserView (PloneKSSView — это специализация для представлений KSS):

<browser:page
 for="Products.VirtualDataCentre.interfaces.IDDCode"
 name="getTableColumns"
 class="Products.VirtualDataCentre.browser.DDActions.DDActions"
 attribute="getTableColumns"
 permission="zope2.View"
 />

где IDDCode — это тип контента, для которого мне нужно представление, а DDActions.py содержит:

from Products.Five import BrowserView
from plone.app.kss.plonekssview import PloneKSSView
class DDActions(PloneKSSView):
    def getTableColumns(self, table, currValue, currLabel):
        columns = self.context.getColumnNames(table)
        for (field, curr) in [('valueColumn', currValue), ('labelColumn',currLabel)]:
            self.replaceSelect(field, columns, (curr or self.context[field]))
person Auspex    schedule 01.06.2011
comment
@blacksheep См. исправленный ответ - person Auspex; 02.06.2011
comment
Именно то, что я искал! Спасибо! - person lightningmanic; 02.06.2011