Форум сайта python.su
Здравствуйте, вот такая проблема в 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 странице, но такое решение не очень красивое, может как то можно что то по другому, типа отключть запрещение візівать методі вложенній классов.
Офлайн
А можно посмотреть ZCML настройку контент объектов? Скорее всего неверно настроены права.
misha111Это еще что такое?
макросы ZMI страниц
Отредактировано (Ноя. 12, 2009 19:23:05)
Офлайн
<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>
Отредактировано (Ноя. 12, 2009 21:25:01)
Офлайн
нет, не это, тут вы привели 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 permission = "<право доступа>" attributes = "<имя атрибута 1> <имя атрибута 2> ... <имя атрибута n>" />
...
Отредактировано (Ноя. 13, 2009 01:50:32)
Офлайн
Вы знаете, действительно не привёл настройку контент объекта, потому что её нет :-(
Помогло лечение путём настройки контент объекта.
<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>
Спасибо за помощь :-) Не ожидал что тут так быстро могут помочь дельным советом, и не посылают читать книжку :-)
Отредактировано (Ноя. 13, 2009 12:14:52)
Офлайн
misha111Не посылают, потому что книжек по Zope3 стоящих внимания, по-моему, всего одна:
Спасибо за помощь :-) Не ожидал что тут так быстро могут помочь дельным советом, и не посылают читать книжку :-)
Офлайн
я б рад почитать, тем более на английском, но похоже с файлообменника удалили книгу :-(
если кому надо будет “попросили удалить”
вроде б та, о которой разговор был
Отредактировано (Ноя. 16, 2009 16:14:41)
Офлайн
misha111Google вас спасет, думаю поискать, откуда скачать на шару, займет не более 5 минут =)
я б рад почитать, тем более на английском, но похоже с файлообменника удалили книгу :-(
Офлайн
да уж. рано я обрадовался, по тому же вопросу новая проблема - модифицируемый проект имеет свою структуру, когда например
класс 2 находится не в корневой папке а во вложенной, /класс/класс2
Вот пока в корне - /класс2 , всё хорошо, но когда я этот же класс 2 перемещаю во вложенную папку, изменяя соответственно объявления в pack-incl, опять старая проблема - из zpt страниц перестаёт вызываться, а из шаблона на диске работает как ни в чём не бывало.
Уже поперепробовал все варианты модификации настройкиконтента класса, после которых зоуп запускается - ничего не помогает. Уж и не пойму на зоуп пинять или на себя, вроде ж всё должно работать без изменений, независимо от того - в корне или нет лежит класс.
Сначало думал что это может из за чего нибудь, внутри самого класса, на который я переношу логику таких вызовов, попробовал простой класс2 сделать во вложенный папке, и всё, опять ForbiddenAttribute
Отредактировано (Ноя. 13, 2009 16:29:15)
Офлайн
1. Для нового вопроса лучше создайте новый топик (это так, к слову).
2. Возможно, вы когда перенесли во вложенную папку (кстати package-includes не надо менять), нужно в configure.zcml, который лежит в корне дописать:
<include package = ".class2" />
Отредактировано (Ноя. 13, 2009 18:29:48)
Офлайн