Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Formulario

Estas en el tema de Formulario en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Soy bastante novato en poo. Estoy haciendo mi primero proyecto. Me da la sensación de que es bueno ir creando funciones para todo, de modo ...
  #1 (permalink)  
Antiguo 04/10/2009, 12:18
Avatar de PacoRuiz  
Fecha de Ingreso: abril-2009
Mensajes: 254
Antigüedad: 15 años
Puntos: 3
Formulario

Soy bastante novato en poo. Estoy haciendo mi primero proyecto. Me da la sensación de que es bueno ir creando funciones para todo, de modo que luego pueda ir tirando de ellas para diferentes cuestiones.

El proyecto que quiero hacer es una página en la cual los profesores puedan crear ejercicios online de modo que los alumnos los resuelvan y queden almacenados los resultados.

He definido una clase alumnos, y dentro de ella una función que alta() para dar de alta a los alumnos en el sistema. La función alta genera un formulario, pero en el action del mismo no puedo mandarlo a otra página, porque se saldría de la función, de modo que creo un formulario que envíe los datos a la misma página.

Este es mi intento de código (Un fragmento):


Código:
function alta(){
        echo " <form action=\"<?=$_SERVER['PHP_SELF'] ?>\" method=\"POST\">
        Nombre: <input type =\"text\" name =\"nombre\"><br>
        Apellidos: &nbsp <input type =\"text\" name =\"apellidos\"><br>
        Clase: &nbsp &nbsp  <input type =\"text\" name =\"clase\"><br><br><br>
        <input type =\"submit\" value =\"ENVIAR\"><BR><BR>";
    }
Me da el siguiente error:

Cita:
Parse error: parse error, expecting `T_STRING' or `T_VARIABLE' or `T_NUM_STRING' in C:\xampp\htdocs\ejercicios\clases.php on line 7
La línea 7 es la primera que he puesto este post.

Si pongo action=\"fichero.php\" no me da este error.

El action está tomado de este ejemplo de un tutorial, que funciona bien:

Código:
<form method="post" action="<?= $_SERVER['PHP_SELF'] ?>">
<input name="postre[]" type="checkbox" value="Helado de Vainilla">Helado de vanilla<br />
<input name="postre[]" type="checkbox" value="Pastel de Chocolate">Pastel de Chocolate<br />
<input name="postre[]" type="checkbox" value="Pay de elote">Pay de elote<br />
<input name="postre[]" type="checkbox" value="Bubulubu">Bubulubu<br />
<input name="postre[]" type="checkbox" value="Duraznos en almibar">Duraznos en almibar<br />
<input name="postre[]" type="checkbox" value="Fresas con crema">Fresas con crema<br />
<input name="send" type="submit" id="send" value="Enviar!">
</form>
De manera que mi código está creado a partir de ejemplos que funcionan bien y debería funcionar. No sé lo que pasa.
  #2 (permalink)  
Antiguo 04/10/2009, 13:05
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Formulario

Siempre si vas a imprimir mucho HTML es recomendable salir de modo PHP y solo imprimir PHP donde debe de ir.

Tu problema viene de que leas esto: http://www.forosdelweb.com/f18/como-...1/#post2414268

Por otro lado receurda que una cosa es el proceso de PHP (se ejecuta en el servidor), y por otro lado lo que el cliente renderea, no porque envies a la misma pagina se va a ejecutar de nuevo alta, tu tienes que asegurarte de ejecutar esa función.

Como PHP no es un lenguaje 100% orientado a objetos (no hay un método main por ejemplo), tienes que tu forzosamente mandar llamar tus funciones.

Por otro lado siempre es bueno separar la vista (lo que el cliente ve) de lo que es el proceso en PHP, por ejemplo ve este ejemplo:
Código PHP:
Ver original
  1. <?php
  2. if (strtolower($_SERVER['REQUEST_METHOD']) == 'post') {
  3.        $alumnos = new alumnos();
  4.        if ($alumnos->alta($_POST['nombre'])) { // registras al alumno
  5.              header('Location: exito.php');
  6.              exit();
  7.        }
  8. }
  9. // imprimes el formulario
  10. ?>
  11. <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
  12.        <input type="text" name="nombre" />
  13.        <input type="submit" name="registrar" value="Registra" />
  14. </form>

