お知らせ表示テンプレートの作成 [Plone3.3]
お知らせ表示として「日付+タイトル」を表示する「ENG TOPIC VIEW」と、「日付+本文」を表示する「ENG BLOG VIEW」を定義する。
ENG TOPIC VIEW
Topicタイプのビューとして ENG TOPIC VIEW を定義する
工学研究科のお知らせ表示用に、Topicタイプのビューを定義する。スキンフォルダ内にテンプレートを eng_topic_view として作成する。タイトルは「ENG TOPIC VIEW」とする。
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" metal:use-macro="here/main_template/macros/master" i18n:domain="plone"> <body> <div metal:fill-slot="main"> <metal:main_macro define-macro="main" tal:condition="here/listCriteria | nothing"> <metal:body define-macro="body_macro" tal:define="kssClassesView context/@@kss_field_decorator_view; getKssClasses nocall:kssClassesView/getKssClassesInlineEditable; templateId template/getId"> <div tal:replace="structure provider:plone.abovecontenttitle" /> <h1 class="documentFirstHeading"> <metal:field use-macro="python:here.widget('title', mode='view')"> Title </metal:field> </h1> <div tal:replace="structure provider:plone.belowcontenttitle" /> <p class="documentDescription"> <metal:field use-macro="python:here.widget('description', mode='view')"> Description </metal:field> </p> <div tal:replace="structure provider:plone.abovecontentbody" /> <metal:listingmacro define-macro="listing"> <tal:topiccontents define="b_size b_size | python:50; topicContents python:here.queryCatalog(batch=True, b_size=b_size); batch topicContents;"> <div metal:define-macro="text-field-view" id="parent-fieldname-text" class="stx" tal:define="kss_class python:getKssClasses('text', templateId=templateId, macro='text-field-view'); text here/getText|nothing" tal:condition="text" tal:attributes="class python:test(here.Format() in ('text/structured', 'text/x-rst', ), 'stx' + kss_class, 'plain' + kss_class)"> <div metal:define-slot="inside" tal:replace="structure text">The body</div> </div> <tal:listing condition="topicContents"> <!-- Navigation --> <div metal:use-macro="here/batch_macros/macros/navigation" /> <div class="newsline"> <tal:items tal:repeat="obj topicContents"> <div class="tline"> <div tal:define="effective_date obj/EffectiveDate; modification_date obj/ModificationDate; effective_date python:test(effective_date != 'None', effective_date, modification_date); effective_date python:here.toLocalizedTime(effective_date)" class="date"> <span tal:replace="string:$effective_date">2007/11/11</span> </div> <div tal:attributes="class string:ctype-${obj/portal_type};"> <a tal:attributes="href string:${obj/getURL}/view;"> <tal:title tal:content="obj/pretty_title_or_id">title</tal:title> </a> </div> </div> </tal:items> </div> </tal:listing> <p class="discreet" tal:condition="python: not topicContents and here.listCriteria()" tal:content="python:test(language=='ja', u'\u63b2\u8f09\u8a18\u4e8b\u306f\u3042\u308a\u307e\u305b\u3093\u3002', 'There is currently no item to display.')"> </p> <p class="discreet" tal:condition="not: here/listCriteria" i18n:domain="atcontenttypes" i18n:translate="description_no_criteria_in_topic"> There are currently no criteria on which to search. Please add them using the 'criteria' tab. </p> <!-- Navigation --> <div metal:use-macro="here/batch_macros/macros/navigation" /> </tal:topiccontents> </metal:listingmacro> </metal:body> <div tal:replace="structure provider:plone.belowcontentbody" /> </metal:main_macro> </div> </body> </html>
お知らせ一覧のイベント表示対応
お知らせ一覧表示テンプレートでイベントの場合は「[開催日] 開催」と表示できるようにする。工学研究科のお知らせ表示用 eng_topic_view を次のように修正する。
<a tal:attributes="href string:${obj/getURL}/view;"> <tal:title tal:content="obj/pretty_title_or_id">title</tal:title> </a> + <tal:event tal:condition="python:obj.Type=='Event'"> + <span class="event_date"> + <tal:date tal:define="event_start python:toLocalizedTime(obj.start, long_format=0); + event_end python:toLocalizedTime(obj.end, long_format=0);" + tal:replace="python:test(event_start==event_end, event_start, event_start+'-'+event_end)" /> + <tal:title tal:replace="python:test(context.Language()=='ja', u'\u958b\u50ac', u'')"> + title</tal:title></span> + </tal:event>
お知らせ一覧のキーワードタグ対応
お知らせ一覧表示テンプレートに、記事のカテゴリに応じた class 属性を出力して、カテゴリ別アイコンを表示できるようにする。
convert_categoryスクリプトの作成
カテゴリは日本語で作成しているため、class 属性に付与するためには英数字にする必要がある。変換スクリプトとしてスキンフォルダに convert_category という名前で Python Script を作成する。key_dic に変換するカテゴリと、出力する文字列一覧の対応を定義しておく。また no_key にはキーワードが設定されていない場合に出力する文字列を定義しておく。
keywords = context.Subject() # カテゴリ未定義 no_key = 'Nocategory' # カテゴリ変換 key_dic = { 'お知らせ':'TopicsGeneral', '入学案内(学部)':'TopicsAdmission', '入学案内(大学院)':'TopicsAdmission', '学生':'TopicsStudent', '研究':'TopicsResearch', '国際交流':'TopicsInternational' } try: if context.Type() == 'Event': return str('TopicsEvent') for keyword in keywords: if keyword in key_dic.keys(): return str(key_dic[keyword]) return str(no_key) except: return str(no_key)
eng_topic_viewの修正
工学研究科のお知らせ表示用 eng_topic_view を修正して上記の変換スクリプトを呼び出し、class 属性に付与されるようにする。
- <div tal:attributes="class string:ctype-${obj/portal_type};"> + <div tal:define="cat python:obj.getObject().convert_category" + tal:attributes="class string:ctype-${cat};">
Topicのビューで選択できるものを指定する
フォルダのビューで選択できるものを指定する。上で作成した、eng_topic_view も設定できるようにする。portal_types/Topic を開き Available view methods に次の行を追加する。
eng_topic_view
ENG BLOG VIEW
各ページ内のURL変換スクリプトを定義する
ブログ表示するともとのページと Base URL が変更になるため、変換スクリプトを定義する。スキンフォルダに Python Script を transformRelatedURLs という名前で作成する。
# this is a quick hack a_splitted = htmltext.split(' href="') result = a_splitted[0] for href in a_splitted[1:]: if not href.startswith('http') and not href.startswith('/') and not href.startswith('file://') and not href.startswith('mailto:'): result += ' href="' + base_url + '/../' + href else: result += ' href="' + href htmltext = result img_splitted = htmltext.split(' src="') result = img_splitted[0] for src in img_splitted[1:]: if not src.startswith('http') and not src.startswith('/') and not src.startswith('file://'): result += ' src="' + base_url + '/../' + src else: result += ' src="' + src htmltext = result return result
また Parameter List は次のように指定しておく。
Parameter List : htmltext, base_url
Topicタイプのビューとして ENG BLOG VIEW を定義する
工学研究科のお知らせ表示用に、Topicタイプのビューを定義する。スキンフォルダ内にテンプレートを eng_blog_view として作成する。タイトルは「ENG BLOG VIEW」とする。
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" metal:use-macro="here/main_template/macros/master" i18n:domain="plone"> <body> <div metal:fill-slot="main"> <metal:main_macro define-macro="main" tal:condition="here/listCriteria | nothing"> <metal:body define-macro="body_macro" tal:define="kssClassesView context/@@kss_field_decorator_view; getKssClasses nocall:kssClassesView/getKssClassesInlineEditable; templateId template/getId"> <div tal:replace="structure provider:plone.abovecontenttitle" /> <h1 class="documentFirstHeading"> <metal:field use-macro="python:here.widget('title', mode='view')"> Title </metal:field> </h1> <div tal:replace="structure provider:plone.belowcontenttitle" /> <p class="documentDescription"> <metal:field use-macro="python:here.widget('description', mode='view')"> Description </metal:field> </p> <div tal:replace="structure provider:plone.abovecontentbody" /> <metal:listingmacro define-macro="listing"> <tal:topiccontents define="b_size b_size | python:20; topicContents python:here.queryCatalog(batch=True, b_size=b_size); batch topicContents;"> <div metal:define-macro="text-field-view" id="parent-fieldname-text" class="stx" tal:define="kss_class python:getKssClasses('text', templateId=templateId, macro='text-field-view'); text here/getText|nothing" tal:condition="text" tal:attributes="class python:test(here.Format() in ('text/structured', 'text/x-rst', ), 'stx' + kss_class, 'plain' + kss_class)"> <div metal:define-slot="inside" tal:replace="structure text">The body</div> </div> <tal:listing condition="topicContents"> <!-- Navigation --> <div metal:use-macro="here/batch_macros/macros/navigation" /> <div class="newsline"> <tal:items tal:repeat="obj topicContents"> <div class="bline"> <div tal:define="effective_date obj/EffectiveDate; modification_date obj/ModificationDate; effective_date python:test(effective_date != 'None', effective_date, modification_date); effective_date python:here.toLocalizedTime(effective_date)" class="date"> <span tal:replace="string:$effective_date">2007/11/11</span> </div> <div tal:define="translation python:obj.getObject(); base_url python:obj.getObject().absolute_url();" tal:attributes="class string:ctype-${obj/portal_type};"> <div class="blog_title"> <a tal:attributes="href string:${obj/getURL}/view;"> <tal:title tal:content="obj/pretty_title_or_id">title</tal:title> </a> </div> <div tal:replace="structure python:here.transformRelatedURLs(translation.CookedBody(stx_level=2), base_url)" /> </div> </div> </tal:items> </div> </tal:listing> <p class="discreet" tal:condition="python: not topicContents and here.listCriteria()" tal:content="python:test(language=='ja', u'\u63b2\u8f09\u8a18\u4e8b\u306f\u3042\u308a\u307e\u305b\u3093\u3002', 'There is currently no item to display.')"> </p> <p class="discreet" tal:condition="not: here/listCriteria" i18n:domain="atcontenttypes" i18n:translate="description_no_criteria_in_topic"> There are currently no criteria on which to search. Please add them using the 'criteria' tab. </p> <!-- Navigation --> <div metal:use-macro="here/batch_macros/macros/navigation" /> </tal:topiccontents> </metal:listingmacro> </metal:body> <div tal:replace="structure provider:plone.belowcontentbody" /> </metal:main_macro> </div> </body> </html>
Topicのビューで選択できるものを指定する
フォルダのビューで選択できるものを指定する。上で作成した、eng_blog_view も設定できるようにする。portal_types/Topic を開き Available view methods に次の行を追加する。
eng_blog_view