PHP を利用する目的が
の2つあり、その説明です。
※エディタでの PHP スクリプトのシンタックスハイライトはうまくできていません。
メニュー「オプション」の「PHP の設定」から別途インストール済みの php.exe の場所を指定してください。
php7.1 以上の新しいバージョンが良いです。
独自タグで実現できない処理は PHP を別途インストールして利用すれば解決できる場合があると思います。
しかし、生成速度も遅くなりがちですし積極的に利用するのは避けたほうが良いと思います。あくまでも最終手段的な感覚です。
ファイルを指定する際のパスの文字コードや出力を利用する際の文字コードは特に何も考えずに全て UTF-8 で行っています。 Windows版 PHP 7.1 以降ではうまく対応してくれるらしいので 7.1 以降の PHP を利用しつつ、 プロジェクトへのパスに全角文字やスペースを含まない様にした方が問題が起きにくいかもしれません。
機能追加版の First はページを生成する際に以下の条件がそろうとページの内容を 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 で実行結果をエディタに分割表示します。
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 のビルドインサーバーを起動し、First 内のブラウザは http でアクセスするようになります。 つまり、ファイルの拡張子を .php としておくと、ビルドインサーバーが PHP を実行した結果を表示できます。
※ファイルの拡張子を .php にすると、ページの生成時のスクリプトは使えなくなります。
ただし、言語の設定等(mb_language等)は何も行いませんので、サーバーにもよりますが、自身で設定する必要があると思います。
もし、First が異常終了した場合、ビルドインサーバーのプロセスが残ってしまいます。 面倒ですがタスクバーで選択し CTRL + C を押下して終了させてください。
また、First 内蔵のブラウザに Not Found 的なメッセージが表示された場合はメニューの 「その他」から「PHP ビルドインサーバーの再起動」を実行してみてください。