Recoger datos de un formulario correctamente

Foro de debate para los escritores de MOD, sobre MOD en Desarrollo.

Moderador: Personalizaciones de Extensiones

Avatar de Usuario
Juanla
Menos de 100 mensajes
Menos de 100 mensajes
Mensajes: 48
Registrado: Lun Dic 13, 2010 7:49 pm

Recoger datos de un formulario correctamente

Mensaje sin leer por Juanla » Vie Dic 17, 2010 10:35 pm

Patrocinador

Bueno, estoy empezando en esto, y no soy usuario avanzado de php, por eso puede que suelte muchas burradas en algunas dudas, pero en principio es una buena forma de aprender, probando así que la suelto:

Tengo una página personalizada en phpBB la cual tiene un formulario que subirá archivos a una carpeta especial. El situación tengo algo así:
1. Tabla en mysql donde guardar los registros
2. Archivo php en raíz del foro
3. Archivo html en template
4. Archivo de lenguage

De momento no incluyo páginas de idioma de phpBB por defecto o uso funciones, y no lo hago porque conozco muy poquitas.

Dejo un ejemplo sencillo resumido de lo que tengo:
HTML (Esta sería la parte importante, le pongo un nombre y un archivo, botón de enviado y un campo oculto que uso en el php para definir que viene desde el formulario)

Código: Seleccionar todo

<form name="send" action="ctfdownloads.php" method="post">
Nombre <input name="file_name" value="" size="30" />
Archivo:<input type="file" name="ctf-file" value="" size="20"/>
<input class="btnmain" type="submit" name="submit" value="{L_SUBMIT}" /></td>                
<input type="hidden" name="sended" value="enviado" />
</form>
El php (lo más problemático)
En principio la página contiene lo que normalmente debe contener

Código: Seleccionar todo

define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);

// Start session management
$user->session_begin();
$auth->acl($user->data);
$user->setup();
Por si acaso lo dejo si me equivoqué en algo. (Ya que pregunto, pregunto :D )

La parte que recibe y actúa en el formulario es:

Código: Seleccionar todo

// Archivo de lenguaje y nombre de la tabla
$user->add_lang(array('mods/ctfdownloads'));
define('CTF_DOWNLOADS_TABLE', $table_prefix.'ctfdownloads');

if(request_var('sended', '', true)== 'enviado'){
// Archivo subido
$ctf_file_temp=$_FILES['ctf-file']['tmp_name'] ;
$ctf_file_content = addslashes(fread(fopen($ctf_file_temp, "rb"), filesize($ctf_file_temp)));

// Leemos formulario del usuario (Modificar)
$file_name	= request_var('file_name', '', true);
$file_description     = request_var('file_description', '', true);
$file_size     = $_FILES['ctf-file']['size'];
$file_type     = $_FILES['ctf-file']['size'];

$nfile_name     = utf8_normalize_nfc($file_name);
$nfile_description     = utf8_normalize_nfc($file_description);

}

$submit = (isset($_POST['submit'])) ? true : false;
Bueno en esta parte lo que hago es ir guardando los datos del archivo que se va a subir (aún no contiene validaciones ni nada, sólo quiero algo que funcione para ir tirando) Según he estado leyendo en phpbb.com las variables no se reciben por $_POST en general sino usando request_Var ya que esta función hace un par de cosillas más. El file_size y type no sabía si podía usarlos desde el request_var así que los metí directamente. Luego ví en algunos mods que estado mirando que a las variables de texto se les pasa el utf8_normalize_nfc, por lo demás saca una caja de texto que te pregunta si de verdad quieres enviar el archivo.

La parte de la caja de texto creo que es esta:

Código: Seleccionar todo

