<?php
/*
*
* @(#) $Id: test_scaffolding_input.php,v 1.14 2009/04/07 09:30:17 mlemos Exp $
*
*/
require('forms.php');
require('form_scaffolding.php');
/*
* Include the layout vertical plug-in class to automatically layout
* the inputs
*/
require('form_layout_vertical.php');
/*
* Include the AJAX submit plug-in class to automatically interact with
* the server without reloading the page
*/
require('form_ajax_submit.php');
/*
* Include the blog post view class and initialize the object to define
* details of presentation of the forms and listings of the posts being
* edited
*/
require('blog_post_view.php');
$view = new blog_post_view_class;
if(!$view->Initialize())
die('Error: '.$model->error);
$form=new form_class;
$form->NAME = 'scaffolding_form';
$form->METHOD = 'POST';
$form->ACTION = (defined('SCAFFOLDING_URI') ? SCAFFOLDING_URI : '?');
$form->InvalidCLASS = $view->GetInvalidInputsClass();
$form->ShowAllErrors = 1;
$form->ErrorMessagePrefix = '- ';
$form->debug = 'trigger_error';
/*
* Include the blog post model class and initialize the object to store
* and retrieve data of the post entries being edited
*/
require('blog_post_model.php');
$model = new blog_post_model_class;
if(!$model->Initialize())
die('Error: '.$model->error);
/*
* Add the scaffolding custom input with all the necessary properties
*/
$error = $form->AddInput(array(
'TYPE'=>'custom',
'CustomClass'=>'form_scaffolding_class',
'ID'=>'posts',
/*
* Customize all the necessary messages for which the default values
* may not be suitable. These messages may include HTML tags.
*/
'ListingMessage'=>'All blog posts',
'NoEntriesMessage'=>'No blog articles were submitted.',
'CreateMessage'=>'Submit a new blog post',
'CreateCanceledMessage'=>'Submitting the blog post was canceled.',
'CreatedMessage'=>'The new blog post was submitted successfully.',
'UpdateMessage'=>'Update this blog post',
'UpdateCanceledMessage'=>'Updating the blog post was canceled.',
'UpdatedMessage'=>'The blog post was updated successfully.',
'DeleteMessage'=>'Are you sure you want to delete this blog post?',
'DeleteCanceledMessage'=>'Deleting the blog post was canceled.',
'DeletedMessage'=>'The blog post was deleted successfully.',
/*
* If we want to display entry previews, a few more properties are
* necessary.
*/
'Preview'=>1,
'PreviewLabel'=>'Preview',
'CreatePreviewMessage'=>'New blog post preview',
'UpdatePreviewMessage'=>'Blog post update preview',
/*
* If we want to allow saving an entry and continue editing, a few
* more properties are necessary.
*/
'Save'=>1,
'SaveLabel'=>'Save',
/*
* If we want to allow viewing an entry without editing it, a few
* more properties are necessary.
*/
'View'=>1,
'ViewLabel'=>'View',
'ViewingMessage'=>'Viewing blog post',
/*
* Here we define all the input fields necessary to edit the
* properties of each entry being created or updated.
*/
'EntryFields'=>array(
array(
'TYPE'=>'text',
'NAME'=>'title',
'LABEL'=>'<u>T</u>itle',
'ValidateAsNotEmpty'=>1,
'ValidationErrorMessage'=>'It was not entered a valid post title.',
),
array(
'TYPE'=>'textarea',
'NAME'=>'body',
'LABEL'=>'<u>B</u>ody',
'COLS'=>60,
'ROWS'=>10,
'ValidateAsNotEmpty'=>1,
'ValidationErrorMessage'=>'It was not entered a valid post body.',
)
),
/*
* Several properties may be set to customize the presentation of the
* listing of existing entries.
*/
'ListingClass'=>'listing box',
'HighlightRowListingClass'=>'highlightrow',
'OddRowListingClass'=>'oddrow',
'EvenRowListingClass'=>'evenrow',
/*
* Customize the presentation of validation error messages and marks
* that appear next to invalid fields.
*/
'ErrorMessageFormat'=>$view->GetErrorMessageFormat(),
'InvalidMark'=>$view->GetInvalidMark(),
/*
* Customize the HTML that envolve the forms for creating, updating
* and deleting entries.
*/
'FormHeader'=>$view->GetFormHeader(),
'FormFooter'=>$view->GetFormFooter(),
));
if(strlen($error))
die('Error: '.$error);
/*
* Handle events AJAX requests handling events.
* Do not output anything nor send any headers before this line.
*/
$form->HandleEvent($processed);
/*
* Exit your script if all AJAX events were processed.
*/
if($processed)
exit;
/*
* Load input values so the scaffolding input can post event messages
* for handling by your application.
*/
$submitted = strlen($form->WasSubmitted('')) != 0;
$form->LoadInputValues($submitted);
/*
* Were any messages posted to handle scaffolding events?
*/
if($form->GetNextMessage($message))
{
/*
* If so process and reply to all messages until there are no more
* messages to process.
*/
do
{
/*
* First lets check which input posted a message.
*/
switch($message['From'])
{
case 'posts':
/*
* If it was the posts scaffolding input, now lets handle each
* type of event.
*/
switch($message["Event"])
{
case "listing":
/*
* When the listing event is sent, applications should
* retrieve the data of entries to display and set a few
* properties to tell the scaffolding plug-in how to render
* the entries.
*/
$page = $message['Page'];
if(!$model->GetEntries($page, $posts, $total_posts))
die('Error: '.$model->error);
if(!$view->GetPostListingFormat($columns, $id_column, $page_entries))
die('Error: '.$view->error);
$form->SetInputProperty('posts', 'IDColumn', $id_column);
$form->SetInputProperty('posts', 'Columns', $columns);
$form->SetInputProperty('posts', 'TotalEntries', $total_posts);
$form->SetInputProperty('posts', 'PageEntries', $page_entries);
$form->SetInputProperty('posts', 'Page', $page);
$form->SetInputProperty('posts', 'Rows', $posts);
break;
case "created":
/*
* When the created event is sent, applications should
* validate the form and create a new entry if it is all
* OK.
*/
if(strlen($error_message = $form->Validate($verify, 'posts-submit')) == 0)
{
$form->LoadInputValues(1);
$entry = array(
'title' => $form->GetInputValue('title'),
'body' => $form->GetInputValue('body')
);
if(!$model->CreateEntry($entry))
{
/*
* If there was a problem creating an entry, cancel the
* entry creation and display an helpful error message.
*/
$message['Cancel'] = 1;
$form->SetInputProperty('posts', 'CreateCanceledMessage', 'Error: '.$model->error);
}
else
{
/*
* If the entry was created successfully, set the Entry
* entry of the message array to pass back the
* identifier of the newly created entry.
*/
$message['Entry'] = $entry['id'];
}
}
break;
case "updating":
case "updated":
/*
* When it is sent an event of an entry being updated, make
* sure the specified entry identifier really exists and
* can be updated.
*/
$id = $message['Entry'];
if(!$model->ReadEntry($id, $entry))
{
/*
* If there was a problem checking the an entry, cancel
* the entry update and display an helpful error
* message.
*/
$message['Cancel'] = 1;
$form->SetInputProperty('posts', 'UpdateCanceledMessage', 'Error: '.$model->error);
}
elseif(IsSet($entry))
{
$form->SetInputValue('title', $entry['title']);
$form->SetInputValue('body', $entry['body']);
/*
* When the updated event is sent, applications should
* validate the form and update the entry if it is all
* OK.
*/
if(!strcmp($message['Event'], 'updated'))
{
$form->LoadInputValues(1);
$entry['title'] = $form->GetInputValue('title');
$entry['body'] = $form->GetInputValue('body');
if(strlen($form->Validate($verify, 'posts-submit')) == 0)
{
if(!$model->UpdateEntry($id, $entry))
{
/*
* If there was a problem updating the entry, cancel the
* entry updating and display an helpful error message.
*/
$message['Cancel'] = 1;
$form->SetInputProperty('posts', 'UpdateCanceledMessage', 'Error: '.$model->error);
}
}
}
}
else
{
/*
* If the entry does not exist or the user does not have
* permissions to access it, cancel the entry update but
* do not display any message as this may be an attempt
* to access unauthorized information.
*/
$message['Cancel'] = 1;
$form->SetInputProperty('posts', 'UpdateCanceledMessage', '');
}
break;
case "deleting":
case "deleted":
/*
* When it is sent an event of an entry being deleted, make
* sure the specified entry identifier really exists and
* can be updated.
*/
$id = $message['Entry'];
if(!$model->ReadEntry($id, $entry))
{
/*
* If there was a problem checking the an entry, cancel
* the entry update and display an helpful error message.
*/
$message['Cancel'] = 1;
$form->SetInputProperty('posts', 'DeleteCanceledMessage', 'Error: '.$model->error);
}
elseif(IsSet($entry))
{
/*
* When the deleted event is sent, applications should
* validate the form and delete the entry if it is all
* OK.
*/
if(!strcmp($message['Event'], 'deleted'))
{
if(strlen($form->Validate($verify, 'posts-delete')) == 0)
{
if(!$model->DeleteEntry($id, $entry))
{
/*
* If there was a problem deleting the entry, cancel the
* entry deletion and display an helpful error message.
*/
$message['Cancel'] = 1;
$form->SetInputProperty('posts', 'DeleteCanceledMessage', 'Error: '.$model->error);
}
}
}
}
else
{
/*
* If the entry does not exist or the user does not have
* permissions to access it, cancel the entry deletion
* but do not display any message as this may be an
* attempt to access unauthorized information.
*/
$message['Cancel'] = 1;
$form->SetInputProperty('posts', 'DeleteCanceledMessage', '');
}
break;
case 'update_previewing':
case 'viewing':
/*
* When it is sent an event to show an existing entry or a
* preview of an entry being updated, make sure the
* specified entry identifier really exists and can be
* updated.
*/
$form->GetInputProperty('posts', 'Entry', $id);
$id = intval($id);
if(!$model->ReadEntry($id, $entry))
{
/*
* If there was a problem checking the an entry, cancel
* the entry update.
*/
$message['Cancel'] = 1;
break;
}
if(!IsSet($entry))
{
/*
* If the entry does not exist or the user does not have
* permissions to access it, cancel the entry update
* but do not display any message as this may be an
* attempt to access unauthorized information.
*/
$message['Cancel'] = 1;
break;
}
case 'create_previewing':
/*
* When it is sent an event to show an existing entry or a
* preview of an entry being created or updated,
* applications should validate the form and generate the
* output HTML if it is all OK.
*/
if(strcmp($message['Event'], 'viewing'))
{
$form->LoadInputValues(1);
$error_message = $form->Validate($verify);
if(strlen($error_message))
break;
$entry = array(
'title' => $form->GetInputValue('title'),
'body' => $form->GetInputValue('body')
);
}
if(!$view->GetPostOutput($entry, $output))
die('Error: '.$view->error);
/*
* If the preview was generated successfully, set the
* EntryOutput property to the necessary HTML to display
* the entry preview.
*/
$form->SetInputProperty('posts', 'EntryOutput', $output);
break;
}
break;
}
/*
* After processing each type of event, always reply to the
* message.
*/
if(strlen($error = $form->ReplyMessage($message, $processed)))
die('Error: '.$error);
}
/*
* Check whether there anymore posted messages until all have been
* processed.
*/
while(!$processed
&& $form->GetNextMessage($message));
/*
* Exit your script if all AJAX events were processed.
*/
if($processed)
exit;
}
/*
* Finalize the model object after we are done with it.
*/
if(!$model->Finalize())
die('Error: '.$model->error);
/*
* Get some values to generate the page output.
*/
$onload = HtmlSpecialChars($form->PageLoad());
$onunload = HtmlSpecialChars($form->PageUnload());
$head = $form->PageHead();
$styles = $view->GetCSSStyles();
/*
* Finalize the view object after we are done with it.
*/
if(!$view->Finalize())
die('Error: '.$view->error);
/*
* Generate the page output.
*/
?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Test for Manuel Lemos' PHP form class
using the scaffolding plug-in input</title>
<style type="text/css"><!--
<?php
echo $styles;
?>
// --></style>
<?php echo $head; ?>
</head>
<body onload="<?php echo $onload; ?>"
onunload="<?php echo $onunload; ?>"
bgcolor="#cccccc">
<center><h1>Test for Manuel Lemos' PHP form class
using the scaffolding plug-in input</h1></center>
<hr />
<?php
$form->AddInputPart('posts');
$form->DisplayOutput();
?>
<hr />
</body>
</html>
|