[20080527_01.png]
おはようございます。
今週は連日招待状の宛名書きをしてます。書く前に一度練習してから清書しているので一通書くのに約10分くらいかかってしまいます。けっこう疲れます。
それが効いているのか、はじめはかなりヤバイ感じのへた字でしたが少しづつ人に見せてもまぁオッケーなくらいになってきました。こういうのって最後になって納得いく字になっていくんでしょうねー。
ここから本題。
先日から挑戦しているコメント投稿のAjax化ですがうまくいきません。投稿できたり、できなかったりとかなり不安定な状況で困っています。
前記事でも書いたようにこのブログはマルチドメインでMTを利用しているのでJavascriptのクロスドメイン制限に引っかかってしまいます。それで違うドメインにあるmt-comments.cgiにPOSTすることができません。そこでPHPで書いた中継プログラム(プロキシサーバー?)を中継してmt-comments.cgiにPOSTするようにしました。
これでうまくいくかな?と思っていたのですが、サインインして投稿すると匿名投稿になってしまったり、投稿自体ができなかったりとおもったように動いてくれませんでした。
コメントのAjax化の方法は基本的に
Movable Type のコメントを Ajax で投稿する2 -- Movable Type 備忘録
の内容を参考にしています。変更した点はJavascriptの冒頭の一部を
var proxy = '<$mt:BlogURL$>proxy.php'; var mt_url = "<$MTCGIPath$><$MTCommentScript$>";
のように変更&追記し、関数ajaxcomment_postとajaxcomment_previewのなかの変数parsを
/*ajaxcomment_post*/ pars = "url="+ encodeURIComponent(mt_url + "?" + pars + "&post=post"); /*ajaxcomment_preview*/ pars = "url="+ encodeURIComponent(mt_url + "?" + pars + "&prevoew=preview");
と変更しているところです。
そのほかは配布されているテンプレートをダウンロードさせてもらってそれを参考に必要箇所をオリジナルテンプレートに追記した感じです。これでいけるはずだったんですが・・・。
サインインしなければいまのとことプレビューと投稿ができるのでコメントはサインインしないでお願いします。
ちなみに今回作成したプロキシはこんなコードです。
<?php
/*
prototype.comment.jsからPOSTされたデータを中継してmt-comments.cgiに再びPOSTする
*/
//URLデコード
$dURL = urldecode($_POST['url']);
//URLを分解
$url = parse_url($dURL);
//クエリ
$query = (isset($url['query'])) ? ('?' . $url['query']) : "";
//リクエストライン
$request = POST . " " . $url['path'] . $query . " HTTP/1.0\r\n";
//リクエストヘッダ
$request .= "HOST: " . $url['host'] . "\r\n";
$request .= "User-Agent: PHP/" . phpversion() . "\r\n";
//POSTデータをヘッダの末尾に追加
parse_otr($url['query'], $post);
while (list($key, $value) = each($post)) {
$POST[] = $key . "=" . $value;
}
$postdata .= implode("&", $POST);
$request .= "Content-Type: application/x-www-form-urlencoded\r\n";
$request .= "Content=Length: " . strlen($postdata) . "\r\n";
$request .= "\r\n";
$request .= $postdata;
//Webサーバーに接続
$fp = fsockopen($url['host'], 80);
//接続に失敗したときの処理
if (!$fp) {
die("MovabelTypeへの接続に失敗しました\r\n");
}
//リクエストデータ送信
fputs($fp, $request);
//レスポンスデータ受信
$response = "";
while (!feof($fp)) {
$response .= fgets($fp, 1024);
}
//接続終了
fclose($fp);
//ヘッダ部分とボディ部分を分離
$out = split("\r\n\r\n", $response, 2);
header("Content-Type: text/html; charset=UTF-8");
header("Pragma: no-cache");
echo $out[1];
?>
Perlの知識がないのが痛いですが、サインしたときのMTの動作をもっと調べないといけないみたいですね。
2008. 6. 1追記
ちょうどサブドメイン環境で Ajax やってみる -- Movable Type 備忘録をいう記事がアップされてました。