[英]YII2 - Add Upload file on Signup
我尝试将另一个字段添加到注册视图:
<?php $form = ActiveForm::begin(['action' => ['site/signup'],'options' => ['method' => 'post', 'enctype' => 'multipart/form-data']]); ?>
<?= $form->field($signup, 'email')->textInput(['autofocus' => true, 'data-constraints'=>"@Required @Email"]) ?>
<?= $form->field($signup, 'name')->textInput(['data-constraints'=>"@Required"])->label('Imię') ?>
<?= $form->field($signup, 'surname')->textInput(['data-constraints'=>"@Required"])->label('Nazwisko') ?>
<?= $form->field($signup, 'phone')->textInput(['data-constraints'=>"@Required"])->label('Telefon') ?>
<?= $form->field($signup, 'password')->passwordInput(['data-constraints'=>"@Required"])->label('Hasło') ?>
<?= $form->field($signup, 'password_repeat')->passwordInput(['data-constraints'=>"@Required"])->label('Powtórz Hasło') ?>
<?= $form->field($signup, 'cv')->fileInput()->label('Photo') ?>
<div class="form-group">
<?= Html::submitButton('Signup', ['class' => 'btn btn-primary', 'name' => 'signup-button']) ?>
<?= yii\authclient\widgets\AuthChoice::widget([
'baseAuthUrl' => ['site/auth'],
'popupMode' => false,
'options' => [
'class' => 'btn'
]
]) ?>
</div>
<?php ActiveForm::end(); ?>
然后在SignupForm.php中,我尝试将文件实例分配给$ cv ,我有这样的事情:
class SignupForm extends Model
{
public $email;
public $name;
public $surname;
public $phone;
public $cv;
public $password;
public $password_repeat;
/**
* {@inheritdoc}
*/
public function rules()
{
return [
['email', 'trim'],
['email', 'required'],
['email', 'email'],
['email', 'string', 'max' => 255],
['email', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This email address has already been taken.'],
['name', 'required'],
['surname', 'required'],
['phone', 'required'],
[['cv'], 'file', 'extensions' => 'png, jpg'],
['password', 'required'],
['password', 'string', 'min' => 6],
['password_repeat', 'required'],
['password_repeat', 'compare', 'compareAttribute'=>'password', 'message'=>"Passwords do not match" ],
];
}
/**
* Signs user up.
*
* @return User|null the saved model or null if saving fails
*/
public function signup()
{
if (!$this->validate()) {
return null;
}
$user = new User();
$user->email = $this->email;
$user->name = $this->name;
$user->surname = $this->surname;
$user->phone = $this->phone;
$path = '../../common/uploads/' . $this->email . '/';
$this->cv = UploadedFile::getInstanceByName('cv');
if (!is_null($this->cv) || !empty($this->cv)){
FileHelper::createDirectory($path);
$this->cv->saveAs($path . $this->cv->baseName . '.' . $this->cv->extension);
$user->cv = $this->cv->baseName . '.' . $this->cv->extension;
}
$user->password_reset_token = $user->generatePasswordResetToken();
$user->setPassword($this->password);
$user->generateAuthKey();
$user->save();
$auth_assign = new AuthAssignment();
$auth_assign->item_name = 'worker';
$auth_assign->user_id = $user->getId();
$auth_assign->save();
return $user;
}
}
好了,现在是操作我的控制器:
******* frontend / controllers / SiteController.php
public function actionSignup()
{
$signup = new SignupForm();
if ($signup->load(Yii::$app->request->post())) {
if ($user = $signup->signup()) {
if (Yii::$app->getUser()->login($user)) {
return $this->goHome();
}
}
else {
return $this->redirect('site/sign#undefined2');
}
}
}
问题:
尝试上传文件时,我总是得到$cv = NULL
。 我知道CV不应该是图像文件,但这只是测试我的解决方案是否有效,但幸运的是,它不行...事前疑问-该文件是模型规则中所述的具有正确格式“ png或jpg”的图像。 伙计们我错了吗? 请纠正我。
我认为问题出在表单的文件输入中,您没有根据模型规则正确呈现它,请尝试以下操作:
<?= $form->field($signup, 'cv')->fileInput()->label('Photo') ?>
代替
<?= $form->field($signup, 'file')->fileInput()->label('Photo') ?>
然后测试
在您的模型中,请尝试此
$this->cv = UploadedFile::getInstances($this, 'cv');
$this->cv = count($this->cv) > 0 ? $this->cv[0] : NULL;
if (!is_null($this->cv) || !empty($this->cv)){
FileHelper::createDirectory($path);
$this->cv->saveAs($path . $this->cv->baseName . '.' . $this->cv->extension);
$user->cv = $this->cv->baseName . '.' . $this->cv->extension;
}
而且,如果您想查看上面这些变量返回的内容,可以在上面的代码之后添加以下行:
echo "<pre>"; print_r($this->cv);print_r($user);die;
这将向您显示$this->cv
和$user
另外,请检查您输入的路径应该上传到该目录,所以我认为您使用的是Yii2 Advance,因此您的上传路径应该像common/uploads/
一样工作,而不是使用../../
感谢@Rajender Verma。 最终我得到了自己的解决方案,但我认为他也很棒。 为了未来和其他:
<?php $form = ActiveForm::begin(['action' => ['site/signup'],'options' => ['method' => 'post', 'enctype' => 'multipart/form-data']]); ?>
<?= $form->field($signup, 'email')->textInput(['autofocus' => true, 'data-constraints'=>"@Required @Email"]) ?>
<?= $form->field($signup, 'name')->textInput(['data-constraints'=>"@Required"])->label('Imię') ?>
<?= $form->field($signup, 'surname')->textInput(['data-constraints'=>"@Required"])->label('Nazwisko') ?>
<?= $form->field($signup, 'phone')->textInput(['data-constraints'=>"@Required"])->label('Telefon') ?>
<?= $form->field($signup, 'password')->passwordInput(['data-constraints'=>"@Required"])->label('Hasło') ?>
<?= $form->field($signup, 'password_repeat')->passwordInput(['data-constraints'=>"@Required"])->label('Powtórz Hasło') ?>
<?= $form->field($signup, 'cv')->fileInput()->label('CV') ?>
<div class="form-group">
<?= Html::submitButton('Signup', ['class' => 'btn btn-primary', 'name' => 'signup-button']) ?>
<?= yii\authclient\widgets\AuthChoice::widget([
'baseAuthUrl' => ['site/auth'],
'popupMode' => false,
'options' => [
'class' => 'btn'
]
]) ?>
</div>
<?php ActiveForm::end(); ?>
然后我在SignupForm模型中使用了getInstance:
public function signup()
{
if (!$this->validate()) {
return null;
}
$user = new User();
$path = \Yii::getAlias('@common') . '/uploads/' . $this->email;
$file = UploadedFile::getInstance($this,'cv');
if ($file instanceof UploadedFile){
FileHelper::createDirectory($path);
$file->saveAs($path . '/' . $file->baseName . '.' . $file->extension);
$user->cv = $file->baseName . '.' . $file->extension;
}
$user->email = $this->email;
$user->name = $this->name;
$user->surname = $this->surname;
$user->phone = $this->phone;
$user->password_reset_token = $user->generatePasswordResetToken();
$user->setPassword($this->password);
$user->generateAuthKey();
$user->save();
$auth_assign = new AuthAssignment();
$auth_assign->item_name = 'worker';
$auth_assign->user_id = $user->getId();
$auth_assign->save(false);
return $user;
}
和我的控制器没有被更改。
只要if($file instanceof UploadedFile)
确定$file
必须是UploadedFile
类的实例,您将来也可以使用它进行更新(以防万一,您需要查找它)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.