一种使zope网站页面内容可管理的简单方法
largeblue.pages的Python项目详细描述
largeblue.pages旨在解决一个相当常见、相对简单的web开发 要求:
- 网站的所有或部分页面需要通过所见即所得编辑器进行编辑 (例如:由客户或非技术网站管理员提供)
- 但是,网站的开发人员绝对不想编辑 页面内容通过所见即所得编辑器,它们(您)希望使用它们(您的) 普通文本编辑器和可能的版本控制等。
- 网站的某些页面可能不适合通过所见即所得进行编辑 (例如:当javascript用于 定制页) 网站结构应该是灵活的,所以新的页面和部分 可递归添加,无需重新开发
大蓝页:
- 提供页容器和页内容对象,其中页可以包含任何 子页数等无限
- 页面的内容属性设置为由所见即所得编辑器编辑(实际上, 我们配置并修补默认的z3c.widget.tiny wysiwyg小部件,以确保 它存储有效的xhtml,并且输出源代码嵌套包含每个元素 缩进2个空格)
- 每个页面及其HTML内容也可以由WebDAV(largeblue.page s)访问 使用bebop.webdav修补zope.app.dav/z3c.dav提供读写功能 webdav access),使页面显示为文件夹,其中包含main\u content.html 以及任何数量的其他页面文件夹。这样,整个页面结构 可以在不靠近Web浏览器的情况下进行编辑。
还有一些其他有用的功能:
- @@edit.html和@ordering.html是挂在页面上的自定义zmi视图,可以 添加到管理员皮肤中,其中@ordering.html(称为“管理内容”) 提供基于largeblue.order和so页面的自定义可订购容器视图 可上下移动、重命名、剪切粘贴、删除和添加等。
- 每个页面容器都有一个名为“index”的属性,该属性在任何时候都包含 当前页面结构的快照(无论何时创建页面, 发生修改或删除事件)-注意,可以有多个页面容器 他们都有自己的索引吗
- 每一页的目标名必须是一个“无交叉浏览器”的 问题的文本片段
- 页面有一个flag属性,打算在视图类中引用(请参见 /browser/index.py)来控制它们是否是只呈现 需要特殊大小写的可管理内容或定制页面
要使用largeblue.pages,只需将包添加到site.zcml(或 等效)(包括largeblue.pages包和overrides.zcml 作为替代)。
不管怎样,让我们看看它的实际效果。
>>> import transaction, pprint >>> from zope.component import createObject >>> from zope.event import notify >>> from zope.lifecycleevent import ObjectCreatedEvent >>> from zope.lifecycleevent import ObjectModifiedEvent >>> from bebop.ordering.interfaces import IOrdering, IOrderable >>> from largeblue.pages.interfaces import IPage, IPageContainer, IFile >>> from largeblue.pages.page import PageContainer
创建页面容器。
>>> app['pages'] = PageContainer()
创建页面。
>>> page1 = createObject('largeblue.pages.Page') >>> page1.__name__ = 'page1' >>> page1.title = u'Page 1' >>> for item in page1: ... print item ... >>> page1.content u'' >>> page1.flag u'Static'
将其添加到容器中并触发创建的事件。
>>> app['pages']['page1'] = page1 >>> notify(ObjectCreatedEvent(page1))
现在我们看到它包含一个名为html_content.html的文件 可通过页面的内容属性编辑。
>>> page1 = app['pages']['page1'] >>> for item in page1: ... print item ... main_content.html >>> page1['main_content.html'].contentType 'text/html' >>> page1.content '<div>Under construction</div>' >>> page1['main_content.html'].data '<div>Under construction</div>' >>> page1['main_content.html'].data = '<div>Foo bar</div>' >>> page1['main_content.html'].data '<div>Foo bar</div>' >>> page1.content '<div>Foo bar</div>' >>> page1.content = '<div>Under construction</div>' >>> page1.content '<div>Under construction</div>' >>> page1['main_content.html'].data '<div>Under construction</div>'
让我们看看页面容器的index属性:
>>> pages = app['pages'] >>> for item in pages: ... print item ... page1 >>> pages.index [{'title': u'Page 1', 'pages': [], 'label': u'page1'}] >>> page2 = createObject('largeblue.pages.Page') >>> page2.__name__ = 'movies' >>> page2.title = u'Movies' >>> pages['movies'] = page2 >>> for item in pages: ... print item ... movies page1 >>> notify(ObjectCreatedEvent(page2)) >>> pages.index [{'title': u'Page 1', 'pages': [], 'label': u'page1'}, {'title': u'Movies', 'pages': [], 'label': u'movies'}]
我们可以在页面内嵌套页面:
>>> page3 = createObject('largeblue.pages.Page') >>> page3.__name__ = 'horror' >>> page3.title = u'Scary Horror Films' >>> notify(ObjectCreatedEvent(page3)) >>> pages['movies']['horror'] = page3 >>> page4 = createObject('largeblue.pages.Page') >>> page4.__name__ = 'texas' >>> page4.title = u'The Texas Chainsaw Massacre' >>> notify(ObjectCreatedEvent(page4)) >>> pages['movies']['horror']['texas'] = page4
再次检查索引:
>>> pprint.pprint(pages.index) [{'title': u'Page 1', 'pages': [], 'label': u'page1'}, {'label': u'movies', 'pages': [{'label': u'horror', 'pages': [{'label': u'texas', 'pages': [], 'title': u'The Texas Chainsaw Massacre'}], 'title': u'Scary Horror Films'}], 'title': u'Movies'}]
其思想是索引可以被动态导航引用,例如 每一次都要遍历书页的继承权。关键在于 对页面进行排序,以便可以控制导航项的顺序 显示。
我们已经修补了贝博普。为了达到这个目的。让我们看看根 集装箱订单:
>>> IOrdering(pages).getNames() [u'page1', u'movies'] >>> IOrdering(pages).keys() [0, 1] >>> IOrdering(pages).upOne([1]) >>> IOrdering(pages).getNames() [u'movies', u'page1'] >>> notify(ObjectModifiedEvent(pages)) >>> pprint.pprint(pages.index) [{'label': u'movies', 'pages': [{'label': u'horror', 'pages': [{'label': u'texas', 'pages': [], 'title': u'The Texas Chainsaw Massacre'}], 'title': u'Scary Horror Films'}], 'title': u'Movies'}, {'title': u'Page 1', 'pages': [], 'label': u'page1'}]
在largeblue.order.readme.txt中有更多关于这个的内容,基本上就是我们所做的 将订购容器的可订购内容限制为仅包含页面:
>>> for item in page3: ... print item ... main_content.html texas >>> IOrdering(page3).getNames() [u'texas']
另外,我们还扩展了ordering container视图的功能,以适应 “正常”的行为。这边是行政滑雪板n zmi层只需要暴露 @@edit.html和@ordering.html视图,因此隐藏除 页面容器视图中的页面(例如:main_content.html、.svn文件等)。
要通过WebDAV连接到页面结构,只需连接到站点实例, 例如:http://localhost:8080然后,瞧,你会看到一个类似这样的结构:
- 页面
- 第1页
- main_content.html
- 电影
- main_content.html
- 德克萨斯州
- main_content.html
- 第1页
编辑main_content.html文件以编辑页面的主要内容。小心 但是-不要重命名它,也不要保存无效的xhtml。关键是 知道这一点的竞争性开发人员应该被授予WebDAV访问权限。