Plone カスタマイズメモ

2005/07/02 更新

 以下の内容は、Plone 2.0.x 当時のものであり、それ以降のバージョンではもはや有効ではありません

 お手軽に使うための Plone のカスタマイズはじめの一歩。

もうちょっと親切な(やさしい口調の)解説が欲しいは場合は Liris さんの所の Plone関連、 カスタマイズ以外の Plone についての落書きは Plone 雑記帳参照のこと。

 また、書籍では「開発のプロが教える標準Plone完全解説」がお勧め。その原著は「Defenitive Guide to Plone」で 内容は http://docs.neuroinf.de/PloneBook/ から参照することもできます。

 

ZMIを使う

  1. Plone画面から Manager 権限のある人でログイン
  2. 「Plone の設定」 を選択「Zope管理画面(ZMI)」を選択

 

Epozを使えるようにする

  1. Manager の人がログインして「Plone の設定」を選択
  2. 「プロダクツを追加・削除」を選択
  3. Epozを使いたい人がログイン→個人設定→コンテンツエディタで「Epoz」を選択

ただし、Epozと フォームによる編集を切り替えたい場合は、再度個人設定で変更
 

Keyword と Event Typeの追加

portal_metadata->Elementsタブ->Subject に追加


タブの削除

例えば、「ニュース」タブの削除の場合

  1. ZMIから portal_actions を開く
  2. plone_actionsNews の Visible? のチェックを OFF

 

タブの追加

たとえば ルートフォルダにある about_us という Document へのリンクをタブに追加したい場合

portal_actions の Actionsタブで以下のような内容で登録。

Name About Us(タブのタイトル)
ID about_us(適当に)
Action string:$portal_url/about_us
Condition (ブランクのまま)
Permissions View
Category portal_tabs
Visible? ON

 Actionsには、string:http://www005.upp.so-net.ne.jp/nakagami/ のように、他のサイトへの URLも指定できる。

  タブの左右の位置は、portal_actionsの一覧の上→下の順番なので、左右を入れ替えたい場合は、MoveUp Move down ボタンで行う

 

Join(参加)させない

  1. ZMIから Security タブを開く
  2. Add portal member の Aquire? のチェックを OFFにして  Manager のチェックを ON

 これで、Anonymous の人が、Joinできなくなりますが、Manager の人は、ログイン後に Ploneの設定→「ユーザーとグループの管理」で追加することができる。

 

CSSを変更して見た目を変える

  1. portal_skins/plone_stylesbase_properties を カスタマイズ (portal_skins/custom/base_properties ができるので、その Propertiesを変更)
  2. 更なるカスタマイズには portal_skins/plone_style/plone.css をいじる

 既存の Plone サイトも、CSSを変更しているだけのところが多いので、具体的なデザインは

のあたりをみて CSSの定義を参考にすると良い。

CSSについては、

を参考にするとよさそう。

 

IE で見た時に、円マーク( ¥ )を表示したいのに、バックスラッシュになってしまう

プロパティの

の値の先頭に、"MS PMincho" を加える。(ちょっと、見にくくなっちゃうけど)

 

ロゴを変える

(その1)イメージファイルの内容を変える

  1. portal_skins/portal_imageslogo.jpg をカスタマイズ(portal_skins/custom/logo.jpgに置かれる)
  2. portal_skins/custom/logo.jpg を置き換える

(その2)イメージのファイル名を変える

  1. portal_skins/custom に自分の好きなファイル名でロゴイメージファイルを入れる
  2. portal_skins/plone_styles/base_properties をカスタマイズして logoName プロパティを変更する

 

「友達にこのページを送る」アイコンの削除

  1. ZMIから portal_actions を開く
  2. plone_actions の Send this page to somebody の Visible? のチェックを OFF

同じく、Print this page の チェックを OFFにすると「このページを印刷する」アイコンが消える。

 

サイトに使われているアイコンの変更

 

左のログインボックスを表示しない

  1. ZMIから Plone Site の Properties タブを開く
  2. left_slotshere/portlet_login/macros/portlet の行を削除


右にあるボックス全体を表示しない

  1. ZMIから Plone Site の Properties タブを開く
  2. right_slots の全行を削除

  もし、Reviewer がレビューするワークフローを使っていたら、 pending のものを確認する必要があるので、here/portlet_review/macros/portletleft_slots に移しておく必要があるはず。

 

ワークフローはいらない(公開、非公開の切り替えができればよい)

  1. portal_workflow の Contents タブで folder_workflow をコピー&ペースト&リネームして simple_workflow(何でもいい)を作る
  2. protal_workflow の Workflows タブで Workflows by type で、上で作った simple_workflowを選択する。