if ($submit)
{
    if (confirm_box(true))
    {
        // variables to hold the parameters for submit_pm
        $poll = $uid = $bitfield = $options = '';
        generate_text_for_storage($my_subject, $uid, $bitfield, $options, false, false, false);
        generate_text_for_storage($my_text, $uid, $bitfield, $options, true, true, true);
 
        $data = array(
        	
        	'file_name' => $nfile_name,
     	        'file_description' => $nfile_description,
                ...(No lo tengo terminado porqué no llega a esta parte aún, este trozo de código lo saque de una página de ejemplo que hay en phpbb.com)
        );
        
    }
    else
    {
 
        // display mode
        confirm_box(false, $user->lang['CTF_CONFIRM_BOX'], $s_hidden_fields);
    }
}
Bueno en mi foro cuando ya sale la confirm_box (la caja de confirmación) ya me muestra el error de que no se ha recibido nombre:

Código: Seleccionar todo

[phpBB Debug] PHP Notice: in file /ctfdownloads.php on line 25: fopen() [function.fopen]: Filename cannot be empty
[phpBB Debug] PHP Notice: in file /ctfdownloads.php on line 25: fread() expects parameter 1 to be resource, boolean given
Osea que resumidamente no estoy enviando bien los datos desde el html al php, aparte de que pueda ser error de la forma en que puse la lectura del archivo quise preguntar antes que nada por si estoy haciendo mal la lectura, es decir si en phpBB hay alguna función encargada de eso ya, o se hace de otra forma, ya que hago esto me gustaría hacerlo bien, aunque le de más vueltas.

Siento mucho el tocho pero me gusta dar toda la información posible del error, además lo tengo en local por lo tanto no podría mostrarlo en "vivo"

Un saludo y gracias!

Avatar de Usuario
Leviatan21
Lider phpBB Argentina
Lider phpBB Argentina
Mensajes: 1993
Registrado: Mié Nov 25, 2009 4:43 pm
Ubicación: Buenos Aires, Argentina
Contactar:

Re: Recoger datos de un formulario correctamente

Mensaje sin leer por Leviatan21 » Sab Dic 18, 2010 12:16 am

Hola Juanla Bienvenido a phpBB Argentina
Hacía rato que te veía registrado sin participar, me alegro que te decidieras.


En realidad lo estas haciendo bastante bien, el detalle es que cuando solicitas la confirmación, utilizando la función confirm_box() los datos obtenidos inicialmente en el formulario, se pierden, por el simple hecho que ya no son parte de la nueva pantalla .

Hay 2 maneras de solucionarlo :
1) No pidiendo confirmación
2) pidiendo confirmación, pero cuando lo haces, volver a mandar a esa nueva pantalla los datos recogidos anteriormente del formulario.
Lea las reglas | Nosotros | Acerca de phpBB | Descargas | Soporte | Blog
Ex Miembro del Equipo QA en phpbb.com
No se brindará soporte por Mensaje Privado, por favor pregunte en un tema público, tenga en cuenta que su problema puede ser también un problema para otros ;)

Avatar de Usuario
Juanla
Menos de 100 mensajes
Menos de 100 mensajes
Mensajes: 48
Registrado: Lun Dic 13, 2010 7:49 pm

Re: Recoger datos de un formulario correctamente

Mensaje sin leer por Juanla » Sab Dic 18, 2010 8:42 am

Gracias por la bienvenida :)

Bueno una cosa más, hice un echo con los campos cuando obtengo este mensaje, y el nombre y la descripción me las muestra sin problemas, el tamaño y tipo ya se lo piensa más :P

Código: Seleccionar todo

    [phpBB Debug] PHP Notice: in file /ctfdownloads.php on line 25: fopen() [function.fopen]: Filename cannot be empty
    [phpBB Debug] PHP Notice: in file /ctfdownloads.php on line 25: fread() expects parameter 1 to be resource, boolean given
Bueno voy a probar unas cosillas más aver si saco algo chulo de esto, Gracias por responder :D

Avatar de Usuario
Leviatan21
Lider phpBB Argentina
Lider phpBB Argentina
Mensajes: 1993
Registrado: Mié Nov 25, 2009 4:43 pm
Ubicación: Buenos Aires, Argentina
Contactar:

Re: Recoger datos de un formulario correctamente

Mensaje sin leer por Leviatan21 » Dom Dic 19, 2010 5:26 pm

Juanla escribió:Bueno una cosa más, hice un echo con los campos cuando obtengo este mensaje, y el nombre y la descripción me las muestra sin problemas, el tamaño y tipo ya se lo piensa más :P
Para un error de este tipo, es necesario contar con los archivos, no es tan fácil de resolver en el "aire" :?
Lea las reglas | Nosotros | Acerca de phpBB | Descargas | Soporte | Blog
Ex Miembro del Equipo QA en phpbb.com
No se brindará soporte por Mensaje Privado, por favor pregunte en un tema público, tenga en cuenta que su problema puede ser también un problema para otros ;)

Avatar de Usuario
Juanla
Menos de 100 mensajes
Menos de 100 mensajes
Mensajes: 48
Registrado: Lun Dic 13, 2010 7:49 pm

Re: Recoger datos de un formulario correctamente

Mensaje sin leer por Juanla » Dom Dic 19, 2010 8:37 pm

Nada perdona, era una tontería pero no podía editar y no quería hacerte un doble post :D

Se me pasó el atributo enctype en el formulario html. Ya avisaré con nuevas noticias cuando avance un poco más en esto que ando un poco liado entre semana. Ya conseguí hacer que subiera el archivo donde debía y registrara lo que debe en la base dedatos, mi último problema esque no se como listar las lista de filas (archivos subidos) de la base de datos de forma en que pueda mostrarla en la plantilla.

Si pudieras orientarme de alguna manera, algunas referencias que leer o algo así te lo agradecería, ya te comentaré como llevo este tema :)

Un saludo!

Avatar de Usuario
Leviatan21
Lider phpBB Argentina
Lider phpBB Argentina
Mensajes: 1993
Registrado: Mié Nov 25, 2009 4:43 pm
Ubicación: Buenos Aires, Argentina
Contactar:

Re: Recoger datos de un formulario correctamente

Mensaje sin leer por Leviatan21 » Lun Dic 20, 2010 1:32 am

Juanla escribió:mi último problema esque no se como listar las lista de filas (archivos subidos) de la base de datos de forma en que pueda mostrarla en la plantilla.

Si pudieras orientarme de alguna manera, algunas referencias que leer o algo así te lo agradecería, ya te comentaré como llevo este tema :)
La estructura básica de una consulta a la base de datos que se utiliza en phpbb tiene este formato :
$sql = 'SELECT [CAMPOS]
FROM ' . [TABLA] . '
WHERE [CONDICIÓN]
ORDER BY [ORDEN];
$result = $db->sql_query($sql);
[CAMPOS] puede ser un listado de columnas o todas
Si sólo deseas algunas columnas sería algo así, separando los nombre de las columnas por una coma :

Código: Seleccionar todo

	$sql = 'SELECT file_name, file_description, file_size
O si quieres todos, se puede utilizar el comodín *

Código: Seleccionar todo

	$sql = 'SELECT *
[TABLA] puedes utilizar una constante ( declarada anteriormente ), una variable o directamente el nombre escrito.

Si utilizas una variable, que es la manera en que se utilizan todas las tablas en phpbb se define así :

Código: Seleccionar todo

define('UPLOAD_TABLE',			$table_prefix . 'upload');

Código: Seleccionar todo

		FROM ' . UPLOAD_TABLE . '
Si utilizas una variable, la defines previamente y luego la utilizas como cualquier otra variable en php

Código: Seleccionar todo

$upload_table = 'el_nombre_de_la_tabla';

Código: Seleccionar todo

		FROM ' . $upload_table . '
Si no, la otra opción es escribirla directamente :

Código: Seleccionar todo

		FROM el_nombre_de_la_tabla

[CONDICIÓN], no siempre se necesita una condición, pero en el caso de hacerlo la escribes directamente :

Código: Seleccionar todo

		WHERE nombre_de_la_columna = lo_que_sea
