2011-04-21 9 views

risposta

17

Solo due brevi frammenti, ma penso che avrete un'idea. Regola il nome dell'elemento e i selettori per le tue esigenze.

Nel vostro controller aggiungere un metodo per generare una nuova captcha

public function refreshAction() 
{ 
    $form = new Form_Contact(); 
    $captcha = $form->getElement('captcha')->getCaptcha(); 

    $data = array(); 

    $data['id'] = $captcha->generate(); 
    $data['src'] = $captcha->getImgUrl() . 
        $captcha->getId() . 
        $captcha->getSuffix(); 

    $this->_helper->json($data); 
} 

Nello script vista (sto usando MooTools per l'ajax-richiesta)

document.addEvent('domready', function() { 
    $$('#contactForm img').addEvent('click', function() { 
     var jsonRequest = new Request.JSON({ 
      url: "<?= $this->url(array('controller' => 'contact', 'action' => 'refresh'), 'default', false) ?>", 
      onSuccess: function(captcha) { 
       $('captcha-id').set('value', captcha.id); 
       $$('#contactForm img').set('src', captcha.src); 
      } 
     }).get(); 
    }); 
}); 

Edit: jquery aggiunta di Pahan

$(document).ready(function() { 
    $('#refreshcaptcha').click(function() { 
     $.ajax({ 
      url: '/contact/refresh', 
      dataType:'json', 
      success: function(data) { 
       $('#contactForm img').attr('src', data.src); 
       $('#captcha-id').attr('value', data.id); 
      } 
     }); 
    }); 
}); 
+2

grazie per il codice, funziona come il fascino :) dopo aver letto questo ho fatto usando jquery. '$ (document) .ready (function() {$ ('# refreshcaptcha'). click (function() {$ .ajax ({url: '/ contact/refresh', dataType: 'json', success: function (data) {console.log (data) $ ('# contactForm img'). attr ('src', data.src); $ ('# captcha-id'). attr ('valore', data.id); }});});}); ' – pahan

+1

@pahan Prego. Ho aggiunto il tuo script jQuery alla mia risposta per riferimento futuro. Grazie. –

+0

Ciao, sto affrontando lo stesso problema potrei sapere che il tuo refreshcaptcha è l'elemento, il mio è img ma non funzionerò? – user236501

1

@Benjamin Cremer grazie per il codice, funziona come charm :) dopo aver letto questo l'ho fatto usando jquery.

$(document).ready(function() { 
    $('#refreshcaptcha').click(function() { 
     $.ajax({ 
      url: '/contact/refresh', 
      dataType:'json', 
      success: function(data) { 
       $('#contactForm img').attr('src',data.src); 
       $('#captcha-id').attr('value',data.id); 
      } 
     }); 
    }); 
}); 
2

@ user236501 In realtà può essere qualsiasi tipo di elemento Form Zend (ad esempio Button). Sei anche in grado di mettere collegamento Aggiorna cliccabile Zend_Form_Element_Captcha opzione descrizione come questo come:

 $captcha = new Zend_Form_Element_Captcha('captcha', array(
      'label' => 'Some text...', 
      'captcha' => array(
       'captcha' => 'Image', 
       'wordLen' => 6, 
       'timeout' => 300, 
       'font' => './fonts/Arial.ttf', 
       'imgDir' => './captcha/', 
       'imgUrl' => 'http://some_host/captcha/' 
      ), 
      'description' => '<div id="refreshcaptcha">Refresh Captcha Image</div>' 
     )); 

ma nelle opzioni quel caso Description del decoratore deve essere modificato, ad esempio:

 $this->getElement('captcha')->getDecorator('Description')->setOptions(array(
      'escape'  => false, 
      'style'   => 'cursor: pointer; color: #ED1C24', 
      'tag'   => 'div' 
     )); 

Può essere fatto in metodo init() del modulo. Ci scusiamo per il mio inglese. Btw Non sono sicuro se metto il mio commento al posto giusto;)

0
  1. Nel config/autoload/global.php aggiungo seguente

    'view_manager' => array(
        'strategies' => array(
         'ViewJsonStrategy','Zend\View\Strategy\PhpRendererStrategy' 
        ), 
    ), 
    
  2. in YourModule/src/YourModule creare una nuova cartella Ajax
  3. All'interno Yourmodule/Ajax creare un file AjaxController.php

    namespace YourModule\Ajax; 
    
    use Zend\Mvc\Controller\AbstractActionController; 
    use Zend\View\Model\JsonModel; 
    use YourModule\Forms\SignupForm; 
    
    class AjaxController extends AbstractActionController 
    {   
        public function refreshSignupCaptchaAction(){ 
         $form = new SignupForm(); 
         $captcha = $form->get('captcha')->getCaptcha();    
         $data = array();     
         $data['id'] = $captcha->generate(); 
         $data['src'] = $captcha->getImgUrl().$captcha->getId().$captcha->getSuffix(); 
         return new JsonModel($data); 
        } 
    } 
    
  4. Add percorso all'interno module.config.php

    'yourmodule-ajax' =>array(
         'type' => 'segment', 
         'options' => array(
         'route' => '/yourmodule/ajax/:action', 
          'constraints' => array( 
           'action' => '\w+', 
          ), 
          'defaults' => array(
           'controller' => 'YourModule\Ajax\AjaxController', 
          )     
         ), 
        ), 
    
  5. ultima nel modello, presumo che si sta utilizzando jQuery

    <div class="form-group"> 
        <div id="captcha" class="control-group <?php echo count($form->get('captcha')->getMessages()) > 0 ? 'has-error' : '' ?>"> 
         <?php echo $this->formLabel($form->get('captcha')); ?> 
         <div class="col-xs-12 col-sm-6"> 
          <a id="refreshcaptcha" class="btn btn-default pull-right">Refresh</a> 
          <?php echo $this->formElement($form->get('captcha')); ?> 
          <?php echo $this->formElementErrors($form->get('captcha')); ?> 
         </div> 
        </div> 
    </div> 
    
    <script type="text/javascript"> 
    $(function(){ 
    
        $('#refreshcaptcha').click(function() { 
         $.ajax({ 
          url: '<?php echo $this->url('yourmodule-ajax', array('action'=>'refreshSignupCaptcha')) ?>', 
          dataType:'json', 
          success: function(data) { 
           $('#captcha img').attr('src', data.src); 
           $('#captcha input[type="hidden"]').attr('value', data.id); 
           $('#captcha input[type="text"]').focus(); 
          } 
         }); 
         return false; 
        }); 
    }); 
    </script> 
    
Problemi correlati