カテゴリ | |
サマリ | 外部から指定ページの日付を更新したい |
バージョン | 1.4.3 |
投稿者 | Miu |
状態 | 完了 |
投稿日 | |
現在、iframe.inc.phpを使ってBBSなどのプログラムを走らせています。そのiframe内のBBSで発言があった場合に、そのページを「最新の○○件」に表示させたいのです。
iframe内のCGIからPukiwikiの指定ページの日付?のようなものを更新することになるかと思うのですが、その方法をアドバイスお願いします。
(コマンドで指示できるんでしょうか?)
- PukiWikiはページの更新日時の情報保持にファイル(wiki/*.txt)の日付を使っています。更にこの情報をキャッシュしているので、他のスクリプトからrecentに更新をかける場合、
1.投稿時に更新ありとしたいページのwiki/*.txtのタイムスタンプを変更する
2.更新情報をキャッシュしたファイルを更新する
の2つが必要です。1.は PHPでのtouch相当の処理、2.はfile.phpのput_lastmodified相当の処理が出来れば良いので、BBSの投稿処理中にそれらを組み込むか、それらの処理を行うPukiWikiのアクションプラグインを作成してBBSの投稿処理でLocationを吐く事でそのアクションプラグインを呼び出すか、をすれば実現できると思います -- にぶんのに
- ありがとうございます。やはりプラグインを作ったほうが便利ですよね~。ところで、ページ編集中にこのプラグインが実行されたらどうなるんでしょうか? -- Miu
- 質問の意味が分からないのですが、ページの更新と同時に実行される事でキャッシュが壊れる事を危惧されているのであればflockで保護されるので問題ありませんよ。 -- にぶんのに
- 別の方法としては、BBSにRSS出力機能をつけて、showrssプラグインを使うとか。(最新の○○件に表示ではなくなるけれど) -- さばぞう
- BBSは他の方が配布されているスクリプトを流用しているので、カスタマイズするのであればプラグイン作ってLocationでキックする方が楽ですね・・・。 -- Miu
- この質問は解決されたんでしょうか?
私も似たような要望がありまして・・・元々、WebSiteを持っていたのですが、更新のし易さからPukiwikiを使い始めました。これまで私が自作したCGIをプラグイン化するのは大変ですので、現在iframeプラグインでページ内に表示しています。iframeを使用しているページだけ[最新の○件」に表示されないので、表示に統一性がありません。
アクションプラグインが出来ていれば使わせて欲しいのですが・・・。 -- こば
- 全く当時の議論には関与していませんが… --
<?php
function plugin_touch_action()
{
global $vars,$script;
$page = mb_convert_encoding($vars['refer'],SOURCE_ENCODING,'auto');
if ( is_page($page) && is_editable($page)) {
touch( DATA_DIR.encode($page).'.txt');
put_lastmodified();
}
( $vars['view'] != 'off') && header("Location: $script".
(is_page($page) ? '?'.rawurlencode($page): ''));
exit;
}
?>
- touch.inc.phpとしてpluginディレクトリに格納、「index.php?plugin=touch&page=該当ページ」というように指定してみましたが、何の変化も無いです・・・。指定方法が間違ってますでしょうか? -- こば
- ソース改変せず、「index.php?plugin=touch&refer=該当ページ」でやってみましたが、変化無くTopページへアクセスしてしまいました。バージョンは1.4.3、PHPは4.3.8なのですが、何か影響してますでしょうか? -- こば
- referはURLエンコード済みですか? -- okkez
- とりあえず、半角英字のみのページ名で新規作成したページで試してみて下さい --
- 半角英字のみでやってみましたが、そのページに飛ばされるのみで、Recentは更新されてないです・・・。 -- こば
- is_editable($page)の代わりに $vars['pass'] == 'パスワード'として、URLに &pass=パスワード を加えて使うようにすれば多少の気休めにはなるか --
- そのパスワードもプラグイン内で定義する独自のものにしてやれば気休め度もさらに上がるかな --
- なるほど。確かに、勝手に更新されるのはマズイですよね・・・。パスワード付きの件は良さそうですね♪ -- こば
- これは iframe.inc.php 用と考えていいのでしょうか?なんならそちらのページにまとめる、さらには iframe.inc.php に取り込んでしまうのもありかと思います。by 現編集者 -- sonots
- iframe用です。 okkezさんのコメントを参考にしてパスワード付きのアクションプラグインを使ってみてます。
iframe内のデータを更新したときに、手動で実行してます・・・。 -- こば
- 本当に iframe だけでしか使用価値はありませんか? --
- “本当に iframe だけでしか使用価値はないか”は自信が無いですけど・・・私の使用方法ですと、十分です。
iframe以外の用途をいろいろ考えてみたんですが、階層表現している子ページ(例:list/記事)の更新で親ページ(例:list)のrecentも更新したいというニーズってあるんでしょうかね? -- こば
- な、何故に手動で?CGIの種類にもよるけど、更新を検出してURIを開くとか*2、あるいはheaderで飛ばすとか、自動にする手段はあるのでは? --
- 全て手動ではなく、iframe内でA.phpのみを使用している場合、submitした際にheaderで自動で飛ばしてます。
しかし、スレッド式のBBSのようなものですと、A.php(スレッドタイトル一覧)からB.php(スレッド内容)、
C.php(書き込み)という構成の場合、C.phpのsubmitの際に飛ばすと、リロードされてiframe内が
A.phpに戻ってしまいます。(当たり前ですけどね。でもB.phpに飛ばさないとユーザは使いにくいと思い、気づいたときに手動でクリック・・・。) -- こば
- php なら例えば書き込み処理のところで fopen("http:...) かなにかでひっそりと中で呼んであげればいいのでは。fopen だと無駄があるのかどうかは知りませんが。 --
- fopen("http://www.test.com/index.php?plugin=touch&pass=パスワード&refer=ページ名",'r');
としてみましたが、反応ありません。知識が薄いもんで・・・・使い方間違ってますでしょうか? -- こば
- php fopen で検索するといいよ。でも毎回 http 接続するなんて遅すぎて耐えられないかもしれない。 --
- パスワードは1byteです。fopen関数を調べて上記ソースを実行してみたんですが・・・。困りました。 -- こば
- allow-url-fopenを確認 --
- あと、PukiWikiと同一のサーバで動かしているPHPスクリプトなら、URLでfopenするまでもなく、touch(PukiWikiのディレクトリ.DATA_DIR.encode(ページ名).'.txt');put_lastmodified();(相当)すれば済む話ですね。 --
- もうちょっと勉強してみますね。ありがとうございました! -- こば