繁体   English   中英

YII2-在注册时添加上传文件

[英]YII2 - Add Upload file on Signup

我尝试将另一个字段添加到注册视图:

****** frontend / view / signup.php

<?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 ,我有这样的事情:

******** frontend / models / SignupForm.php

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。 最终我得到了自己的解决方案,但我认为他也很棒。 为了未来和其他:

前端/视图/ signup.php

 <?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:

前端/模型/ SignupForm.php

 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM