2016-07-31 17 views
0

Es gibt ein Datenbankfeld namens path es Texttyp ist und es verwendet wird, Pfade zu speichern Strings als CSV-Markierung, etwa wie folgt:Yii2 CSV-Textfeld, um mehr Auswahldropdown

*:*,site/about,site/* Ursprünglich wird es verwendet, als Texteingabefeld wie folgt aus:

<?= $form->field($model, 'path')->textarea(['rows' => 6]) ?> 

ich möchte, temporäre, die Wege in eine dropDownSelect Liste in der Ansicht konvertieren, dann in der Steuerung werde ich die ausgewählten Elemente in String implodieren erneut validiert werden und Gerettet.

Im Ansicht_form.php Ich habe folgendes:

<?= $form->field($model, 'path')->dropDownList($model->getPathSelectList($model->path), ['multiple' => 'multiple']) ?> 

Im Controller:

public function actionCreate() 
    { 
     $model = new StaticHtml(); 
     // var_dump($model->path); 
     // die(); 
     if (is_array($model->path)) $model->path = implode(',', $model->path); 

     if ($model->load(Yii::$app->request->post()) && $model->save()) { 
      return $this->redirect(['view', 'id' => $model->id]); 
     } else { 
      $model->path = $model->getPathsList(Yii::$app->getRequest()->getQueryParam('path')); 
      return $this->render('create', [ 
       'model' => $model,    
      ]); 
     } 
    } 

Bitte beachten Sie die beiden kommentierten Zeilenvar_dump($model->path) und die() Ich habe sie debuggen, weil ich jedesmal aus der dropDownList auswähle und th abschicke e Form, schlägt die Validierung und mir sagen, dass Path must be a string und natürlich gibt es keine im Gegensatz zu anderen Bereichen reserviert jede Auswahl und die var_dump($model->path) druckt NULL:

enter image description here

In dem obigen Code, gibt es zwei Methoden Modell:

  1. getPathsList() Es wird vom Controller aufgerufen und konvertiert einen Anfangspfad in Pfadmarkierungen und legt sie als CSV-Zeichenfolge fest.
  2. getPathSelectList in der Ansicht und es konvertieren die CSV in ein assoziatives Array, dessen Schlüssel und Werte sind gleich für jede Datenliste für das DropDownList-Feld.

Bis zu diesem Punkt, denke ich es mehr für die Aktualisierung benötigt, aber jedoch, was ist das Problem in meinem Code, der die $model->path Veröffentlichung verhindert so druckt er NULL mit var_dump()?

Ich bin mir ziemlich sicher, dass es ein Problem ist, Daten aus dem Formular in Empfang, weil ich versuchte:

var_dump(Yii::$app->getRequest()->post('path')); 
var_dump(Yii::$app->getRequest()->post('title')); 
var_dump(Yii::$app->request->post('path')); 

und alle von ihnen NULL zurück

Antwort

0

wenn Ihre Gültigkeitsregel Sie

hinzufügen

skipOnEmpty => true

Ansonsten können Sie die Prüfung auf diese Weise außer Kraft setzen

['path', 'required', 'isEmpty' => function ($value) { 
    return empty($value); 
}] 
+0

Vielen Dank, aber ich habe 'vorValidation' Callback im Modell verwendet, um die Transformation des Wertes durchzuführen. Der Punkt noch nicht klar, ist, warum konnte ich den Wert nicht erhalten, der vom Formular im Controller eingereicht wurde ?! – SaidbakR

+1

1) - Haben Sie den vorgeschlagenen Vorschlag ausprobiert .. was ist passiert .. Sie haben Fehler .. oder wird nicht ausgeführt ...2) Wenn Sie eine Vorvalidierung durchführen, könnte dies auf Modellebene vor dem Senden an den Controller geschehen. (BevorValidation ausgeführt werden sollte, bevor ein Validierungsfunktionsaufruf durchgeführt wird) ... trotzdem ist ein guter Platz für Ihre Konvertierung der afterFind() -Methode im Modell und der Controller vor sicher, so nicht mit der Validierung stören .. – scaisEdge

+0

Meinst du den Fehler beim Empfangen von Daten aus dem Formular im Controller aufgrund der Daten an das Modell zuerst, so dass die Validierung fehlschlagen, und dann gibt es die Daten nicht an den Controller? – SaidbakR