2011-06-14 12 views
12

मैं एक फार्म जमा करने के लिए Yii ajaxSubmitButton() का उपयोग कर रहा है। इसके अलावा, मैंने संबंधित टेक्स्टबॉक्स को सत्यापित करने के लिए 'enableAjaxValidation' पैरामीटर को सत्य पर सेट किया है।Yii ajaxSubmitButton() क्षेत्रों सत्यापन

मैं क्या करने में सक्षम हूँ:

  1. मान्य क्षेत्र जब फोकस छोड़ देता है एसिंक्रोनस।
  2. सर्वर साइड विधि आह्वान बटन क्लिक होने एसिंक्रोनस।

समस्या मैं कैसे क्षेत्रों सत्यापन जब सबमिट बटन पर क्लिक किया जाता है प्रदर्शन करने के लिए और, पता नहीं है कि, अगर मॉडल मान्य है ग्राहक के पक्ष में एक आंशिक रेंडरिंग निष्पादित है।

अगर मैं ajaxSubmitButton में 'सफलता' घटना को ओवरराइड, मैं आंशिक प्रतिपादन मिलता है, लेकिन मैं मॉडल मान्यता नहीं बनाए रख सकते ..

किसी भी मदद की?


संपादित

उत्तर के लिए धन्यवाद,

validateOnSubmit झंडा पहले से ही सेट किया गया है और मॉडल सही ढंग से मान्य होगा अगर 'सफलता' घटना सेट नहीं था।

जब ajaxSubmitButton इस तरह है:

<?php echo CHtml::ajaxSubmitButton('Send', 
             CHtml::normalizeUrl(array('site/ajaxIndexSubmit')), 
             array(
             'error'=>'js:function(){ 
              alert(\'error\'); 
             }', 
             'beforeSend'=>'js:function(){ 
              alert(\'beforeSend\'); 
             }', 
             'success'=>'js:function(data){ 
              alert(\'success, data from server: \'+data); 
             }', 
             'complete'=>'js:function(){ 
              alert(\'complete\'); 
             }', 
             //'update'=>'#where_to_put_the_response', 
             ) 
            ); 
    ?> 

चेतावनी ('सफलता') स्ट्रिंग मॉडल सत्यापन करने के लिए इसी प्रिंट होगा। एक बार मेरे पास वह स्ट्रिंग हो जाने के बाद, क्लाइंट साइड में किस तर्क का आह्वान किया जाना चाहिए?

कारण 'सफलता' जावास्क्रिप्ट हैंडलर सर्वर से एक आंशिक प्रतिपादन, मॉडल सत्यापन करने के लिए विभिन्न प्राप्त करने के लिए है ओवरराइड करने के लिए। मुझे दोनों चीजें चाहिए: सत्यापन और आंशिक प्रतिपादन।

+0

अच्छा सवाल, मुझे AJAXSubmitButton – RusAlex

उत्तर

1

CActiveForm एक सार्वजनिक संपत्ति $clientOptions कहा जाता है। एक validateOnSubmit विकल्प है जो डिफ़ॉल्ट रूप से गलत है। आपको इसे सच होने की आवश्यकता है। आपके विचार में यह कुछ इस तरह दिखना चाहिए:

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'yourFormId', 
    'enableAjaxValidation'=>TRUE, 
    'clientOptions'=>array('validateOnSubmit'=>TRUE), 

)); ?> 

http://www.yiiframework.com/doc/api/1.1/CActiveForm#clientOptions-detail

+8

के साथ validateOnSubmit का उपयोग करने का कोई तरीका नहीं मिला, यह सत्यापन AJAXSubmitButton के साथ निष्पादित नहीं किया गया था। यह केवल CHtml :: सबमिट बटन – RusAlex

0

मैं के बारे में एक अलग मूल्य में भेजने की कोशिश करने के लिए कर रहा हूँ ajaxSubmitButton क्लिक पर ($ _GET के साथ पोस्ट)। मान के लिए परीक्षण और उसके बाद सत्यापन चल रहा है यदि मान मौजूद नहीं है। क्या वह काम तुम्हारे लिये होगा?

1

मैं एक समाधान मिल गया। मेरे CActive फार्म

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'gold-value-form', 
    'enableAjaxValidation'=>true, 
    'clientOptions'=>array(
     'validateOnSubmit'=>true, 
     'afterValidate'=>'js:function(form, data, hasError) { 
      if(jQuery.isEmptyObject(data)) { 
       alert("ok") 
      } 
      return false; 
     }' 
    ), 
)); ?> 

अपना कार्य बनाने

public function actionCreate() 
{ 
    $this->layout=false; 
    $model=new GoldValue; 

    if(isset($_POST['ajax']) && $_POST['ajax']==='gold-value-form') 
    { 
     if(isset($_POST['GoldValue'])) 
     { 
      $model->attributes=$_POST['GoldValue']; 
      if(!$model->save()) 
       echo CActiveForm::validate($model); 
     } 
    } 
    Yii::app()->end(); 
} 
13

अरे मैं एक ही समस्या और सहारे तो यह और भी aftervalidate, beforevalidate के साथ इतना काम करने और है.और दूसरी बात मैं सहारे के लिए एक एक्सटेंशन का उपयोग करना चाहते मिलता था इस coz मेरे ऐप में पहले से ही कई हैं। तो मैं इस बनाया:

संपादित करें: बार्थ के सुझाव के अनुसार, मैं उन कोड डाल रहा हूँ यहीं।

चरण 1: @ अपने नियंत्रक कार्रवाई

