freo(PHP)に「てがろぐ」の投稿を埋め込む

20221124_freo_tega.jpg

2022/12/06 スキンの書き方や別の方法について追記しました。

一応当サイトのコンテンツの一つとして設置してみたてがろぐですが、スマホ等で見たときに本サイトからアクセスしづらかった(PCなど画面サイズが大きい環境では上部メニューリンクの「コンテンツ」にホバーしたときに展開される項目最下部からアクセスできるんですけどスマホのハンバーガーメニューだと表示されない)のでサイトトップページに最新一件を表示できるようにしてみたメモです。

てがろぐの投稿をHTMLファイルに埋め込むには

てがろぐCGIが出力した最新の1件を任意の場所にSSIで埋め込む方法 - Sakura scopeで解説されている通りに埋め込み用のスキンを作成しSSIを使ってHTMLファイルに埋め込むことができます。

しかしfreoはPHPなので…SSIでのインクルードは使えない…。上記の解説で

PHPのfile_get_contentsなどで埋め込む場合でも同様

とはあるものの、さらっとその一文だけだったので実装する際に少しだけ手間取りました😅PHP触るのも久々だったので…(言い訳)

てがろぐの投稿をPHPファイルに埋め込むには

前準備として、HTMLファイルに埋め込む手順と同じく埋め込み用のてがろぐスキンファイルを作成しておきます。私は文字列のみを一行で表示できればよかったのでskin-cover.htmlはにししさんの解説と同様に、skin-onelog.htmlは以下のようにしました。

<a href="てがろぐトップURL">
<span class="date">[[DATE:Y/M/D]]</span>
<span class="body">[[COMMENT:TEXT:100]]</span>
</a>

で、SSIと同じように

<?php
 echo file_get_contents("/path/to/tegalog.cgi?skin=umekomi");
?>

として埋め込み完了!…とはならなかったので困りました。試行錯誤の結果、file_get_contentsで外部ファイルの内容を埋め込むにはパスの扱いが微妙らしく。相対パスで書くといいという情報も見たのですが自分の環境ではそれでもうまくいかなかったため「http~」から始まるURLを入れることで解決しました。ローカルでもweb上でもそれぞれの場所に置いてあるてがろぐを読み込みたかったので以下のような書き方をしています。

<?php
$url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$html = file_get_contents($url . 'tegalog/tegalog.cgi?skin=umekomi');
echo $html;
?>

freoのテンプレートファイルに書く場合は

{php}
$url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$html = file_get_contents($url . 'tegalog/tegalog.cgi?skin=umekomi');
echo $html;
{/php}

smarty3の場合は{php}~{/php}が無効化されてるかもしれません、freoTIPS ~ Smartyを2.x系から3.x系にバージョンアップするときのTIPS ~ ― 龍の棲む場所を参考に後方互換を使ったSmarty3を適用している場合はlibs/freo/comon.php42行目以降「テンプレート設定」末尾 return 直前あたりに

$freo->smarty->php_handling      = Smarty::PHP_ALLOW;

を追加すると使えるようになるかもです(バージョンによってはこれでもテンプレート内に直接PHPを書くのが無理になってるかもしれません・未確認)。

デモ

当サイトトップです。令和の時代のmarquee😄

リンクや画像も表示したい場合は

今回私はてがろぐへの誘導リンクとして出力できればよかったので上記のようにしましたが、普通に投稿内容を表示したい場合はてがろぐ公式動作確認板 No.2115に書き込まれた方法を使うのがよさそうです。