Aktualizowanie danych w yii2 problem z hasłem

Zrobiłem CRUD do danych użytkownika.Zrobiłem to korzystająć z ActiveRecord. I teraz gdy chcę zaktualizować dane użytkownika mam tam input hasło. Za każdym razem to hasło nadpisuje mi się gdy kliknę przycisk update. Zrobiłem funkcję beforeSave, żeby zapisywać dane niepochodzące z inputów i z funkcją haszującą podane hasło:


public function beforeSave($insert)

    {

        if (parent::beforeSave($insert)) {

            if($this->isNewRecord) {

                $this->created_at = time();

                $this->status = self::DEFAULT_STATUS;

                $this->generateAuthKey();

                $this->setPassword($this->PasswordHash);

                $this->RulesAccept=1;

                return true;

            }

            else {

            $this->setPassword($this->PasswordHash);

            return true;

        }

        } 

    }

Tutaj sprawdzam czy jest to nowy user czy tylko aktualizacja. Ale to nie działa bo za każdym razem hasło się nadpisuje. Pomyślałem, że stworzę input który zawsze będzie pusty:


<label class="control-label"> <?= Yii::t('app', 'Hasło')?> </label>

        <?= $form->field($model, 'PasswordHash')->passwordInput(['placeholder' => Yii::t('app', 'Utwórz hasło'), 'value' => ''])->label('') ?>

No i chciałem napisać coś, żeby sprawdzić, czy ktoś aktualizując dane usera wpisał nowe hasło czy nie. Jeśli input jest pusty tzn, że nie chcę zapisywać hasła i w bazie to zahaszowane hasło ma się nie zmienić ale jeśli ktoś uzupełnił ten iput to ma zahaszować podane hasło:


public function beforeSave($insert)

    {

        if (parent::beforeSave($insert)) {

            if($this->isNewRecord) {

                $this->created_at = time();

                $this->status = self::DEFAULT_STATUS;

                $this->generateAuthKey();

                $this->setPassword($this->PasswordHash);

                $this->RulesAccept=1;

                return true;

            }

            else {

            If((!empty)$this->PasswordHash)){

            $this->setPassword($this->PasswordHash);

            return true;

}return false

        }

        } 

    }

Ale niestety to nie działa. Czy jest jakiś sposób na to żeby hasło sie nie nadpisywało? Nie mam już pomysłu. Gdy nie zrobię tego inputa, który zawsze jest pusty to wtedy na akcji update ten input ma dużo kropek, tzn, że wczytuje on znaki zahaszowane z bazy no i to mogło by tak zostać, że widać te znaki, ale gdy klikne zapisz to za każdym razem to hasło mi się zmienia. Co mogę zrobić, żeby nie nadpisywać tego hasła? I chcę to zrobić korzystając z Active record wiem ze rozszerzając klase extend Model było by łatwiej ale zależy mi żeby tak to zostawić. Proszę o pomoc.

Jeśli nie chcesz tworzyć nowego hasha hasła, nie wywołuj metody setPassword().

PasswordHash nie powinien być polem w formularzu do podania, a jedynie powinien przechowywać automatycznie wygenerowany hash z pola password.

Możesz zrobić tak:

  1. w modelu zdefiniuj dwa scenariusze: create i update oraz pole $hasło (jako pole klasy: public $haslo)

  2. pole hasło ustaw jako wymagane ale wyklucz wymagalność przy scenariuszu update

  3. w formularzu wstaw pole $haslo z podpowiedzią, że jezeli jest puste to nie zostanie zmienione (metoda hint())

  4. w beforeSave sprawdzaj wartość pola haslo. Jeżeli jest puste to nie generujesz hasha jeżeli nie jest puste taki hash generujesz.

Ewentualnie możesz zrobić oddzielny formularz do zmiany hasła.

PS

Poczytaj o TimestampBehavior