Movable Type 備忘録

 MailForm プラグインを jQuery 化する

  • Jan042009
  • Vote:
    http://bizcaz.com/archives/2009/01/04-190154.php
  • Categories: Customize
  • Tags: ,
  • Social Bookmark

こんばんわ^^

年末年始のお休みも今日が最後って人は多いと思います。
わたしもその一人ですが、いつもながらあっという間で、毎年のことながらまったりできない年末年始でした(つω-`。)みなさんはどぅでしょうか。

さて、現在のテンプレートに変更してからメールフォームを取り外してたのですが、とりあえず完成度 80% 程度ですが運用を開始しました。

  • メールフォーム

今回は MailForm プラグインを jQuery 化して、Ajax Uploader という jQuery プラグインを使って、ファイルのアップロード機能を備えたメールフォームを作ってたのですが、どうしてもファイルのアップロードができませんでした。

デモと比較したところ、Ajax Uploader プラグインのインスタンス生成時に input タグ( ファイル選択用 )が自動生成されます。
その input タグのホバーイベントが、デモ版だと正しく入ってきて 'hover' というクラスが自動追加されたりなどされて、ファイル選択ダイアログが表示されるのですが、わたしのメールフォームだとそのイベントが発生してないんですよね。
それが直接の原因か分からないけど、違いはそこら辺ってかんじ。

[2009.01.04] アップローダーが動作しない原因が分かりました。
よく CSS の初期化でフォントサイズを変更したりしますが、Ajax Uploader を使用する際全体のフォントサイズを変更してしまうと動作しなくなります。
なので、わたしはアップローダーを包含するブロック要素配下のすべての子要素のみフォントサイズをデフォルトに戻すことで動作するようになりました。
※詳細は以降で配布する圧縮ファイルの内の CSS を参考にしてください。

後は、アップロードサイズの制限と、アップロードファイルの種類の制限を入れれば完成かな (●´∀`●)