(Default) のワークフローに simple_workflow を指定しても良い。

 simple_workflow を作らずに、単純に 2.で forlder_workflow を指定しても良い(わけわかんなくならなければ)

 

Member の人が他人の作成したコンテンツを Publish したり Hideしたりしたい

  1. portal_workflow→Contents→該当するworkflowの Transisions タブを開く
  2. hide(もしくは publish ) のリンクを選択する
  3. Hide や Publishの Role(s)欄に Member を追加(チェックを ON)


Member の人が Visible(や Private)の状態のコンテンツを編集したい

  1. portal_workflow→Contents→該当するworkflowの States タブを開く
  2. visible(や private )のリンクを選択する
  3. Permissions のタブを開く
  4. 「Modify portal content 」に Member を追加(チェックを ON)

  Public のものを複数の人が編集すると、わけわからんくなるので、必ず visibleにしないと (または、privateまで戻さないと)編集できないようにしたほうが良いと思う。



Memberフォルダを Anonymous には見せない

ZMIを開き Memberフォルダの Security タブで

にする。

 また、portal_actions の Members の Condition をpython:member  に変更して「メンバー」タブが Member のときのみ出るようにする(Visible?のチェックを OFFにしても良い)。

 

ドキュメントの説明(Desctiption)を Anonymous には見せない

 portal_skins/plone_content/document_view をカスタマイズ、Description を表示しているところを(抜粋)以下のようにする

 <div class="documentDescription"
       tal:content="here/Description" tal:condition="not:isAnon">
       description
</div>

 

Memberが「マイフォルダ」以外の場所にコンテンツを置く

Security タブで

の Member Role を ON にする。

フォルダオブジェクトの URL の最後に /folder_contents をつけると、フォルダのコンテンツ一覧が出る(http://blog.so-net.ne.jp/nakagami/2005-03-15 参照)

コンテンツの右下の 作成者、日付等を Anonymous には出したくない

portal_propertiessite_properties のプロパティ allowAnonymousViewAbout のチェックを OFF

 

Anonymous の人には Personal Bar(ログインのリンクのところ) を出したくない

portal_skins/plone_templates/global_personalbar をカスタマイズ。以下太字の1行を加える。

<div metal:define-macro="personal_bar"
tal:condition="not: isAnon"
tal:define="display_actions python:user_actions[:-1]+global_actions+user_actions[-1:];"
tal:omit-tag="">

 ただ、これだと、線の引かれ方と配色がいまいちなので、本当はもっとちゃんと直すべし。

 Personal Bar の下の Path Bar のデザインを変えると良いかも。例えば、portal_skins/plone_style/ploneCustom.css をカスタマイズして 以下のような内容を ploneCustom.css の
 /* DELETE THIS LINE AND PUT YOUR CUSTOM STUFF HERE */
とあるあたりに入れるとか 。

#portal-breadcrumbs {
    background-color: &dtml-globalBackgroundColor;;
    border-top-color: &dtml-globalBorderColor;;
    border-top-style: &dtml-borderStyle;;
    border-top-width: &dtml-borderWidth;;
    border-bottom-color: &dtml-globalBorderColor;;
    border-bottom-style: &dtml-borderStyle;;
    border-bottom-width: &dtml-borderWidth;;
    line-height: 1.3em;
    color: &dtml-fontColor;;
    padding: 0em 3em 0em 3em;
    margin: 0;
    text-transform: &dtml-textTransform;;
    list-style: none;
}

 ログインのリンクが出ていない状態でも http://localhost:8080/login_form のように URLの最後に login_form とつけるとログイン画面が出るので支障はない。

 

フッターの部分の表示をやめたい

  1. portal_skins/plone_templates/footer
  2. portal_skins/plone_templates/colophon

で、以下のように、tal 式で常に False になるように指定

<div id="portal-xxxx" metal:define-macro="xxxxxxxx" i18n:domain="plone" tal:condition="nothing">

単純に内容(<div>~</div>の部分)を書き換えても良い。

 

検索結果からアドバンス検索へのリンクをつけない

 ここまでのカスタマイズをしているサイトは、アドバンス検索があると混乱するはず(使っていない機能がたくさんあるので)。

portal_skins/plone_forms/serch をカスタマイズして、該当するパラグラフを削除する。もしくは、

<p i18n:translate="search_results_advanced" tal:condition="nothing">

という感じにする。

 

イベントや、ニュースを「新規アイテムの追加」の選択肢に入れない

portal_types で該当するものをクリックして Implicitly addable? のチェックを OFFにする。

 

RSSを配信したい

 

Ploneサイトをサイトのルートコンテンツとしてアクセスしたい

 例えば、http://www.example.com/ として Ploneサイトを表示したいような場合・・・

 Squid を使ってよければ Zopeと Squidの連携を参照

