2012-03-29 12 views
0

ich ein Location-Modell mit den folgenden Attributen haben -Yü: Update Modellwerte vor actionCreate und actionUpdate

id 
City 
State 
Country 

I wan't der Benutzer aus einer Liste bestehender Staaten/Länder auswählen zu können, und Wenn ein zusätzliches Element hinzugefügt werden muss, kann es in ein Textfeld eingegeben werden. Ich habe die _form.php teilweise wie folgt modifiziert -

// city 
<?php echo $form->textField($model,'city',array('size'=>60,'maxlength'=>100)); ?> 

// state 
<?php echo $form->dropDownList($model, 'state', CHtml::listData(Location::model()->findAll(), 'state', 'state')); ?> 
<?php echo CHtml::textField('state2','',array('size'=>60,'maxlength'=>100)); ?> 

// country 
<?php echo $form->dropDownList($model, 'country', CHtml::listData(Location::model()->findAll(), 'country', 'country')); ?> 
<?php echo CHtml::textField('country2','',array('size'=>60,'maxlength'=>100)); ?> 

state2 und country2 sind nicht Teil der Modellattribute. Jetzt, in der Lage-Controller Ich habe die folgende Aktion -

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

    // Uncomment the following line if AJAX validation is needed 
    // $this->performAjaxValidation($model); 

    if(isset($_POST['Location'])) 
    { 
     $model->attributes=$_POST['Location']; 
     if($model->save()) 
      $this->redirect(array('view','id'=>$model->id)); 
    } 

    $this->render('create',array(
     'model'=>$model, 
    )); 
} 

Ich möchte wie dies die Werte setzen, bevor diese Aktion ausführt -

if(!empty($_POST['state2'])) $model->state = $_POST['state2']; 
if(!empty($_POST['country2'])) $model->country = $_POST['country2']; 

Was ich bisher versucht

1. Versuch 1 Ich fügte die Linien direkt zu actionCreate und actionUpdate hinzu. Ich denke jedoch nicht, dass dies eine saubere Lösung ist.

1. Versuch 2 Ich habe versucht, einen Filter wie das Hinzufügen -

public function filterAlternateData($filterChain) 
{ 
    if(!empty($_POST['state2'])) $_POST['Location[state]'] = $_POST['state2']; 
    if(!empty($_POST['country2'])) $_POST['Location[country]'] = $_POST['country2']; 
    $filterChain->run(); 
} 

Dann modifizierte ich die Filter() Funktion wie diese, so dass sie auf die Erstellung und Aktualisierung Aktionen gebunden ist -

public function filters() 
{ 
    return array(
     'accessControl', // perform access control for CRUD operations 
     'alternateData + create, update', 
    ); 
} 

Aber das hat nicht funktioniert.

Wer hat irgendwelche Ideen?

Antwort

0

Ich vermute, dass dies in einer CRUD-Operation auf der Grundlage der actionCreate() -Methode passiert.

Persönlich würde ich ein separates Formular für die create-Funktionalität mit den folgenden Attributen erstellen.

Formular

  • Städte
  • Staaten
  • Länder
  • Neue Stadt (nicht erforderlich)
  • New State (nicht erforderlich)
  • New Country (nicht erforderlich)

Dann können Sie in der Formularvalidierung überprüfen, ob der Benutzer eine Stadt, einen Staat oder ein Land eingegeben hat, das bereits existiert usw.

+0

Scheint wie die richtige Option für mich hier. Ich beschränkte mich auf das CRUD-Gerüst der Fabrik. – Bojack

0

Sie können die Zeilen in der beforeSave() -Methode Ihres Modells hinzufügen (Sie müssen sie überschreiben).

+0

wird 'beforeValidate()' nicht vor 'beforeSave()' aufgerufen? Wird die Validierung nicht fehlschlagen, wenn die Dropdownliste leer ist (erste Datensatzeinfügung)? – Bojack

+0

hängt von den Validierungen ab, die Sie in Ihrem Modell festgelegt haben ... Wenn Sie eine 'erforderliche' Validierung für die Felder festgelegt haben, werden die Validierungen fehlschlagen. Aber in Ihrem Fall können sie leer und nicht gesetzt sein, also sollte die Validierung nicht fehlschlagen. –