2017-04-06 1 views
0

C'est la première fois que j'utilise SP Page Builder composant avec Joomla. Je souhaite utiliser leur formulaire de contact, mais il ne prend pas en charge Google ReCaptcha. Je suis assez bon avec le codage à pensé que je pourrais l'ajouter manuellement dans: /com_sppagebuilder/addons/ajax_contact/site.php et le faire fonctionner. J'ai ajouté: <div class="g-recaptcha" data-sitekey="My_Key"></div>; Et le plugin Joomla ReCaptcha est activé. Je ne savais pas si je devais, mais j'ai ajouté <script src='https://www.google.com/recaptcha/api.js'></script> dans l'étiquette de la tête. Avec cela, le ReCaptcha montre bien.Joomla, Sp Page Builder et ReCaptcha

Mon problème est avec la validation. J'ai essayé d'ajouter du code de validation dans le site.php mais je crois que SP Page Builder utilise JFactory :: getMailer(); pour préparer l'e-mail et l'envoyer, et je ne sais rien à ce sujet. Par conséquent, je ne sais pas où je peux ajouter mon code de validation ReCaptcha, et comme j'ai trouvé quelques versions de ce code en ligne, je ne sais vraiment pas lequel utiliser. J'ai cherché partout des réponses sur comment faire cette vérification ... et j'ai essayé beaucoup de choses, mais ça ne marche toujours pas.

Quelqu'un peut-il m'aider à travers celui-ci?

Merci beaucoup!

EDIT

Je pense que ma question ne suffit pas claire:

Je veux ajouter Recaptcha, qui fonctionne déjà bien dans d'autres formes sur mon site (il est donc pas une configuration avec le problème Joomla). Je souhaite utiliser le formulaire de contact SP Page Builder suivant et non RSFormPro comme sur le reste du site Web. Le processus de validation doit être fait dans cette section, mais j'ai essayé d'ajouter le code de validation Google, et j'ai essayé quelques versions de celui-ci, je trouve, l'Internet, et il ne fonctionne pas du tout:

public static function getAjax() { 
    $input = JFactory::getApplication()->input; 
    $mail = JFactory::getMailer(); 

    //inputs 
    $inputs    = $input->get('data', array(), 'ARRAY'); 

    foreach ($inputs as $input) { 

     if($input['name'] == 'recipient') { 
      $recipient   = base64_decode($input['value']); 
     } 

     if($input['name'] == 'email') { 
      $email   = $input['value']; 
     } 

     if($input['name'] == 'name') { 
      $name   = $input['value']; 
     } 

     if($input['name'] == 'subject') { 
      $subject   = $input['value']; 
     } 

     if($input['name'] == 'message') { 
      $message   = nl2br($input['value']); 
     } 
    } 

    /*Try at the validation*/ 
    $captcha_plugin = JFactory::getConfig()->get('captcha'); 
    if ($captcha_plugin != '0') { 
    $captcha = JCaptcha::getInstance($captcha_plugin); 
    $field_id = 'google-recaptcha'; 
    print $captcha->display($field_id, $field_id, 'g-recaptcha'); 
    } 


    $sender = array($email, $name); 
    $mail->setSender($sender); 
    $mail->addRecipient($recipient); 
    $mail->setSubject($subject); 
    $mail->isHTML(true); 
    $mail->Encoding = 'base64'; 
    $mail->setBody($message); 

    if ($mail->Send()) { 
     return '<span class="sppb-text-success">'. JText::_('COM_SPPAGEBUILDER_ADDON_AJAX_CONTACT_SUCCESS') .'</span>'; 
    } else { 
     return '<span class="sppb-text-danger">'. JText::_('COM_SPPAGEBUILDER_ADDON_AJAX_CONTACT_FAILED') .'</span>'; 
    } 
} 

Toutes les suggestions ?

Merci!

Répondre

0

Je pense que ce que vous avez manqué est de configurer correctement les informations d'identification ReCaptcha.

Vous pouvez vérifier ici - Setup captcha

Vérifiez champ ReCaptcha sur le formulaire d'inscription par défaut Joomla si elle est là, alors vous avez configuré correctement. Pour sp constructeur de pages, vous devez vérifier avec le développeur de l'extension, car ils sont pris en charge par champ Recaptcha ou non.

