2016-06-16 13 views
1

Ich habe diese Form in der Ansicht:Speicherfeld in yii Rahmen

<form method="POST" action="<?php echo Yii::$app->request->baseUrl;?>/telephone/addnow/" role="form" enctype="multipart/form-data"> 
    <label>Upload your photo:</label><input type="file" name="image" ><br> 
    <input type="name" name="name" id="name" placeholder="Name" required><br><br> 
    <input type="text" name="address" placeholder="Address"><br><br> 
    <input type="text" name="telephone" placeholder="Telephone number" required> 
    <br><br> 
    <div id="dynamicInput"> 
     <br><input type="text" name="myinputs[]" placeholder="Secondary Phone #1"> 
     <span class="glyphicon glyphicon-plus" onClick="addInput('dynamicInput');"></span> 
     <br><br> 
    </div> 
    <input type="text" name="mobile" placeholder="Mobile number" > <br><br> 
    <input type="email" name="email" placeholder="Email"> 
    <input type="email" name="altemail" placeholder="Alternative Email"><br><BR> 
    <input type="text" name="company_name" placeholder="Company Name"><br><BR> 
    <input type="text" name="company_address" placeholder="Company Address"><br><br> 
    <input type="text" name="company_phone_primary" placeholder="Company Telephone">  
    <input type="text" name="company_phone_secondary" placeholder="Telephone Secondary "><br><br> 
    <input type="text" name="company_email" placeholder="Company Email Address"><br><BR> 
    <button type="submit" class="btn btn-default">Submit</button><BR><BR> 
</form> 

dem Benutzer ermöglicht, eine beliebige Anzahl von Sekundär Telefone einzufügen i dieses JavaScript-Code verwendet:

<script> 
    var counter = 1; 
    var limit = 10; 
    function addInput(divName) { 
     if (counter == limit) { 
      alert("You have reached the limit of adding " + counter + " inputs"); 
     } else { 
      var newdiv = document.createElement('div'); 
      newdiv.innerHTML = "Seconday Phone # " + (counter + 1) + " <br><input type='text' name='myinputs[]' placeholder='Secondary Phone '>"; 
      document.getElementById(divName).appendChild(newdiv); 
      counter++; 
     } 
    } 
</script> 

Und ich habe diesen Controller-Code:

public function actionAddnow() 
{ 
    $request = Yii::$app->request; 
    $add=new telephone(); 
    $add->Name=$request->post('name'); 
    $add->Email=$request->post('email'); 
    $add->Mobile=$request->post('mobile'); 
    $add->Address=$request->post('address'); 
    $add->Telephone=$request->post('telephone'); 
    $add->altemail=$request->post('altemail'); 
    $add->company_name=$request->post('company_name'); 
    $add->company_address=$request->post('company_address'); 
    $add->company_phone_primary=$request->post('company_phone_primary'); 
    $add->company_phone_secondary=$request->post('company_phone_secondary'); 
    $add->company_email=$request->post('company_email'); 

    $add->save(); 

    $getlast=Yii::$app->db->getLastInsertId(); 
    $myinputs=$request->post('myinputs'); 
    $totalinputs=sizeof('$myinputs'); 

    for ($i=0; $i<=$totalinputs; $i++) { 
     $inputs=$myinputs[$i]; 
     $phones=new phone(); 
     $phones->secondary_phones=$inputs; 
     $phones->id=$getlast; 
     $phones->save();  
    } 
    return $this->redirect(Yii::$app->request->baseUrl.'/telephone/index');  
} 

, aber nur die ersten beiden Werte von $myinputs werden in die Datenbank eingefügt.

+0

haben Sie einige Validierungsregeln auf Telefonmodell? Bitte zeigen Sie dieses Modell – scaisEdge

+0

Sind Sie sicher, dass dies der richtige Weg ist? '$ totalinputs = sizeof ('$ myinputs');' um $ toalinputs zu bekommen? –

Antwort

1

Setzen Sie die Variable $ myinputs zwischen einfache Anführungszeichen ('$ myinputs') und konvertieren Sie Ihre Variable in eine Zeichenfolge. sizeof ist ein Alias ​​für die count-Funktion, aber wenn Sie ein Argument als String angeben, erhalten Sie immer das Ergebnis als 1. Nachdem Sie eine Bedingung durchlaufen haben ($ i = 0; $ i < = $ totalinputs; $ i ++) bedeutet dies, dass der Zyklus 2 mal ausgeführt wird wenn $ i = 0 und wenn ich $ 1 ist

Statt:

$totalinputs=sizeof('$myinputs'); 

sollten Sie

$totalinputs=sizeof($myinputs); 

Ein weiterer Fehler in Ihrem Zyklus Zustand verwenden.

for ($i=0; $i<=$totalinputs; $i++) 

Sollte

for ($i=0; $i<$totalinputs; $i++) 

sein Oder Sie könnten für den Zyklus mit foreach

foreach($myinputs as $inputs) 
{ 
     $phones=new phone(); 
     $phones->secondary_phones=$inputs; 
     $phones->id=$getlast; 
     $phones->save(); 
} 

Auf Yü Seite von Verbesserungen

1.For Form ersetzen Sie ActiveForm verwenden könnte Widget

$form = \yii\widgets\ActiveForm::begin([ 
     'options' => [ 
      "role" => "form", 
      "enctype"=> "multipart/form-data", 
     ], ]); 

echo $form->field($add, 'Name'); 
//etc 
$form->end(); 

2. Wenn Sie ActiveField für die Erstellung von Eingabefeldern im Hinblick oder manuell hinzufügen Feldnamen in Format wie ModelClassName [ModelFieldName], dann würden Sie in der Lage sein zu verwenden Modell Last für assaign'ing Werte Beispiel verwenden würden:

3.Für URLs ist es wahrscheinlich nicht erforderlich, Anforderung baseUrl Eigenschaft hinzuzufügen. Beispiel in redirect können Sie einfach

$this->redirect('/telephone/index'); 

4.Using Methode getLastInsertId() verwenden, kann zu Fehlern führen, wenn es einige Trigger in der Datenbank sind, die zusätzliche Zeilen schaffen. So kann es klüger sein zu verwenden:

$getlast=$add->id;//assuming model autoincrement field name is "id"