Después de un tiempo generando formularios con la librería formslib, he decidido no volver a usarla. Aquí, os dejo una breve descripción de ella y lo que opino. Me gustaría saber qué opinais vosotros y a ver si así conseguimos eliminar los aspectos negativos que más abajo describo y que son los que me han llevado a abandonarla para pasar a generar formularios directamente con código HTML desde PHP.
Librería PHP formslib
La librería formslib se utiliza para crear formularios en Moodle de una manera muy rápida y sin necesidad de añadir código HTML ni Javascript. Internamente, se trabaja con objetos encargados de generar todo el código del formulario, concretamente, de la clase PHP moodleform.
Definimos nuestra clase para generar el formulario (miformulario.php):
require_once($CFG->libdir.'/formslib.php');
class MiFormulario extends modleform{
public function MiFormulario(){
/* ... aquí va mi código... */
parent::moodleform();
}
public function definition(){
$mform =& $this->_form;
/* ... aquí va mi código... */
}
public function definition_after_data(){
$mform =& $this->_form;
/* ... aquí va mi código... */
}
public function validation($datos_introducidos){
/* ... aquí va mi código... */
}
}
Definimos la página en la que se generará:
require_once('miformulario.php');
$mform = new MiFormulario();
if($mform->is_cancelled()){
/* ... aquí va mi código con la acción consecuente de haberse pulsado el botón "cancelar"... */
}
else if($datos_introducidos = $mform->get_data()){
/* ... aquí va mi código con la acción consecuente de haberse validado los datos... */
}
else{
/* Generamos el formulario */
$mform->display();
}
Esta idea no es nueva y la prueba está en que internamente se trabaja con una clase bastante conocida que ya se encarga de generar el código: HTMLQuickForm. Lo que Moodle añade en la funcionalidad de esta clase es el control de la identidad del usuario en cada página y la inclusión de campos ocultos en cada formulario con los parámetros de configuración. Esto se hace con la clase MoodleQuickForm que hereda de HTMLQuickForm sobrecargando sus métodos.
Código de formslib.php:
<?php
...
require_once 'HTML/QuickForm.php';
require_once 'HTML/QuickForm/DHTMLRulesTableless.php';
require_once 'HTML/QuickForm/Renderer/Tableless.php';
...
class moodleform{
...
var $_form;
...
function moodleform(...){
...
$this->_form =& new MoodleQuickForm(...);
...
}
...
}
class MoodleQuickForm extends HTML_QuickForm_DHTMLRulesTableless{
...
}
...
?>
¿Qué ventajas tiene crear formularios con moodleform?
1. La creación de formularios sin necesidad de saber HTML ni Javascript. Evidentemente, es necesario conocer PHP.
2. La creación de tipos de campos no contemplados en HTML cuya creación sin el uso de MoodleQuickForm implicaría conocer Javascript.
En la versión 2.0 a día 09/07/08 están definidos estos tipos: checkbox, file, group, password, passwordunmask, radio, select, selectgroups, submitlink, text, textarea, date_selector, date_time_selector, htmleditor, format, static, hidden, modvisible, selectyesno, modgrade, cancel, button, choosecoursefile, choosecoursefileorimsrepo, header, submit, questioncategory, advcheckbox y recaptcha.
3. Validación de campos en el cliente.
¿Qué desventajas?
1. El programador no tiene control sobre la forma en que se validan los datos introducidos (ya existe código Javascript encargado en la misma librería).
2. Personalizar la validación de los datos en el cliente obliga añadir código Javascript en el cuerpo de la página. Esto ofusca el código PHP y limita la primera de las ventajas descritas a formularios muy simples (mi concepto de formulario "simple" lo explico en el apartado de la conclusión).
3. Crear formularios con campos dispuestos en varias columnas implica al programador introducir código HTML (etiquetas <table> o <div>). La forma en que podemos introducirlo es más farragosa que haciéndolo directamente en HTML olvidando HTMLQuickForm.
$mform->addElement('html', "<table ...>"); echo "<table ...>";
$mform->addElement('html', "<tr ...>"); echo "<tr ...>";
$mform->addElement('html', "<td ...>"); echo "<td ...>";
$mform->addElement('html', "</td>"); echo "</td>";
$mform->addElement('html', "</tr>"); echo "</tr>";
$mform->addElement('html', "</table>"); echo "</table>";
4. Modificar el aspecto mediante hojas de estilo es una tarea muy engorrosa. Los métodos de MoodleQuickForm que se encargan de generar el código HTML, hacen referencia a las hojas de estilo del aspecto (theme) aplicado a Moodle. Esto implica que para darle a un formulario un aspecto diferente independiente de Moodle, tengamos que crear reglas css propias que reemplacen las creadas, al menos hasta el fin de la generación del formulario, para después deshacer los cambios y así no alterar el estilo en el resto de elementos de Moodle.
Conclusión:
La librería formslib es útil solo para generar formularios simples. Formularios con una única columna de campos cuyos datos se introducen desde el teclado o desde menús popup predefinidos en la librería (añadir menús personales implica generar código HTML desde PHP mediante "echo") y cuya validación no implique el uso de nuevas funciones Javascript (por ejemplo, un formulario de autenticación o de registro). En realidad, los formularios se pueden hacer todo lo que complejos que se desee, pero cuanto mayor sea su complejidad menor es el interés por utilizar esta librería.
Librería PHP formslib
La librería formslib se utiliza para crear formularios en Moodle de una manera muy rápida y sin necesidad de añadir código HTML ni Javascript. Internamente, se trabaja con objetos encargados de generar todo el código del formulario, concretamente, de la clase PHP moodleform.
Definimos nuestra clase para generar el formulario (miformulario.php):
require_once($CFG->libdir.'/formslib.php');
class MiFormulario extends modleform{
public function MiFormulario(){
/* ... aquí va mi código... */
parent::moodleform();
}
public function definition(){
$mform =& $this->_form;
/* ... aquí va mi código... */
}
public function definition_after_data(){
$mform =& $this->_form;
/* ... aquí va mi código... */
}
public function validation($datos_introducidos){
/* ... aquí va mi código... */
}
}
Definimos la página en la que se generará:
require_once('miformulario.php');
$mform = new MiFormulario();
if($mform->is_cancelled()){
/* ... aquí va mi código con la acción consecuente de haberse pulsado el botón "cancelar"... */
}
else if($datos_introducidos = $mform->get_data()){
/* ... aquí va mi código con la acción consecuente de haberse validado los datos... */
}
else{
/* Generamos el formulario */
$mform->display();
}
Esta idea no es nueva y la prueba está en que internamente se trabaja con una clase bastante conocida que ya se encarga de generar el código: HTMLQuickForm. Lo que Moodle añade en la funcionalidad de esta clase es el control de la identidad del usuario en cada página y la inclusión de campos ocultos en cada formulario con los parámetros de configuración. Esto se hace con la clase MoodleQuickForm que hereda de HTMLQuickForm sobrecargando sus métodos.
Código de formslib.php:
<?php
...
require_once 'HTML/QuickForm.php';
require_once 'HTML/QuickForm/DHTMLRulesTableless.php';
require_once 'HTML/QuickForm/Renderer/Tableless.php';
...
class moodleform{
...
var $_form;
...
function moodleform(...){
...
$this->_form =& new MoodleQuickForm(...);
...
}
...
}
class MoodleQuickForm extends HTML_QuickForm_DHTMLRulesTableless{
...
}
...
?>
¿Qué ventajas tiene crear formularios con moodleform?
1. La creación de formularios sin necesidad de saber HTML ni Javascript. Evidentemente, es necesario conocer PHP.
2. La creación de tipos de campos no contemplados en HTML cuya creación sin el uso de MoodleQuickForm implicaría conocer Javascript.
En la versión 2.0 a día 09/07/08 están definidos estos tipos: checkbox, file, group, password, passwordunmask, radio, select, selectgroups, submitlink, text, textarea, date_selector, date_time_selector, htmleditor, format, static, hidden, modvisible, selectyesno, modgrade, cancel, button, choosecoursefile, choosecoursefileorimsrepo, header, submit, questioncategory, advcheckbox y recaptcha.
3. Validación de campos en el cliente.
¿Qué desventajas?
1. El programador no tiene control sobre la forma en que se validan los datos introducidos (ya existe código Javascript encargado en la misma librería).
2. Personalizar la validación de los datos en el cliente obliga añadir código Javascript en el cuerpo de la página. Esto ofusca el código PHP y limita la primera de las ventajas descritas a formularios muy simples (mi concepto de formulario "simple" lo explico en el apartado de la conclusión).
3. Crear formularios con campos dispuestos en varias columnas implica al programador introducir código HTML (etiquetas <table> o <div>). La forma en que podemos introducirlo es más farragosa que haciéndolo directamente en HTML olvidando HTMLQuickForm.
$mform->addElement('html', "<table ...>"); echo "<table ...>";
$mform->addElement('html', "<tr ...>"); echo "<tr ...>";
$mform->addElement('html', "<td ...>"); echo "<td ...>";
$mform->addElement('html', "</td>"); echo "</td>";
$mform->addElement('html', "</tr>"); echo "</tr>";
$mform->addElement('html', "</table>"); echo "</table>";
4. Modificar el aspecto mediante hojas de estilo es una tarea muy engorrosa. Los métodos de MoodleQuickForm que se encargan de generar el código HTML, hacen referencia a las hojas de estilo del aspecto (theme) aplicado a Moodle. Esto implica que para darle a un formulario un aspecto diferente independiente de Moodle, tengamos que crear reglas css propias que reemplacen las creadas, al menos hasta el fin de la generación del formulario, para después deshacer los cambios y así no alterar el estilo en el resto de elementos de Moodle.
Conclusión:
La librería formslib es útil solo para generar formularios simples. Formularios con una única columna de campos cuyos datos se introducen desde el teclado o desde menús popup predefinidos en la librería (añadir menús personales implica generar código HTML desde PHP mediante "echo") y cuya validación no implique el uso de nuevas funciones Javascript (por ejemplo, un formulario de autenticación o de registro). En realidad, los formularios se pueden hacer todo lo que complejos que se desee, pero cuanto mayor sea su complejidad menor es el interés por utilizar esta librería.