+0

je l'ai fait. D'après ce que j'ai trouvé sur SP Page Builder, ils ne supportent pas ReCaptcha, donc ils ne vont pas aider. J'ai réussi à ajouter le ReCaptcha dans leur forme, et il montre correctement. Le problème est que peu importe ce que j'ai essayé, le formulaire passe, peu importe si la ReCaptcha est cochée ou non. Je ne sais pas comment ajouter le code de validation ... Je vois que SP Page Builder utilise JFactory :: getMailler() pour préparer et envoyer le formulaire, mais je ne sais rien à ce sujet. – StS

+0

Pour ajouter ReCaptcha personnalisé dans votre composant, cochez ceci - http://stackoverflow.com/questions/12840015/how-to-use-joomla-recaptcha-plugin-to-my-custom-module/12860744#12860744 –

+0

cela et essayé, mais comme je l'ai dit, je ne peux pas savoir où mettre le code de validation. Je crois qu'ils utilisent Jmail (à cause de: JFactory :: getMailer()) mais je ne sais pas où trouver ou ajouter le code de validation dans cela. – StS

0

J'ai réussi à ajouter captcha au formulaire de contact Ajax. Bien que le code nécessite encore quelques améliorations, voici ce que j'ai fait:

Voyez que j'utilise le plugin captcha n3tseznamcaptcha, j'ai encore besoin d'implémenter les changements pour que d'autres captchas fonctionnent (recaptcha, etc) mais vous pouvez l'adapter à vos besoins.

Un add-on SP Pagebuilder se compose de deux fichiers, admin et site. Dans le site d'administration, j'ai retiré le captcha par défaut, qui manque de nombreuses mesures de sécurité.Ensuite, dans la partie du site, j'ai ajouté ce qui suit:

function ajax_contact_addon($atts) 
{ 
    global $formcaptcha; 
    (...) 
    if($formcaptcha) 
    { 
      // TODO: Add Joomla's captcha: 
      JPluginHelper::importPlugin('captcha'); 
      $dispatcher = JDispatcher::getInstance(); 

      // This will put the code to load CAPTCHA's JavaScript file into your <head> 
      $dispatcher->trigger('onInit', 'dynamic_captcha_1'); 

      // This will return the array of HTML code. 
      $captcha = $dispatcher->trigger('onDisplay', array(null, 'dynamic_captcha_1', 'class=""')); 
      // I have only 1 recaptcha plugin enabled so the HTML is at 0 index, this will be improved in next version, following the contact component 
      $output .= (isset($captcha[0])) ? $captcha[0] : ''; 
      $output .= '<div class="clearfix"></div><p></p>'; 
    } 
    (...) 
} 

function ajax_contact_get_ajax() 
{ 
    global $formcaptcha; 

    $jinput   = JFactory::getApplication()->input; 
    $mail   = JFactory::getMailer(); 
    $config   = JFactory::getConfig(); 

    // TODO: CHECK CAPTCHA and add a Helper Class to get the captchas fields 
    $captchaset = 'n3tseznamcaptcha'; 
    if ($captchaset === 'n3tseznamcaptcha') 
    { 
     $captcha_field_hash = 'n3t_seznam_captcha_hash'; 
     $captcha_field_answer = 'n3t_seznam_captcha'; 
    } 

    //inputs 
    $inputs    = $jinput->get('data', array(), 'ARRAY'); 
    foreach ($inputs as $input) 
    { 
      if($input['name'] == 'title') 
      { 
       $title     = $input['value']; 
      } 
      if($input['name'] == 'recipient') 
      { 
        $recipient  = base64_decode($input['value']); 
      } 

      if($input['name'] == 'email') 
      { 
        $email   = $input['value']; 
      } 

      (...) 

      if($input['name'] == $captcha_field_hash) 
      { 
        $captcha_hash = $input['value']; 
      } 

      if($input['name'] == $captcha_field_answer) 
      { 
        $captcha_answer  = $input['value']; 
      } 
    } 

    if($formcaptcha) 
    { 
      // get the plugin 
      JPluginHelper::importPlugin('captcha'); 
      $dispatcher = JEventDispatcher::getInstance(); 

      // In order the plugin can check the code, we have to insert it into the request data: 
      $jinput->set('n3t_seznam_captcha_hash', $captcha_hash); 
      $jinput->set('n3t_seznam_captcha', $captcha_answer); 

      // Here we check for the code: 
      $res = $dispatcher->trigger('onCheckAnswer', $captcha_answer); 

      if(!$res[0]) 
      { 
        // There is a problem with pagebuilder cache and captchas, so we need to clean the cache, to renew the captcha code: 
        $cache = JFactory::getCache('page'); 
        $cache->clean(); 
        return '<span class="pb-text-danger">'. JText::_('COM_PAGEBUILDER_ADDON_AJAX_FORM_WRONG_CAPTCHA') .'</span>'; 
      } 
} 

} 

