ファイルシステムで開発されたカスタム ポートレットを更新するための ajax コールバック ブラウザー ビューには、ajax 要求を生成するポートレットの関連付けられたポートレット割り当てを取得する次のコードがあります。
def getPortletById(self, content, portletManager, key, name):
manager = getUtility(IPortletManager, name=portletManager, context=content)
retriever = getMultiAdapter((content, manager,), IPortletRetriever)
print "getPortletById: ",content, portletManager, key, name
print "iterating portlet assignements:"
for assignment in retriever.getPortlets():
print assignment["key"], assignment["name"]
if assignment["key"] == key and assignment["name"] == name:
return assignment["assignment"]
return None
def getPortletManager(self, column):
manager = getUtility(IPortletManager, name=column)
return manager
def render(self):
print "refreshment of moonphase portlet"
content = self.context.aq_inner
print self.context
name = self.request.form.get("portletName")
managername = self.request.form.get("portletManager")
key = self.request.form.get("portletKey")
print name, managername, key
portlet = self.getPortletById(content, managername, key, name)
manager = self.getPortletManager(managername)
managerRenderer = manager(content, self.request, self)
renderer = managerRenderer._dataToPortlet(portlet.data)
renderer.update()
return renderer.render()
これは、リクエストを生成するポートレットがコンテンツまたはその親フォルダーに直接割り当てられて表示される限り、うまく機能します。しかし、フォルダのデフォルト ビューを、ポートレットが割り当てられたコンテンツ アイテムに設定すると、イテレーションで、デフォルト フォルダ ビューの一部としてページにレンダリングされたポートレットが見つかりません。
<PloneSite at naturfreundeskreis>
moonphase-portlet plone.rightcolumn /naturfreundeskreis/naturfreundeskreis
getPortletById: <PloneSite at naturfreundeskreis> plone.rightcolumns /naturfreundeskreis/naturfreundeskreis moonphase-portlet
iterating portlet assignements
/naturfreundeskreis calendar
2013-03-19 13:48:31 ERROR Zope.SiteErrorLog 1363715311.150.739587723624 http://midgard.user.openhosting.com:8280/naturfreundeskreis/@@refreshMoonphase
Traceback (innermost last):
Module ZPublisher.Publish, line 126, in publish
Module ZPublisher.mapply, line 77, in mapply
Module ZPublisher.Publish, line 46, in call_object
Module kuehnel.portlets.moonphase.moonphaseview, line 21, in __call__
Module kuehnel.portlets.moonphase.moonphaseview, line 59, in render
AttributeError: 'NoneType' object has no attribute 'data'
最初のポートレット レンダリング プロセスは、ポートレットが表示され、要求を生成するときに、何らかの方法でポートレットを見つけました。でもできないんです。私は何を間違えたのですか?
ブラウザ ビューを使用して ajax リクエストのコンテンツを配信するのは良い習慣ですか?
現在の開発状況を反映するために、1 日の終わりにhttps://github.com/tdkuehnel/kuehnel.portlets.moonphaseにあるポートレット全体の github リポジトリを更新します。
Centos での Plone 4.2.4 ビルドアウト