Plone 如何通过从TAL portlet调用模板页的方法来呈现模板页(@@manage portlet)

Plone 如何通过从TAL portlet调用模板页的方法来呈现模板页(@@manage portlet),plone,portlet,zope,Plone,Portlet,Zope,如何从collective.Portlet.TAL提供的TALPortlet调用文件系统中的方法 我就是这样做的:在我的例子中,我定义了一个新的BrowserView createPictMenu.py,然后将其注册为新portlet组件的呈现程序: class AddressTAL(BrowserView) def my_address() address_bar = ViewTemplatePageFile('templates/address_left.pt')

如何从collective.Portlet.TAL提供的TALPortlet调用文件系统中的方法

我就是这样做的:在我的例子中,我定义了一个新的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中:


不幸的是,它不起作用。请提供帮助。

该方法位于文件系统中,没有多少信息或问题。这就是它应该在的地方。在ZODB中使用它是可能的,但这不是一个好主意

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

您可以拥有ZMI中称为脚本Python的方法,这些方法可以通过portal_皮肤访问,可以拥有内容对象上的方法,也可以拥有视图上的方法。这些都可以从好未来那里调用

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

在您的情况下,要调用的方法已经是渲染器上的方法。这意味着你可以直接打电话给它

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

请注意,您忘记了定义中的self参数。还有,请跟我来

您应该使用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>
或:


如果只更改渲染器,则应使用plone:portletRenderer。请允许我问一下,定制的最终目标是什么?因为我认为collective.portlet.tal不是您所需要的。我创建了我的tal portlet。我想获取tal portlet中filesystemcreatePictMenu.py中一个类的方法的返回值。如何在TAL Portletin zmi中访问该方法…@@mat:我将向您发送一个链接,我想我已经清楚地解释了我的需要。所以,请看一看,这样您就有了一个呈现模板的模板,该模板调用了一个呈现模板的方法。什么使你认为这是个好主意?投票结束,因为你没有解释问题是什么。python:view.myaddress是调用portlet呈现程序视图方法的正确方法。@@regebro:我不想在zmi脚本中放入taladdress方法。为什么意味着。类和方法不是真正独立的。它的一些值由creatPictMenu.py中的另一个类获取。因此,将该方法单独放在zmi脚本中不是一个好主意@@regebro:因此,我唯一能做的就是从文件系统调用该方法,以获取TAL中的返回值Portlet@nirmala:你的评论就像随机生成的文本,毫无意义。我不想在zmi脚本中放入taladdress方法我没叫你这么做。事实上我告诉过你不要那样做。读我的答案。解释您不理解的单词。@@regebro:您说过,您可以使用ZMI中称为脚本Python的方法,这些方法可以通过portal_皮肤访问,可以使用内容对象上的方法,也可以使用视图上的方法。这些都可以从好未来那里调用。thays我告诉过你,我不想把这个方法直接放在zmi脚本中@@regebro:我不明白你告诉我的关于这两种方法的部分,你必须创建一个你可以调用的上述类型的方法,然后再调用你想调用的方法。对于portlet,创建该方法的明显位置是在呈现器上添加一个方法,这是一种视图类型,您可以从portlet模板调用它。AddressTAL视图实际上就是portlet呈现器。因此,视图/我的地址应该足够了。我猜问题在于他们忘记了自己。但是因为他们没有提供错误消息…@@Davi Lima:嗨,Davi,谢谢你的消息,现在我得到了一些什么输出。但我必须修正它,以获得我所期望的准确输出。谢谢你的帮助@@Davi:嗨,TAL portlet工作得很好,但现在的问题是我只是得到了整个addressleft.pt html代码。但我希望它只显示内容,而不是整个代码。所以我必须进一步改变。
<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>