|
سلام ، من برای ثبت داده ها می خوام یه فرم داشته باشم که برای این کار از 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,
));
}
ممنون از راهنماییتون.من یه تغییراتی دادم ولی هنوز کامل اوکی نشده.قبلا $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 انجام دادم:
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(); ?>
میشه کد مربوط به کنترلر و جاوا اسکریپتتون رو بذارید؟
بنظره من شما بهتره بار کدتون رو بر عهده جاوا اسکریپت بندازید. اول یه تمپلیت از سرورتون بگیرید که همون html فیلد های فرمتون هستش. این تمپلیت رو تو یه متغیر جاوا اسکریپت ذخیره کنید. بعد هر بار که دکمه btn رو زدید از این متغیر جاواسکریپتتون یه clone بگیرید و تو صفحه append کنید. در نهایت هم با زدن دکمه submit فرمتون رو serialize کنید. این راهکاریه که بنظرم می رسه. بنظرم رو این سناریو کار کنید بعد هرچا به مشکل خوردید بگید که با همفکری هم مشکل رو حل کنیم.