تمام سوالات سوالات بدون پاسخ سوال بپرسید

سلام ، من برای ثبت داده ها می خوام یه فرم داشته باشم که برای این کار از form_ خود yii استفاده کردم و یه btn به فرم اضافه کردم.زمانی که کلیک بشه باید عین همون فرم (البته خالی و بدون دکمه submit ) زیر فرم قبلی بیاد. یعنی هر چند تا که خواست اضافه کنه و در نهایت در پایین صفحه تنها ذکمه ی submit رو که زد به ازای تک تک فرم ها یک رکورد در کنترلر ذخیره کنه.من سعی کردم این کار رو با ajax یا renderpartial انجام بدم که به نتیجه نرسیدم.

_form :

<?php $form = $this->beginWidget('CActiveForm', array(
    'id'                   => 'question-form',
    'enableAjaxValidation' => false,)); ?>

<?php $answercount = 1; ?>
<script type="text/javascript">function showform() {
        <?php $answercount+=1; 
                for($i=0; $i<$answercount; $i++){
                     if(isset($listanswer[$i]['title'])){
                         echo $form->labelEx($answer,'title'); 
                         echo $form->textField($answer,'title', array('value'=>$listanswer[$i]['title'] ,'name'=>'Answer'.$i));
                          echo $form->error($answer,'title');  }
                     else{
                         echo'<div class="row">';echo $form->labelEx($answer,'title');  
                          echo $form->textField($answer,'title', array('value'=>'' ,'name'=>'Answer'.$i));  
                          echo $form->error($answer,'title');echo'</div>'; } }?>;
    };
</script>
<div class="form">
    <p class="note">Fields with <span class="required">*</span> are required.</p>
    <?php echo $form->errorSummary($model); ?>
    <div class="row">
        <?php echo $form->labelEx($model, 'body'); ?>
        <?php echo $form->textArea($model, 'body', array('rows' => 6, 'cols' => 50)); ?>
        <input type="button" class="add" id="add" value="add answer" onclick="showform()"/>

        <?php echo $form->error($model, 'body'); ?>
    </div>
    <div class="row">
        <?php echo $form->labelEx($model, 'sortOrder'); ?>
        <?php echo $form->textField($model, 'sortOrder'); ?>
        <?php echo $form->error($model, 'sortOrder'); ?>
    </div>
    <div class="row buttons">
        <?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?>
    </div>

    <?php $this->endWidget(); ?>

</div>

                             controller 
public function actionCreate()
{   
    $model=new Question;
    $answer=new Answer;
    $answercount=5;
    // Uncomment the following line if AJAX validation is needed
    // $this->performAjaxValidation($model);
    if(isset($_POST['Question']))
    {
        $model->attributes=$_POST['Question'];
        $model->insert_datetime=date('H:i:s');
        $model->update_datetime=date('H:i:s');
        $model->sortOrder=$_POST['Question']['sortOrder'];
        if($model->save()){
            for($i=0; $i<$answercount; $i++){
                if ($_POST['Answer'.$i]!=""){
                    $answer=new Answer();
                    $answer->question_id=$model->id;
                    $answer->title=$_POST['Answer'.$i];
                    $answer->save();
                }
            }

            $this->redirect(array('view','id'=>$model->id));
        }
    }
    $this->render('create',array(
        'model'=>$model,
        'answer'=>$answer,
    ));
}

میشه کد مربوط به کنترلر و جاوا اسکریپتتون رو بذارید؟

