PHP を利用する目的が

  1. ページの生成時に独自タグで対応できない部分を補う。
  2. 問い合わせフォーム等の PHP スクリプトを動かす。

の2つあり、その説明です。

エディタでの PHP スクリプトのシンタックスハイライトはうまくできていません。

PHP の設定

メニュー「オプション」の「PHP の設定」から別途インストール済みの php.exe の場所を指定してください。
php7.1 以上の新しいバージョンが良いです。

ページの生成に PHP を使う

独自タグで実現できない処理は PHP を別途インストールして利用すれば解決できる場合があると思います。
しかし、生成速度も遅くなりがちですし積極的に利用するのは避けたほうが良いと思います。あくまでも最終手段的な感覚です。

ファイルを指定する際のパスの文字コードや出力を利用する際の文字コードは特に何も考えずに全て UTF-8 で行っています。 Windows版 PHP 7.1 以降ではうまく対応してくれるらしいので 7.1 以降の PHP を利用しつつ、 プロジェクトへのパスに全角文字やスペースを含まない様にした方が問題が起きにくいかもしれません。

機能追加版の First はページを生成する際に以下の条件がそろうとページの内容を PHP に読ませてその結果をページとして書き出します。

  • php.exe の場所が設定されている。
  • 生成するページの拡張子が「.html」 である。
  • 生成するページの内容に <?php の文字列が含まれている。

先頭に無条件で以下のスクリプトが追加されて、設定と変数、定数が定義されます。 (以下は見やすく改行していますが、実際は改行しないで追加されます。)

<?php 
error_reporting(E_ALL);
ini_set('default_charset', 'UTF-8');
date_default_timezone_set('Asia/Tokyo');
set_time_limit(5);
mb_language('ja');
mb_internal_encoding('UTF-8');
$id= 生成中のノードID;
const PROJECT_DIR = "プロジェクトフォルダのパス";
const TEST = false; //生成中は false テンプレートエディタでの実行では true
$pdo = new PDO('sqlite:./project.sq3');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
?>
変数/定数
$id ページのノード ID
$pdo SQLite ファイルへの PDO 接続ハンドル
TEST (定数) テンプレートファイルエディタで実行時に true、生成時には false
PROJECT_DIR(定数) プロジェクトフォルダのパス

テンプレートファイルエディタでの実行時には、ページの ID が決まっていないので、 テンプレートエディタの左パネルの「ノードタブ」のツリーで選択されているノードの ID が $id に格納されています。(選択されていない場合は 1 になります。)

スクリプトの記述

メインコンテンツを Markdown 形式で書いている場合に、 markdown パーサがスクリプトを書き換えてしまう場合がありますので、 メインコンテンツに直接スクリプトは書かずに、parts フォルダにファイルを作成してそれらを

[[ First ファイル挿入 #php_script.php# ]]

等として読み込むようにしてください。

テンプレートファイルのエディタで開いているファイルをテスト実行したい場合は CTL + R で実行結果をエディタに分割表示します。

php の実行の図

First はグローバル変数 $pdo に SQLite ファイルへのハンドルを格納していますので、 それを使ってプロジェクト内の全てのデータにアクセスできます。

以下はページデータと一緒にリスト表示する例です。
parts フォルダに例えば php_script.php として保存し、 [[ First ファイル挿入 #php_script.php# ]] で読み込む。

//フォルダノードを取得
$query
	= $pdo->query(
		sprintf(
			'SELECT * FROM %s WHERE name = %s',
			'nodes',
			$pdo->quote('フォルダ名')
		)
	);

$dir_node = $query->fetch(PDO::FETCH_ASSOC);

$query = null;

//ページデータテーブルを JOIN して取得
if ( $dir_node !== false ) {

	$query
		= $pdo->query(
			sprintf(
'
SELECT a.name as name, a.title as title, a.url as url, b.value as value
FROM nodes as a LEFT JOIN metas as b ON a.id = b.node_id AND b.name = %s
WHERE a.parent_id = %d AND a.name <> %s ORDER BY a.order_key DESC

',
			$pdo->quote('ページデータ名'),
			$dir_node['id'],
			$pdo->quote('index.html')
			)
		);

	if ( !$row = $query->fetch(PDO::FETCH_ASSOC) ) {
		//データなし
	}
	else {

		echo '<ul>';
		do {

			printf(
				'<li><a href="[[ First トップまでの相対パス ]]%s">%s %s</a></li>',
				ltrim($row['url'], '/'),
				$row['value'],
				$row['title']
			);

			echo "\r\n";

		} while ( $row = $query->fetch() );
		echo '</ul>';
	}
}

サーバーサイドで使う PHP

PHP の実行ファイルを指定すると PHP のビルドインサーバーを起動し、First 内のブラウザは http でアクセスするようになります。 つまり、ファイルの拡張子を .php としておくと、ビルドインサーバーが PHP を実行した結果を表示できます。

※ファイルの拡張子を .php にすると、ページの生成時のスクリプトは使えなくなります。

ただし、言語の設定等(mb_language等)は何も行いませんので、サーバーにもよりますが、自身で設定する必要があると思います。

First の異常終了時

もし、First が異常終了した場合、ビルドインサーバーのプロセスが残ってしまいます。 面倒ですがタスクバーで選択し CTRL + C を押下して終了させてください。

また、First 内蔵のブラウザに Not Found 的なメッセージが表示された場合はメニューの 「その他」から「PHP ビルドインサーバーの再起動」を実行してみてください。

最終更新日:2020 年 02月 04 日