![]() |
![]() |
TinyDの後継的な位置づけを持つモジュールです。
TinyDからの移行パスも用意されています。
ただし、コード的にはpicoとTinyDはまったく関係なく、完全に独立した存在です。
webmasterによるコンテンツ作成に適していますが、設定次第では、一般ユーザによる記事投稿を許可するタイプのモジュールとしても利用できます。
Duplicatable V3ですから、ディレクトリ名の制限もなく、アップデートも1回分ですみます。
このモジュールでは、ファイル構成が大きく6種類に分けられます。それぞれきちんと区別してください。
なお、モジュールフロントエンドに置かれた各モジュールのことを、「モジュールインスタンス(実体)」と呼ぶこともあります。
picoにはwrapsモードという特徴的なモードがあります。
wraps モジュールの拡張版というイメージで、ApacheのPATH_INFOを利用する点は一緒です。PATH_INFOに関する注意点もwrapsと同じですので、そちらを参照してください。
wrapsモードを有効にすると、記事のURIが以下のような形式になります。
(mod_rewriteモード無効時)
http://example.com/modules/(dirname)/index.php/index.html
(mod_rewriteモード有効時)
http://example.com/modules/(dirname)/index.html
picoでは、"/index.html" の部分を「仮想パス」と呼びます。仮想パスの拡張子が.html(または.htm)で終わっている場合、picoはXOOPSヘッダとフッタをつけて出力します。いわゆるページラップです。
ラップされる中身は、通常、ラップディレクトリの対応するファイルから取得します。仮想パスが "/index.html" であれば、以下のファイルになります。
(ラップディレクトリ)/index.html
いわゆるDBコンテンツについても、任意の仮想パスを割り当てることができます。この場合は、コンテンツ編集画面で入力された本文が表示されます。wrapsモードが有効の場合、明示的に仮想パスが指定されていないコンテンツについても、自動的に仮想パスが割り当てられます。番号1のコンテンツは、デフォルトでは、以下のURIになります。
(mod_rewriteモード無効時)
http://example.com/modules/(dirname)/index.php/content0001.html
(mod_rewriteモード有効時)
http://example.com/modules/(dirname)/content0001.html
仮想パスの拡張子が.htmlまたは.htm以外のファイルについては、ラップディレクトリの対応ファイルが、拡張子に応じたMIMEヘッダとともに転送されます。この動作はwrapsモジュールとまったく同じです。
picoには、TinyDと同じく、ページラップする機能があります。
以下に、ページラップ機能について、TinyDとpicoを比較します。
| 項目 | TinyD | pico |
| DBコンテンツとの違い | それぞれ編集画面から異なり、まったく別の概念 | 本文フィルターとして「ページラップ」を通過するかどうかだけの差。他の本文フィルターをかけることさえ出来る |
| ラップファイルの置き場 | 公開側のcontent/ の下 | ラップディレクトリ XOOPS_TRUST_PATH/wraps/(dirname) の下 |
| 相対リンクの扱い | コンテンツ毎にWRAP2,WRAP3などが用意されていた | WRAP2,WRAP3などは存在しない。相対リンクを使う場合は、wrapsモードと併用することで自然につながる |
ページラップは、wrapsモードと混同されやすいと思いますが、前者は「指定された番号のコンテンツ(中身)をどこから持ってくるか」という設定であり、後者は「URIをどのように表現するか。そのURIからどのコンテンツ番号が呼ばれているか。該当する番号がなければ転送するか。」という設定です。
(1) XOOPS_TRUST_PATHの設定をします。(まだ一度もしていなければ)
(2) XOOPS_TRUST_PATH/modules/pico 以下にモジュール本体をアップロードします。
(3) XOOPS_ROOT_PATH/class/smarty/plugins 以下にSmartyプラグイン(ファイル2個)をアップロードします。以前、d3forum等をインストールしてあれば、同名のファイルが既に存在するかもしれませんが、気にせず上書きしてください。
(4) XOOPS_TRUST_PATH/PEAR/ 以下に、PEARファイルをアップロードします。(TextWikiが必要な場合のみ)
(5) XOOPS_ROOT_PATH/common/ 以下に、common用WYSIWYG Editorをアップロードします。(WYSIWYG機能が必要な場合のみ)
(6) XOOPS_ROOT_PATH/modules/ の下に、好きな名前(仮にcontentsとします)でディレクトリを作成し、そこにモジュールフロントエンドをアップロードします。
(7) モジュールに表示させるコンテンツそのものを、XOOPS_TRUST_PATH/wraps/の下に、(6)と同名のディレクトリを作って、そこに FTPでアップロードします。ファイル間のリンクが相対リンクになっていれば、特にリンクを書き換える必要はありません。(ページラップ機能を利用する場合のみ)
(8) お使いのXOOPSの管理画面に入り、モジュール管理よりインストールします。
2個目以降のpicoをインストールする時は、(6)〜(8)の手順だけでOKです。
ファイル構成については、基本的にモジュール本体部分だけを上書きアップロードすればOKです。何らかの理由(画像ファイルの追加やデフォルトCSS変更)で、フロントエンド部分も上書きする必要がある場合にはその旨のアナウンスがあります。
あとは、必要に応じて(必要な場合はアナウンスがあります)、インストールされたすべてのpicoモジュールについて、モジュール管理からモジュールアップデートを行います。
特に、1.0系列から1.1/1.2系列にアップデートする際には、モジュールアップデートは必須です。
また、1.31から搭載された文字定数オーバーライドシステム(言語定数オーバーライド)を使用している場合は、”言語定数管理”の画面で、"更新"を行ってください。
更新をしないと_MD_PICO_LABEL_LOCKEDなど、新しく追加された言語定数が正しく表示されません。
インストール直後に行った方が良いのは、トップカテゴリーの権限設定です。管理画面から「カテゴリーアクセス権限」に入り、適切に許可設定を与えてください。(カテゴリーアクセス権限参照)
今後、カテゴリーを作る時には、この設定がベースとなりますので、最初にやっておくのが面倒がないでしょう。
TinyDや他のpicoからの全面的な引き継ぎを行う場合は、この時点でインポートを行うべきです。(インポート/同期参照)
というのも、先に新しいコンテンツを作成してから、後からインポートを行うと、作っておいた新しいコンテンツがすべて消されてしまうからです。(この仕様は、記事番号などを引き継ぐためであり、どうしてもさけられません)
そこまで準備が出来たら、基本的には、カテゴリーやコンテンツを作っていくだけです。
適宜、編集・削除を行います。
以下、各コントローラの解説をします。
なお、トップカテゴリーだけは特殊なカテゴリーで、「編集」を行おうとすると、管理画面の一般設定に飛ばされます。
これは異常ではなく、picoの仕様です。
トップ以外のカテゴリーとは、ベースとなる一般設定をオーバーライドするシステムに過ぎないからです。
例えば、トップカテゴリーのカテゴリータイトルは、一般設定の「モジュールトップのメッセージ」となります。トップカテゴリーオプションとは、すなわち、一般設定の各設定そのものです。
言葉にすると判りづらいと思いますが、実際に使ってみればピンと来ると思います。
何度か編集を繰り返すと、編集画面の下に「履歴」が蓄積されます。ここのリンクから、過去のバージョンを参照したりダウンロードできます。
また、現在との差分・直前バージョンとの差分の確認も出来ます。変更点が色分けしてあるので、一見するだけで違いが判るでしょう。
履歴の保存数は、一般設定で指定します。
| フィルター項目 | 管理画面での入力値 |
| Smarty(XoopsTpl) | xoopstpl |
| phpコード | eval |
| HTML特殊文字エスケープ | htmlspecialchars |
| PEAR TextWiki | textwiki |
| 顔文字変換 | smiley |
| BBCode変換 | xcode |
| 自動改行 | nl2br |
TinyDからpicoへの移行は、さほど難しくないはずです。
同一dirnameで移行する場合はやや繁雑になりますが、以下の手順になるでしょう。
中身がDBコンテンツのみの場合は、管理画面からインポートすればほぼ問題なく動作します。
画像のパスだけが問題となりますが、必要に応じて、モジュールフロントエンド側にコピーしてください。
中身がページラップの場合は、TinyDのcontent/ディレクトリ下にあるファイルを、ラップディレクトリにコピーする必要があります。pico管理画面からインポートした後にコピーすれば良いでしょう。
元のTinyDで、WRAP3モードなどを利用していた場合は、移行先のpicoでもwrapsモードをONにする必要があります。
また、TinyDから記事単位でpicoにコピーしたい場合も、やはりテンポラリ用のpicoに全体をインポートし、テンポラリ用の管理画面-コンテンツ一括管理から、個別にエクスポートするのが良いでしょう。
picoでは、基本的にすべてのコンテンツを、公開側で編集・管理できますが、カテゴリーをまたいだ操作などをやりやすくするために、管理側にコンテンツを一括で管理できるコントローラを用意しています。
まず、編集対象とするカテゴリーをドロップダウンで選択してから、その右側の「送信」を押すことで、画面下半分に対象カテゴリーのコンテンツ一覧が表示されます。なお、「全コンテンツ」を選択すると、カテゴリー関係なく、すべてのコンテンツが表示されます。
この一覧画面の各フォーム要素を書き換えたりチェックしたりした後に、画面下にある「送信」ボタンを押すことで、一括変更ができます。
記事をまとめて削除/移動/コピーする場合は、各行の一番右にあるチェックボックスをチェックしてから、テーブル最下部のボタンをクリックします。
他のpicoモジュールへのコピー(エクスポート)を行った場合、対象とされたpicoモジュールのトップカテゴリーにコピーされます。
カテゴリー選択において、「削除済コンテンツ」を選択すると、過去に削除されたコンテンツを参照することもできます。ただし、直接の編集・復活は出来ませんので、復活する場合は、ダウンロードした内容から手作業で復元することになるでしょう。
picoでは、カテゴリー毎に細かい権限設定が可能です。
まず、編集対象とするカテゴリーをドロップダウンで選択してから、その右側の「送信」を押すことで、対象カテゴリーに対する権限が、「グループ毎」と「ユーザ毎」の2つの画面として表示されます。
「グループ毎の権限」では、全グループが表示されていますので、各グループについて、適切な権限となるよう、チェックをしたり、外したりします。
「ユーザ毎の権限」では、ユーザ名(uname)かユーザ番号(uid)でコントロールします。すでに追加されているユーザを消す場合は、閲覧権限のチェックを外してください。閲覧権限はすべての権限の前提となるため、閲覧権限がない時点で、そのユーザのエントリそのものが削除されます。
これらの権限は、すべて論理和(OR)が有効となります。
例えば、「登録ユーザグループ」には単に閲覧権限が与えられ、「特権ユーザグループ」にはモデレータ権限が与えられていた場合、その両方のグループに所属するユーザは、モデレータ権限を持ちます。
「登録ユーザグループ」にしか所属していないユーザであっても、「ユーザ毎の権限」において、個別にモデレータ権限を与えられれば、やはりモデレータ権限を持ちます。
個別に権限を奪う設定は存在しないので、グループ毎にはなるべく低めの権限を与えておくのが良いでしょう。
以下、各権限を解説します。
なお、公開側から作成されたサブカテゴリーについての権限は、親カテゴリーとまったく同じ内容で自動作成されます。
そのため、利用最初の段階で、トップカテゴリーについて、妥当な権限設定しておけば、後から、個々のカテゴリーについてあらためて権限設定する手間は格段に減るでしょう。
同じXOOPSサイトにインストールされたTinyDまたは他のpicoから、モジュール単位でインポートできます。
あくまでモジュールまるごとのインポートですので、今のpicoモジュール内のコンテンツデータはすべて削除される点に注意が必要です。(コンテンツ単位でのインポートが必要な場合は、読込元の「コンテンツ一括管理」から記事を選択して、「他のpicoへのコピー」を行います。TinyDから記事単位でコピーする場合は、一時的に作った別のpicoにインポートしてから同様の作業をします)
TinyDからのインポートの場合のみ、例外的に今のpicoモジュールのカテゴリーは(カテゴリーに対する権限設定も)削除されません。これはTinyDにカテゴリーが存在しないためです。
他のpicoからのインポートであれば、カテゴリーもカテゴリー権限もまるごとインポートされます。
ある特定の記事だけをコピー/移動したい場合は、コンテンツ一括管理を利用してください。
カテゴリーのツリー構造・コンテンツにおける投票数など、速度をかせぐために持たせている冗長情報がおかしくなった時に実行してください。
同期をしなければならいことはあまりないはずですが、phpMyAdminなどで直接、投票テーブルやカテゴリーテーブルをいじった後のつじつま合わせには便利でしょう。
サイトを移動するなどして、コンテンツ本文の表示や検索結果がおかしくなっている時にだけ実行してください。正常な時に実行すると、パフォーマンスの低下や検索ミスなどの原因になります。
いわゆるblocksadminです。
ブロック管理およびモジュールとブロックに関するアクセスコントロールができます。
altsysがインストールされている時にだけ表示されます。
| ブロック名 | テンプレート | 説明 | ブロック複製 | ブロックオプション |
| メニュー | (dirname)_block_menu.html | 各カテゴリー毎にコンテンツ一覧を表示する | 可 | カテゴリー絞り込み・ブロックテンプレート |
| コンテンツ内容 | (dirname)_block_conetnt.html | ブロックオプションで指定された番号のコンテンツ(本文)を表示する | 可 | コンテンツ番号・ブロックテンプレート |
| コンテンツ一覧 | (dirname)_block_list.html | コンテンツを指定された順番でリスト表示する | 可 | カテゴリー絞り込み・表示順・ブロックテンプレート |
| サブカテゴリー一覧 | (dirname)_block_subcategories.html | サブカテゴリーの一覧を表示する | 可 | 親カテゴリー・ブロックテンプレート |
| 自身の承認待ち | (dirname)_blockedit_mywaitings.html | 承認待ちコンテンツへのリンクを表示する | 可 | ブロックテンプレート |
ブロックオプションの「カテゴリー絞り込み」とは、ある特定のカテゴリーだけを対象とするための設定です。
トップカテゴリー直下(内のコンテンツ)だけを対象としたい場合は0とだけ指定します。あくまでそのカテゴリー番号の直下だけが対象となる点に注意が必要です。
カテゴリー5年生(cat_id=5) の下に、5年1組(cat_id=10)と5年2組(cat_id=11)という2つのサブカテゴリーがあって、5年生に関するすべてのコンテンツを表示させたい、ということであれば、以下のように指定します。(区切り文字がカンマである点に注意)
5,10,11
そのカテゴリー番号は、カテゴリー表示画面でURIを見ればすぐに判るはずです。
「コンテンツ内容」ブロックでは、コンテンツ番号を指定します。wrapsモードで仮想パスをしている場合など、公開側のURIからだとコンテンツ番号が容易に判りません。この場合、「コンテンツ一括管理」画面におけるリンクを参照してください。
「ブロックのテンプレート」では、ブロック個別に異なるテンプレートを使う方法を提供しています。デフォルトはモジュールインストール時に登録されたDBテンプレートで、以下のようなリソース名です。
db:pico_block_*.html
ここを書き換えることで、任意のテンプレートをそのブロックに割り当てることができます。
例えば、テーマdefaultの下に、pico_block_menu_customized.html というファイル(themes/default/pico_block_menu_customized.html) を置いて、そのファイルをテンプレートとする場合は、以下のように記述します。
default/pico_block_menu_customized.html
リソース種別を明示しない場合、パスの基準が XOOPS_ROOT_PATH/themes/ であることに注意が必要です。(これはXOOPSの基本仕様なので覚えておいて損はありません)
もちろん絶対パス指定のFILEテンプレートも利用できます。この場合は、リソース種別指定が必要です。
file:/home/myhome/templates/pico_block_menu_customized.html
altsysやtplsadminを利用したい場合、DBテンプレートの数を増やす、という手も有効です。XOOPS_TRUST_PATH/modules/pico/templates/ の下にファイルを追加して、モジュールアップデートを行う。たったそれだけで、DBテンプレートが追加されます。(D3モジュールの共通仕様)
もちろん、モジュールアンインストール時には、追加されたDBテンプレートごと削除されますので、ゴミとして残ってしまうことを心配する必要はありません。
| テンプレート名 | 説明 |
| pico_admin_category_access.html | 管理画面のカテゴリーアクセス権限用 |
| pico_admin_contents.html | 管理画面のコンテンツ一括管理用 |
| pico_admin_extras_detail.html | |
| pico_admin_extras.html | |
| pico_admin_import.html | 管理画面のインポート/同期用 |
| pico_block_content.html | コンテンツ内容ブロック用 |
| pico_block_list.html | コンテンツ一覧ブロック用 |
| pico_block_menu.html | メニューブロック用 |
| pico_block_mywaitings.html | |
| pico_block_subcategories.html | |
| pico_block_tags.html | |
| pico_blockedit_content.html | ブロック管理画面用(コンテンツ) |
| pico_blockedit_list.html | ブロック管理画面用(コンテンツ一覧) |
| pico_blockedit_menu.html | ブロック管理画面用(メニュー) |
| pico_blockedit_mywaitings.html | ブロック管理画面用(承認待ち) |
| pico_blockedit_subcategories.html | ブロック管理画面用(サブカテゴリ) |
| pico_blockedit_tags.html | ブロック管理画面用(タグ一覧) |
| pico_inc_breadcrumbs.html | パンくず部分 |
| pico_independent_print.html | 印刷用画面 |
| pico_independent_rss20.html | RSS出力用 |
| pico_independent_singlecontent.html | シングルコンテント用 |
| pico_main_category_form.html | カテゴリーの編集フォーム |
| pico_main_content_form.html | コンテンツの編集フォーム |
| pico_main_listcontents.html | コンテンツリスト表示用 |
| pico_main_diffhistories.html | |
| pico_main_menu.html | 自動生成トップメニュー表示用 |
| pico_main_querycontents.html | タグによる絞り込み時の表示用 |
| pico_main_viewcontent.html | コンテンツ詳細画面用 |
| pico_main_viewhistory.html | |
| pico_main.css | picoをメイン部として表示する時のCSS |
pico の部分が、モジュールインスタンス名に置き換わります。
picoに用意されているイベント通知は一種類だけです。
wrapsと違い、picoにはカテゴリーがあります。
そのカテゴリーの仮想パスを上手に設定することで、ラップディレクトリに置いたHTMLファイルを自動的にカテゴライズすることができます。
例えば、小学校の学級ホームページを作るために、picoモジュールをclassというdirnameでインストールしたとします。その場合、ラップディレクトリは、XOOPS_TRUST_PATH/wraps/class/ となるわけですが、その直下に学年毎のディレクトリを作り、学年ディレクトリの下にそれぞれ組のディレクトリを作ります。(ヒエラルキーの構築)
class/ (トップカテゴリーに相当)
5/ (カテゴリー「5年生」に相当)
5-1/
5-2/ (カテゴリー「5年2組」に相当)
profile.htmlその上で、カテゴリー管理から、各クラスのディレクトリをやはりツリー状に作り、仮想パスを指定しておきます。例えば、「5年2組」のカテゴリーは、親カテゴリーが「5年生」で、仮想パスは /5/5-2 です。(当然、先に「5年生」というカテゴリーを作っておく必要があります)
この場合、
XOOPS_URL/modules/class/index.php/5/5-2/profile.html
へのアクセスは、自動的に「5年2組」のカテゴリーである、として扱われます。コンテンツとして登録されていなくても、です。もちろん、パンくずにも、
トップ > 5年生 > 5年2組 > (ページ名)
と表示されます。
「HTMLラップファイルの自動DB登録」と併用すれば、「5年2組」カテゴリーに所属するコンテンツとして自動登録されます。
なお 5-2/ のさらに下にサブディレクトリがあって、その内側のHTMLファイルにアクセスがあった場合、そのサブディレクトリを仮想パスとするカテゴリーがない限り、カテゴリー「5年2組」となります。
つまりは、最長一致するカテゴリーに所属する、ということです。
wrapsモードにおいて、拡張パス指定されたファイルがラップディレクトリから転送される場合、以下の3種類のパターンに分けられます。(もちろん、対応ファイルがない場合は、単に404エラーです)
このうち「HTMLラッピング」の動作は以下の通りです。
これらのHTMLファイルは、DBに登録されたファイルと違い、コンテンツIDが振られていないため、以下の機能が利用できません。
「HTMLラップファイルの自動DB登録」をONにすると、ラップディレクトリの中を走査して、HTMLファイルを一通りDBに自動登録します。
ただ、アクセスの度に、ラップディレクトリの中を走査していたのでは、無駄に重いため、登録するファイルかどうか調べるタイミングがあります。
それを判断するのは、対応するラップディレクトリのタイムスタンプが、前回の走査より新しいかどうか、です。
通常、あるディレクトリにファイルをFTP等でアップロードした場合、所属するディレクトリのタイムスタンプも更新されるので、ほとんどの場合、これでうまく行くでしょう。カテゴリーの仮想パスと対応していないサブディレクトリ内だけを更新した場合などは、あえて上位のディレクトリのタイムスタンプを更新することで、自動登録させることができます。
逆にいえば、仮想パスに対応するディレクトリのタイムスタンプさえ変わらなければ、そのカテゴリー内に自動的にコンテンツが追加されることはありません。つまり、自動登録されたコンテンツをあえて削除してもすぐに再登録されてしまう恐れはありません。
もちろんそれでも何かの拍子に再登録されてしまう可能性が残っているので、どうしても自動登録させたくないコンテンツについては、削除する代わりに「非表示」とするのが良いでしょう。
picoはモジュール単独としてもパンくずを表示できますが、xoops_breadcrumbsに完全対応していますので、xugj_assign.php を使ってテーマパンくずを実装することを勧めます。
(その場合は、一般設定の「パンくずを表示する」をOFFにする)
お使いのテーマにパンくずを実装するには下を参照してください。
http://xoops.peak.ne.jp/modules/news/index.php?page=article&storyid=405
picoは正しくD3モジュールであり、XOOPSコメントには対応しません*1。その代わりに、用意されているのが、d3forumコメント統合機能です。
d3forumコメント統合によって、picoコンテンツへのコメント機能を有効化するための手順は以下の通りです。
以上で、d3forumコメント統合機能は有効化されます。
d3forum側の「フォーラム編集」を開いてみると、「コメント統合時の参照方法」に自動的に値が入っているはずです。picoの場合、以下のような記述になります。
(モジュールインスタンス名)::PicoD3commentContent::pico
picoの基本的かつ重要な動作についての設定は、モジュールの一般設定ではなく、ある特定のファイルで定義されています。(一般設定で気軽にいじられてしまうと、復旧が大変なことになりそうな設定だから、という理由です)
その特定のファイルとは、TRUST_PATH側の include/constants.php です。
実はこのファイル、正式版からは消される運命ですので、正式版からインストールした場合には存在しないかもしれません。その場合は、include/constants.dist.php をリネームして、.dist の部分を消してください。
なぜこんな複雑なことをするかというと、正式版のアーカイブには、constants.dist.php の方しか含まれないので、後からpicoを上書きアップロードしても、設定ファイルである constants.php は上書きされなくなります。
constants.php をあえて作っていない場合は、constants.dist.php の方が読み込まれます。
以下、設定を解説します。
いずれも上級者向けの解説となっています。
意味が判らなければ、この部分のカスタマイズはやめておいた方が無難です。
picoに登録したコンテンツを、単独で表示したい、というケースはよくあります。特に、ポップアップ画面やインラインフレームを多用するサイトでは頻出します。
picoにはそのためのコントローラも実装してあります。単独表示したいコンテンツが表示されるURIの最後に、
?page=singlecontent
という文字列を付与するだけです。
http://www.example.com/modules/pico/sample.html
上記URIで表示されるコンテンツを単独表示するURIは以下のようになります。
http://www.example.com/modules/pico/sample.html?page=singlecontent
http://www.example.com/modules/pico/index.php?content_id=1
上記URIで表示されるコンテンツを単独表示するURIは以下のようになります。
http://www.example.com/modules/pico/index.php?content_id=1&page=singlecontent
picoは、カテゴリー毎のオプションオーバーライド機能に対応しています。
詳しくはこちらを参照してください。
http://xoops.peak.ne.jp/md/news/index.php?page=article&storyid=386
picoは、D3モジュールですので、モジュールインスタンス毎に異なる言語設定を利用することも簡単にできます。
詳しくはこちらを参照してください。
http://xoops.peak.ne.jp/md/news/index.php?page=article&storyid=363
picoは、このモジュールの性格上、同一サイト内にかなりの数を同時にインストールされることも多いと思いますが、X2管理画面では、アイコンが多くなってくると目的のアイコンを探すのが大変になります。
色分け・サイズ変更などを施して、見つけやすくしたアイコンに差し替えることも簡単にできます。
詳しくはこちらを参照してください。
http://xoops.peak.ne.jp/md/news/index.php?page=article&storyid=399
なんらかの理由で、どうしてもpicoのモジュールアイコンが利用できない時にも、この方法を使うと表示されるかもしれません。
そのために、mod_rewriteモードが存在します。
一般設定の「mod_rewriteモードを有効にする」を「はい」とすることで、この機能が有効になりますが、利用しているサーバのhttpdがApacheであり、かつ、mod_rewriteが.htaccessで指定できなければこの機能は事実上機能しません。
wrapsモードとmod_rewriteモードの組み合わせで4パターンが考えられますが、それぞれコンテンツのURIが大きく変わってきますので、注意が必要です。
もっともベーシックなモードです。静的なURI表現は一切ありません。
コンテンツ
http://www.example.com/modules/pico/index.php?content_id=1
カテゴリー
http://www.example.com/modules/pico/index.php?cat_id=1
モジュールフロントエンド直下の .htaccess_normal を .htaccess にリネームする必要があります。
すべてフォーマットに数字が埋め込まれる形でのURIになります。
コンテンツ
http://www.example.com/modules/pico/content0001.html
カテゴリー
http://www.example.com/modules/pico/category0001.html
仮想パス有無によって異なります。また、仮想パスを指定する場合、ディレクトリの深さも表現されます。
コンテンツ
http://www.example.com/modules/pico/index.php/content0001.html (仮想パス指定無し) http://www.example.com/modules/pico/index.php/index.html (仮想パス指定が /index.html)
カテゴリー
http://www.example.com/modules/pico/index.php/category0001.html (仮想パス指定無し) http://www.example.com/modules/pico/index.php/subcat/ (仮想パス指定が /sucat)
モジュールフロントエンド直下の .htaccess_wraps を .htaccess にリネームする必要があります。
仮想パス有無によって異なります。また、仮想パスを指定する場合、ディレクトリの深さも表現されます。
コンテンツ
http://www.example.com/modules/pico/content0001.html (仮想パス指定無し) http://www.example.com/modules/pico/index.html (仮想パス指定が /index.html)
カテゴリー
http://www.example.com/modules/pico/category0001.html (仮想パス指定無し) http://www.example.com/modules/pico/subcat/ (仮想パス指定が /sucat)
いずれのURI形式においても、コンテンツURIの最後に?page=printを付与すれば印刷用画面が、?page=singlecontentを付与すればシングルコンテント画面が表示されます。同様に、カテゴリーURIの最後に?page=rssを付与すれば、RSS表示用のURIとなります。
原因はいろいろ考えられますが、いずれの場合でも、PHPかXOOPSがおかしい状態になっているために発生します。
PHPデバッグをONにした上で、そのモジュールアイコン画像だけを表示してみれば原因がつかめるかもしれません。
どうしても解決できない場合は、module_icon.png を、モジュールフロントエンド直下にコピーするという手もあります。
エラー文を良く読んでください。
unrecognized tag 'xoopsdhtmltarea'
などと書いてあれば、その名前のプラグインがアップロードできていません。
本文フィルターの「HTML特殊文字エスケープ」にチェックが入っていないか確認してください。
HTMLタグを使ったコンテンツをメインに作る場合は、最初から「一般設定」のデフォルトフィルターセットを、下のようにしておくとその都度チェックを外す手間が省けることでしょう。
smiley|xcode|nl2br
Protectorが動作してしまっています。
wrapsモードで大量の画像もラップディレクトリの下に置いた場合、それらの画像が<img>タグなどで呼ばれるだけでも、Protectorのカウントになってしまうからです。
Protector一般設定の「DoS監視の対象から外すモジュール」にモジュールディレクトリ名(モジュールフロントエンド側)を登録することで、改善されます。
下の「wrapsモード時に、画像などの表示が遅い」も参照のこと。
wrapsモードで、画像のパスを "images/sample.gif" などとすると、画像もすべてwrapsディレクトリの下に置いて転送することになります。これだと、転送にPHPやXOOPSがからんでくるため、かなり重く感じられることでしょう。
ゲストにも公開してよい画像であれば、<img>タグなどの画像パスを以下のようなパターンで記述して、それぞれ対応する場所に画像をわけてアップロードすることで、画像転送はApacheだけの仕事となるので、格段に速度が向上します。
また、一般設定において「画像ファイルのブラウザキャッシュ」を長めに設定することでも、改善されるかもしれません。
最新のpiCalモジュールには、pico用のプラグインが2種類含まれています。
基本的に pico 内部で用いるので、TRUST_PATH/modules/pico/smarty_plugins/ に入っていれば使えるのですが、pico 外部、theme などで使いたいときは、/class/smarty/plugins/ に当該プラグインをコピーして使いましょう。
picoの特定コンテンツを表示するためのSmartyプラグイン、function.pico.php があります。
テーマ内のテキストを直書きしたい場所に、
<{pico dir="pico" id="1"}>などと埋め込んでおくと、その文言を、picoのコントローラから編集できて便利でしょう。
http://xoops.peak.ne.jp/md/news/index.php?page=article&storyid=415
なお新しい pico プラグインでは
<{pico dir="pico" id="1" item="hoge"}>という記述もできます。こうすることで、<{$hoge}> にコンテンツの内容をアサインできますので、
<pre>
<{""|var_dump:$hoge}>
</pre>というように内容を確認してみてください。
ちなみに、テーマ等で pico プラグインを使ってコンテンツを呼び出すと、div にくくられた内容が出てきますが、ほかの変数にアサインして用いることで、この div を出さずにコンテンツを呼び出すことができるようになります。
picoの所与のカテゴリに属するコンテンツ群を表示するためのSmartyプラグインです。1.57 以降に同梱されています。
<{pico_list dir="pico" cat_id="1" item="list" order="o.weight" limit="5"}>というように用います。item を指定すると、上記の場合であれば、$list に値をアサインします。
値をアサインしない場合は、そのまま block_list.html と同じフォーマット表示されます。
さまざまな用途に対応できる強力なプラグインですので、ぜひ値をアサインしたら、
<pre>
<{""|var_dump:$list}>
</pre>などでどんな値を使えるかを確認してみてください。
ちなみに order などの値が有効になるのは、引数 item(もしくは assign)で、別の smarty 変数にアサインしているときだけで、block_list.html で表示をするときには、order などは有効になりません。
limit の値は下記のように範囲を指定できます。
<{pico_list dir="pico" cat_id="1" limit="5"}>これは5件のみ。
<{pico_list dir="pico" cat_id="1" limit="10,5"}>10番目〜15番目の5件が表示される。
つまり、
order になかで用いることのできる有効な値は下記の通りです。
カテゴリの冗長情報を取得するためのプラグインです。きめ細かいカテゴリリストを作りたい場合などに重宝します。1.57 以降に同梱されています。
<{pico_subcattree dirname="pico" id="0" item="mycat"}>アサイン専用のプラグインですので、上記の場合でしたら、$mycat にアサインの後、これもどんな値が利用可能なのか、var_dump で確かめてみてください。
以下は利用例です。
<{pico_subcattree dirname="pico" id="0" item="mycat"}>
<!-- cat_id=0 直属カテゴリーのループ -->
<{foreach from=$mycat.subcattree_raw item="subcat"}>
ID: <{$subcat.cat_id}><br />
Title: <{$subcat.cat_title|escape}><br />
直下記事数: <{$subcat.contents_count}><br />
総記事数: <{$subcat.contents_total}><br />
<!-- cat_id=0 の孫カテゴリーのループ -->
<{foreach from=$subcat.subcattree_raw item="subsubcat"}>
ID: <{$subsubcat.cat_id}><br />
Title: <{$subsubcat.cat_title|escape}><br />
直下記事数: <{$subsubcat.contents_count}><br />
総記事数: <{$subsubcat.contents_total}><br />
<{/foreach}>
<{/foreach}>pico_category_search は、ちょっとかわった状態を想定しているプラグインです。 pico のカテゴリ構成が下記のようになっているときに威力を発揮します。
カテゴリ1 -好きな映画 -好きな食べ物 カテゴリ2 -好きな映画 -好きな食べ物 カテゴリ3 -好きな映画 -好きな食べ物
つまり複数のカテゴリがあり、その中に同じ名前のサブカテゴリをもっている状態です。 こういうカテゴリ構成の pico があったとして、仮にその pico を test_pico という dirname だったと仮定します。
<{pico_category_search dir="test_pico" item="categories" title="好きな映画"}>とすることで、test_pico の中にある「好きな映画」カテゴリについての情報が収集され、$categories にアサインされるので、
<pre>
<{''|var_dump:$categories}>
</pre>というような形で、内容を確認してみてください。 で、たとえばこんな形で foreach をまわします。
<{foreach from=$categories item=category}>
<{if $category.redundants.contents_total != '0'}>
<h2>
<a href="/modules/test_pico/index.php?cat_id=<{$category.id}>"><{$category.paths_value[0]}> (記事数:<{$category.redundants.contents_total}>)</a>
</h2>
<{if $category.redundants.contents_total > 0}>
<ul>
<{pico_list dir=$category.mod_dirname cat_id=$category.id item="list"}>
<{foreach from=$list.contents item="content"}>
<li><a href="<{$xoops_url}>/modules/<{$category.mod_dirname}>/<{$content.link}>"><{$content.subject}></a></li>
<{/foreach}>
</ul>
<{/if}>
<{/if}>
<{/foreach}>この例では pico_list プラグインとのあわせ技で、いろんなカテゴリに属している「好きな映画」カテゴリに入っている記事へのリンクを生成しています。
ちなみに pico_category_search で title という引数で渡している文字列を GET の文字列にすることで、ちょっと面白いことができます。
<form name="sampleForm" id="sampleForm" method="get" action="(どこか適当な場所)"> <select name="pcs_querry"> <option value="好きな映画">好きな映画</option> <option value="好きな食べ物">好きな食べ物</option> </select> <input type="submit" value="検索" /> </form>
で、(どこか適当な場所)で、
<{pico_category_search dir="test_pico" item="categories" title=$smarty.get.pcs_querry}>とすれば、指定した文字列で pico_category_search を使うことができるようになります。 ちなみに、受け皿側(どこか適当な場所)で、下記のようなことをしたくなるかもしれません。
<h1><{$smarty.get.pcs_querry}> の検索結果</h1>でも、$_GET をそのまま出力したらあかんので、くれぐれも escape を忘れずに 
<h1><{$smarty.get.pcs_querry|escape}> の検索結果</h1>任意追加フィールド機能(extra_fields)は、pico 1.7 から追加された機能です。pico のテンプレート(*main_content_form.html)を編集することで、任意の入力欄を作って、対話的な入力欄や、さまざまな条件分岐などを追加することができるようになります。
| モジュール名 | 説明 | 配布先 |
| ModuleManuals/TinyD | 静的コンテンツモジュール | http://xoops.peak.ne.jp/ |
| ModuleManuals/wraps | ページラップ専用モジュール | http://xoops.peak.ne.jp/ |
| ModuleManuals/d3forum | picoでコメント機能を使うときに必要なフォーラムモジュール | http://xoops.peak.ne.jp/ |