JHtmlEmail::cloak は文書テキストのみを書き込むことができ、あなたの場合のように要素属性に書き込むことはできません。これが本当に必要な場合は、独自の JHtml ヘルパーを作成する必要があります。これは、以下の手順で実現できます。
属性で電子メールをクローキングするための Joomla 関数の実装:
your_components/helpers/html/specialemail.php でヘルパー クラスを作成します。
<?php
defined('_JEXEC') or die;
abstract class JHtmlSpecialEmail
{
public static function cloak($id, $attribute, $mail)
{
// convert text
$mail = JHtmlSpecialEmail::_convertEncoding($mail);
// split email by @ symbol
$mail = explode('@', $mail);
$mail_parts = explode('.', $mail[1]);
// random number
$rand = rand(1, 100000);
$replacement = "\n <script type='text/javascript'>";
$replacement .= "\n <!--";
$replacement .= "\n var prefix = 'ma' + 'il' + 'to';";
$replacement .= "\n var path = 'hr' + 'ef' + '=';";
$replacement .= "\n var addy". $rand ." = '". @$mail[0] ."' + '@';";
$replacement .= "\n addy". $rand ." = addy". $rand ." + '". implode("' + '.' + '", $mail_parts) ."';";
$replacement .= "\n document.getElementById('$id').$attribute = addy$rand.replace(/&#(\d+);/g, function (m, n) { return String.fromCharCode(n); });";
$replacement .= "\n //-->";
$replacement .= '\n </script>';
return $replacement;
}
protected static function _convertEncoding($text)
{
// replace vowels with character encoding
$text = str_replace('a', 'a', $text);
$text = str_replace('e', 'e', $text);
$text = str_replace('i', 'i', $text);
$text = str_replace('o', 'o', $text);
$text = str_replace('u', 'u', $text);
return $text;
}
}
次に、入力メール要素を次のように記述します。
<input id="email_field" name="email" placeholder="" type="text" />
<?php JHTML::addIncludePath(JPATH_COMPONENT.DS.'helpers'.DS.'html'); ?>
<?php echo JHtml::_('specialemail.cloak', 'email_field', 'placeholder', 'email@domain.com'); ?>
元の Joomla クローク機能と同じクローク アルゴリズムを使用します。document.write
電子メールをドキュメントに出力するために使用する代わりに、この回答のスニペットを使用して ASCII エンティティをデコードし、選択した属性に値を直接設定します。