<?
/*
Example file using Formslib4PHP
More dml operations (insert, update) using a dropdown as navigation
Requires: MySQL database
*/
require( '../formslib.php' );
$oDB = ADONewConnection( 'mysqli' );
$oDB->Connect( 'localhost', 'root', false, 'test' );
// Doing some security stuff
$id = (int)$oDB->GetOne( 'SELECT id FROM person WHERE id='.(int)$_REQUEST['id'] );
// Setting up the data block
$oBlock = new DataBlock( 'myblock', "SELECT * FROM person where id = $id", DATA_DB, $oDB, 'person', 'id' );
// This will be our template.
$template = "
<html>
<title>A test form</title>
<body>
<center>%_form[TITLE]%</center>
<center>
%sometext[FIELD]%<br />
%id[LABEL]%: %id[FIELD]% <br />
%hr1[FIELD]%
%now[LABEL]%: %now[FIELD]% <br /><br />
%age[LABEL]%: %age[FIELD]%%age[ERROR]% <br />
%name[LABEL]%: %name[FIELD]%%name[ERROR]% <br />
%memo[LABEL]%: %memo[FIELD]% <br /><br />
%save[FIELD]%
%hr1[FIELD]%
</center>
</body>
</html>
";
// Let's create the main form object.
// You can enter the form title as the second construction argument, or simply use the method
// ::set_title() after construction
$form = new HTMLForm( 'test' );
$form -> set_title('Persons');
// Adding some controller for different behaviour when we're just navigating
$form->add_control( 'navigation', true, FORM_INIT, 'GET' );
// Defining some fields and setting properties and validators for our example
// We just use a dropdown for navigation
$f = new HTMLFormList( 'dropdown', 'id', 'Records', $id );
$f->populate( 'SELECT id, name FROM person', false, $oDB );
$f->set_property( 'empty', array( 'new'=>'--- Insert new record ---' ) );
$f->add_attr( array ( 'onchange'=>"javascript:document.test.action='?navigation=1'; document.test.submit();" ) );
$f->set_property ( 'readonly' );
// A database field with simply internal validation
// The validation will only occur if the field ist not empty, because it's not defined as required.
$f = new HTMLFormInput( 'text', 'age', 'Age' );
$f->add_validation( 'int_abs', 'Please enter a number greater than zero!', V_INTERNAL );
// A normal text input field which we'll map to the data block
// We assign 2 validations to this field, an internal and an user specific
$f = new HTMLFormInput( 'text', 'name', 'Full name' );
$f->set_property( 'required', '"%LABEL%" is a required field!' );
$f->add_validation('personal_name', '"%LABEL%" contains disallowed characters.', V_INTERNAL);
$f->add_validation('my_validate_function', 'The first letter should be uppercase.', V_USER); // Just an example
// A textarea field. Note the extra added HTML attributes
$f = new HTMLFormInput( 'textarea', 'memo', 'Description' );
$f->add_attr( array( 'cols'=>20, 'rows'=>6 ) );
// Another HTML only field (span)
$f = new HTMLFormInput ( 'htmltext', 'sometext' );
$f->set_value( "This is a wonderful text!" );
$f->add_attr( array( 'style'=>'color:green;' ) );
// This is not a database field, we just create it for fun. We won't map it to our block,
// so it always initialize itself with the value given at creation time (or by ::init() or ::set_value())
// which is here the current time.
$f = new HTMLFormDate( 'now', 'Actual time', time() );
$f->set_language( 'uk' );
// Our submit button. Even with no primary reference variable, you can immediately
// access it after creation using FLIB::HTML('save').
new HTMLFormControl( 'save', 'Update it!', 'submit' );
// A simple non functional tag.
$h1 = new HTMLElement ( 'hr', HT_NOENDTAG, array ( 'noshade'=>true ) );
$h1->set_key( 'hr1' );
/* Main execution part */
$form->set_template( $template );
$form->add_blocks();
$form->add_fields();
// We map some defined fields to the database block, so the library knows how to update them
// Note how the formslib field "memo" is mapped to the column "description" in the database block,
// because of its different name.
$form->map( 'myblock', array( 'id', 'name', 'age', 'memo'=>'description' ) );
$form->setup();
/* End of main execution part */
// This is a very simple method of displaying some errors that occured.
// Normally, you will want make this in a more beautiful manner ;)
if ( sizeof ($form->get_errors() ) ) {
print "Errors occured: ";
print_r( $form -> get_errors() );
}
// This is some other stuff we want to do before outputting the code (it's user specific and not
// directly related to the formslib!)
post_actions();
// This is the output function for creating the HTML code
print $form->out();
// Defining a field trigger which modifies a value just before inserting
// or updating the field named "id" into the database. We want to try to insert
// "null" on new id records (forcing mysql to use the auto increment function for this column).
function _test_id_success ( $id ) {
return ( $id == 'new' ? null : $id );
}
// This trigger is called automatically AFTER updating the data blocks.
function _test_success() {
if ( $_GET['navigation'] != 1 ) {
FLIB::HTML('id')->populate( 'select id, name from person', false, $GLOBALS['oDB'] );
if ( ! (int)$GLOBALS['id'] ) {
$GLOBALS['id'] = (int)$GLOBALS['oDB']->GetOne("select max(id) from person");
FLIB::HTML('id')->set_value( $GLOBALS['id'] );
post_actions();
}
}
}
// An user specified validation function
function my_validate_function ( $str )
{
return ( $str{0} == strtoupper ( $str{0} ) );
}
// We just pack this code into one function, because it is executed from 2 different locations
function post_actions()
{
// Playing around with the button value depending on the record type ( new or update )
// Have a look at the way we're accessing the field objects inside the form
if ( ! $GLOBALS['id'] || $GLOBALS['id'] == 'new' ) {
FLIB::HTML('save')->set_value( 'Insert it!' );
}
}
?>
|