Yii2 как восстановить модал в afterSave - PullRequest
0 голосов
/ 17 мая 2018

У меня есть модель ProductOffer внутри, которую я использую afterSave для генерации купона.

Сейчас статус нулевой, и после сохранения я хочу его обновить.

public function afterSave($insert, $changedAttributes) {
    if (floatval($this->offer) >= floatval($this->product->threshold_price)) {
        $coupon = false;
        $createCoupon = "";
        $ctr = 1;
        while ($coupon == false) {
            $createCoupon = $this->createCoupon(
                "Offer for " . $this->customer_name . ' #' . $this->id, 
                $this->product->sale_price - $this->offer,
                $this->product_id
            );

            if ($createCoupon || $ctr > 3) {
                $coupon = true;
            }

            $ctr++;
        }

        $this->status = self::STATUS_ACCEPTED_COUPON_GENERATED;
        $this->coupon_code = $createCoupon->code;

        // todo this
        // echo "Accepted automatically then send email to customer as the same time to merchant email";
    } else {
        $this->status = self::STATUS_REJECTED;
    }

    return parent::afterSave($insert, $changedAttributes);
}

Так что здесь, в afterSave, я хочу обновить статус записи и сохранить код купона.

То, что я не хочу делать, просто так.

public function afterSave($insert, $changedAttributes) {

    // So basically I want to update the status in afterSave
    $this->status = "What ever value rejected or accepted it depends of the outcome of generating coupon";
    $this->coupon = "AddTheCoupon";

    // Save or Update
    $this->save();

    return parent::afterSave($insert, $changedAttributes);
}

Но, похоже, это не работает для меня, и если вы собираетесь анализировать его, оно выполняет бесконечное обновление данных, поскольку при каждом сохранении () оно проходит через afterSave ().

Есть ли другой способ сделать это?

Спасибо!

1 Ответ

0 голосов
/ 17 мая 2018

Вы должны использовать метод updateAttributes, который пропускает все события.

См. Ссылку updateAttributes (['some_field']) .

/** After record is saved
  */
public function afterSave($insert, $changedAttributes)
{
     parent::afterSave($insert, $changedAttributes);

     $this->some_field = 'new_value';
     $this->updateAttributes(['some_field']);
     return true;
}
...