**[[続・質問箱/350]] [#t73257e1]
#author("2018-03-11T14:05:50+09:00;2007-09-25T15:52:53+09:00","","")
**[[質問箱/2350]] [#t73257e1]
|RIGHT:70|LEFT:410|c
|~カテゴリ||
|~サマリ|外部から指定ページの日付を更新したい|
|~バージョン|1.4.3|
|~投稿者|[[Miu]]|
|~状態|完了|
|~投稿日|&new{2004-09-24 (金) 20:12:51};|
***質問 [#i82c004a]
現在、iframe.inc.phpを使ってBBSなどのプログラムを走らせています。そのiframe内のBBSで発言があった場合に、そのページを「最新の○○件」に表示させたいのです。

iframe内のCGIからPukiwikiの指定ページの日付?のようなものを更新することになるかと思うのですが、その方法をアドバイスお願いします。
(コマンドで指示できるんでしょうか?)


***回答 [#c55b14a0]
-PukiWikiはページの更新日時の情報保持にファイル(wiki/*.txt)の日付を使っています。更にこの情報をキャッシュしているので、他のスクリプトからrecentに更新をかける場合、&br; 1.投稿時に更新ありとしたいページのwiki/*.txtのタイムスタンプを変更する&br;2.更新情報をキャッシュしたファイルを更新する&br;の2つが必要です。1.は PHPでのtouch相当の処理、2.はfile.phpのput_lastmodified相当の処理が出来れば良いので、BBSの投稿処理中にそれらを組み込むか、それらの処理を行うPukiWikiのアクションプラグインを作成してBBSの投稿処理でLocationを吐く事でそのアクションプラグインを呼び出すか、をすれば実現できると思います -- [[にぶんのに]] &new{2004-09-24 (金) 22:57:27};
--ありがとうございます。やはりプラグインを作ったほうが便利ですよね~。ところで、ページ編集中にこのプラグインが実行されたらどうなるんでしょうか? -- [[Miu]] &new{2004-09-25 (土) 21:43:46};
--質問の意味が分からないのですが、ページの更新と同時に実行される事でキャッシュが壊れる事を危惧されているのであればflockで保護されるので問題ありませんよ。 -- [[にぶんのに]] &new{2004-09-27 (月) 00:41:51};
-別の方法としては、BBSにRSS出力機能をつけて、showrssプラグインを使うとか。(最新の○○件に表示ではなくなるけれど) -- [[さばぞう]] &new{2004-09-25 (土) 22:15:08};
--BBSは他の方が配布されているスクリプトを流用しているので、カスタマイズするのであればプラグイン作ってLocationでキックする方が楽ですね・・・。 -- [[Miu]] &new{2004-09-26 (日) 19:38:22};
-この質問は解決されたんでしょうか?&br;私も似たような要望がありまして・・・元々、WebSiteを持っていたのですが、更新のし易さからPukiwikiを使い始めました。これまで私が自作したCGIをプラグイン化するのは大変ですので、現在iframeプラグインでページ内に表示しています。iframeを使用しているページだけ[最新の○件」に表示されないので、表示に統一性がありません。&br;アクションプラグインが出来ていれば使わせて欲しいのですが・・・。 -- [[こば]] &new{2005-01-17 (月) 21:04:47};
-全く当時の議論には関与していませんが… --  &new{2005-01-17 (月) 22:39:06};
 <?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=該当ページ」というように指定してみましたが、何の変化も無いです・・・。指定方法が間違ってますでしょうか? -- [[こば]] &new{2005-01-18 (火) 22:29:58};
---ああ、ページ指定が違います。「index.php?plugin=touch&refer=該当ページ」です。
あるいは、「index.php?plugin=touch&page=該当ページ」でやりたければ
  $page = mb_convert_encoding($vars['page'],SOURCE_ENCODING,'auto');
で --  &new{2005-01-18 (火) 23:29:08};
--ソース改変せず、「index.php?plugin=touch&refer=該当ページ」でやってみましたが、変化無くTopページへアクセスしてしまいました。バージョンは1.4.3、PHPは4.3.8なのですが、何か影響してますでしょうか? -- [[こば]] &new{2005-01-20 (木) 12:33:19};
-referはURLエンコード済みですか? -- [[okkez]] &new{2005-01-20 (木) 13:11:04};
-とりあえず、半角英字のみのページ名で新規作成したページで試してみて下さい --  &new{2005-01-20 (木) 20:52:22};
--半角英字のみでやってみましたが、そのページに飛ばされるのみで、Recentは更新されてないです・・・。 -- [[こば]] &new{2005-01-21 (金) 10:47:03};
---もう一回リロード --  &new{2005-01-21 (金) 11:16:45};
---もしかしてページを凍結している? --  &new{2005-01-21 (金) 21:02:59};
---凍結していました。凍結していないページでは確認できました!!&br;凍結しているページのRecentって変更できないんでしょうか? -- [[こば]] &new{2005-01-22 (土) 13:39:35};
---凍結ページに対してはtouchしないようになっているのです。 --  &new{2005-01-22 (土) 15:34:50};
 _  if ( is_page($page) && is_editable($page)) {
 +  if ( is_page($page)) {
で凍結したページでもtouchするようになります。空age荒しに使われる可能性((という意味では、check_editableの方が妥当だったかもしれない))があることに注意して下さい。
---6行目のifの所にある&& is_editable($page) を消せば凍結されていてもtouch出来るようになるけど、裏を返せば編集認証のかかっているページでもtouchできるようになってしまうのでこの変更をするのはオススメしない。 -- [[okkez]] &new{2005-01-22 (土) 15:36:25};
-is_editable($page)の代わりに $vars['pass'] == 'パスワード'として、URLに &pass=パスワード を加えて使うようにすれば多少の気休めにはなるか --  &new{2005-01-22 (土) 15:44:35};
--そのパスワードもプラグイン内で定義する独自のものにしてやれば気休め度もさらに上がるかな --  &new{2005-01-22 (土) 16:54:03};
--なるほど。確かに、勝手に更新されるのはマズイですよね・・・。パスワード付きの件は良さそうですね♪ -- [[こば]] &new{2005-01-24 (月) 09:06:32};
-これは iframe.inc.php 用と考えていいのでしょうか?なんならそちらのページにまとめる、さらには iframe.inc.php に取り込んでしまうのもありかと思います。by 現編集者 -- [[sonots]] &new{2005-01-26 (水) 12:47:05};
--iframe用です。 okkezさんのコメントを参考にしてパスワード付きのアクションプラグインを使ってみてます。&br;iframe内のデータを更新したときに、手動で実行してます・・・。 -- [[こば]] &new{2005-01-27 (木) 21:46:26};
--本当に iframe だけでしか使用価値はありませんか? --  &new{2005-01-28 (金) 03:02:23};
--“本当に iframe だけでしか使用価値はないか”は自信が無いですけど・・・私の使用方法ですと、十分です。&br;iframe以外の用途をいろいろ考えてみたんですが、階層表現している子ページ(例:list/記事)の更新で親ページ(例:list)のrecentも更新したいというニーズってあるんでしょうかね? -- [[こば]] &new{2005-01-29 (土) 09:02:31};
-な、何故に手動で?CGIの種類にもよるけど、更新を検出してURIを開くとか((&view=offの心はそこにあり))、あるいはheaderで飛ばすとか、自動にする手段はあるのでは? --  &new{2005-01-27 (木) 22:48:00};
--全て手動ではなく、iframe内でA.phpのみを使用している場合、submitした際にheaderで自動で飛ばしてます。&br;しかし、スレッド式のBBSのようなものですと、A.php(スレッドタイトル一覧)からB.php(スレッド内容)、&br;C.php(書き込み)という構成の場合、C.phpのsubmitの際に飛ばすと、リロードされてiframe内が&br;A.phpに戻ってしまいます。(当たり前ですけどね。でもB.phpに飛ばさないとユーザは使いにくいと思い、気づいたときに手動でクリック・・・。) -- [[こば]] &new{2005-01-29 (土) 08:41:46};
--php なら例えば書き込み処理のところで fopen("http:...) かなにかでひっそりと中で呼んであげればいいのでは。fopen だと無駄があるのかどうかは知りませんが。 --  &new{2005-01-29 (土) 09:06:10};
--fopen("http://www.test.com/index.php?plugin=touch&pass=パスワード&refer=ページ名",'r');&br;としてみましたが、反応ありません。知識が薄いもんで・・・・使い方間違ってますでしょうか? -- [[こば]] &new{2005-01-31 (月) 23:35:06};
---パスワードはマルチバイトコードですか? --  &new{2005-02-01 (火) 00:12:12};
--php fopen で検索するといいよ。でも毎回 http 接続するなんて遅すぎて耐えられないかもしれない。 --  &new{2005-02-02 (水) 07:12:48};
--パスワードは1byteです。fopen関数を調べて上記ソースを実行してみたんですが・・・。困りました。 -- [[こば]] &new{2005-02-02 (水) 21:46:06};
-[[allow-url-fopen>http://jp2.php.net/manual/ja/ref.filesystem.php#ini.allow-url-fopen]]を確認 --  &new{2005-02-02 (水) 21:47:53};
-あと、PukiWikiと同一のサーバで動かしているPHPスクリプトなら、URLでfopenするまでもなく、touch(PukiWikiのディレクトリ.DATA_DIR.encode(ページ名).'.txt');put_lastmodified();(相当)すれば済む話ですね。 --  &new{2005-02-02 (水) 21:50:48};
--もうちょっと勉強してみますね。ありがとうございました! -- [[こば]] &new{2005-02-11 (金) 13:33:39};

//#comment

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Site admin: PukiWiki Development Team

PukiWiki 1.5.4+ © 2001-2022 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u12. HTML convert time: 0.057 sec.

OSDN