Hier geht es darum, mit SCENARIO Parameter in zwei verschiedene Tabellen einzufügen, zuerst den Kunden mit seinen Parametern zu registrieren und dann die Bestellung eines Kunden in nur einer Form zu registrieren.

Ich sende ein Formular mit mehreren Parametern, einige werden beim Einfügen eines Kunden mithilfe eines Szenarios verwendet, und die anderen Parameter werden in der Reihenfolge verwendet (ich habe dies getan, damit ich nicht zwei Formulare erstellen muss) korrekt durch POST zusammen mit der csrf gesendet.

public function createOrder()
{
    //$customer = Customer::find()->where(['email' => $params->email])->limit(1)->asArray()->all();
    $customer = new Customer;
    $customer->load(Yii::$app->request->post());
    $customer->scenario = 'create';
    if($customer->validate()){
        $customer->save();
        vdp($customer);
    } else{
        vdpd($customer->getErrors());
    }

    die;

}

Dies gibt mir ein Array zurück, das besagt, dass die Parameter Name, E-Mail, Adresse, Handy, Telefon, Stadt usw. nicht leer bleiben dürfen .

In meinem Kundenmodell:

const SCENARIO_CREATE = 'create';

public function scenarios()
{
    $scenarios = parent::scenarios();
    $scenarios[self::SCENARIO_CREATE] = ['name', 'email', 'public_place', 'cell_phone', 'phone', 'city', 'cep', 'state', 'neighborhood', 'number', 'complement'];
    return $scenarios;
}
0
viniciussvl 24 Juni 2018 im 01:09

3 Antworten

Beste Antwort

Controller

public function actionCreateOrder()
{
   $customer = new Customer;
   $customer->setScenario(Customer::SCENARIO_CREATE);
   if($customer->load(Yii::$app->request->post())
      if($customer->save()){
          vdp($customer);
      } else {
          vdpd($customer->getErrors());
      }
   }
   die;
}

MODELL

const SCENARIO_CREATE = 'create';

public function rules()
{
    return [
       [['name', 'email', 'address'], 'required', 'on' => self::SCENARIO_CREATE], // Add more required fields on 'create' scenario.
       ... // some more rules
    ];
}

public function scenarios()
{
    $scenarios = parent::scenarios();
    $scenarios[self::SCENARIO_CREATE] = ['name', 'email', 'public_place', 'cell_phone', 'phone', 'city', 'cep', 'state', 'neighborhood', 'number', 'complement'];
    return $scenarios;
}
1
Insane Skull 24 Juni 2018 im 04:21

1) createOrder() sollte im Controller actionCreateOrder() sein, nicht im Modell.

2)

$customer->load(Yii::$app->request->post());
$customer->scenario = 'create';
if ($customer->validate()) {
...

Sollte sein

$customer->scenario = Customer::SCENARIO_CREATE;
if ($customer->load(Yii::$app->request->post()) && $customer->validate()) { ... }

Da die Methode load Attribute für das aktuelle Szenario lädt und keine Validierung ausgeführt werden muss, bevor das Modell geladen wird. Siehe das Beispiel.

3) Deklarieren Sie Regeln für Ihre Attribute in Customer Modell.

1
camelsWriteInCamelCase 24 Juni 2018 im 01:30

Sie müssen $scenario vor dem Aufruf von load() festlegen. Das Szenario definiert Attribute, die von load() festgelegt werden können. Sie tun dies also zu spät und es hat keine Auswirkung. Versuche dies:

$customer = new Customer;
$customer->scenario = 'create';
$customer->load(Yii::$app->request->post());
0
rob006 24 Juni 2018 im 00:03