PHP Classes

File: more_dml.php

Recommend this page to a friend!
  Classes of Alex D.   Formslib4PHP   more_dml.php   Download  
File: more_dml.php
Role: Example script
Content type: text/plain
Description: Medium complexity example script
Class: Formslib4PHP
Generate and validate Web forms
Author: By
Last change:
Date: 18 years ago
Size: 5,738 bytes
 

Contents

Class file image Download
<?
/*
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!' );
    }
}

?>