Apacheじゃなきゃいやな人はこちら

 

日本語で検索できるようにする

 Splitter for ZCTextIndexのページを参照すべし。中でも ejSplitter がお勧め(自画自賛)。ejSplitter のインストールについては、 http://takanory.net/plone/basic/splitter/ の説明が丁寧。

 

日本語でメールを送信できるようにする

 jaMailHostをインストールして、ZMIから MailHost の Titleに「utf-8」 と入れる(自画自賛) 。

 

ログイン直後に、属しているグループのフォルダを表示する

$portal_skins/plone_scripts/logged_in をカスタマイズ 最後の
return REQUEST.RESPONSE(redirect)
の行の直前に
dest = REQUEST.URL1
if hasattr(member, 'isGroup'):
    groups = member.getGroupsWithoutPrefix()
    if len(groups):
        dest += '/groups/' + groups[0]
と入れる。 複数のグループに属している場合、先にとってこれた方(アルファベット順?)。 グループに属していないユーザーは Plone サイトのルートを表示する。

 

My Groups portlet

自分の属しているグループのフォルダーへのリンクを表示する portlet。 $portal_skins/custom に portlet_mygroups として こんな感じ に定義してみる。

ZMI から、ルートフォルダの Propteries タブの left_slot に

here/portlet_mygroups/macros/portlet

の行を加える。

 

ファイルのアップロードがうまくできない

File を 追加・変更しようとする時に、日本語の含まれるパス名のファイルを アップロードしようとすると、エラーになって追加できない。 「日本語のファイル名やフォルダー名はだめです」と言ってしまえれば良いが、 そうもいかない場合も多い。
$portal_skins/plone_form_scripts/validate_file_edit
--- validate_file_edit.vpy.orig Thu Nov 11 19:44:32 2004
+++ validate_file_edit.vpy      Thu Nov 11 19:54:28 2004
@@ -21,12 +21,7 @@
 if not filename and not size:
     state.setError('file', 'You must upload a file')
 
-if context.CreationDate() == context.ModificationDate() and filename:
-    alternative_id = filename[max( string.rfind(filename, '/')
-                       , string.rfind(filename, '\\')
-                       , string.rfind(filename, ':') )+1:].strip()
-else:
-    alternative_id = context.getId()
+alternative_id = context.getId()
 
 id = id.strip()
 id_err = context.check_id(id, 1, alternative_id)
$portal_skins/plone_form_scripts/file_edit
--- file_edit.cpy.orig  Thu Nov 11 19:56:22 2004
+++ file_edit.cpy       Thu Nov 11 19:57:45 2004
@@ -14,20 +14,10 @@
 original_id=context.getId()
 filename=getattr(file,'filename', '')
 
-if file and filename and context.isIDAutoGenerated(original_id):
-#   if there is no id or an autogenerated id, use the filename as the id
-#   if not id or context.isIDAutoGenerated(id):
-#   if there is no id, use the filename as the id
-    if not id:
-        id = filename[max( string.rfind(filename, '/')
-                       , string.rfind(filename, '\\')
-                       , string.rfind(filename, ':') )+1:]
 if file and hasattr(file, 'seek'):
     file.seek(0)
 
-# if there is no id specified, keep the current one
-if not id:
-    id = context.getId()
+id = context.getId()
 
 if not file and file_data:
     file=StringIO(file_data)
とすれば、アップロードしたファイルのファイル名がオブジェクトの IDにはならないけど、 とりあえず、エラーにならなくて済む。

また、Document を追加・変更しようとする時に、ファイルのアップロードで やろうとすると、UTF-8 で書いてないと文字化けしてしまう。 $portal_skins/plone_content/document_edit_formをカスタマイズして、 アップロードするファイルを指定する部分の<div>~</div>を削除してしまった 方が良いかも

 

Structured Textで日本語を使う

 Zopeの本体の Structured Text のソースを少し変更する必要あり。

 

コメントを受け付ける / トラックバックを受け付ける

http://blog.so-net.ne.jp/nakagami/2005-01-07

 

ユーザー設定は変更させたくないが、パスワードは変更できるようにしたい

portal_skins/plone_prefs/password_form をカスタマイズ
Manage properties のパーミッションを Authenticated ON に
portal_controlpanel のChange Password の Permission を View

portal_skins/plone_form_scripts/plone_change_password
をカスタマイズ
Proxy タブで Manage を選択

→といろいろやってみたが、今のところうまくいかない

パスワードの変更は Zope を経由しないようにする方法はある。例えば、ユーザー情報は、LsbUserFolder 等を使って保持し、かつ Manage properties のパーミッションを Authenticated ON にして、ユーザー設定は変更させないようにするとか。

 


Zope メモ