I was talking with Matthew this morning, and he asked if I was setting up a methodology to create forms using table definitions. My answer was “yes!”.
Here’s an example: 2 lines to start Solar, 2 lines to connect to an existing Solar_Sql_Table, 2 lines to create a Solar_Form using the table columns, and 2 lines to display it with Solar_View using the associated form helper. (The “Solar_Model_Nodes” table is part of the existing Solar_Content domain model.)
<?php // prelims require 'Solar.php'; Solar::start(); // sql and table connection Solar::register('sql', 'Solar_Sql'); $table = Solar::factory('Solar_Model_Nodes'); // get a form and load elements from the table $form = Solar::factory('Solar_Form'); $form->load('Solar_Form_Load_Table', $table); // display the form $view = Solar::factory('Solar_View'); echo $view->form($form); // done! Solar::stop(); ?>
This creates an element for each column and a form-level validation based on the column datatype. Number and string columns get a properly-sized “text” element, CLOBs get a “textarea”, and booleans get a checkbox. If the column has its own validation of “inList” or “inKeys”, it gets a “select” element of the allowed values. Soon, when I add Ajax-y widgets, date/time/timestamp columns will get date-picker elements.
The $form->load() call can use ‘Solar_Form_Load_Xml’ too, if you want to define forms using XML. (I don’t, but Matthew liked the idea and contributed the code.)
If you only want certain columns, you can pass a list of them as the third param to $form->load():
$cols = array('email', 'subj', 'body'); $form->load('Solar_Form_Load_Table', $table, $cols);
Now, this is not all sweetness and light; the magic requires that you do the work of definining your columns in the Solar_Sql_Table class. Lucky for us, that’s pretty easy. More on that in another post.