Найти - Пользователи
Полная версия: Help, please! Zope 3
Начало » Zope/Plone/Bluebream » Help, please! Zope 3
1
lissa
Есть класс А с интерфейсом:
class ClassA(zope.interface.Interface):
name = TextLine(title=u“Name”, required=True)
value = TextLine(title=u“Value”, required=False)
1). Поле select:
Есть класс B интерфейс которого должен иметь
атрибут - выпадающий список с именами (атрибут name) существующих
объектов класса А.
Как это можно осуществить? Пожалуйста помогите!!!
astoon
Обычно лучше проиндексировать твои объекты, предоставляющие интерфейс IClassA. Тогда в схеме второго интерфейса используем словарь собранный на основе индексов.
Если выбирать нужно только один объект из списка, тогда
interfaces.py ::
class IFoo(Interface):
selected = Choice(
title = u'Choice object',
required = False,
vocabulary = 'foo.vocabulary')
Теперь код словаря (могут быть другие варианты, я почти скопировал из своего текущего проекта). В данном случае в поле selected интерфейса IFoo хранятся именно индексы объектов (в этом есть плюсы и есть минусы, зависит от конкретного случая), ну а в форме отображается name.
vocabulary.py
from zope.component import getUtility
from zope.schema.vocabulary import SimpleTerm, SimpleVocabulary
from zope.security.proxy import removeSecurityProxy
from zope.app.intid.interfaces import IIntIds
from zope.app.catalog.interfaces import ICatalog

def fooVocabulary(context):
catalog = getUtility(ICatalog)
intids = getUtility(IIntIds)
result = catalog.apply({'class_a_index':{'any':None}},)
class_a_objects = [(id, removeSecurityProxy(intids.getObject(id)).name) for id in result]
terms = [SimpleTerm(value=id, token=id, title=name) for (id, name) in class_a_objects]
return SimpleVocabulary(terms)
Теперь зарегистрируем эту функцию как утилиту. configure.zcml ::
 <utility
provides="zope.schema.interfaces.IVocabularyFactory"
component=".vocabulary.fooVocabulary"
name="foo.vocabulary"
/>
Остается тольк позаботиться о создании индекса ‘class_a_index’. Обычно это делается не ручным кликанием в ZMI, а в коде. Но можешь и вручную - добавь в сайт-менеджер каталог и в него индекс по любому полю для ICLassA, название индекса в данном случае, в примере - ‘class_a_index’. Про утилиту IIntIds только не забудь.

Однако если объекты ClassA однозначно находятся в каком-то одном контейнере - лучше чтоб утилита предоставляющая словарь читала не индексы, и values() этого контейнера, ИМХО.
lissa
Спасибо огромное! сегодня попробую все сделать!!!
lissa
Опять проблема! Через ZMI проиндексировать не могу, когда делаю индекс “страницу невозможно отобразить”. А как проиндексировать в коде понятия не имею! Помогите чем сможете!!!
astoon
Не понял.
Что именно в ZMI делаешь ? Индексируется все автоматически при добавлении объектов.
В коде при добавлении обхекта:
from zope.lifecycleevent import ObjectCreatedEvent
from zope.event import notify

some_object = ... ... ...

notify(ObjectCreatedEvent(some_object))
some_container[id] = some_object
это событие само вызывает все что нужно. Также есть ObjectModifiedEvent.
В атоматом сгенерированных формах это уже есть.
lissa
Нужно проиндексировать объекты, предоставляющие интерфейс IClassA. (см. выше) В ZMI сделать нечего не получается. В закладке «Управление сайтом» добавляю генератор уникальных идентификаторов, каталог (имя по умолчанию), в каталоге добавляю индекс по полям, ссылаюсь на интерфейс нужного класса и в результате «Невозожно отобразить страницу»! Как сделать все правильно??? И как сделать это в коде???
astoon
lissa
Нужно проиндексировать объекты, предоставляющие интерфейс IClassA. (см. выше) В ZMI сделать нечего не получается. В закладке «Управление сайтом» добавляю генератор уникальных идентификаторов, каталог (имя по умолчанию), в каталоге добавляю индекс по полям, ссылаюсь на интерфейс нужного класса и в результате «Невозожно отобразить страницу»! Как сделать все правильно??? И как сделать это в коде???
Может ты не зарегистрировал утилиту IIntIds и каталог, а только добавил их в контейнер ? …
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB