2017-02-23 5 views
0

ライブラリを使用せずにjqueryでダイナミックフィールドを作成したいと思います。私は2つのフォームを提出したが、1つのファイル私は実際に複数の時間を作成したい質問オプションは、それは複数回することができます。yii2でダイナミックフィールドを更新するには

以下のform.phpでは、label fieldが複数回jqueryで作成されています。私はそれらを救うことができますが、私はどのようにしてupdate caseに1回以上提出されたものを表示するのか分かりません。本当に私の英語のために申し訳ありません。

コントローラ

public function actionCreate() 
    { 
     $model = new QuestionsOptions(); 

    if ($model->load(Yii::$app->request->post())) { 
      if(sizeof(array_filter($_POST['QuestionsOptions']['label'])) > 0){ 
      foreach($_POST['QuestionsOptions']['label'] as $key => $row){ 
        $model->setIsNewRecord(true); 
        $model->option_id = null; 
        $model->label = $row; 
        $model->save(); 
      } 
      } 
     // exit; 
      return $this->redirect(['view', 'id' => $model->option_id]); 
     } else { 
      return $this->renderAjax('create', [ 
       'model' => $model, 
      ]); 
     } 
    } 

モデル

namespace app\models; 
use Yii; 

class QuestionsOptions extends \yii\db\ActiveRecord 
{ 
    public static function tableName() 
    { 
     return 'questions_options'; 
    } 
    public function rules() 
    { 
     return [ 
      [['question_id', 'label', 'type'], 'required'], 
      [['question_id'], 'integer'], 
      [['type'], 'string'], 
      [['dated', 'updated'], 'safe'], 
      [['label'], 'string', 'max' => 255], 
      [['question_id'], 'exist', 'skipOnError' => true, 'targetClass' => SurveysQuestions::className(), 'targetAttribute' => ['question_id' => 'question_id']], 
     ]; 
    } 
    public function attributeLabels() 
    { 
     return [ 
      'option_id' => 'Option ID', 
      'question_id' => 'Question ID', 
      'label' => 'Label', 
      'type' => 'Type', 
      'dated' => 'Dated', 
      'updated' => 'Updated', 
     ]; 
    } 
    public function getQuestionsAnswers() 
    { 
     return $this->hasMany(QuestionsAnswers::className(), ['option_id' => 'option_id']); 
    } 
    public function getQuestion() 
    { 
     return $this->hasOne(SurveysQuestions::className(), ['question_id' => 'question_id']); 
    } 
} 

form.php

<?php 

use yii\helpers\Html; 
use yii\widgets\ActiveForm; 

?> 

<div class="surveys-questions-form"> 

    <?php $form = ActiveForm::begin(); ?> 

    <?php 

     if(isset($_GET['option_id']) and $_GET['option_id'] > 0) 
      $id= $_GET['option_id']; 
     else 
      $id= $model->option_id; 
     echo $form->field($model, 'question_id')->hiddenInput(['value' => $id])->label(false); 
    ?> 

    <div class="col-md-6"> 
    <div id="question_wrapper"> 
     <?= $form->field($model, 'type')->dropDownList([ 'text' => 'Text', 'numbers' => 'Numbers', 'date' => 'Date', 'texarea' => 'Texarea', 'checkbox' => 'Checkbox', 'radio' => 'Radio', 'rating' => 'Rating', ], ['prompt' => '']) ?> 
     <div id="add_more_field"> 
      <?= $form->field($model, 'label[]')->textInput(['maxlength' => true]) ?> 

     </div> 
     <div class="form-group"> 
      <?php 
       echo Html::a('Add more', 'javascript:void(0);', [ 
        'id' => 'surveys-questions-new-button', 
        'class' => 'pull-right btn btn-primary btn-xs' 
       ]) 
      ?> 
     </div> 
    </div> 
    </div> 
    <div class="col-md-12"> 
    <div class="form-group"> 
     <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> 
    </div> 
    </div> 
    <?php ActiveForm::end(); ?> 

</div> 
<?php 
$script = <<< JS 
$(document).ready(function(){ 

    $('#surveys-questions-new-button').on('click', function() { 
     $("#add_more_field").clone().appendTo("#question_wrapper"); 
    }); 

}); 

JS; 
$this->registerJs($script); 
?> 

多分他の事は、私は本当に助けが欲しい私を提案することができますしてください私のコードでは、右もありません。

+0

私は何かを提案することができますが、その後、あなたの検証は動作しません.... – Dani

答えて

0

私はあなたのコードを改善し、手直しするいくつかのコメントがあります。

  1. はあなた動的に追加されたオプション/ラベルをロードすることQuestionOptionsFormを作成します。オプション(要求またはDBからロードされる可能性がある)を反復するために、このモデルを使用します。 $_GET['option_id']のようなステートメントは使用しないでください(特にビュー内で)。

  2. フォームに新しいオプションを(動的に)追加する場合は、フィールド名にinteger-indexを追加します。例えば、label[45]。私は通常、置き換えて特別なhtmlテンプレートを使用しました。既存の行を複製する代わりに、この方法を使用します。たとえば、次のように

    <div class="js-new-option-template"> 
        <input type="text" name="option[{{OPTION_ID}}][label]"/> 
        <input type="hidden" name="option[{{OPTION_ID}}][is_new_option]"/> 
    </div> 
    

    注:あなたはJSコードで生成された動的から既存オプションIDを分離する必要があります。このためにis_new_option隠しフィールドを使用することができます。

  3. 既存のオプションを復元するときは、IDを使用してインデックスを作成します。

  4. 次に、オプションを繰り返し、既存のオプションのモデルを読み込み、動的に生成される新しいモデルを作成します。

    // ... 
    foreach ($modelForm->options as $optionId => $optionData) { 
    
        // Prepare data 
        $isNewModel  = \yii\helpers\ArrayHelper::getValue($optionData, 'is_new_option', true); 
        $optionLabel = \yii\helpers\ArrayHelper::getValue($optionData, 'label'); 
        $optionQuestion = \yii\helpers\ArrayHelper::getValue($optionData, 'question_id'); 
    
        // Create or find options model 
        $modelOption = $isNewModel 
         ? new QuestionsOptions() 
         : QuestionsOptions::findOne($optionId); 
    
        if (!$modelOption) { 
         throw new \yii\web\NotFoundHttpException('Cannot be found option record with the id = ' . $optionId); 
        } 
    
        // Populate and save model 
        $modelOption->label  = $optionLabel; 
        $modelOption->question_id = $optionQuestion; // foreign key 
    
        if (!$modelOption->save()) { 
         throw new \yii\base\Exception('Cannot be saved new option record.'); 
        } 
    } 
    
  5. 必要に応じて、フォームで削除されたDBオプションから削除できます。

+0

ありがとう@ IStranger。私はそれを持っていない$ modelOption = $ isNewModel?新しい質問オプション():QuestionsOptions :: findOne($ optionId); – Coder

+0

もう1つのことは、jsコードを置くと最も良くなります。あなたが時間を得るとき – Coder

関連する問題