Saludos.
  #3 (permalink)  
Antiguo 04/10/2009, 13:37
Avatar de PacoRuiz  
Fecha de Ingreso: abril-2009
Mensajes: 254
Antigüedad: 15 años
Puntos: 3
Respuesta: Formulario

Me cuesta seguirte GatorV, vamos por partes:

Yo entiendo que he escapado bien las comillas porque he puesto \ antes de las comillas intermedias. De hecho Si pongo action=\"fichero.php\" no me da este error, lo cual indica que está bien.

Cita:
Por otro lado receurda que una cosa es el proceso de PHP (se ejecuta en el servidor), y por otro lado lo que el cliente renderea, no porque envies a la misma pagina se va a ejecutar de nuevo alta, tu tienes que asegurarte de ejecutar esa función.
No veo la relación de esto con mi código.

Cita:
Como PHP no es un lenguaje 100% orientado a objetos (no hay un método main por ejemplo), tienes que tu forzosamente mandar llamar tus funciones.
Yo llamo a mis funciones.

En tu ejemplo no veo la definición de la función, que es donde está mi problema.

Cita:
Siempre si vas a imprimir mucho HTML es recomendable salir de modo PHP y solo imprimir PHP donde debe de ir.
En mi caso el formulario sería una función, por tanto debe ser php. quizás haya otra forma de resolver esto pero no la veo. Por otro lado, aunque no sea la manera óptima, mi forma debería funcionar, no entiendo por qué no lo hace.
  #4 (permalink)  
Antiguo 04/10/2009, 14:43
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Formulario

No funciona por lo mismo, tienes los conceptos equivocados no puedes poner PHP dentro de una cadena y esperar que se evalue, tu problema esta aqui:

Código:
echo "<form action=\"<?=$_SERVER['PHP_SELF'];?>\">";
Ahí estas metiendo código PHP dentro de la cadena y esperas que se evalue, eso no es correcto, en dado caso tendría que ser así:
Código PHP:
Ver original
  1. echo "<form action=\"" . $_SERVER['PHP_SELF'] . "\">";

Por eso revisa el link que te deje, tienes que aprender a usar las comillas correctamente.

Mi comentario a que no porque llames a la misma pagina vas a seguir dentro de alta() en tu clase. PHP es un lenguaje stateless, una vez que se termina de ejecutar PHP, se envia el resultado al cliente y es lo que ves ya en tu browser.

Por eso al enviar de regreso el formulario al servidor aunque lo mandes a $_SERVER['PHP_SELF'] no va a entrar de nuevo a alta() a menos que tu lo mandes llamar como te explicaba.

Lo de separar la parte de HTML del proceso es un buen consejo de programación hace las cosas más mantenibles y sencillas, y puedes usar un sistema de plantillas como Smarty o Zend_View que te permite tener todo tu HTML fuera de la parte de proceso de PHP.

Es por mantenimiento y extensibilidad, si pones todo tu HTML y PHP juntos es complicado luego darle mantenimiento.

Saludos.
  #5 (permalink)  
Antiguo 06/10/2009, 05:42
Avatar de PacoRuiz  
Fecha de Ingreso: abril-2009
Mensajes: 254
Antigüedad: 15 años
Puntos: 3
Respuesta: Formulario

Gracias Gator, este tipo de respuestas son las mejores porque es importante modificar concepciones erróneas, lo que pasa es que a veces no son fáciles de entender. La cuestión de las comillas la he entendido, entiendo tu código y entiendo por qué está mal el mío.

Entiendo que por el hecho de volver a la misma página no tiene por qué volver a alta(), pero lo que no entiendo es cómo lo haces tú para solucionar eso:

Cita:
<?phpif (strtolower($_SERVER['REQUEST_METHOD']) == 'post') {
$alumnos = new alumnos();
if ($alumnos->alta($_POST['nombre'])) { // registras al alumno
header('Location: exito.php');
exit();
}
}
// imprimes el formulario
?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];>">
<input type="text" name="nombre" />
<input type="submit" name="registrar" value="Registra" />
</form>
Llamas a alta() con un parámetro que es más bien un resultado de la función, no un parámetro, y luego pones el formulario al final, pero no entiendo cómo se relaciona alta() con el formulario, en ningún momento se le está diciendo que cuando ejecute alta() tiene que abrir ese formulario.

tú separas html de php, pero según yo lo veo, el formulario tiene que ser php escrito con un echo, porque se le va a llamar como función. Quizás tengo un concepto equivocado ahí, pero no lo veo. No entiendo cómo puedo separar html de php, si dar de alta al alumno lo quiero hacer como una función, y eso es php, y a la vez dar de alta a un alumno es rellenar un formulario y eso es html. No veo otra opción que hacer un formulario con un echo. No entiendo tu modo de hacerlo porque no entiendo en qué miomento se está llamando a ese formulario y cómo se devuelven los datos del formulario.
  #6 (permalink)  
Antiguo 06/10/2009, 08:30
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Formulario

Como te comentaba el separar las cosas no es nada más que logica, por ejemplo, suponiendo que lo quieres en funciones, una se llama muestraFormulario y otra se llama procesaFormulario, entonces lo que haces es algo así:
Código PHP:
Ver original
  1. class procesos
  2. {
  3.            public function muestraFormulario() {
  4.                        include('./vistas/formularioAlta.php');
  5.            }
  6.  
  7.            public function procesaFormulario() {
  8.                        $nombre = $_POST['nombre'];
  9.                        $edad = $_POST['edad'];
  10.                        //aqui procesas nombre y edad y los insertas lo lo que sea
  11.            }
  12. }
vistaFormulario.php:
Código PHP:
Ver original
  1. <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
  2.          Nombre: <input type="text" name="nombre" />
  3.          Edad: <input type="text" name="edad" />
  4.          <input type="submit" name="registrar" value="Registar" />
  5. </form>

Luego en tu archivo ya de proceso (que es necesario ya que como te comento PHP no tiene un método main).
Código PHP:
Ver original
  1. include('./clases/procesos.php');
  2.  
  3. $p = new procesos();
  4. if (strtolower($_SERVER['REQUEST_METHOD']) == 'post') {
  5.        $p->procesaFormulario();
  6. } else {
  7.        $p->muestraFormulario();
  8. }

A esto se le conoce como programación en capas, una capa representa una entidad en el proceso y cada capa tiene una responsabilidad específica. Puedes programar usando más capas, abstraer el acceso a datos etc. y usar un patrón como MVC para facilitar el acceso a los controladores (o procesos).

Saludos.
  #7 (permalink)  
Antiguo 06/10/2009, 13:31
Avatar de PacoRuiz  
Fecha de Ingreso: abril-2009
Mensajes: 254
Antigüedad: 15 años
Puntos: 3
Respuesta: Formulario

Gracias Gator. Te he entendido todo salvo el último párrafo, pero por ahora déjalo, al haberme dado dos palabras claves: programación en capas y MVC, buscaré sobre eso y ya iré leyendo.

Por ahora todo esto me parece matar moscas a cañonazos. Imagino que uno le acaba viendo la punta a POO cuando desarrolla proyectos complejos o cuando tiene desarrollados una serie de objetos que acaban siendo útiles en diferentes proyectos
  #8 (permalink)  
Antiguo 06/10/2009, 14:23
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Formulario

Si, si lo ves así nadamas para un simple formulario se vuelve complejo, pero cuando trabajas en un sistema de 100 tablas, con más de 600 formularios y procesos muy complejos, creeme que programando un sistema usando POO y patrones de diseño ayudan mucho en el mantenimiento del sistema.

Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:44.