ウェブデザインとプログラムのナインマイルズ

s9yドキュメント

Serendipityを組み込みで使う

  1. このセクションのオリジナルドキュメント
  2. ..(テクニカルドキュメント)

Serendipityは2つの組み込みモードをサポートしています: Serendipityのページ内に何かを埋め込む方法と、他のページにSerendipityを埋め込む方法です。

Serendipityの組み込みインストールをセットアップするためのヒントについては、この説明もまた必ず読むようにしてください。

まず初めに、あなたの最終目標がSmartyのテンプレート (テンプレートディレクトリ内のindex.tpl, entries.tpl) をモディファイすることなどで、既に実現されてはいないことを確認してください。

Serendipityの中にに埋め込むもの

基本的に、他のプログラムは index.tpl から呼び出します。

他のものはここで機能します。そうしてください…。

他のページにSerendipityを埋め込む

Serendipityを埋め込むのはあまりお勧めの方法ではありません。 はっきり言って、全ての設定を正しく行うには相当骨が折れます。
代わりに、Serendipityの中に他のものを埋め込むことを強くお勧めします。

そうですか、それでも決心しましたか。では、

基本原則

Serendipityは正しく配置されたディレクトリからの呼び出しがなければ正しく動きません。 PHPプログラムなので、適切なPHP構文を使って呼び出す必要もあります。 とても簡単な事例を示します:

<?php
  chdir("<serendipity_dir>");
  require("index.php");
  chdir("<original_dir>");
?>

1行目でカレントディレクトリをSerendipityのディレクトリ (当然、<serendipity_dir> の部分は正しいディレクトリ名を用います) に変更しています。 2行目ではSerendipityが実際に動いて全ての内容を出力します。 3行目で元のディレクトリ (もちろん <original_dir> は置き換えてください) に戻ります。

内容をすぐに表示させるのではなく、出力内容を後で使うために保存しても結構です。 もしPHPプログラムの中にSerendipityを埋め込むのなら、このやり方が特に使いやすいです。 出力内容を保存する一つの方法はこんな感じになります:

<?php
  ob_start();
  chdir("<serendipity_dir>");
  require("index.php");
  chdir("<original_dir>");
  $serendipity_contents = ob_get_contents();
  ob_end_clean();
?>

oboutput bufferを表します。 これで、直前の内容がバッファに捕らえられ、バッファの中身は $serendipity_contents 変数の中に確保されます。 その後バッファへの保存は終了します。
これで、blogを表示させたい任意の箇所で print $serendipity_contents することが可能です。

ラッパーとして使うこともできる点に留意してください。 それはSerendipityを呼び出して変数に格納された内容を保存する小さなPHPファイルです。 例えば、任意のディレクトリに serendipity_wrapper.php というファイル名で保存し、このように利用できます:

require("<full_path>/serendipity_wrapper.php");

これで あなたがどこでも利用できる $serendipity_contents を含む変数を得ることができるでしょう。良い感じでしょう?

これはかろうじてきちんと動きます。 もし Warning: Cannot modify header information - headers already sent というエラーが出た場合は、ラッパーを使う必要があるでしょう。 Serendipityが呼び出される前にいかなる出力も有ってはいけないので、ラッパーを初めに呼ばなければいけないわけです。
もしファイルの先頭ではなく他のどこかにSerendipityの出力を表示させたい場合は、変数に格納された出力内容を保存しておいて、後から使う必要があります。 これがその例です:

<?php
require("wrapper.php"); // 変数の中身を保存
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
</head>
<body>
Your non-Serendipity content goes here.
<?php
echo $serendipity_contents; // 変数を出力
?>
More non-Serendipity content here.
</body>
</html>

HTMLコードの中ほどでSerendipityを呼び出していたことが header already sent エラーの原因だったということです。

埋め込まれた外観を変更する

テーマとヘッダ部のHTMLを取り除くには、管理者ページで設定を変更します。
Serendipityを組み込みで使用しますか? を見つけたら はい にします。
これでSerendipityはHTMLだけを出力するようになります。
スタイルシートも、<HTML>, <HEAD>, <BODY> の各タグも含まれなくなります。

サイドバーはさらに簡単で、もう少し分かりやすいです。
管理者ページに行き、プラグイン設定を選び、そしてサイドバープラグインを隠すにセットします。
削除を選ぶこともまた可能です。
これでSerendipityはサイドバーを出力しません。

その他の外観を変更する

もちろんラッパー内で変数を定義することも可能です。
より多くの人がこのドキュメントを更新するために時間を取ってくれれば、もっと説明できるのですが。

既知の問題

出力バッファを圧縮して使う場合、Serendipityの組み込み時に空のページが表示されるかもしれません。 これは複数のGZIP圧縮されたページバッファがそれぞれ互いに上手く作用しない場合があるからです。
解決策はSerendipityかPHPの設定で圧縮出力をオフにすることです。

Serendipity