2012-01-23 9 views
3

Plone4用のコンテキストポートレットを作成します。このポートレットは、特定のフォルダーに追加され、それぞれのサブフォルダーに表示されます。ただし、ポートレットがどこに表示されていても、レンダラーのインスタンスでポートレットの割り当てコンテキスト(最初に配置された場所)にアクセスしたいと考えています。レンダラーインスタンスからPlone 4ポートレットの割り当てコンテキストにアクセスする

class Assignment(base.Assignment): 
    ... 

class Renderer(base.Renderer): 

    def base_folder(self): 
     # self.context is the current context. 
     # but how to access the folder, to which the portlet has been assigned? 

... 

self.managerとself.dataの「割り当て」コンテキストで検索されましたが、適切なものが見つかりませんでした。

self.contextからポートレットのあるフォルダまでのパスを検索するか、ポートレットの作成時にAssignmentのインスタンスに情報を保存するなど、いくつかの直接的な方法があるのだろうかと思います。

+0

は直接の解決策が、いくつかのポインタhttp://collective-docs.readthedocs.org/en/latest/portlets/tips.html#checking-if-a-certain-context-portlet-is-active -on-a-page –

+0

ありがとうございました。私はaqチェーンの検索を実装するようです。 –

答えて

3

私はポートレットの設定ダイアログに直接リンクを提供したいので、次のようになりました。

def settingsUrl(self): 
    # this is odd... should be much more straightforward? 
    # also, this is pretty slow. 
    manager = self.manager 
    context = self.context 
    assignment = self.data 

    allAss = [] 
    while not assignment in allAss: 
     pam = getMultiAdapter((context,manager), IPortletAssignmentMapping) 
     allAss = pam.values() 
     if assignment in allAss: 
      break 

     if IAcquirer.providedBy(context): 
      context=aq_parent(aq_inner(context)) 
     else: 
      context = context.__parent__ 

    return '%s/++contextportlets++%s/%s' % (context.absolute_url(), 
              manager.__name__, 
              assignment.__name__) 

UPD:私は、関数の最後でコンテキストの値は、あなたが欲しい物だと思います。 2014:ポートkey(割り当ての場所)、category(例: 'context')、manager(例: 'plone.rightcolumn')のポートレットレンダラーの__portlet_metadata__プロパティからこの情報をまとめて表示できるようにも見えます。およびname

+0

ありがとう!これは参考になります。特にIAcquirer状態。 –

0
class Renderer(base.Renderer): 

    def your_method(self): 
     assignment_context_path = self.__portlet_metadata__['key'] 
     assignment_context = self.context.restrictedTraverse(assignment_context_path)  
関連する問題