一种使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

编辑main_content.html文件以编辑页面的主要内容。小心 但是-不要重命名它,也不要保存无效的xhtml。关键是 知道这一点的竞争性开发人员应该被授予WebDAV访问权限。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java apache Jclouds与quarkus兼容吗?   java Switch语句和字符串到字节   java在Windows中处理unix路径   java将XML中的不同值插入数据库表   Android Room中带日期的java查询   java如何将vaadin7与googlemap连接起来   java有条件地忽略特定属性DTO   数据库中的java Spring最后一个ID作为JSP中的默认输入值。。怎样   java创建和使用匿名可运行类的最佳方法   关于布尔语句中参数的java问题   java JMH:无法创建SecurityManager:worker。组织。格拉德尔。过程内部的工人小孩BootstrapSecurityManager   JavaXMLStreamReader编码   java Hibernate空指针位于AbstractUserTypeHibernateIntegrator用户类型   安卓支持v7。小装置。在使用安卓 studio的java文件中找不到工具栏?   java从res文件夹中读取名为的文件(从变量读取)   java如何解决“图形设备初始化失败:d3d、sw”问题   java字节缓冲区可以用作“长寿”静态对象吗?   java如何获取currentlyloggedin用户的用户名   java如何优雅地检测SSL