多重インクルードの設定

Pickles Framework では、SSI(サーバーサイドインクルード)のように、部品化された共通のHTMLファイルを埋め込むために、$px->ssi() が用意されています。

$px->ssi() の例
<?php
if($px){
    print $px->ssi('/common/inc/hoge.html');
}
?>

PHP の include() 関数も使用できます。

include() の例
<?php
    include($_SERVER['DOCUMENT_ROOT'].'/common/inc/hoge.html');
?>

PHP の include() で読み込んだソースは、パブリッシュ時に静的に記述されたものとして出力されます。 $px->ssi() は、ブラウザでプレビューするときはインクルードされた状態で、パブリッシュするときは、Apache の SSI の記述として出力する点が、include() と大きく挙動が異なる点です。

デフォルトでは、$px->ssi() は、インクルードファイルをスタティックな文字列として取り扱います。従って、インクルードファイル内でさらに別のファイルをインクルードしたい場合に、期待通りに動作しません。

そこで、このページでは、$px->ssi() を使って多重インクルードを実現する方法についてご紹介します。

多重インクルード(インクルードファイル内でインクルード)するには

Pickles Framework 1.0.3 以降、次の手順で多重インクルードを実装することができるようになりました。

  • 手順1. コンフィグで system.ssi_method"http" に設定します。
    この設定は、ウェブサーバーを経由してインクルードファイルを取得します。基本認証やダイジェスト認証がかかっている場合は、project.auth_type, project.auth_name, project.auth_password も合わせて設定してください。
  • 手順2. インクルードファイルの拡張子を設定します。
    インクルードファイルをブラウザでアクセスしたときに、SSIが処理されるよう Apache を設定します。

インクルードファイルの拡張子が *.html の場合

拡張子 *.html のファイルは、サイトマップに記載がない場合でも、Pickles Framework のテーマの処理を通ります。そのため、断片的であるはずのインクルードファイルにヘッダー・フッターがついた状態で出力されてしまいます。

HTMLの先頭に次のコードを埋め込み、nakedレイアウトが適用されるようにします。

インクルードファイルの実装例: /common/inc/hoge.html
<?php if($px){$px->site()->set_page_info(null,array('layout'=>'naked'));} ?>
<div class="hoge">
<?php if($px){print $px->ssi('/common/inc/fuga.html');} ?>
</div>

HTMLファイルをインクルードする場合にも、インクルードファイル側にPHPの動的な記述を書くことができますが、動的な記述はパブリッシュ時に出力結果だけが静的に生成されることになります。条件によって異なる値(例えば、ページによって異なる値、ページタイトルなど)を出力するような処理は、インクルードファイル内に実装せず、テーマやコンテンツに直接実装してください。

インクルードファイルの拡張子が *.html 以外(例えば *.inc など)の場合

インクルードファイルの拡張子が *.html 以外の場合は、Apache を設定して SSI を有効にします。例えば *.inc であれば、次のような設定ファイルを設置し、SSIを有効にします。

.htaccess
AddType text/html .inc
AddOutputFilter INCLUDES .inc

*.inc 以外の拡張子の場合でも、基本的には同様です。 .inc の部分を適宜書き換えます。
次の例は、インクルードファイルの実装例です。Apache の SSI の記述をそのまま使用します。

インクルードファイルの実装例: /common/inc/hoge.inc
<div class="hoge">
<!--#include virtual="/common/inc/fuga.inc" -->
</div>

パブリッシュ後のインクルードの実装方式を変更するには

やや余談ですが。

パブリッシュ時、デフォルトでは、インクルードの形式はApacheのSSIの形式 (<!--#include virtual="****" -->) で出力されます。この挙動は、プラグインAPIから変更することができます。

次の例は、PHPの include() を使ったインクルード形式で出力するサンプルです。 pjと命名したプラグインの ./_PX/plugins/pj/register/funcs.php に実装しています。

./_PX/plugins/pj/register/funcs.php
<?php

/**
 * PX Plugin "pj"
 */
class pxplugin_pj_register_funcs{
    private $px;

    /**
     * コンストラクタ
     * @param object $px PxFWコアオブジェクト
     */
    public function __construct( $px ){
        $this->px = $px;
    }

    /**
     * パブリッシュ時のSSIタグを出力する。
     *
     * $px->ssi() からコールされます。
     */
    public function ssi_static_tag( $path ){
        return '<'.'?php include( $_SERVER[\'DOCUMENT_ROOT\'].'.t::data2phpsrc( $path ).' ); ?'.'>';
    }//ssi_static_tag()

}

?>

<前へ

次期バージョン Pickles 2 を公開しました。もっと詳しく