-2

如何从 TAL Portlet(由 提供collective.portlet.tal)调用文件系统中的方法?

我是这样做的:我定义了一个新的 BrowserView (createPictMenu.py在我的例子中),然后将它注册为一个新的 portlet 组件的渲染器:

class AddressTAL(BrowserView)

    def my_address()
        address_bar = ViewTemplatePageFile('templates/address_left.pt') # this 
         is the page template I want for my new portlet.

并在configure.zcml

<plone:portlet
    name="collective.portlet.tal.TALPortlet"
    interface="collective.portlet.tal.talportlet.ITALPortlet"
    assignment="collective.portlet.tal.talportlet.Assignment"
    view_permission="zope2.View"
    edit_permission="cmf.ManagePortal"
    renderer=".browser.createPictMenu.AddressTAL"
    addview="collective.portlet.tal.talportlet.AddForm"
    editview="collective.portlet.tal.talportlet.EditForm"
    />

然后我转到 localhost:8080/myproject/@@manage-portlets 并TAL Portlet option从 Add Portlet 下拉列表中选择。我通知标题作为地址,为了描述,我插入了下面的代码片段来调用address_tal()

<span tal:define="global li view/myaddress">
    <span tal:replace="structure li" /> 
</span> 

不幸的是,它没有用。请帮忙。

4

2 回答 2

0

该方法在文件系统上的信息或问题很少。那是它应该在的地方。将它放在 ZODB 中是可能的,但这是一个坏主意。

但是有许多类型的方法,从 TAL 中调用它们的方式也不同。

您可以拥有 ZMI 中称为“脚本 (Python) 方法”的内容,可通过 portal_skins 访问,您可以拥有内容对象的方法,也可以拥有视图的方法。这些都可以从 TAL 调用。

对于这两者都不是的方法,您必须创建一个可以调用的上述类型的方法,然后再调用您要调用的方法。对于 portlet,创建该方法的明显位置是在 Renderer 上添加一个方法,这是一种视图,您可以从 portlets 模板中调用它。

在您的情况下,您要调用方法已经是渲染器上的方法。这意味着你只需调用它。

<p tal:content="view/myaddress" />

请注意,您忘记self了定义中的参数。另外,请关注PEP8

于 2013-08-29T06:11:13.037 回答
0

您应该使用 browser:view 指令注册您的类 AddressTAL,而不是 plone:portlet 指令。像这样:

<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:browser="http://namespaces.zope.org/browser">

  <browser:page
      name="address-view"
      class=".browser.createPictMenu.AddressTAL"
      for="*"
      permission="zope2.View"
      />

</configure>

然后调用它:

<div tal:define="my_address python:context.restrictedTraverse('@@address-view').my_address()" >
    Your method returns <span tal:content="my_address" />
</div>

或者:

<div tal:define="address_view context/@@address-view" >
    Your method returns <span tal:content="address_view/my_address" />
</div>
于 2013-08-29T09:20:17.540 回答