Je pense que c'est tout. J'espère que cela vous aide à le découvrir.

+0

Cela aide beaucoup! Je travaille encore sur l'adaptation pour le Captcha de Google, je vous ferai savoir si cela fonctionne :) – StS

+0

Eh bien ... Je dois vraiment aspirer à cela parce que je ne comprends vraiment pas quoi mettre à la place de: '$ captchaset = 'n3tseznamcaptcha'; if ($ captchaset === 'n3tseznamcaptcha') { $ captcha_field_hash = 'n3t_seznam_captcha_hash'; $ captcha_field_answer = 'n3t_seznam_captcha'; } ' et au lieu de: ' $ jinput-> set ('n3t_seznam_captcha_hash', $ captcha_hash); $ jinput-> set ('n3t_seznam_captcha', $ captcha_answer); $ res = $ dispatcher-> trigger ('onCheckAnswer', $ captcha_answer); ' Afin de faire fonctionner mon google ReCaptcha:/ – StS

+0

Le problème ici implémenter le captcha installé est que le formulaire ajax ne remplit pas le get paramètres, il remplit la variable POST et renvoie la réponse AJAX, par conséquent le plugin ne fonctionnera jamais, donc ce que nous devons faire est d'obtenir ces valeurs à partir des champs captcha générés et le passer à jinput (JFactory :: getApplication-> input) que lorsque le plugin est déclenché, il peut récupérer ces valeurs et vérifier si elles ont raison ou non, mais chaque captcha a ses propres champs, nous devons donc trouver celui que nous utilisons pour lire ces valeurs, je vais ajouter un edit dans mon answer for recaptcha plugin to work – spacebiker

0

Donc ici vous avez la solution complète. Notez que j'ai aussi changé quelques choses du côté admin. Cette version va afficher et valider le captcha par défaut sélectionné dans Joomla config, mais il ne fonctionnera que pour recaptcha et n3tsezam .. autre doit être ajouté manuellement. La raison en est que cet addon n'ajoute pas les champs challenge et response dans la requête, que les plugins captcha utilisent pour la validation, il faut donc les récupérer et écrire dans le jinput de notre fonction ajax (ajax_contact_get_ajax), et ce qui complique l'ensemble chose est que chaque plugin captcha utilise des champs différents. Quoi qu'il en soit .. si vous avez besoin d'un autre plugin captcha, vous pouvez simplement l'ajouter à l'interrupteur et vous devriez avoir terminé.

