将标记接口应用于请求,以实现子部分的特殊展示。
项目描述
部分子皮肤
================
部分子皮肤是一个将接口应用于请求的系统,该请求映射为
描述站点子部分的主题应该如何更改。
这些映射不会自动更改主题中的内容,但它们
可在Zope3样式的浏览器视图中以条件包含的形式使用。
目前推荐的做法(因为DTML视图不受支持)
是创建一个使用TAL而不是标准DTML方法的视图,该方法用于
生成自定义CSS文件。
从`collective.sectionsubskin.browser.subskin.SubSkin`继承的浏览器视图
设置了一个“子皮肤”变量,该变量可以从视图中访问。
例如,如果所有子皮肤都包含一个`colour`属性,则可以使用以下方式找到当前颜色:
<tal:colour replace="view/subskin/colour" on-error="string:MyDefaultColour"/>
无聊的导入和设置(移动到tests.py?)。你可能希望忽略所有这些:
>>> from zope.app.testing import ztapi
>>> import zope.interface
>>> from AccessControl.SecurityManagement import newSecurityManager
>>> from AccessControl.User import UnrestrictedUser
>>> from Testing.makerequest import makerequest
>>> app = makerequest(app)
>>> portal = portal.__of__(app)
>>> newSecurityManager(None, UnrestrictedUser('god', '', ['Manager'], ''))
>>> from Products.Five.testbrowser import Browser
>>> browser = Browser()
>>> from Testing.ZopeTestCase import user_password
>>> browser.addHeader('Authorization', 'Basic %s:%s' % ('portal_owner', user_password)) # 只在视图是虚拟时需要,如果通过ZCML注册,我们将使用权限=zope2.View
创建新的主题定义非常简单:
>>> 从 collective.sectionsubskin.definition 导入 BaseDefinition
>>> 从 collective.sectionsubskin.interfaces 导入 ISubskinDefinition
>>> 从 collective.sectionsubskin.test_support 导入 IRedSkin, RedSkin
同样,在文件系统中,此代码的值是:
class IRedSkin(ISubskinDefinition)
pass
class RedSkin(BaseDefinition)
title = u"RedSkin"
colour = u"FF0000"
type_interface = IRedSkin
我们可以将此实例保存在列表中,以便以后对其进行操作:
>>> skins = []
>>> skins.append(RedSkin())
>>> skins
[<SectionSubSkin named RedSkin>]
>>> skins[0].colour
u'FF0000'
这些只是从 BaseDefinition 继承的基本 Python 对象,它还条件性地继承自 p4a.subtyper,并提供一些辅助方法。
这意味着您可以使用它们执行与正常对象相同的一切操作:
>>> 从 collective.sectionsubskin.test_support 导入 IBlueSkin, BlueSkin
>>> skins.append(BlueSkin())
>>> class IBlueSkin(ISubskinDefinition)
同样,在文件系统中,此代码的值是:
class BlueSkin(BaseDefinition)
pass
title = u"BlueSkin"
colour = u"0000FF"
type_interface = IBlueSkin
type_interface = IBlueSkin
现在,skins 变量包含两种皮肤:
>>> skins
[<SectionSubSkin named RedSkin>, <SectionSubSkin named BlueSkin>]
>>> skins[1].colour
u'0000FF'
现在,如果我们为网站创建一个浏览器视图(在 test_support 中注册):
>>> 从 collective.sectionsubskin.test_support 导入 colours
这些必须在文件系统代码中,这样 Zope 不会抛出错误,所以实际上是:
从 collective.sectionsubskin.browser.subskin 导入 SubSkin
class colours(SubSkin)
""" 颜色。 """
def render(self)
""" 渲染 CSS。 """
try
return """html { background-color: #%s; }""" % (self.subskin.colour)
except
return """"""
__call__ = render
def __of__(self, parent)
# 对于这个玩具示例,我们不关心获取
return self
我们可以直接实例化一个,通过浏览器导航到它或访问它:
>>> colours(portal, app.REQUEST).render()
''
>>> portal.unrestrictedTraverse("colours.css").render()
''
>>> browser.open("%s/colours.css" % self.portal.absolute_url())
>>> browser.contents
''
只有最后一种会触发子皮肤,因为它仅在遍历对象时激活 HTTP 请求。
由于根没有激活子皮肤,它正确地渲染了一个空字符串。
但是,如果我们创建一些子文件夹并为其分配子皮肤:
>>> red = portal[portal.invokeFactory("Folder","red")]
>>> zope.interface.alsoProvides(red, (IRedSkin, ))
>>> blue = portal[portal.invokeFactory("Folder","blue")]
>>> zope.interface.alsoProvides(blue, (IBlueSkin, ))
>>> noskin = portal[portal.invokeFactory("Folder","noskin")]
现在,当我们遍历到红色文件夹时,我们会看到红色皮肤:
>>> browser.open("%s/red/colours.css" % self.portal.absolute_url())
>>> browser.contents
'html { background-color: #FF0000; }'
但如果我们访问蓝色,我们会看到另一种选择:
>>> browser.open("%s/blue/colours.css" % self.portal.absolute_url())
>>> browser.contents
'html { background-color: #0000FF; }'
任何未标记的文件夹仍然没有子皮肤:
>>> browser.open("%s/noskin/colours.css" % self.portal.absolute_url())
>>> browser.contents
''
奇怪的遍历将给出遇到的最后一个皮肤:
>>> browser.open("%s/red/blue/colours.css" % self.portal.absolute_url())
>>> browser.contents
'html { background-color: #0000FF; }'
和:
>>> browser.open("%s/blue/red/colours.css" % self.portal.absolute_url())
>>> browser.contents
'html { background-color: #FF0000; }'
更改日志
=========
0.2
---
为遍历器添加了对在遍历新定义时删除现有子皮肤的支持
Matthew Wilkes
0.1
---
在 2.10 中运行良好。2.9 与 Five 1.4.4 一起运行,但不受支持。
MatthewWilkes
================
部分子皮肤是一个将接口应用于请求的系统,该请求映射为
描述站点子部分的主题应该如何更改。
这些映射不会自动更改主题中的内容,但它们
可在Zope3样式的浏览器视图中以条件包含的形式使用。
目前推荐的做法(因为DTML视图不受支持)
是创建一个使用TAL而不是标准DTML方法的视图,该方法用于
生成自定义CSS文件。
从`collective.sectionsubskin.browser.subskin.SubSkin`继承的浏览器视图
设置了一个“子皮肤”变量,该变量可以从视图中访问。
例如,如果所有子皮肤都包含一个`colour`属性,则可以使用以下方式找到当前颜色:
<tal:colour replace="view/subskin/colour" on-error="string:MyDefaultColour"/>
无聊的导入和设置(移动到tests.py?)。你可能希望忽略所有这些:
>>> from zope.app.testing import ztapi
>>> import zope.interface
>>> from AccessControl.SecurityManagement import newSecurityManager
>>> from AccessControl.User import UnrestrictedUser
>>> from Testing.makerequest import makerequest
>>> app = makerequest(app)
>>> portal = portal.__of__(app)
>>> newSecurityManager(None, UnrestrictedUser('god', '', ['Manager'], ''))
>>> from Products.Five.testbrowser import Browser
>>> browser = Browser()
>>> from Testing.ZopeTestCase import user_password
>>> browser.addHeader('Authorization', 'Basic %s:%s' % ('portal_owner', user_password)) # 只在视图是虚拟时需要,如果通过ZCML注册,我们将使用权限=zope2.View
创建新的主题定义非常简单:
>>> 从 collective.sectionsubskin.definition 导入 BaseDefinition
>>> 从 collective.sectionsubskin.interfaces 导入 ISubskinDefinition
>>> 从 collective.sectionsubskin.test_support 导入 IRedSkin, RedSkin
同样,在文件系统中,此代码的值是:
class IRedSkin(ISubskinDefinition)
pass
class RedSkin(BaseDefinition)
title = u"RedSkin"
colour = u"FF0000"
type_interface = IRedSkin
我们可以将此实例保存在列表中,以便以后对其进行操作:
>>> skins = []
>>> skins.append(RedSkin())
>>> skins
[<SectionSubSkin named RedSkin>]
>>> skins[0].colour
u'FF0000'
这些只是从 BaseDefinition 继承的基本 Python 对象,它还条件性地继承自 p4a.subtyper,并提供一些辅助方法。
这意味着您可以使用它们执行与正常对象相同的一切操作:
>>> 从 collective.sectionsubskin.test_support 导入 IBlueSkin, BlueSkin
>>> skins.append(BlueSkin())
>>> class IBlueSkin(ISubskinDefinition)
同样,在文件系统中,此代码的值是:
class BlueSkin(BaseDefinition)
pass
title = u"BlueSkin"
colour = u"0000FF"
type_interface = IBlueSkin
type_interface = IBlueSkin
现在,skins 变量包含两种皮肤:
>>> skins
[<SectionSubSkin named RedSkin>, <SectionSubSkin named BlueSkin>]
>>> skins[1].colour
u'0000FF'
现在,如果我们为网站创建一个浏览器视图(在 test_support 中注册):
>>> 从 collective.sectionsubskin.test_support 导入 colours
这些必须在文件系统代码中,这样 Zope 不会抛出错误,所以实际上是:
从 collective.sectionsubskin.browser.subskin 导入 SubSkin
class colours(SubSkin)
""" 颜色。 """
def render(self)
""" 渲染 CSS。 """
try
return """html { background-color: #%s; }""" % (self.subskin.colour)
except
return """"""
__call__ = render
def __of__(self, parent)
# 对于这个玩具示例,我们不关心获取
return self
我们可以直接实例化一个,通过浏览器导航到它或访问它:
>>> colours(portal, app.REQUEST).render()
''
>>> portal.unrestrictedTraverse("colours.css").render()
''
>>> browser.open("%s/colours.css" % self.portal.absolute_url())
>>> browser.contents
''
只有最后一种会触发子皮肤,因为它仅在遍历对象时激活 HTTP 请求。
由于根没有激活子皮肤,它正确地渲染了一个空字符串。
但是,如果我们创建一些子文件夹并为其分配子皮肤:
>>> red = portal[portal.invokeFactory("Folder","red")]
>>> zope.interface.alsoProvides(red, (IRedSkin, ))
>>> blue = portal[portal.invokeFactory("Folder","blue")]
>>> zope.interface.alsoProvides(blue, (IBlueSkin, ))
>>> noskin = portal[portal.invokeFactory("Folder","noskin")]
现在,当我们遍历到红色文件夹时,我们会看到红色皮肤:
>>> browser.open("%s/red/colours.css" % self.portal.absolute_url())
>>> browser.contents
'html { background-color: #FF0000; }'
但如果我们访问蓝色,我们会看到另一种选择:
>>> browser.open("%s/blue/colours.css" % self.portal.absolute_url())
>>> browser.contents
'html { background-color: #0000FF; }'
任何未标记的文件夹仍然没有子皮肤:
>>> browser.open("%s/noskin/colours.css" % self.portal.absolute_url())
>>> browser.contents
''
奇怪的遍历将给出遇到的最后一个皮肤:
>>> browser.open("%s/red/blue/colours.css" % self.portal.absolute_url())
>>> browser.contents
'html { background-color: #0000FF; }'
和:
>>> browser.open("%s/blue/red/colours.css" % self.portal.absolute_url())
>>> browser.contents
'html { background-color: #FF0000; }'
更改日志
=========
0.2
---
为遍历器添加了对在遍历新定义时删除现有子皮肤的支持
Matthew Wilkes
0.1
---
在 2.10 中运行良好。2.9 与 Five 1.4.4 一起运行,但不受支持。
MatthewWilkes
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源分发
collective.sectionsubskin-0.2.tar.gz (15.1 kB 查看哈希值)
构建分发
collective.sectionsubskin-0.2-py2.4.egg (21.1 kB 查看哈希值)
关闭
collective.sectionsubskin-0.2.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 27530a013dd2e8a343dbb981c63c0b557143d185369f3ca7799ea9db1851d12d |
|
MD5 | ced314769d89aaf0de38ce21d40fd123 |
|
BLAKE2b-256 | 7b75e21c1fd5bdab0046162cf7e7f14ae8478b340ffaa9759d48a4c185141e0b |
关闭
collective.sectionsubskin-0.2-py2.4.egg 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e6e9c1c0ce55a34272ae780afd870b78967846fa98557d77899f4e9e2614f0dc |
|
MD5 | 95d8427b3b82fa0822b90becfbf8fec4 |
|
BLAKE2b-256 | 85a2caf11b6a242023b9d236c03add1a6c87d460bcb046794e48f742b3d6cd8c |