Ошибка преобразования объекта модели в строку
Обрабатываю запрос на получение главной страницы, передавая данные пользователя, чтобы отобразить их в форме.
public function actionIndex()
{
$model = ProfileForm::GetWithUser(Yii::$app->user->identity->id);
return $this->render('index', [
'model' => $model,
]);
}
После чего принимаю их во view и при передаче объекта $model в $form->field. Выдаёт ошибку преобразования объекта в строку.
<?php
/** @var yii\web\View $this */
/** @var \frontend\models\ProfileForm $model */
$this->title = 'My Yii Application';
?>
<div class="site-index">
<?php
if (Yii::$app->user->isGuest) {
echo '
<p>Вы не авторизованы( Сделайте что-нибудь с этим</p>
';
} else {
var_dump($model);
echo `
<h1><?= Html::encode($this->title) ?></h1>
<p>Please fill out the following fields to login:</p>
<div class="row">
<div class="col-lg-5">
<?php $form = ActiveForm::begin(['id' => 'profile-form']); ?>
<?= $form->field($model, 'first_name')->textInput(['autofocus' => true]) ?>
<?= $form->field($model, 'last_name')->textInput() ?>
<button class="btn btn-lg btn-primary" type="submit">OK</button>
<?php ActiveForm::end(); ?>
</div>
</div> `;
}
?>
</div>
</div>
Ошибка:
2024-02-11 22:02:22 [127.0.0.1][19][s4fbag0p29c13uqv0pejjv9re8shnefh][error][yii\base\ErrorException:4096] yii\base\ErrorException: Object of class frontend\models\SignupForm could not be converted to string in F:\programs\OSPanel\domains\test-assigment-infa\advanced\frontend\views\site\index.php:27
Stack trace:
#0 F:\programs\OSPanel\domains\test-assigment-infa\advanced\frontend\views\site\index.php(27): yii\base\ErrorHandler->handleError(4096, 'Object of class...', 'F:\\programs\\OSP...', 27, Array)
#1 F:\programs\OSPanel\domains\test-assigment-infa\advanced\vendor\yiisoft\yii2\base\View.php(347): require('F:\\programs\\OSP...')
#2 F:\programs\OSPanel\domains\test-assigment-infa\advanced\vendor\yiisoft\yii2\base\View.php(257): yii\base\View->renderPhpFile('F:\\programs\\OSP...', Array)
#3 F:\programs\OSPanel\domains\test-assigment-infa\advanced\vendor\yiisoft\yii2\base\View.php(156): yii\base\View->renderFile('F:\\programs\\OSP...', Array, Object(frontend\controllers\SiteController))
#4 F:\programs\OSPanel\domains\test-assigment-infa\advanced\vendor\yiisoft\yii2\base\Controller.php(407): yii\base\View->render('index', Array, Object(frontend\controllers\SiteController))
#5 F:\programs\OSPanel\domains\test-assigment-infa\advanced\frontend\controllers\SiteController.php(84): yii\base\Controller->render('index', Array)
#6 [internal function]: frontend\controllers\SiteController->actionIndex()
До этого делал формы регистрации и авторизации, всё теми же шагами, но там всё работает корректно.
Класс ProfileFrom
<?php
namespace frontend\models;
use Yii;
use yii\base\Model;
use common\models\User;
/**
* Profile form
*/
class ProfileForm extends Model
{
public $first_name;
public $last_name;
public $email;
public $password;
public $passwordRepeat;
private $_user;
public static function GetWithUser($userId){
if ($userId == null)
return null;
$pf = new ProfileForm();
$user = $pf->getUser($userId);
$pf->first_name = $user->first_name;
$pf->last_name = $user->last_name;
$pf->email = $user->email;
return $pf;
}
/**
* {@inheritdoc}
*/
public function rules()
{
return [
['first_name', 'trim'],
['first_name', 'required'],
['first_name', 'string', 'min' => 2, 'max' => 255],
['last_name', 'trim'],
['last_name', 'required'],
['last_name', 'string', 'min' => 2, 'max' => 255],
['email', 'readonly'],
['password', 'required'],
['password', 'string', 'min' => Yii::$app->params['user.passwordMinLength']],
['passwordRepeat', 'required'],
['passwordRepeat', 'checkPasswords']
];
}
/**
* Signs user up.
*
* @return bool whether the creating new account was successful and email was sent
*/
public function checkPasswords($attribute, $params){
if ($this->password != $this->passwordRepeat)
$this->addError($attribute, 'Пароли не совпадают');
return null;
}
public function getUser($userId){
if ($this->_user === null) {
$this->_user = User::findOne($userId);
}
return $this->_user;
}
public function edit(){
$_user->first_name = $this->first_name;
$_user->last_name = $this->last_name;
$_user->email = $this->email;
$_user->setPassword($this->password);
$_user->generateAuthKey();
$_user->generateEmailVerificationToken();
return $_user->save()
}
}
Класс SingupForm
<?php
namespace frontend\models;
use Yii;
use yii\base\Model;
use common\models\User;
/**
* Signup form
*/
class SignupForm extends Model
{
public $first_name;
public $last_name;
public $email;
public $password;
public $passwordRepeat;
/**
* {@inheritdoc}
*/
public function rules()
{
return [
['first_name', 'trim'],
['first_name', 'required'],
['first_name', 'string', 'min' => 2, 'max' => 255],
['last_name', 'trim'],
['last_name', 'required'],
['last_name', 'string', 'min' => 2, 'max' => 255],
['email', 'trim'],
['email', 'required'],
['email', 'email'],
['email', 'string', 'max' => 255],
['email', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This email address has already been taken.'],
['password', 'required'],
['password', 'string', 'min' => Yii::$app->params['user.passwordMinLength']],
['passwordRepeat', 'required'],
['passwordRepeat', 'checkPasswords']
];
}
/**
* Signs user up.
*
* @return bool whether the creating new account was successful and email was sent
*/
public function signup()
{
if (!$this->validate()) {
return null;
}
$user = new User();
$user->first_name = $this->first_name;
$user->last_name = $this->last_name;
$user->email = $this->email;
$user->setPassword($this->password);
$user->generateAuthKey();
$user->generateEmailVerificationToken();
return $user->save() && $this->sendEmail($user);
}
public function checkPasswords($attribute, $params){
if ($this->password != $this->passwordRepeat)
$this->addError($attribute, 'Пароли не совпадают');
return null;
}
/**
* Sends confirmation email to user
* @param User $user user model to with email should be send
* @return bool whether the email was sent
*/
protected function sendEmail($user)
{
return Yii::$app
->mailer
->compose(
['html' => 'emailVerify-html', 'text' => 'emailVerify-text'],
['user' => $user]
)
->setFrom('[email protected]')
->setTo($this->email)
->setSubject('Account registration at ' . Yii::$app->name)
->send();
}
}
Решил вместо SingupForm передать ProfileForm в контролере на страницу с формой регистрации, так как поля у моделей идентичные. И никакой ошибки не выдаёт, поля заполняются верно. Решил наоборот передать на страницу с формой редактирования пользователя объект SingupForm вместо ProfileForm и ошибка остаётся такой же что описана выше