Найти - Пользователи
Полная версия: можно ли из ZMI доступиться ко вложенным методам подчиненного класса.
Начало » Zope/Plone/Bluebream » можно ли из ZMI доступиться ко вложенным методам подчиненного класса.
1 2 3
misha111
Здравствуйте, вот такая проблема в ZOPE 3: есть два класса
класс1, он создаёт класс2 и держит его как свойство, свойство класса1
у класса1 есть метод1,
у класса2 есть метод2.

метод2 возвращает строку ‘2’

метод1 вызывает метод2 и возвращает то, что вернул метод2, то есть 2.

У класса1 есть шаблон, он вызывает view.метод1 и на экране появляется2
также в шаблоне можно вызвать, view.класс2.метод2, и на экране тоже появляется 2

Всё отличненько работает из шаблонов, расположенных в файлах *.pt
также в шаблоне можно вызвать, view.класс2.метод2, и на экране тоже появляется 2

но теперь я пытаюсь перенести эту логику на ZMI, так как в разрабатываемом проекте сами шаблоны не наполнены а всего лишь переадресовывают на соответствующие макросы ZMI страниц, где всё описано.
И тут начинается самое интересное, я просто попробовал вставить строку вызова метода вложенного класса, например
<span tal:content=“python: view.Class2ImplObj.method2()”></span>
тоесть я обращаюсь к полю текущего класса (class1), которое является динамически созданным объектом класса 2, и на экран я получаю ‘2’ - то есть результат віполнения класс2.метода2

но как только я эту беду вставляю в ZMI страницу, где описано тело шаблона в виде макроса - вывадивается ошибка Forbidden attribute класс2.метода2

Кто нить что нить может по єтому поводу сказать? То есть решение есть простое - нужно просто сделать метод, которій будет опрашивать вложенный класс и возвращать результат в макрос, описанный в ZMI странице, но такое решение не очень красивое, может как то можно что то по другому, типа отключть запрещение візівать методі вложенній классов.
regall
А можно посмотреть ZCML настройку контент объектов? Скорее всего неверно настроены права.
misha111
макросы ZMI страниц
Это еще что такое?
misha111
<browser:addMenuItem
class=“.class2.Class2”
title=“class2”
permission=“zope.ManageContent” />

<browser:page
for=“.class2.IClass2”
name=“class2.html”
class=“.class2.Class2Impl”
permission=“zope.Public”
template=“templ2.pt”
menu=“zmi_views”
title=“class2”/>

вот например как описан класс 2 в ZCML, класс 1 описан так же.

ZPT Page в админке, макрос описан так. страница называется common, макрос top_menu
<tal:block metal:define-macro=“top_menu”>
<span tal:content=“python: view.method1()”></span>
</tal:block>

в шаблоне вызывется макрос так
<html>
<head>
<title>class</title>
<meta http-equiv=“Content-Type” content=“text/html;charset=utf8” />
<meta http-equiv=“Pragma” content=“no-cache” />
</head>
<body>
<span tal:content=“python: view.method1()”></span><br>
<span tal:content=“python: view.Class2ImplObj.method2()”></span><br>
<tal:block metal:use-macro=“context/../common/macros/top_menu” />
</body>
</html>
regall
нет, не это, тут вы привели zcml - настройку видов, а нужна zcml - настройка контент-объектов, а именно определение прав у объектов на интерфейсы или их части, то есть типа такого:
...
xmlns = 'http://namespaces.zope.org/zope'
...
<class class = ".class2.Class2">
<factory id = "myapp.class2.Class2" />
<implements interface = ".class2.IClass2" />
<require permission = "zope.ManageContent" set_schema = ".class2.IClass2" />
<require permission = "zope.Public" interface = ".class2.IClass2" />
</class>
Сдесь теги <require … /> указывают права доступа к атрибутам объекта, определенными в схеме объекта.
Такое описание обязательно должно присутствовать для каждого контент-объекта в приложении.

В случае же, если объект класса, который является атрибутом другого класса, не входит в схемы контент-объекта, можно описать тегом <require … /> следующим способом:
...
<require permission = "<право доступа>" attributes = "<имя атрибута 1> <имя атрибута 2> ... <имя атрибута n>" />
...
misha111
Вы знаете, действительно не привёл настройку контент объекта, потому что её нет :-(
Помогло лечение путём настройки контент объекта.
<class class = “.class1.Class1Impl”>
<factory id = “myapp.class1.Class1” />
<implements interface = “.class1.IClass1” />
<require permission = “zope.ManageContent” set_schema = “.class1.IClass1” />
<require permission = “zope.Public” interface = “.class1.IClass1” />
<require permission = “zope.Public” attributes = “method1” />
</class>
Спасибо за помощь :-) Не ожидал что тут так быстро могут помочь дельным советом, и не посылают читать книжку :-)
regall
misha111
Спасибо за помощь :-) Не ожидал что тут так быстро могут помочь дельным советом, и не посылают читать книжку :-)
Не посылают, потому что книжек по Zope3 стоящих внимания, по-моему, всего одна:
- Web Component Development with Zope 3. Вот даю ссылочку: http://python.su/forum/viewtopic.php?pid=8349#p8349.
Книга стоит внимания, очень доходчиво написана, вот только на английском, но если вас это не смущает, то очень поможет =)
misha111
я б рад почитать, тем более на английском, но похоже с файлообменника удалили книгу :-(
если кому надо будет “попросили удалить”
вроде б та, о которой разговор был
regall
misha111
я б рад почитать, тем более на английском, но похоже с файлообменника удалили книгу :-(
Google вас спасет, думаю поискать, откуда скачать на шару, займет не более 5 минут =)
misha111
да уж. рано я обрадовался, по тому же вопросу новая проблема - модифицируемый проект имеет свою структуру, когда например
класс 2 находится не в корневой папке а во вложенной, /класс/класс2
Вот пока в корне - /класс2 , всё хорошо, но когда я этот же класс 2 перемещаю во вложенную папку, изменяя соответственно объявления в pack-incl, опять старая проблема - из zpt страниц перестаёт вызываться, а из шаблона на диске работает как ни в чём не бывало.
Уже поперепробовал все варианты модификации настройкиконтента класса, после которых зоуп запускается - ничего не помогает. Уж и не пойму на зоуп пинять или на себя, вроде ж всё должно работать без изменений, независимо от того - в корне или нет лежит класс.

Сначало думал что это может из за чего нибудь, внутри самого класса, на который я переношу логику таких вызовов, попробовал простой класс2 сделать во вложенный папке, и всё, опять ForbiddenAttribute
regall
1. Для нового вопроса лучше создайте новый топик (это так, к слову).
2. Возможно, вы когда перенесли во вложенную папку (кстати package-includes не надо менять), нужно в configure.zcml, который лежит в корне дописать:
<include package = ".class2" />
При этом желательно перенести конфигурацию Class2 в configure.zcml, который расположен в папке /класс/класс2

P.S. Лучше сразу строить “правильные структуры пакетов”. Если вы разрабатываете компонент, в который входят контент-объекты “класс” и “класс2”, то сделайте дерево
- компонент/
- - класс
- - - configure.zcml # (тут пишем “… <include package = ”.browser“ /> … ”)
class.py
browser/
- - - - configure.zcml
view.py
template.pt
configure.zcml # ( тут пишем “… <include package = ”.класс“ /> <include package = ”.класс2“ /> … ”)
- - класс2

В общем идея остается таковой же: в package-includes.zcml добавляем только корень, в корневой папке делаем инклуды всех папок, которые находятся на уровень ниже, и т.д.
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