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?
Scheint wie die richtige Option für mich hier. Ich beschränkte mich auf das CRUD-Gerüst der Fabrik. – Bojack