public function actionMyAction() 
    {  
      $model=new User;    
      $this->performAjaxValidation($model); 

      if(isset($_POST['User'])) 
      { 
        $model->attributes=$_POST['User']; 
        $valid=$model->validate();    
        if($valid){ 

         //do anything here 
         echo CJSON::encode(array(
           'status'=>'success' 
         )); 
         Yii::app()->end(); 
         } 
         else{ 
          $error = CActiveForm::validate($model); 
          if($error!='[]') 
           echo $error; 
          Yii::app()->end(); 
         } 
      } 

    } 

चरण 2: @ आपके विचार आपका प्रपत्र इस

<?php 
$form=$this->beginWidget('CActiveForm', array(
    'id'=>'user-form', 
    'enableAjaxValidation'=>true, 
    'action'=>$this->createUrl('myController/MyAction'), 
    'enableClientValidation'=>true, 
)); ?> 
    <div class="errorMessage" id="formResult"></div> 
    <div id="AjaxLoader" style="display: none"><img src="<?php echo Yii::app()->request->baseUrl; ?>/images/spinner.gif"></img></div> 
    <div class="row-user-single"> 
      <?php echo $form->labelEx($model,'attribute1'); ?> 
      <?php echo $form->passwordField($model,'attribute1',array('size'=>60,'maxlength'=>500)); ?> 
      <?php echo $form->error($model,'attribute1'); ?> 
    </div> 

    <div class="row-user-single"> 
      <?php echo $form->labelEx($model,'attribute2'); ?> 
      <?php echo $form->passwordField($model,'attribute2',array('size'=>60,'maxlength'=>500)); ?> 
      <?php echo $form->error($model,'attribute2'); ?> 
    </div> 
    <div class="buttons"> 

    <?php echo CHtml::ajaxSubmitButton('Save',CHtml::normalizeUrl(array('myController/MyAction','render'=>true)), 
      array(
       'dataType'=>'json', 
       'type'=>'post', 
       'success'=>'function(data) { 
        $("#AjaxLoader").hide(); 
        if(data.status=="success"){ 
        $("#formResult").html("form submitted successfully."); 
        $("#user-form")[0].reset(); 
        } 
        else{ 
        $.each(data, function(key, val) { 
        $("#user-form #"+key+"_em_").text(val);              
        $("#user-form #"+key+"_em_").show(); 
        }); 
        }  
       }',      
       'beforeSend'=>'function(){       
         $("#AjaxLoader").show(); 
        }' 
       ),array('id'=>'mybtn','class'=>'class1 class2')); ?> 

यह मैं के लिए ठीक काम कर रहा है और यह सब कोड की तरह लग सकता है ऊपर लिखा है लेखन की मेरी शैली है। आप उन्हें आवश्यकतानुसार बदल सकते हैं, लेकिन इस प्रकार ध्यान देने योग्य केवल दो चीजें हैं: 1. @ आपके कंट्रोलर कॉल आपके मॉडल की पुष्टि करते हैं और फॉर्म अमान्य होने पर एक जेसन ऑब्जेक्ट लौटाते हैं 2. @ आपका दृश्य इस जेसन ऑब्जेक्ट को तोड़ता है (या इसके माध्यम से ट्रैवर्स) और फॉर्म के संबंधित तत्वों के तहत त्रुटि संदेश दिखाएं।

रखें यह आसान :)

तुम मेरे ब्लॉग पोस्ट यहाँ भी देख सकते हैं: http://www.yiiframework.com/forum/index.php/topic/37075-form-validation-with-ajaxsubmitbutton/

+0

के साथ काम करता है StackOverflow में आपका स्वागत है! क्या आप अपने उत्तर में लिंक का एक अंश जोड़ना चाहते हैं? यदि लिंक मर जाता है तो इस तरह आपका उत्तर उपयोगी रहेगा। –

+0

यह उत्तर के रूप में चिह्नित होना चाहिए। – MKD

0

जांच इस स्निपेट, यह ग्राहक के पक्ष http://www.yiiframework.com/wiki/466/a-simple-way-to-get-yii-client-side-form-validation-run-when-submitting-by-ajax/

+1

लोन लिंक को एक खराब उत्तर माना जाता है (देखें [faq # हटाना]) क्योंकि यह स्वयं से व्यर्थ है और ** लक्ष्य संसाधन भविष्य में जीवित रहने की गारंटी नहीं है **। [यह बेहतर होगा] (http://meta.stackexchange.com/q/8259) यहां उत्तर के आवश्यक हिस्सों को शामिल करने के लिए, और संदर्भ के लिए लिंक प्रदान करें। – j0k

-1

पर समस्या का हल इस प्रयास करें:

/* 
1) Register the snippet into the HEAD. Be sure that it is linked after jquery.yii.js is linked. 

2) Configure your CActiveForm instance like this: 
*/ 

$this->beginWidget('CActiveForm', array(
    ... 
    'enableClientValidation'=>true, 
    'clientOptions'=>array(
     'validateOnSubmit'=>true, 
     'afterValidate'=>'js:$.yii.fix.ajaxSubmit.afterValidate' 
    ) 
    ... 
); 
/* 
3) Configure your CHtml::ajaxSubmitButton instance like this: 
*/ 

echo CHtml::ajaxSubmitButton('Whateverlabel', 'whateverurl', array(
    ... 
    'beforeSend'=>'js:$.yii.fix.ajaxSubmit.beforeSend("#YOUR_FORM_ID")' 
    ... 
); 

और देखें http://www.codexamples.com/90/chtml-ajaxsubmitbutton/ या http://www.codexamples.com/category/chtml-8/