まだ完成ではないけど、メールフォームの機能は満たせてるのでとりあえずペンディングにしちゃいました (; ̄∇ ̄A
今回は普通に MailForm プラグインの jQuery 化についてご紹介です。

ちなみにわたしが使ってる MailForm プラグインのバージョンは 2.10( 2009/01/04 時点の最新 )で Ajax 版を使用してます。
Ajax 版を利用されてない人にはまったく無意味な記事です。

カスタマイズ

MailForm プラグインを jQuery に対応するには以下のファイルを修正/追加します。

  • mt/plugins/MailForm/MailForm.pl
    修正します。
  • mt/mt-static/plugins/MailForm/jquery.mailform.js
    追加します。

以上です。
後は今まで通り使えます。また、変更後は一度再構築し直す必要もあります。

  1. MailForm プラグインの修正

    まず、MailForm.pl ファイルを以下のように修正します。

    MailForm.pl 235 行目

    1.     my $out = <<HERE;
    2. <script type="text/javascript" src="${static_path}plugins/MailForm/js/prototype.js"></script>
    3. <script type="text/javascript" src="${static_path}plugins/MailForm/js/mailform.js"></script>
    4. <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"></script>
    5. <script type="text/javascript" src="${static_path}plugins/MailForm/js/jquery.mailform.js"></script>
    6. <script type="text/javascript">
    7. //<![CDATA[

    上記赤字の 235、246 行を削除して青字で置き換えます。 変更したら保存します。
    この修正は MTMailFormAjaxJS ファンクションタグに影響します。 テンプレートでいうと、インデックステンプレートの「mail_form:メールフォーム」に関係します。

  2. JavaScript のアップロード

    jQuery 版 mailform.js スクリプトを新規でアップロードします。 jQuery 版 mailform.js のコードは以下の通りです。

    jQuery 版 mailform.js

    1. jQuery.noConflict();
    2. var j$ = jQuery;
    3. var FJAjaxMail = {};
    4.  
    5. FJAjaxMail.send = function(mode) {
    6.     var form = document.mailform;
    7.     var resp = j$('#ajax_mail');
    8.     var opts = {preview:'&mail_preview=1', post:'&mail_post=1'};
    9.     var params = [j$(form).serialize(), opts[mode].join('');
    10.  
    11.     resp.html(FJAjaxMail.waitMsg).ajaxError(function(ev, req, ops, err) {
    12.         j$(this).html(FJAjaxMail.failureMsg);
    13.         return false;
    14.     });
    15.     j$.post([FJAjaxMail.cgiPath, 'plugins/MailForm/mt-mail-form.cgi'].join(''), params, function(message, status) {
    16.         resp.html(FJAjaxMail.safari_escape(message));
    17.         return false;
    18.     });
    19. };
    20.  
    21. FJAjaxMail.safari_escape = function(text) {
    22.     if (navigator.appVersion.indexOf("KHTML") > -1) {
    23.         var esc = escape(text);
    24.  
    25.         if (esc.indexOf("%u") < 0 && esc.indexOf("%") > -1) {
    26.             text = decodeURIComponent(esc);
    27.         }
    28.     }
    29.  
    30.     return text;
    31. };

    上記コードを jquery.mailform.js というファイル名で保存して、mt/mt-static/plugins/MailForm/js/ フォルダ内にアップロードします。

以上です。
後はメールフォームを再構築すれば完了です。

ちなみに、上記コードは単純にオリジナルの mailform.js を jQuery で置き換えただけですが、わたしのサイトではさらにカスタマイズして、フォーカスイン、フォーカスアウト時の強調表示なども賄ってます。

bzbell 版 mailform.js

  1. jQuery.noConflict();
  2. var j$ = jQuery;
  3. var FJAjaxMail = {};
  4.  
  5. j$(document).ready(function() {
  6.     FJAjaxMail.focus_bg = '#d3cbc6';// フォーカスイン時の背景色
  7.     FJAjaxMail.blur_bg = '#fbfaf5';// フォーカスアウト時の背景色
  8.     FJAjaxMail.focus_bd = '#c89932';// フォーカスイン時のボーダー色
  9.     FJAjaxMail.blur_bd = '#000'; // フォーカスアウト時のボーダー色
  10.     FJAjaxMail.image_height = 200; // 背景イメージ高さ
  11.  
  12.     FJAjaxMail.setevent();
  13. });
  14.  
  15. FJAjaxMail.setevent = function() {
  16.     /*
  17.      * 全 input タグに hover イベント割り当て
  18.      */
  19.     j$(':input').hover(function() {
  20.         j$(this).css({'border-color':FJAjaxMail.focus_bd});
  21.     },
  22.     function() {
  23.         j$(this).css({'border-color':FJAjaxMail.blur_bd});
  24.     })
  25.     /*
  26.      * preview/post ボタンに click イベント割り当て
  27.      */
  28.     .filter('input[@type="button"]').click(function() {
  29.         var form = document.mailform;
  30.         var resp = j$('#ajax_mail');
  31.         var opts = {mail_preview:'&mail_preview=1', mail_post:'&mail_post=1'};
  32.         var params = [j$(form).serialize(), opts[j$(this).attr('name')]].join('');
  33.  
  34.         resp.html(FJAjaxMail.waitMsg)
  35.             .ajaxError(function(ev, req, ops, err) {
  36.                 j$(this).html(FJAjaxMail.failureMsg);
  37.                 return false;
  38.             });
  39.         j$.post([FJAjaxMail.cgiPath, 'plugins/MailForm/mt-mail-form.cgi'].join(''), params, function(message, status) {
  40.             resp.html(FJAjaxMail.safari_escape(message));
  41.             FJAjaxMail.setevent();
  42.             return false;
  43.         });
  44.     })
  45.     .end()
  46.     /*
  47.      * 全 input:text タグに focus/blur イベント割り当て
  48.      */
  49.     .filter('input[@type="text"]').focus(function() {
  50.         j$(this).css({'background-color':FJAjaxMail.focus_bg, 'background-position':'0 -'+FJAjaxMail.image_height+'px', 'border-color':FJAjaxMail.focus_bd});
  51.     })
  52.     .blur(function() {
  53.         j$(this).css({'background-color':FJAjaxMail.blur_bg, 'background-position':'0 0', 'border-color':FJAjaxMail.blur_bd});
  54.     });
  55.     /*
  56.      * 全 textarea タグに hover/focus/blur イベント割り当て
  57.      */
  58.     j$('textarea').focus(function() {
  59.         j$(this).css({'background-color':FJAjaxMail.focus_bg, 'background-position':'0 -'+FJAjaxMail.image_height+'px', 'border-color':FJAjaxMail.focus_bd});
  60.     })
  61.     .blur(function() {
  62.         j$(this).css({'background-color':FJAjaxMail.blur_bg, 'background-position':'0 0', 'border-color':FJAjaxMail.blur_bd});
  63.     })
  64.     .hover(function() {
  65.         j$(this).css({'border-color':FJAjaxMail.focus_bd});
  66.     },
  67.     function() {
  68.         j$(this).css({'border-color':FJAjaxMail.blur_bd});
  69.     });
  70. };
  71.  
  72. FJAjaxMail.safari_escape = function(text) {
  73.     if (navigator.appVersion.indexOf("KHTML") > -1) {
  74.         var esc = escape(text);
  75.  
  76.         if (esc.indexOf("%u") < 0 && esc.indexOf("%") > -1) {
  77.             text = decodeURIComponent(esc);
  78.         }
  79.     }
  80.  
  81.     return text;
  82. };

ざっくり説明すると、メールフォームのページが表示されたら hover、focus、blur、click イベントを各 input タグに割り当てることをやってます。
これに伴って、テンプレートモジュールの「mail_common:メールフォーム共通部分」を以下のように変更します。

mail_common:メールフォーム共通部分

  1. <div id="mailform-block">
  2.     <form method="post" action="-" name="mailform" id="mailform">
  3.         <fieldset class="rounded">
  4.             <p id="owner" class="clearfix"><img src="<$MTStaticWebPath$>plugins/mt_memo/images/iddy/profile.png" width="100%" height="100%" alt="bzbell" /></p>
  5.             <p><label for="mail_author">Name</label>
  6.             <input type="text" id="mail_author" name="mail_author" class="mail_input" value="<$MTMailPreviewAuthor$>" /></p>
  7.  
  8.             <p><label for="mail_email">Email address</label>
  9.             <input type="text" id="mail_email" name="mail_email" class="mail_input" value="<$MTMailPreviewEMail$>" /></p>
  10.  
  11.             <p><label for="mail_email_confirm">Retype email address</label>
  12.             <input class="mail_input<MTMailPreviewIfEMailDifferent> mail_error</MTMailPreviewIfEMailDifferent>" type="text" id="mail_email_confirm" name="mail_email_confirm" value="<$MTMailPreviewEMailConfirm$>" /></p>
  13.  
  14.             <p><label for="mail_subject">Title</label>
  15.             <input type="text" id="mail_subject" name="mail_subject" class="mail_input" value="<$MTMailPreviewSubject$>" /></p>
  16.  
  17.             <p><label for="mail_text">Message</label>
  18.             <textarea id="mail_text" name="mail_text" class="mail_input" rows="12" cols="20"><$MTMailPreviewBody$></textarea></p>
  19.             <p class="center"><input type="hidden" name="mail_blog_id" value="<$MTBlogID$>" />
  20.             <input type="hidden" name="mail_ajax" value="1" />
  21.             <input type="hidden" name="mail_setting" value="<$mt:GetVar name="mail_setting"$>" />
  22.             <input type="button" name="mail_preview" id="mail_preview" accesskey="v" value="Preview" />
  23.             <input type="button" name="mail_post" id="mail_post" accesskey="s" value="Post" /></p>
  24.         </fieldset>
  25.     </form>
  26. </div>

何が違うかというと、テンプレート内に JavaScript のコードが消えたってことでしょうか。
参考までに、わたしが使ってる MailForm プラグインを以下に置いておきます。 上記で説明されてるコード、およびテンプレート一式を同梱してます。
一部取っ掛かり中のファイルアップロード機能のコードも含まれてますが気にしないでください。

では。

 Trackback Pings(0)

No trackbacks found.

 Comments(4)

#1: Posted by Author Profile Page kchin.openid.ne.jp @ April 7, 2009 [REPLY]
user-pic

こんにちは^^
メールフォームを設置しようと思っているのですが
その前に・・・またIE8でのエラー情報です
bzbellさんのメールフォームURLをクリックすると(サイドバーにあるメールフォーム)
エラーが発生しフォームが表示されていません^^;

Foxだとエラーも無くメールを送る事ができるのですが

エラー内容は下記のとおりです
メッセージ: 引数が無効です。
ライン: 12
文字: 12949
コード: 0
URI: http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js
#2: Posted by Author Profile Page bzbellからkchin.openid.ne.jpへの返信 @ April 7, 2009 [REPLY]
user-pic

>>1 kchin.openid.ne.jp さん

こんばんわ^^

そうなんです。
shadowbox というライブラリを使用してまして、IE8 だとエラーしちゃうんですよね。
すっかり忘れてましたあせあせ
shadowbox と併用しなければ問題ないかと思います。

ご連絡ありがとうございますもじもじ

#3: Posted by asd @ May 13, 2009 [REPLY]
user-pic

こんにちは、
jquery版メールフォーム使わせていただきました。
jquery.mailform.jsをアップして使おうと思ったら、エラーが出てました。
jQuery 版 mailform.jsの9行目
var params = [j$(form).serialize(), opts[mode].join('');

var params = [j$("form").serialize(), opts[mode]].join('');

結構使いたい人がいると思うので、ご報告しておきます〜。

#4: Posted by Author Profile Page bzbellからasdへの返信 @ May 13, 2009 [REPLY]
user-pic

>>3 asd さん

こんばんわ^^

> 結構使いたい人がいると思うので、ご報告しておきます〜。

あちゃキャハハ
修正版を UP しました。
ご連絡ありがとうございますぺこり

 Post a Comment

 

コメント用フィード