(10 ژوئن '14, 08:15) hamedkh ♦

بنظره من شما بهتره بار کدتون رو بر عهده جاوا اسکریپت بندازید. اول یه تمپلیت از سرورتون بگیرید که همون html فیلد های فرمتون هستش. این تمپلیت رو تو یه متغیر جاوا اسکریپت ذخیره کنید. بعد هر بار که دکمه btn رو زدید از این متغیر جاواسکریپتتون یه clone بگیرید و تو صفحه append کنید. در نهایت هم با زدن دکمه submit فرمتون رو serialize کنید. این راهکاریه که بنظرم می رسه. بنظرم رو این سناریو کار کنید بعد هرچا به مشکل خوردید بگید که با همفکری هم مشکل رو حل کنیم.

(10 ژوئن '14, 13:51) hamedkh ♦
2 پاسخ

ممنون از راهنماییتون.من یه تغییراتی دادم ولی هنوز کامل اوکی نشده.قبلا $answercount ثابت بود . اما الان به تعداد جواب هایی که تو ویوی فرم وارد میکنه بستگی داره.این مقدار رو سعی کردم با ajax به actioncreate بفرستم اما کار نمیکنه و توی firebug ارور میده. _form

<div class="tform">
        <?php echo $form->labelEx($answer,'title'); ?>
        <?php echo $form->textField($answer,'title' ,
        array('value'=>'' ,'name'=>'Answer'.$i,'class'=>'child')
        ); ?>
        <?php echo $form->error($answer,'title'); ?>
    </div>

<input type="button" value="Add a field" class="add" id="add" />

 <script>
$(document).ready(function() {
    $("#add").click(function() {
       var fcId = $(".row1").length + 1;
      //  alert(fcId);
        var fName = $(".tform");
        var answerid="Answer"+fcId;
      var nwform=  $(".tform").clone().attr("id",answerid).attr("class","row1");
    nwform.children("input").attr("name",answerid).attr("id",answerid).val('');
      nwform.appendTo($("#question-form"));
      //$("#hidenp").val(fcId);
      $.ajax({
          url: "question/create",
          type: "POST",
          data: {answercount: fcId}
         // async: false
         dataType: 'json'
       });
    });

       });

</script>

              questioncontroller--------actioncreate
    //$answercount=5;

    if (!empty($_POST['answercount']))
    {  $answercount = $_POST['answercount'];
 echo $answercount;}
    else
 $answercount = null;

توی script اول از

jQuery.ajaxSetup({
jsonp: "callback",

باگ داره و وقتی توی input اولی که با jquery اورده شده تایپ میشه این ارور رو میده:

JSON.parse: unexpected character at line 1 column 1 of the JSON data


من اینکار رو با توابع clone,append,children در jquery انجام دادم:

<?php
echo $form->labelEx($answer,'title'); echo $form->textField($answer,'title' ,array('value'=>'' ,'name'=>'Answer0','class'=>'child')); echo $form->error($answer,'title'); $j=-1; foreach ($tags as $tag) { $j++; if (in_array($tag['id'], $tagtick)) { echo($tag['title']); echo CHtml::activeCheckBox($modeltag,'title', array('value'=>$tag['id'], 'name'=>'Tag'.$j , 'checked'=>'1')); } else { echo($tag['title']); echo ' '. CHtml::activeCheckBox($modeltag,'title', array('value'=>$tag['id'], 'name'=>'Tag'.$j )).' '; } }?>

</div>
    <div class="tform2" style="visibility: hidden;">
    <?php   
     echo $form->labelEx($answer,'title'); 
     echo $form->textField($answer,'title' ,array('value'=>'' ,'name'=>'Answer0','class'=>'child')); 
     echo $form->error($answer,'title');

    ?>
</div>

<div class="row">

<?php  
for($i=0; $i<$answercount; $i++){
     echo "<br/>";
     echo $form->labelEx($answer,'title'); 
     echo $form->textField($answer,'title', array('value'=>$listanswer[$i] ,'name'=>'Answer'.$i,'class'=>'row1')); 
     echo $form->error($answer,'title');
     $j=-1;
  foreach ($tags as $tag){
    if (isset ($tagtick[$i])){
        $j++;
        if (in_array($tag['id'], $tagtick[$i])){
          echo($tag['title']);
             echo CHtml::activeCheckBox($modeltag,'title', array('value'=>$tag['id'], 'name'=>'Tag'.$j.$i , 'checked'=>'1'));
        }else{
             echo($tag['title']);
             echo CHtml::activeCheckBox($modeltag,'title', array('value'=>$tag['id'], 'name'=>'Tag'.$j.$i ));
        }
    }
 }
}?>
 </div>
<div class="row">
    <?php echo $form->labelEx($model,'price');
          echo $form->checkbox($model,'price',array('id'=>'price'));
          echo $form->error($model,'price'); ?>
</div>

<div class="row">
    <?php echo $form->labelEx($model,'image_uri'); ?>
    <?php echo CHtml::activeFileField($model,'image_uri') ; ?>
</div>

<div class="row">
    <?php echo $form->labelEx($model,'sortOrder'); ?>
    <?php echo $form->textField($model,'sortOrder'); ?>
    <?php echo $form->error($model,'sortOrder'); ?>
</div>
<div id="append"></div>
    <?php echo CHtml::ajaxButton(
        'افزودن پاسخ',
        array('question/create'),
        array(
        //'data'=>array('answercount'=>'js:$("#hidenp").val()'
            ),

        array(
        'onclick'=>'js:$(document).ready(function() {
                var price=$("#price").is(":checked");
                var nwform;
                //alert(price);
                var fcId = $(".row1").length ;
                //alert(fcId);
                var fName = $(".tform");
                var answerid="Answer"+fcId;
                $(".tform").css("visibility","hidden");
                $(".tform2").css("visibility","hidden");
                if(price)
                {
                     nwform=  $(".tform2").clone().attr("class","sform").css("visibility", "visible");
                }
                else
                {
                     nwform=  $(".tform").clone().attr("class","sform").css("visibility", "visible");
                };
                nwform.children("input[type=text], select").attr("name",answerid).attr("id",answerid).attr("class","row1").val("");
                var tid=nwform.children("input[type=checkbox], select").attr("name");
                var taglist=nwform.children("input[type=checkbox], select");
                var htaglist=nwform.children("input[type=hidden], select");
                $(taglist).each(function(){$(this).attr("name", this.name +fcId).attr("id",this.id +fcId);})
                $(htaglist).each(function(){$(this).attr("name", this.name +fcId).attr("id",this.id +fcId);})
                nwform.appendTo($("#append"));

                $("#hiden").val(fcId);
                });
            ',
            'id'=>'add'
        )

    ); ?>
</div>

<div class="row buttons">
<input id="hiden" name="hidenp" style="visibility: hidden;" /> 
    <?php echo CHtml::submitButton($model->isNewRecord ? 'ثبت سوال' : 'ذخیره'); ?>
</div>
endWidget(); ?>

toggle preview



آموزش زبان برنامه نویسی C#
آموزش jquery
آموزش برنامه نویسی
آموزش طراحی وبسایت
آموزش مدیریت وبسایت
آموزش جاوا Java
آموزش پایتون Python
آموزش سی شارپ C#‎
آموزش HTML و CSS
آموزش JavaScript جاوااسکریپت
آموزش jQuery جی کوئری
آموزش ساخت ربات تلگرام
آموزش برنامه‌نویسی PHP
آموزش برنامه‌نویسی اندروید
● آموزش‌های رایگان

سوالات مرتبط

راهنمای استفاده از ویرایشگر
  • *ایتالیک*‌ یا __ایتالیک__
  • **ضخیم** یا __ضخیم__
  • آدرس:[متن](http://url.com/ "عنوان")
  • عکس?![alt متن](/path/img.jpg "عنوان")
  • لیست عددی: 1. Foo 2. Bar
  • برای رفتن به خط بعد، هر جا مایلید که خط جدید شروع شود دو کاراکتر فاصله (space) قرار دهید
  • تگ‌های ساده HTML هم پشتیبانی می‌شوند

تگها:
  • ×96
  • ×88
  • ×49
  • پرسیده شده: 10 ژوئن '14, 01:10
  • بازدید: 3,547 بار
  • آخرین بروزرسانی: 30 ژوئن '14, 12:53

این سوال را دنبال کنیدتوسط ایمیل: ایمیل شما (باید معتبر باشد, هرگز به دیگران نمایش داده نمیشود):

هنگامی که شما به سیستم وارد شوید،قادر خواهید بود برای بروز رسانی ها مشترک شوید.


توسط RSS:

پاسخها

پاسخها و نظرها