it-swarm-es.tech

Componente personalizado: JInput no obtiene la entrada del formulario

Tengo un formulario de entrada en la vista de administrador:

<form name="upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file_upload" />
    <input type="submit" value="Upload Image" />
    <input type="hidden" name="option" value="com_newsshowcase" />
    <input type="hidden" name="task" value="upload" />
    <?php echo JHtml::_( 'form.token' ); ?>
</form>

Este formulario llama a la función upload () en el controlador:

public function upload()
{
    // Check for request forgeries
    JSession::checkToken('request') or jexit(JText::_('JINVALID_TOKEN'));
    $app = JFactory::getApplication()->input;
    $file = $app->files->get('file_upload');
    $filename = JFile::makeSafe($file['name']);
}

He estado repitiendo (depurando) las variables $filename Y $file, Pero no se repite ningún valor. Cuando hago eco de algo como:

echo '<pre>',print_r($file,1),'</pre>';

nada se repite. Supongo que esto significa que el archivo que debe cargar esta función no se pasa de la vista al controlador.

Actualización: También importé JInput explícitamente (vi cosas mixtas en esto en mis búsquedas diciendo que no es necesario, pero no estaría de más). Mi controlador original extendió JController, intenté cambiar esto a JControllerForm y cambié la dependencia de importación en consecuencia y aún nada.

Actualización # 2: Cuando hago un var_dump En $_POST Puedo ver los datos del formulario, pero cuando hago un var_dump En $_FILES Muestra una matriz vacía.

Actualización n. ° 3: El tamaño de la imagen que intento cargar, como prueba, es de 345 bytes (super pequeño).

Actualización n. ° 4: Dupliqué el formulario (eliminé los campos específicos de Joomla) en un archivo independiente PHP que se vinculaba a a PHP punto final que realizó una var_dump($_FILES) y mostró los datos de carga.

Actualización n. ° 5: No estoy seguro de si es importante, pero el formulario HTML reside en la sección "default_body" de la página de administración.

4
Eric

Un par de cosas. Primero, verifique que este sea un error utilizando el JRequest en desuso pero que aún funciona para obtener los datos del archivo. Recientemente tuve que recurrir al uso de este método por una necesidad de carga de archivos.

$file = JRequest::getVar('file_upload', null, 'files', 'array'); 

Si eso aún no funciona, simplemente intente volcar la variable de solicitud $ _FILES ['file_upload'] para confirmar que el archivo se está enviando. Mi pensamiento está usando JRequest funcionará.

En segundo lugar, debe adjuntar el método de carga al controlador específico para la vista. Aunque debe y puede llegar a un método público en su punto de entrada principal, debe crear y adjuntar a un controlador que utilizará el modelo/vista.

Además, una vez que la tarea se migra al controlador adecuado, no es necesario recuperar un objeto JInput como parte de la clase principal.

Por razones de argumentos, digamos que la vista es Archivos, el controlador se ve así:

NewsShowcaseControllerFiles extends JControllerLegacy {

    public function upload() {
        jimport('joomla.filesystem.file');
        jimport('joomla.filesystem.folder');
        // Check for request forgeries
        JSession::checkToken('request') or jexit(JText::_('JINVALID_TOKEN'));

        // Notice in the controllers context, no need to instansiate Application Object
        $file = $this->input->files->get('file_upload');
        $filename = JFile::makeSafe($file['name']);

        // logic to save file or dump data to verify success
    }

}

En el punto de entrada del controlador primario ubicado en el sitio de componentes/raíz del administrador, agregue la siguiente línea a su método de visualización para registrar su tarea:

$this->registerTask('files.upload', 'upload');

Por último, debe modificar la URL del punto final para el formulario o AJAX solicitud que maneja el envío del formulario:

JRoute::_('index.php?option=com_newsshowcase&task=files.upload');
2
Brian Bolli