跳转到主要内容

将标记接口应用于请求,以实现子部分的特殊展示。

项目描述

部分子皮肤
================

部分子皮肤是一个将接口应用于请求的系统,该请求映射为
描述站点子部分的主题应该如何更改。
这些映射不会自动更改主题中的内容,但它们
可在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 查看哈希值)

上传时间

支持者