¿Se puede pasar un dato de controlador a modelo? Yii2

Hola a todos comunidad, tengo un problema ,estoy tratando de subir un archivo a mi app , recibo los datos y los leo en un array de objetos y necesito guardar uno de sus elementos (el nombre ), (lo cual puedo ver si hago var_dump o lo retorno ) , pero al momento de guardar y poner mis datos en el modelo me dice que el objeto del array que estoy usando no es un objeto :thinking: . Si alguien me puede guiar por mi duda se lo agradecería muchisimo. de igual manera Gracias.

Acá les dejo mi vista

<div class="d-md-flex justify-content-center align-content-center flex-column py-5 text-center">

<h1><?= Html::encode($this->title) ?></h1>

<div class="upload-icon d-md-flex flex-row align-self-center justify-content-center">
<i class="fas fa-file-upload"></i>
</div>
<div>
    <p>Arrastra tu documento para poder enviarlo</p>
    <p class="text-muted">Tú documento ser privado hasta le momento en que decidas enviarlo</p>

    <?php ActiveForm::begin(
        [
            'options' => ['enctype' => 'multipart/form-data' ]
        ]) ?>
    <button class="btn btn-primary btn-file">
        selecciona tu documento
        <input type="file" name="documento" id="archivoDocumento">
    </button>
    <?php ActiveForm::end() ?>
</div>

Acá mi controlador

 public function actionCreate()
{
    $model = new Documento();

    // $documento = UploadedFile::getInstanceByName('documento');
    
    $this->documento = UploadedFile::getInstanceByName('documento');
    echo'<pre>';var_dump($this->documento->name);

    foreach ($this->documento as $key => $value) { //hice esto para ver si así podía pasar mi dato pero no tive éxito
        $model->nombre_documento = $this->documento->name;
        if($key == "name"){
            
            $nombre = $model->nombre_documento ;
        }
    }

    //  echo'<pre>';var_dump($documento);echo'<pre>';die;

    if (Yii::$app->request->isPost && $model->save()) {
        return $this->redirect(['view', 'id' => $model->id_documento]);
    }

    // echo'<pre>';var_dump(Yii::$app->request->isPost);echo'<pre>';exit();

    return $this->render('create', [
        'model' => $model,
    ]);
}

Y acá mi modelo en donde estoy haciendo una función donde podré crear y guardar mi carpeta donde irán mis archivos

public function save($runValidation = true, $attributeNames = null)
{
    $insert = $this->isNewRecord;

    
    if ($insert) {
        
      var_dump($this->documento);
        $this->id_documento = Yii::$app->security->generateRandomString(15);
        
    }
    // return parent::save($runValidation, $attributeNames);
    $saved = parent::save($runValidation, $attributeNames);

    if (!$saved) {
        return false;
    }
    if ($insert) {
        $videoPath = Yii::getAlias('@frontend/web/storage/documento/' . $this->id_documento . '.pdf');
        if(!is_dir(dirname($videoPath))) {
            FileHelper::createDirectory(dirname($videoPath));
        }
        $this->documento->saveAs($videoPath);
    }
    return true;
}

Estoy intentando pasar “$this->documento->name” a mi modelo para poder guardarlo pero no se como pasar una variable de mi controlador a mi modelo, nuevamente gracias a quien pueda ayudarme.

/* Moved to /International/Spanish */

1 Like

oh, sorry I didn’t realize !! ._.

según veo en el controlador ya tiene la instancia de Documento, si está tratando de sobreescribir el método save en el modelo documento debería poder acceder con $this, también tenga en cuanta que para subir un archivo generalmente se crea un atributo en el modelo (supongo que cuando llama a $this->documento no corresponde a un campo de la tabla)

1 Like

@blonder4131 cuando dices un atributo , te refieres a una variable global o campo en las reglas del modelo? (rules)

@blonder4131 porque cuando reviso el procedimiento dentro de mi carpeta de temporales, aparece y se desaparece ahí mismo, supongo que intenta ir a la carpeta que le asigno , pero no llega :S

un atributo es una variable en la clase, yo por ejemplo tengo un campo en mi tabla que se llama imagen y al modelo le creo el public $archivo, ese atributo es el que uso para subir el archivo. Si el archivo aparece en temporales supongo que está subiendo, tal vez no está encontrando la ruta o no tiene permisos, verifique los permisos o encierre todo en un try…catch para probar.

1 Like

@blonder4131 si, tenía problemas con la ruta y al final tuve que usar "move_uploaded_file($nombreTemp, $documentoPath) ", y tuve que sacar el nombre del archivo temporal que se creaba para poder guardar en mi carpeta