fonction ajax_contact_addon ($ atts) {

 extract(AddonAtts(array(
       "title"    => '', 
       "show_title"     => '', 
       "heading_selector"  => 'h3', 
       "title_fontsize"  => '', 
       "title_fontweight"  => '', 
       "title_text_color"  => '', 
       "title_margin_top"  => '', 
       "title_margin_bottom"   => '', 
       "recipient_email"  => '', 
       "formcaptcha"   => '', 
       "class"    => '', 
       ), $atts)); 

     JHtml::script('media/com_pagebuilder/js/ajax-contact.js');   

//  There is a problem with pagebuilder cache and captchas 
     $cache = JFactory::getCache('page'); 
     $cache->clean(); 

     $output = '<div class="pb-addon pb-addon-ajax-contact ' . $class . '">'; 

     if(boolval($show_title) && $title) 
     { 

       $title_style = ''; 
       if($title_margin_top !='') $title_style .= 'margin-top:' . (int) $title_margin_top . 'px;'; 
       if($title_margin_bottom !='') $title_style .= 'margin-bottom:' . (int) $title_margin_bottom . 'px;'; 
       if($title_text_color) $title_style .= 'color:' . $title_text_color . ';'; 
       if($title_fontsize) $title_style .= 'font-size:'.$title_fontsize.'px;line-height:'.$title_fontsize.'px;'; 
       if($title_fontweight) $title_style .= 'font-weight:'.$title_fontweight.';'; 

       $output .= '<'.$heading_selector.' class="pb-addon-title" style="' . $title_style . '">' . $title . '</'.$heading_selector.'>'; 
     } 

     $output .= '<div class="pb-addon-content">'; 
     $output .= '<form class="pb-ajax-contact-form">'; 

     $output .= '<div class="pb-form-group">'; 
     $output .= '<input type="text" name="name" class="pb-form-control" placeholder="'. JText::_('COM_PAGEBUILDER_ADDON_AJAX_CONTACT_NAME') .'" required="required">'; 
     $output .= '</div>'; 

     $output .= '<div class="pb-form-group">'; 
     $output .= '<input type="email" name="email" class="pb-form-control" placeholder="'. JText::_('COM_PAGEBUILDER_ADDON_AJAX_CONTACT_EMAIL') .'" required="required">'; 
     $output .= '</div>'; 

     $output .= '<div class="pb-form-group">'; 
     $output .= '<input type="text" name="subject" class="pb-form-control" placeholder="'. JText::_('COM_PAGEBUILDER_ADDON_AJAX_CONTACT_SUBJECT') .'" required="required">'; 
     $output .= '</div>'; 

     $output .= '<div class="pb-form-group">'; 
     $output .= '<textarea type="text" name="message" rows="5" class="pb-form-control" placeholder="'. JText::_('COM_PAGEBUILDER_ADDON_AJAX_CONTACT_MESSAGE') .'" required="required"></textarea>'; 
     $output .= '</div>'; 

     if($formcaptcha) 
     { 
       JPluginHelper::importPlugin('captcha'); 
       $dispatcher = JDispatcher::getInstance(); 
       $dispatcher->trigger('onInit', 'dynamic_captcha_1'); 

       $captchas = $dispatcher->trigger('onDisplay', array(null, 'dynamic_captcha_1', 'class=""')); 
       $index = 0; 

       foreach (JPluginHelper::getPlugin('captcha') as $plugin) 
       { 
         if (JFactory::getApplication()->get('captcha', '0') === $plugin->name) 
         { 
           $captcha = $captchas[$index]; 
           break; 
         } 
         $index++; 
       } 
       $output .= (isset($captcha)) ? $captcha : ''; 
       $output .= '<div class="clearfix"></div><p></p>'; 
     } 

     $output .= '<input type="hidden" name="recipient" value="'. base64_encode($recipient_email) .'">'; 
     $output .= '<input type="hidden" name="title" value="'. $title .'">'; 

     $output .= '<button type="submit" class="btn btn-default"><i class="fa"></i> '. JText::_('COM_PAGEBUILDER_ADDON_AJAX_CONTACT_SEND') .'</button>'; 

     $output .= '</form>'; 

     $output .= '<div style="display:none;margin-top:10px;" class="pb-ajax-contact-status"></div>'; 

     $output .= '</div>'; 

     $output .= '</div>'; 

     return $output; 

} 

