PR(記事内にアフィリエイト広告が含まれています)
スポンサーリンク
Nucleus

Nucleusフォームの文字化け対策

今まで自分自身にメモ代わりでフォームを送ってただけなので気付かなかったのですが、フォームのメール欄に日本語を入れると文字化けする状態でした。半年以上気付いてなかったとは!
Nucleusのバージョン3.21のlibs/ACTION.PHP(バージョン3.15ではaction.php)を修正。

117行目あたり
@mb_send_mail($tomem->getEmail(), $title, $message, "From: ". $fromMail);
↓
mb_send_mail($tomem->getEmail(), $title, $message, 'From: '. mb_convert_encoding($fromMail, "iso-2022-jp", _CHARSET) . "\nContent-Type: text/plain; charset=iso-2022-jp");

要は文字化けする項目を mb_convert_encoding にかけてやればいいわけですね。他にも文字化けする項目があったら同様に処理すればよいかと。
文字化けの修正のついでに名前とメールの項目を別途にしたり、公開レスの可否のラジオボタンとかも追加しました。フォーム項目取得部分はバージョン3.15では一番上の階層にあるaction.phpを弄りましたが、バージョン3.21ではlibs/ACTION.PHPの中のfunction sendMessage()を弄ることになります。

  function sendMessage() {
global $CONF, $member;
$error = $this->validateMessage();
if ($error != '')
return array('message' => $error);
if (!$member->isLoggedIn()) {
$fromMail = postVar('frommail');
//20100511_takehana_upd_s
//      $fromName = _MMAIL_FROMANON;
$fromName = requestVar('inputname');
//20100511_takehana_upd_e
} else {
$fromMail = $member->getEmail();
$fromName = $member->getDisplayName();
}
//20100511_takehana_add_s
$res = requestVar('res');
if (!$res) $res = 'mine';
//20100511_takehana_add_e
$tomem = new MEMBER();
$tomem->readFromId(postVar('memberid'));
$message  = _MMAIL_MSG . ' ' . $fromName . "\n"
//20100511_takehana_com1
//        . '(' . _MMAIL_FROMNUC. ' ' . $CONF['IndexURL'] .") \n\n"
//20100511_takehana_add2
. "Mail or URL : " . $fromMail . " \n"
. "RES : " . $res . " \n\n"
//20100511_takehana_com1
//        . _MMAIL_MAIL . " \n\n"
. postVar('message');
$message .= getMailFooter();

デザイン部分は forms ディレクトリのテンプレートを弄ります。かなり変更してますのが、テンプレートソースではコメント付けにくいので改造後の内容をそのまま記載しておきます。
membermailform-notloggedin.template

<a id="nucleus_mf"></a>
<form method="post" action="#nucleus_mf">
<div class="mailform">
<input type="hidden" name="memberid" value="<%formdata(memberid)%>" />
<input type="hidden" name="action" value="sendmessage" />
<input type="hidden" name="url" value="<%formdata(url)%>" />
<%errordiv%>
Name<br>
<input type="text" name="inputname" class="comname" size="35" /><br>
<br>
<%text(_MEMBERMAIL_MAIL)%><br>
<input type="text" name="frommail" class="comname" size="35" /><br>
<br>
Message<br />
<textarea name="message" class="comfield" rows="<%formdata(rows)%>" cols="<%formdata(cols)%>"><%formdata(message)%></textarea><br>
<br />
Res on web ?<br>
<input type="radio" name="res" value="ok" CHECKED>OK <input type="radio" name="res" value="ng">NG<br>
<%callback(FormExtra,membermailform-notloggedin)%>
<br />
<input type="submit" value="<%text(_MEMBERMAIL_SUBMIT)%>" class="formbutton" />
</div>
</form>

受信フォーム内の表示内容を変更するために languageディレクトリの言語ファイル内の member mail message 辺りや、globalfunction.phpのgetMailFooter()辺りも修正しておけば万全ですね。
これでいつフォームが来ても大丈夫です。でもまぁ次のフォームが来るのは統計的な観点から予想すると年末か来年あたりでしょうけれど。ここはなんて孤独なインターネットなのでしょう!

コメント

タイトルとURLをコピーしました