[ORDEN], tampoco es necesaria, pero si muy utilizada, por ejemplo para listar por orden alfabético del nombre :

Código: Seleccionar todo

		ORDER BY file_name ASC';
una vez finalizada la consulta recorres el resultado con :

Código: Seleccionar todo

	while ($row = $db->sql_fetchrow($result))
	{
		código para mostrar 
	}
	$db->sql_freeresult($result);
Si necesitas mas datos, primero revisa algunos archivos de phpbb para ver como se muestran los resultados en una plantilla.
Si no lo entiendes, o comprendes, vuelves a preguntar :ugeek:
Lea las reglas | Nosotros | Acerca de phpBB | Descargas | Soporte | Blog
Ex Miembro del Equipo QA en phpbb.com
No se brindará soporte por Mensaje Privado, por favor pregunte en un tema público, tenga en cuenta que su problema puede ser también un problema para otros ;)

Avatar de Usuario
Juanla
Menos de 100 mensajes
Menos de 100 mensajes
Mensajes: 48
Registrado: Lun Dic 13, 2010 7:49 pm

Re: Recoger datos de un formulario correctamente

Mensaje sin leer por Juanla » Lun Dic 20, 2010 8:14 am

Sip, creo que toda esa parte la tengo clara, la idea es que así se mostrar los resultados con "echo" o cosas así, pero lo bonito sería poner en la plantilla un

<!-- BEGIN UPLOADS DIR -->
aquí pondría un bloque de esa plantilla y en el contenido alguna variable, eso es lo que tengo "que estudiar más"
<!-- END UPLOADS DIR -->

Por otra parte, antes que eso estuve dándole vueltas a lo del confirm box. He estado mirando un ejemplo en la wiki de phpbb, concretamente este:

http://wiki.phpbb.com/display/DEV/Using ... +Functions
1.4.13. Bringing it all together: A Sample Page

La parte en la que se encuentra el confirm_box bajo el submit es idéntica a la que tengo yo pero en cambio no usa nada para enviar los datos recogidos anteriormente, como son (en el caso del ejemplo) los

Código: Seleccionar todo

// Read user input
$my_subject     = request_var('my_subject', '', true);
$my_message     = request_var('my_message', '', true);
 
$my_subject     = utf8_normalize_nfc($my_subject);
$my_message     = utf8_normalize_nfc($my_message);
Como vemos aquí:

Código: Seleccionar todo

