YII2 - Добавить Загрузить файл при регистрации - PullRequest
0 голосов
/ 02 ноября 2018

Я попытался добавить другое поле для просмотра регистрации:

****** внешний интерфейс / просмотр / регистрация.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(); ?>

Затем в RegistrationForm.php я попытался присвоить Экземпляр файла $ cv , и у меня есть что-то вроде этого:

******** внешний интерфейс / модели / RegistrationForm.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;
    }
}

Хорошо, теперь действие - мой контроллер:

******* интерфейс / контроллеры / 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", как описано в правилах модели , ребята где я не прав? Пожалуйста, поправьте меня.

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Спасибо @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(); ?>

тогда я использовал getInstance в модели RegistrationForm:

интерфейс / модели / 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, вы также можете использовать его для обновления в будущем (на всякий случай, если вы ищете это).

0 голосов
/ 02 ноября 2018

Я думаю, что проблема в том, что вы вводите файл в форму, вы неправильно отображаете его в соответствии с правилами ваших моделей, пожалуйста, попробуйте это:

<?= $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/ вместо использования ../../

...