1

以下のhtmlがあります。Joomla の電子メール アドレスは、難読化または「クローク」されて Web サイトに表示されます。これを使用して、Web サイト JHtml::_('email.cloak', 'demo@example.com') に電子メール アドレスを表示しています。しかし、入力テキスト フィールドにメール アドレスを表示できないようです。

<input id="email_field" name="email" placeholder="<?php echo JHtml::_('email.cloak',$result->email_address, 0); ?>" type="text" />

上記のコードを使用すると、入力フィールドに次のスクリプトが生成されます。

<script type='text/javascript'>  
    <!--  var prefix = 'ma' + 'il' + 'to';  
    var path = 'hr' + 'ef' + '=';  
    var addy16915 = 'user' + '@'; 
    addy16915 = addy16915 + 'user' + '.' + 'com';  
    document.write(addy16915);  //-->\n 
</script>

<script type='text/javascript'>  
    <!--  document.write('<span style=\'display: none;\'>');  //-->  
</script>

このメールアドレスはスパムボットから保護されています。表示するには JavaScript を有効にする必要があります。

<script type='text/javascript'>  
    <!--  document.write('</');  document.write('span>');  //-->  
</script>

何か案は?ありがとう

4

2 に答える 2

1

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 = '&#109;a' + 'i&#108;' + '&#116;o';";
        $replacement    .= "\n var path = 'hr' + 'ef' + '=';";
        $replacement    .= "\n var addy". $rand ." = '". @$mail[0] ."' + '&#64;';";
        $replacement    .= "\n addy". $rand ." = addy". $rand ." + '". implode("' + '&#46;' + '", $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', '&#97;', $text);
        $text   = str_replace('e', '&#101;', $text);
        $text   = str_replace('i', '&#105;', $text);
        $text   = str_replace('o', '&#111;', $text);
        $text   = str_replace('u', '&#117;', $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 エンティティをデコードし、選択した属性に値を直接設定します。

于 2012-09-25T14:24:40.007 に答える
0

それは、Joomla がエコーアウトしているものであるためです。電子メールだけを印刷するには、そのアドレスの電子メール保護を無効にする必要があります。または、派手な JavaScript トリックを実行します。

于 2012-09-25T11:13:34.273 に答える