function ajax_contact_get_ajax() 
{ 
     $config       = JFactory::getConfig(); 
     $jinput    = JFactory::getApplication()->input; 
     //inputs 
     $inputs    = $jinput->get('data', array(), 'ARRAY'); 

     $mail    = JFactory::getMailer(); 

     // TODO: Find the way to check if captcha is enabled in the addon 
     $formcaptcha = true; 
     $message = ""; 

     // TODO: CHECK CAPTCHA and add a Helper Class to get the captchas 
     switch (JFactory::getApplication()->get('captcha', '0')) 
     { 
      case 'recaptcha': 
       // v.1: 
       //$captcha_challenge_field = 'recaptcha_challenge_field'; 
       //$captcha_answer_field = 'recaptcha_response_field'; 
       // v.2: 
       $captcha_challenge_field = ''; 
       $captcha_answer_field = 'g-recaptcha-response'; 
       break; 
      case 'n3tseznamcaptcha': 
       $captcha_challenge_field = 'n3t_seznam_captcha_hash'; 
       $captcha_answer_field = 'n3t_seznam_captcha'; 
       break; 
      default: 
       // disable captcha as we could not find the right fields 
       $formcaptcha = false; 
     } 

     foreach ($inputs as $input) 
     { 

       if($input['name'] == 'title') 
       { 
         $title     = $input['value']; 
       } 
       if($input['name'] == 'recipient') 
       { 
         $recipient  = base64_decode($input['value']); 
       } 

       if($input['name'] == 'email') 
       { 
         $email   = $input['value']; 
       } 

       if($input['name'] == 'name') 
       { 
         $name   = $input['value']; 
       } 

       if($input['name'] == 'subject') 
       { 
         $subject   = $input['value']; 
       } 

       if($input['name'] == 'message') 
       { 
         $message   = nl2br($input['value']); 
       } 

       if($input['name'] == $captcha_challenge_field) 
       { 
         $captcha_challenge = $input['value']; 
       } 

       if($input['name'] == $captcha_answer_field) 
       { 
         $captcha_answer  = $input['value']; 
       } 

     } 

     $valid_captcha = true; 
     if($formcaptcha) 
     { 
       // get the plugin 
       JPluginHelper::importPlugin('captcha'); 
       $dispatcher = JEventDispatcher::getInstance(); 

       $jinput->set($captcha_challenge_field, $captcha_challenge); 
       $jinput->set($captcha_answer_field,  $captcha_answer); 

       $res = $dispatcher->trigger('onCheckAnswer', $captcha_answer); 

       $index = 0; 
       foreach (JPluginHelper::getPlugin('captcha') as $plugin) 
       { 
         if (JFactory::getApplication()->get('captcha', '0') === $plugin->name) 
         { 
           $valid_captcha = $res[$index]; 
           break; 
         } 
         $index++; 
       } 
       if(!$valid_captcha) 
       { 
        $msg = '<span class="pb-text-danger">'. JText::_('COM_PAGEBUILDER_ADDON_AJAX_FORM_WRONG_CAPTCHA') .'</span>';       
       } 
     } 

     if ($valid_captcha) 
     { 
       // We do not want to send the email as a fake user, it may cause spam problems 
       $sender = array( 
         $config->get('mailfrom'), 
         $config->get('fromname') 
       ); 

       $subject = (($title)? '['.$title.'] ' : '') . $subject; 
       $message .= JText::sprintf('COM_PAGEBUILDER_ADDON_AJAX_CONTACT_EMAIL_SIGNATURE', JUri::getInstance()->toString(), JUri::getInstance()); 

       $mail->setSender($sender); 
       $mail->addRecipient($recipient); 
       $mail->setSubject($subject); 
       $mail->AddReplyTo($email); 
       $mail->isHTML(true); 
       $mail->Encoding = 'base64'; 
       $mail->setBody($message); 

       if ($mail->Send()) 
       { 
         $msg = '<span class="pb-text-success">'. JText::_('COM_PAGEBUILDER_ADDON_AJAX_CONTACT_SUCCESS') .'</span>'; 
       } else { 
         $msg = '<span class="pb-text-danger">'. JText::_('COM_PAGEBUILDER_ADDON_AJAX_CONTACT_FAILED') .'</span>'; 
       } 
     } 

//  There is a problem with pagebuilder cache and captchas 
     $cache = JFactory::getCache('page'); 
     $cache->clean(); 

     return $msg; 

} 
+0

J'ai essayé votre code dans: /com_sppagebuilder/addons/ajax_contact/site.php, C'est un pas en avant car maintenant il bloque tous les messages de contact au lieu de tous les envoyer XD je dois faire quelque chose de mal. – StS