if ($submit)
{
    if (confirm_box(true))
    {
        // variables to hold the parameters for submit_pm
        $poll = $uid = $bitfield = $options = '';
        generate_text_for_storage($my_subject, $uid, $bitfield, $options, false, false, false);
        generate_text_for_storage($my_text, $uid, $bitfield, $options, true, true, true);
	blablabla...
Mi estructura sigue eso mismo, es decir recoger los datos, el submit y todo va bien, si meto un if con el confirm_box como ahí el confirm box funciona pero pierde los datos (como me dijiste anteriormente).

El caso esque no se me ocurre forma alguna de que no pierda esos datos, he probado usando la array que tiene como parámetro la funcion confirm_box envíandoselos así:

Código: Seleccionar todo

	$datos_array = array(
        'file_description' => utf8_normalize_nfc(request_var('file_description', '', true)),
        'real_file_name' => $_FILES['ctf-file']['name'],
        'file_size' => $_FILES['ctf-file']['size'],
		'file_type' => $_FILES['ctf-file']['type'],
		'file_url'	=> '/ctfuploads/' . $real_file_name
	      );
}

$submit = (isset($_POST['submit'])) ? true : false;

if ($submit)
{	

	if(confirm_box(true, '', $datos_array)){
				$real_file_name = $datos_array['real_file_name'];
				$file_size     = $datos_array['file_size'];
				$file_type     = $datos_array['file_type'];
				$nfile_description     = $datos_array['nfile_description'];
				$file_url = $datos_array['file_url'];
				blablabla..
Pero creo que ese array no está para ese uso pues no los recibe correctamente.


Mi código "funcional" es este:

Código: Seleccionar todo

if(request_var('sended', '', true)== 'enviado'){ //estos datos solos inicializa si recibe la variable sended con valor "enviado"
	// Archivo subido
	$ctf_file_temp=$_FILES['ctf-file']['tmp_name'] ;
	$ctf_file_content = addslashes(fread(fopen($ctf_file_temp, "r"), filesize($ctf_file_temp)));
	
	// Leemos formulario del usuario y preparamos los campos
	$real_file_name = $_FILES['ctf-file']['name'];
	$file_size     = $_FILES['ctf-file']['size'];
	$file_type     = $_FILES['ctf-file']['type'];
	$nfile_description     = utf8_normalize_nfc(request_var('file_description', '', true));
	$file_url = '/ctfuploads/' . $real_file_name;
}

$submit = (isset($_POST['submit'])) ? true : false;

if ($submit)
{	
				$real_file_name = $datos_array['real_file_name'];
				$file_size     = $datos_array['file_size'];
				$file_type     = $datos_array['file_type'];
				$nfile_description     = $datos_array['nfile_description'];
				$file_url = $datos_array['file_url'];
				//echo "<h1>TEXTO2</h1>".$nfile_description.$real_file_name.$file_size.$file_type.$file_url;
		
				rename($_FILES['ctf-file']['tmp_name'], ".".$file_url);
		
				$sql	= "INSERT INTO " . CTF_DOWNLOADS_TABLE . " 
				VALUES ( NULL , '".$real_file_name."','".$file_description."','".$file_size."','".$file_type."', '".$file_url."' ) ";
				$result  = $db->sql_query($sql);
				$db->sql_freeresult($result);
}

page_header($user->lang['CTF_DOWNLOADS_TITLE']);

$template->set_filenames(array(
        'body' => 'ctfdownloads.html',
    ));

    make_jumpbox(append_sid("{$phpbb_root_path}viewforum.$phpEx"));
    
page_footer();

Avatar de Usuario
Leviatan21
Lider phpBB Argentina
Lider phpBB Argentina
Mensajes: 1993
Registrado: Mié Nov 25, 2009 4:43 pm
Ubicación: Buenos Aires, Argentina
Contactar:

Re: Recoger datos de un formulario correctamente

Mensaje sin leer por Leviatan21 » Lun Dic 20, 2010 7:05 pm

Pasa las variables por campos ocultos con los mismos nombres que tienes en el formulario

Código: Seleccionar todo

            $s_hidden_fields = build_hidden_fields(array(
                'my_subject'        => $my_subject,
                'my_message'        => $my_message,
                )
            );
        // display mode
        confirm_box(false, $user->lang['CTF_CONFIRM_BOX'], $s_hidden_fields);

 
Lea las reglas | Nosotros | Acerca de phpBB | Descargas | Soporte | Blog
Ex Miembro del Equipo QA en phpbb.com
No se brindará soporte por Mensaje Privado, por favor pregunte en un tema público, tenga en cuenta que su problema puede ser también un problema para otros ;)

Avatar de Usuario
Juanla
Menos de 100 mensajes
Menos de 100 mensajes
Mensajes: 48
Registrado: Lun Dic 13, 2010 7:49 pm

Re: Recoger datos de un formulario correctamente

Mensaje sin leer por Juanla » Mar Dic 21, 2010 10:47 am

Muchas Gracias gabriel, cuando avance un poco más con el tema iré informando como voy :)

Avatar de Usuario
Juanla
Menos de 100 mensajes
Menos de 100 mensajes
Mensajes: 48
Registrado: Lun Dic 13, 2010 7:49 pm

Re: Recoger datos de un formulario correctamente

Mensaje sin leer por Juanla » Dom Ene 09, 2011 1:05 pm

Bueno quería comentar que ando ultimamente muy ocupado, aver si saco tiempo y sigo estudiando esto un poco más. Feliz año gente que no dije nada :)

Responder