
概要:
Joomla! の標準でついているメールフォームを使っていると、だんだん、スパムメールが増えてきます。
セッションのチェック機能をONにしていても、少しずつ、増えてきます。
特に海外向けの記事などがある場合は、顕著です。
さて、このような場合、通常は、メールフォーム(contactで検索すると結構あります)のエクステンションなどを用いますが、
今回は、yvcommentでも使用したキャプチャーであるBigo Captcha extensionを使ったデフォルトのメールフォームでの利用方法について、具体的に記述したいと思います。
実際に、Bigo Captchaを利用できるメールフォームのエクステンションがあります。例えば、ALFcontact です。
ただ、ALFcontact は、最近、セキュリティホールが見つかっており、ちょっと、利用を控えたくなります。
それも、あいまって、今回は、デフォルトのメールフォームに追加してみたいと思います。
では、早速、試してみましょう。
ダウンロード:Bigo Captcha extension
参考記事:Joomla! で 記事にコメントするには(yvCommentを使ってみる)
ここで、変更したphpのソースコード

もっと、Joomla!やPHP、Apacheについて詳しく知りたい方は、以下の本なども良いと思います。
本から学ぶことは多いと思います。ネットだけでは判らない様々な事に気づかされます。
以降は、Bigo Captcha がインストールされているものとして、話を始めます。
また、ここで、使用したJoomla!のバージョンは、1.5.14です。
もし、異なるバージョンの場合は、phpのソースコードの行番号は、異なる場合がありますので、そのバージョン毎のソースコードで、前後関係を確認して、作業を行ってください。
では、早速、始めましょう。
変更するphpのソースコードは、以下の3つです。
ただし、言語ファイルで、コメントなどを変更したい場合は、以下の言語ファイルの変更・追加を行うことで対応できます。
(ここでは、そこまでの説明をしません。)
administrator/language/ja-JP/ja-JP.com_contact.ini
administrator/language/en-GB/en-GB.com_contact.ini
language/ja-JP/ja-JP.com_contact.ini
language/en-GB/en-GB.com_contact.ini
- administrator/components/com_contact/contact_items.xml
- ここでは、コンポーネントのメールフォームのパラメータにキャプチャーを使用するか否かのパラメータを追加します。 - components/com_contact/controller.php
- ここでは、キャプチャー画像と、入力情報が一致するか否かの判断処理、キャプチャー画像を表示する処理を追加します。 - components/com_contact/views/contact/tmpl/default_form.php
- ここでは、メールフォームにキャプチャー画像を表示する処理を追加します。
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | <params group="email"> <param name="show_email_form" type="radio" default="1" label="Email Form" description="Show/Hide the email to form"> <option value="0">Hide</option> <option value="1">Show</option> </param> <param name="email_description" type="text" size="30" default="" label="Description text" description="PARAMEMAILDESCTEXT" /> <param name="show_email_copy" type="radio" default="1" label="Email Copy" description="PARAMEMAILCOPY"> <option value="0">Hide</option> <option value="1">Show</option> </param> <param name="use_captcha" type="radio" default="1" label="Use Captcha" description="Enable Captcha verification"> <option value="0">No</option> <option value="1">Yes</option> </param> <param name="banned_email" type="textarea" default="" label="BANNED EMAIL LABEL" rows="3" cols="30" description="BANNED EMAIL DESC" /> <param name="banned_subject" type="textarea" default="" label="BANNED SUBJECT LABEL" rows="3" cols="30" description="BANNED SUBJECT DESC" /> <param name="banned_text" type="textarea" default="" label="BANNED TEXT LABEL" rows="3" cols="30" description="BANNED TEXT DESC" /> </params> |
ここで、追加するのは、97行目 - 100行目までです。
use_captcha というパラメータを追加しています。
この変更を行うと、以下のようにメールフォームのパラメータが追加されます。



このソースコードでは、大きく2か所追加があります。
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | if (!$email || !$body || (JMailHelper::isEmailAddress($email) == false)) { $this-->setError(JText::_('CONTACT_FORM_NC')); $this-->display(); return false; } /** Captcha */ if (!$this-->_checkCaptcha()) { JError::raiseWarning("666","You have entered the wrong CAPTCHA sequence. Please try again."); $this-->display(); return false; } // Contact plugins JPluginHelper::importPlugin( 'contact' ); $dispatcher =& JDispatcher::getInstance(); |
ここで、追加するのは、124行目 - 131行目までです。
ここでは、メールフォームの入力情報をチェックしている箇所で、キャプチャー画像と入力情報が一致しているかチェックしています。
128行目が、入力情報に誤りがあった時のエラーメッセージです。文言を変更したい場合は、ここの文字列を変更すると良いでしょう。
396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 | /** @author bigo @date januray, 2008 */ function displaycaptcha() { global $mainframe; $contactId = JRequest::getVar('contact_id', 0, '', 'int'); // load the contact details $model = &$this-->getModel('contact'); $qOptions['id'] = $contactId; $contact = $model-->getContact( $qOptions ); $params = new JParameter( $contact-->params ); if ($params-->get('use_captcha')) { $Ok = null; $mainframe-->triggerEvent('onCaptcha_Display', array($Ok)); if (!$Ok) { echo "<br/>Error displaying Captcha<br/>"; } } } function _checkCaptcha() { global $mainframe; $contactId = JRequest::getVar('id', 0, '', 'int'); // load the contact details $model = &$this-->getModel('contact'); $qOptions['id'] = $contactId; $contact = $model-->getContact( $qOptions ); $params = new JParameter( $contact-->params ); // not using captcha! if (!$params-->get('use_captcha')) { return true; } $return = false; $word = JRequest::getVar('word', false, '', 'CMD'); $mainframe-->triggerEvent('onCaptcha_confirm', array($word, &$return)); if ($return) { return true; } else return false; } } |
ここで、追加するのは、396行目 - 435行目までです。
ここでは、このクラスの末尾に、2つのメソッドを追加しています。
一つは、displaycaptcha() キャプチャー画像を表示するメソッドです。
もう一つは、_checkCaptcha() キャプチャー画像と入力情報が一致しているかチェックするメソッドです。
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | <?php if ($this-->contact-->params-->get( 'show_email_copy' )) : ?> <br /> <input type="checkbox" name="email_copy" id="contact_email_copy" value="1" /> <label for="contact_email_copy"> <?php echo JText::_( 'EMAIL_A_COPY' ); ?> </label> <?php endif; ?> <?php if ($this-->params-->get('use_captcha')) { ?> <!-- Bigo Captcha --> <br clear=left /> <img src="/index.php?option=com_contact&task=displaycaptcha&contact_id=<?php echo $this-->contact-->id; ?>"> <br clear=left /> <?php echo JText::_( 'Verification' ); ?> : <input type="text" name="word" /> <br /> <?php } ?> |
ここで、追加するのは、64行目 - 71行目までです。
ここでは、メールフォームにキャプチャー画像の表示を行っています。
この変更を行うと、以下のようにメールフォームにBigo Captcha の画像が表示されます。

ここでは、69行目の"Verification"の文言を"絵の英数字を入力してください"としています。
これで完了です。
また、この時、入力情報をすべて消去してしまいます。これが良いかどうかは、多少意見が分かれるところでしょう。
いろいろとご自身でカスタマイズされるのも良いと思います。






