Bueno, en realidad la clase la comencé con el objetivo de que sea un generador y validador de formularios sacándome de encima la necesidad de crear el código JavaScript y PHP cada vez que tenía que validar un form diferente. El tema es que genera los select dependientes tan cómodamente que me pareció útil compartirla con ustedes, más teniendo en cuenta la cantidad de correos que me llegan a diario indicandome las dificultades que se presentan en la adaptación de este ejemplo.

Voy a comenzar colocando un ejemplo de uso. Lamentablemente todavía no hice la documentación que debería, pero como mencioné, la idea de la clase es otra y la misma la generaré cuando termine de desarrollarla. Puede que encuentren métodos que no hacen nada, u otros que aparentan no tener sentido; la verdad es que me quedó código colgando para el cual tengo objetivos pensados pero aún no me he puesto a trabajar en ellos. De todas maneras todo funciona perfecto, como debe ser.

El código se compone de una clase principal -llamada muy originalmente "Form"- la cual para llevar a cabo sus tareas se valdrá de otras 3 clases que son algo así como plug-ins. Existe entre ellos un objeto DataAccess el cuál deberán configurar con sus datos de acceso a la base de datos que aplica el patrón Singleton (si no sabes que es revisa por aquí).

Sin mas charla les muestro el modo de uso y comento algunas cosillas. El resto de las configuraciones las colocaré mas adelante a medida que avance con el desarrollo de la clase y le agregue algo más que solo generar selects:

PHP:
  1. <?php
  2. require 'classes/Form.class.php';
  3. require 'classes/DataAccess.class.php';
  4. require 'classes/ElementsFromDB.class.php';
  5. require 'classes/LinkedSelect.class.php';
  6. $form=new Form('form', 'post');
  7. $form->AddInput(array(
  8.     'elementsfromdb'=>array(
  9.         'table'=>'select_1',
  10.         'values'=>'id',
  11.         'options'=>'opcion',
  12.     ),
  13.     'attributes'=>array(
  14.         'type'=>'select',
  15.         'id'=>'select_1',
  16.         'name'=>'select_1'
  17.     ),
  18.     'externalclass'=>'elementsfromdb',
  19.     'selected'=>'1',
  20.     'default'=>array(
  21.         'value'=>'0',
  22.         'option'=>'Elige...'
  23.     )
  24. ));
  25.  
  26. $form->AddInput(array(
  27.     'elementsfromdb'=>array(
  28.         'table'=>'select_2',
  29.         'values'=>'id',
  30.         'options'=>'opcion',
  31.     ),
  32.     'attributes'=>array(
  33.         'type'=>'select',
  34.         'id'=>'select_2',
  35.         'name'=>'select_2'
  36.     ),
  37.     'externalclass'=>'linkedselect',
  38.     'linkedby'=>array(
  39.         'reference'=>'relacion', // columna de bd donde este la relacion entre select_1 y select_2
  40.         'id'=>'select_1',
  41.         'showdefault'=>'0' // el value que tiene que tener select_1 para que en select_2 se muestre el option por defecto
  42.     ),
  43.     'default'=>array(
  44.         'value'=>'0',
  45.         'option'=>'Elige...'
  46.     ),
  47.     'locations'=>array( // rutas a los archivos JS y PHP
  48.         'js'=>'js/',
  49.         'php'=>'classes/'
  50.     )
  51. ));
  52. $form->AddInput(array(
  53.     'elementsfromdb'=>array(
  54.         'table'=>'select_3',
  55.         'values'=>'id',
  56.         'options'=>'opcion',
  57.     ),
  58.     'attributes'=>array(
  59.         'type'=>'select',
  60.         'id'=>'select_3',
  61.         'name'=>'select_3'
  62.     ),
  63.     'externalclass'=>'linkedselect',
  64.     'linkedby'=>array(
  65.         'reference'=>'relacion',
  66.         'id'=>'select_2',
  67.         'showdefault'=>'0'
  68.     ),
  69.     'default'=>array(
  70.         'value'=>'0',
  71.         'option'=>'Elige...'
  72.     ),
  73.     'locations'=>array(
  74.         'js'=>'js/',
  75.         'php'=>'classes/'
  76.     )
  77. ));
  78. $form->GenerateForm();
  79. ?>
  80. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  81. <html xmlns="http://www.w3.org/1999/xhtml">
  82. <head>
  83. <?php $form->GenerateAdditionalJS(); ?>
  84. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  85. <title>Documento sin título</title>
  86. </head>
  87. <body>
  88. <?php
  89. $form->GetInput('select_1');
  90. echo "<br>";
  91. $form->GetInput('select_2');
  92. echo "<br>";
  93. $form->GetInput('select_3');
  94. ?>
  95. </body>
  96. </html>

Esto generaría 3 selects, como pueden ver, estas tantas líneas generan el código JS y PHP necesario para que todo funcione ¡y utilizando AJAX! Por ahora no hace mas que eso y la documentación es una mie***, ya lo sé, pero pronto estará todo listo. Creo que como ejemplo le puede ser útil a más de uno.

Cualquier dudilla comenten, aquí estare para responder. Les adjunto los archivos con las clases: http://www.formatoweb.com.ar/blog/files/validation.rar

Saludos a todos!