--- forms/form_scaffolding.php 2009/02/10 03:31:27 1.4
+++ forms/form_scaffolding.php 2009/03/15 07:54:12 1.24
@@ -1,28 +1,47 @@
{result}
{message}
{listing}
{formheader}{form}{formfooter}
';
+ var $format = '{result}
{message}
{toppagination}
{listing}
{bottompagination}
{preview}
{errormessage}{formheader}{form}{formfooter}
';
+ var $error_message_format = '{errormessage}
';
var $form_header = '';
var $form_footer = '';
+ var $page_entries = 0;
+ var $total_entries = 0;
+ var $page = 1;
+ var $listing_message = '';
var $no_entries_message = '';
var $create_message = 'Create a new entry';
var $create_canceled_message = 'Creating a new entry was canceled.';
var $created_message = 'A new entry was created successfully.';
- var $save = 'save';
+ var $update_message = 'Update this entry';
+ var $update_canceled_message = 'Updating an entry was canceled.';
+ var $updated_message = 'The entry was updated successfully.';
+ var $delete_message = 'Are you sure you want to delete this entry?';
+ var $delete_canceled_message = 'Deleting the entry was canceled.';
+ var $deleted_message = 'The entry was deleted successfully.';
+ var $create_preview_message = 'New entry preview';
+ var $update_preview_message = 'Updated entry preview';
+ var $preview_input;
+ var $preview_label = 'Preview';
+ var $save_input;
var $save_label = 'Save';
- var $cancel = 'cancel';
+ var $cancel_input;
var $cancel_label = 'Cancel';
+ var $delete_input;
+ var $delete_label = 'Delete';
+ var $delete_cancel_input;
var $invalid_mark = '[X]';
var $fields = array();
+ var $delete_fields = array();
var $columns = array();
- var $posts = array();
+ var $rows = array();
var $listing_style = '';
var $listing_class = '';
var $highlight_row_color = '';
@@ -31,9 +50,86 @@ class form_scaffolding_class extends for
var $odd_row_class = '';
var $even_row_color = '';
var $even_row_class = '';
+ var $create = 1;
+ var $read = 1;
+ var $update = 1;
+ var $delete = 1;
+ var $preview = 0;
+ var $update_label = 'Update';
+ var $id_column;
+ var $preview_output = '';
+ var $custom_parameters = array();
+ var $external_parameters = array();
var $create_parameter;
+ var $page_parameter;
+ var $update_parameter;
+ var $delete_parameter;
var $state = '';
+ var $entry;
+ var $ajax_input = '';
+ var $action_input = '';
+ var $preview_id = '';
+ var $message_id = '';
+
+ var $pagination_data = '{page}';
+ var $pagination_tab_limit = 10;
+ var $ajax_response = 0;
+ var $ajax_message = array();
+
+ Function GeneratePagination(&$form)
+ {
+ $t = $this->total_entries;
+ $e = $this->page_entries;
+ $l = $this->pagination_tab_limit;
+ if(intval(($t + $e - 1) / $e) > $l)
+ {
+ $start = (max($this->page - intval($l / 2), 1) - 1) * $e + 1;
+ $end = $start + $l * $e - 1;
+ if($end > $t)
+ {
+ $start = max((intval($t / $e) - $l + 1) * $e + 1, 1);
+ $end = $t;
+ }
+ }
+ else
+ {
+ $start = 1;
+ $end = $t;
+ }
+ for($pages = array(), $entry = $start; $entry <= $end; $entry += $e)
+ {
+ $page = ($entry - 1) / $e + 1;
+ $p = count($pages);
+ $last = min($t, $entry + $e - 1);
+ $pages[$p]=array(
+ 'first'=>$entry,
+ 'last'=>$last,
+ 'page'=>$page,
+ 'data'=>str_replace('{first}', $entry, str_replace('{last}', $last, str_replace('{page}', $page, $this->pagination_data)))
+ );
+ if($page != $this->page)
+ {
+ $pages[$p]['url'] = $this->AddActionParameter($form, $this->page_parameter, $page);
+ $pages[$p]['tab'] = 1;
+ }
+ }
+ return($pages);
+ }
+
+ Function DisplayPagination($form, $pages, $position)
+ {
+ $o = '';
+ $tp = count($pages);
+ $page = '{data}';
+ $tab = '{data}';
+ for($p = 0; $p < $tp; ++$p)
+ {
+ $u = IsSet($pages[$p]['url']);
+ $o .= str_replace('{data}', $pages[$p]['data'], str_replace('{url}', $u ? HtmlSpecialChars($pages[$p]['url']) : '', $u ? $page : $tab));
+ }
+ return($o);
+ }
Function HasEntries(&$has_entries)
{
@@ -41,19 +137,42 @@ class form_scaffolding_class extends for
return('');
}
+ Function AddActionParameter(&$form, $parameter, $value)
+ {
+ $url = $form->ACTION.(GetType(strpos($form->ACTION, '?')) == 'integer' ? '&' : '?').UrlEncode($parameter).'='.UrlEncode($value);
+ $p = $this->custom_parameters;
+ $tc = count($p);
+ for(Reset($p), $c = 0; $c < $tc; Next($p), ++$c)
+ {
+ $k = Key($p);
+ $url .= '&'.UrlEncode($k).'='.UrlEncode($p[$k]);
+ }
+ $p = $this->external_parameters;
+ $tc = count($p);
+ for(Reset($p), $c = 0; $c < $tc; Next($p), ++$c)
+ {
+ $k = Key($p);
+ $this->external_parameters[$k] = $form->GetInputValue($k);
+ $url .= '&'.UrlEncode($k).'='.UrlEncode($this->external_parameters[$k]);
+ }
+ return($url);
+ }
+
Function GetListing(&$form, &$listing)
{
$ro = $this->rows;
$co = $this->columns;
$tc = count($co);
$listing = 'listing_class) ? ' class="'.$this->listing_class.'"' : '').''.(strlen($this->listing_style) ? ' style="'.$this->listing_style.'"' : '').">\n\n";
- for($c = 0; $c < $tc; ++$c)
+ for($style = array(), $c = 0; $c < $tc; ++$c)
{
+ $style[$c] = (IsSet($co[$c]['Style']) ? ' style="'.HtmlSpecialChars($co[$c]['Style']).'"' : '').(IsSet($co[$c]['Class']) ? ' class="'.HtmlSpecialChars($co[$c]['Class']).'"' : '');
if(IsSet($co[$c]['HTML'])
&& !$co[$c]['HTML'])
Unset($co[$c]['HTML']);
$listing .= '';
- $listing .= $co[$c]['Header'];
+ if(IsSet($co[$c]['Header']))
+ $listing .= $co[$c]['Header'];
$listing .= " | \n";
}
$listing .= "
\n";
@@ -68,185 +187,675 @@ class form_scaffolding_class extends for
$listing .= '\n";
for($c = 0; $c < $tc; ++$c)
{
- $listing .= '';
- $data = $ro[$r][$c];
- if(IsSet($co[$c]['Map'][$data]))
- $data = $co[$c]['Map'][$data];
- if(IsSet($co[$c]['HTML']))
- $data = HtmlSpecialChars($data);
- $listing .= $data;
- $listing .= " | \n";
- }
+ $listing .= '';
+ if(IsSet($co[$c]['Update']))
+ {
+ $id = $co[$c]['Update'];
+ $data = ''.$this->update_label.'';
+ }
+ elseif(IsSet($co[$c]['Delete']))
+ {
+ $id = $co[$c]['Delete'];
+ $data = ''.$this->delete_label.'';
+ }
+ elseif(IsSet($co[$c]['Format']))
+ {
+ $data = $co[$c]['Format'];
+ $f = (IsSet($co[$c]['FormatParameters']) ? $co[$c]['FormatParameters'] : array());
+ $tf = count($f);
+ for(Reset($f), $p = 0; $p < $tf; Next($f), ++$p)
+ {
+ $k = Key($f);
+ $d = (IsSet($f[$k]['Column']) ? $f[$k]['Column'] : $c);
+ if(IsSet($ro[$r][$d]))
+ $v = $ro[$r][$d];
+ else
+ $v = (IsSet($f[$k]['MapNull']) ? $f[$k]['MapNull'] : '');
+ if(IsSet($f[$k]['Map'][$v]))
+ $v = $f[$k]['Map'][$v];
+ if(IsSet($f[$k]['HTML']))
+ $v = HtmlSpecialChars($v);
+ $data = str_replace($k, $v, $data);
+ }
+ }
+ else
+ {
+ $d = (IsSet($co[$c]['Column']) ? $co[$c]['Column'] : $c);
+ if(IsSet($ro[$r][$d]))
+ $data = $ro[$r][$d];
+ else
+ $data = (IsSet($co[$c]['MapNull']) ? $co[$c]['MapNull'] : '');
+ if(IsSet($co[$c]['Map'][$data]))
+ $data = $co[$c]['Map'][$data];
+ if(IsSet($co[$c]['HTML']))
+ $data = HtmlSpecialChars($data);
+ }
+ $listing .= $data." | \n";
+ }
$listing .= "
\n";
}
$listing .= "
\n";
return('');
}
- Function AddActionParameter($action, $parameter, $value)
+ Function SetColumns($columns)
{
- return($action.(GetType(strpos($action, '?')) == 'integer' ? '&' : '?').UrlEncode($parameter).'='.UrlEncode($value));
+ if($this->update)
+ {
+ $has_update = 0;
+ Unset($id);
+ $tc = count($this->columns);
+ for($c = 0; $c < $tc; ++$c)
+ {
+ if(IsSet($columns[$c]['Update']))
+ $has_update = 0;
+ if(IsSet($columns[$c]['ID']))
+ $id = $c;
+ }
+ if(!IsSet($id))
+ {
+ if(!IsSet($this->id_column))
+ return('it was not specified the column from where the ID value would be taken to update entries');
+ $id = $this->id_column;
+ }
+ if($this->update)
+ {
+ $columns[] = array(
+ 'Update'=>$id
+ );
+ }
+ if($this->delete)
+ {
+ $columns[] = array(
+ 'Delete'=>$id
+ );
+ }
+ }
+ $this->columns = $columns;
+ return('');
+ }
+
+ Function SetIDColumn($column)
+ {
+ if(GetType($column) != 'integer'
+ || $column < 0)
+ return('it was not specified a valid id column');
+ $this->id_column = $column;
+ return('');
}
Function AddInput(&$form, $arguments)
{
- if(IsSet($arguments['NoEntriesMessage']))
- $this->no_entries_message = $arguments['NoEntriesMessage'];
- if(IsSet($arguments['CreateMessage']))
- $this->create_message = $arguments['CreateMessage'];
- if(IsSet($arguments['CreateCanceledMessage']))
- $this->create_canceled_message = $arguments['CreateCanceledMessage'];
- if(IsSet($arguments['CreatedMessage']))
- $this->created_message = $arguments['CreatedMessage'];
- if(IsSet($arguments['InvalidMark']))
- {
- if(strlen($arguments['InvalidMark']) == 0)
- return('it was not specified an invalid mark');
- $this->invalid_mark = $arguments['InvalidMark'];
- }
- if(IsSet($arguments['ListingClass']))
- $this->listing_class = $arguments['ListingClass'];
- if(IsSet($arguments['ListingStyle']))
- $this->listing_style = $arguments['ListingStyle'];
- if(IsSet($arguments['HighlightRowListingClass']))
- $this->highlight_row_class = $arguments['HighlightRowListingClass'];
- if(IsSet($arguments['HighlightRowListingColor']))
- $this->highlight_row_color = $arguments['HighlightRowListingColor'];
- if(IsSet($arguments['OddRowListingClass']))
- $this->odd_row_class = $arguments['OddRowListingClass'];
- if(IsSet($arguments['OddRowListingColor']))
- $this->odd_row_color = $arguments['OddRowListingColor'];
- if(IsSet($arguments['EvenRowListingClass']))
- $this->even_row_class = $arguments['EvenRowListingClass'];
- if(IsSet($arguments['EvenRowListingColor']))
- $this->even_row_color = $arguments['EvenRowListingColor'];
- if(!IsSet($arguments['EntryFields'])
- || ($tf = count($fields = $arguments['EntryFields'])) == 0)
- return('it were not specified any entry fields');
- for($f = 0; $f < $tf; ++$f)
- {
- $field_arguments = $fields[$f];
- if(!IsSet($field_arguments[$key = 'ID'])
- && !IsSet($field_arguments[$key = 'NAME']))
- return('it was not specified the identifier of the field '.$f);
- $id = $field_arguments[$key];
- if(!strcmp($id, $this->cancel)
- && !IsSet($field_arguments['SubForm']))
- $field_arguments['SubForm'] = $this->cancel;
- $field_arguments['NoParent'] = 1;
- if(strlen($error = $form->AddInput($field_arguments)))
- return($error);
- $this->fields[$id] = $field_arguments;
- }
- if(!IsSet($this->fields[$this->save])
- && strlen($error = $form->AddInput(array(
- 'TYPE'=>'submit',
- 'NAME'=>$this->save,
- 'ID'=>$this->save,
- 'VALUE'=>$this->save_label))))
- return($error);
- if(!IsSet($this->fields[$this->cancel])
- && strlen($error = $form->AddInput(array(
- 'TYPE'=>'submit',
- 'NAME'=>$this->cancel,
- 'ID'=>$this->cancel,
- 'VALUE'=>$this->cancel_label,
- 'SubForm'=>$this->cancel))))
- return($error);
- $this->create_parameter = $this->GenerateInputID($form, $this->input, 'create');
+ if(IsSet($arguments['Create']))
+ $this->create = intval($arguments['Create']);
+ if(IsSet($arguments['Read']))
+ $this->read = intval($arguments['Read']);
+ if(IsSet($arguments['Update']))
+ $this->update = intval($arguments['Update']);
+ if(IsSet($arguments['Delete']))
+ $this->delete = intval($arguments['Delete']);
+ if(IsSet($arguments['Preview']))
+ $this->preview = intval($arguments['Preview']);
+ if(IsSet($arguments['CustomParameters']))
+ $this->custom_parameters = $arguments['CustomParameters'];
+ if(IsSet($arguments['ExternalParameters']))
+ $this->external_parameters = $arguments['ExternalParameters'];
+ $this->ajax_input = $this->GenerateInputID($form, $this->input, 'ajax');
+ $this->action_input = $this->GenerateInputID($form, $this->input, 'action');
+ $this->preview_id = $this->GenerateInputID($form, $this->input, 'preview');
+ $this->message_id = $this->GenerateInputID($form, $this->input, 'message');
if(strlen($error = $form->AddInput(array(
+ 'TYPE'=>'custom',
+ 'ID'=>$this->ajax_input,
+ 'CustomClass'=>'form_ajax_submit_class',
+ 'TargetInput'=>$this->input,
+ )))
+ || strlen($error = $form->AddInput(array(
'TYPE'=>'hidden',
- 'NAME'=>$this->create_parameter,
- 'ID'=>$this->create_parameter,
- 'VALUE'=>'1'))))
+ 'ID'=>$this->action_input,
+ 'NAME'=>$this->action_input,
+ 'VALUE'=>''
+ ))))
+ return($error);
+ if($this->create
+ || $this->update)
+ {
+ $this->save_input = $this->input.'-save';
+ $this->cancel_input = $this->input.'-cancel';
+ }
+ if($this->create)
+ {
+ if(IsSet($arguments['CreateMessage']))
+ $this->create_message = $arguments['CreateMessage'];
+ if(IsSet($arguments['CreatePreviewMessage']))
+ $this->create_preview_message = $arguments['CreatePreviewMessage'];
+ if(IsSet($arguments['CreateCanceledMessage']))
+ $this->create_canceled_message = $arguments['CreateCanceledMessage'];
+ if(IsSet($arguments['CreatedMessage']))
+ $this->created_message = $arguments['CreatedMessage'];
+ $this->create_parameter = $this->GenerateInputID($form, $this->input, 'create');
+ if(strlen($error = $form->AddInput(array(
+ 'TYPE'=>'hidden',
+ 'NAME'=>$this->create_parameter,
+ 'ID'=>$this->create_parameter,
+ 'VALUE'=>'1',
+ 'Subform'=>$this->save_input
+ ))))
+ return($error);
+ }
+ if($this->read)
+ {
+ if(IsSet($arguments['ListingMessage']))
+ $this->listing_message = $arguments['ListingMessage'];
+ if(IsSet($arguments['NoEntriesMessage']))
+ $this->no_entries_message = $arguments['NoEntriesMessage'];
+ if(IsSet($arguments['ListingClass']))
+ $this->listing_class = $arguments['ListingClass'];
+ if(IsSet($arguments['ListingStyle']))
+ $this->listing_style = $arguments['ListingStyle'];
+ if(IsSet($arguments['HighlightRowListingClass']))
+ $this->highlight_row_class = $arguments['HighlightRowListingClass'];
+ if(IsSet($arguments['HighlightRowListingColor']))
+ $this->highlight_row_color = $arguments['HighlightRowListingColor'];
+ if(IsSet($arguments['OddRowListingClass']))
+ $this->odd_row_class = $arguments['OddRowListingClass'];
+ if(IsSet($arguments['OddRowListingColor']))
+ $this->odd_row_color = $arguments['OddRowListingColor'];
+ if(IsSet($arguments['EvenRowListingClass']))
+ $this->even_row_class = $arguments['EvenRowListingClass'];
+ if(IsSet($arguments['EvenRowListingColor']))
+ $this->even_row_color = $arguments['EvenRowListingColor'];
+ if(IsSet($arguments['ErrorMessageFormat']))
+ $this->error_message_format = $arguments['ErrorMessageFormat'];
+ if(IsSet($arguments['FormHeader']))
+ $this->form_header = $arguments['FormHeader'];
+ if(IsSet($arguments['FormFooter']))
+ $this->form_footer = $arguments['FormFooter'];
+ if(IsSet($arguments['Rows']))
+ $this->rows = $arguments['Rows'];
+ if(IsSet($arguments['IDColumn'])
+ && strlen($error = $this->SetIDColumn($arguments['IDColumn'])))
+ return($error);
+ if(IsSet($arguments['Columns'])
+ && strlen($error = $this->SetColumns($arguments['Columns'])))
+ return($error);
+ if(IsSet($arguments['TotalEntries']))
+ $this->total_entries = $arguments['TotalEntries'];
+ if(IsSet($arguments['PageEntries']))
+ $this->page_entries = $arguments['PageEntries'];
+ if(IsSet($arguments['Page']))
+ $this->page = $arguments['Page'];
+ $this->page_parameter = $this->GenerateInputID($form, $this->input, 'page');
+ }
+ if($this->update)
+ {
+ if(IsSet($arguments['UpdateLabel']))
+ $this->update_label = $arguments['UpdateLabel'];
+ if(IsSet($arguments['UpdateMessage']))
+ $this->update_message = $arguments['UpdateMessage'];
+ if(IsSet($arguments['UpdatePreviewMessage']))
+ $this->update_preview_message = $arguments['UpdatePreviewMessage'];
+ if(IsSet($arguments['UpdateCanceledMessage']))
+ $this->update_canceled_message = $arguments['UpdateCanceledMessage'];
+ if(IsSet($arguments['UpdatedMessage']))
+ $this->updated_message = $arguments['UpdatedMessage'];
+ $this->update_parameter = $this->GenerateInputID($form, $this->input, 'update');
+ if(strlen($error = $form->AddInput(array(
+ 'TYPE'=>'hidden',
+ 'NAME'=>$this->update_parameter,
+ 'ID'=>$this->update_parameter,
+ 'VALUE'=>'1',
+ 'Subform'=>$this->save_input
+ ))))
+ return($error);
+ }
+ if($this->create
+ || $this->update)
+ {
+ if(IsSet($arguments['InvalidMark']))
+ {
+ if(strlen($arguments['InvalidMark']) == 0)
+ return('it was not specified an invalid mark');
+ $this->invalid_mark = $arguments['InvalidMark'];
+ }
+ if(!IsSet($arguments['EntryFields'])
+ || ($tf = count($fields = $arguments['EntryFields'])) == 0)
+ return('it were not specified any entry fields');
+ for($f = 0; $f < $tf; ++$f)
+ {
+ $field_arguments = $fields[$f];
+ if(!IsSet($field_arguments[$key = 'ID'])
+ && !IsSet($field_arguments[$key = 'NAME']))
+ return('it was not specified the identifier of the field '.$f);
+ $id = $field_arguments[$key];
+ $field_arguments['SubForm'] = (strcmp($id, $this->cancel_input) ? $this->save_input : $this->cancel_input);
+ $field_arguments['NoParent'] = 1;
+ if(strlen($error = $form->AddInput($field_arguments)))
+ return($error);
+ $this->fields[$id] = $field_arguments;
+ }
+ if($this->preview)
+ {
+ $this->preview_input = $this->input.'-preview';
+ if(IsSet($arguments['PreviewLabel']))
+ $this->preview_label = $arguments['PreviewLabel'];
+ if(!IsSet($this->fields[$this->preview_input])
+ && strlen($error = $form->AddInput(array(
+ 'TYPE'=>'submit',
+ 'NAME'=>$this->preview_input,
+ 'ID'=>$this->preview_input,
+ 'VALUE'=>$this->preview_label,
+ 'SubForm'=>$this->save_input
+ ))))
+ return($error);
+ }
+ if(!IsSet($this->fields[$this->save_input]))
+ {
+ if(IsSet($arguments['SaveLabel']))
+ $this->save_label = $arguments['SaveLabel'];
+ if(strlen($error = $form->AddInput(array(
+ 'TYPE'=>'submit',
+ 'NAME'=>$this->save_input,
+ 'ID'=>$this->save_input,
+ 'VALUE'=>$this->save_label,
+ 'SubForm'=>$this->save_input
+ ))))
+ return($error);
+ }
+ if(!IsSet($this->fields[$this->cancel_input]))
+ {
+ if(IsSet($arguments['CancelLabel']))
+ $this->cancel_label = $arguments['CancelLabel'];
+ if(strlen($error = $form->AddInput(array(
+ 'TYPE'=>'submit',
+ 'NAME'=>$this->cancel_input,
+ 'ID'=>$this->cancel_input,
+ 'VALUE'=>$this->cancel_label,
+ 'SubForm'=>$this->cancel_input
+ ))))
+ return($error);
+ }
+ }
+ if($this->delete)
+ {
+ $this->delete_input = $this->input.'-delete';
+ $this->delete_cancel_input = $this->input.'-delete-cancel';
+ if(IsSet($arguments['DeleteLabel']))
+ $this->delete_label = $arguments['DeleteLabel'];
+ if(IsSet($arguments['DeleteMessage']))
+ $this->delete_message = $arguments['DeleteMessage'];
+ if(IsSet($arguments['DeleteCanceledMessage']))
+ $this->delete_canceled_message = $arguments['DeleteCanceledMessage'];
+ if(IsSet($arguments['DeletedMessage']))
+ $this->deleted_message = $arguments['DeletedMessage'];
+ $fields = (IsSet($arguments['DeleteFields']) ? $arguments['DeleteFields'] : array());
+ $tf = count($fields);
+ for($f = 0; $f < $tf; ++$f)
+ {
+ $field_arguments = $fields[$f];
+ if(!IsSet($field_arguments[$key = 'ID'])
+ && !IsSet($field_arguments[$key = 'NAME']))
+ return('it was not specified the identifier of the field '.$f);
+ $id = $field_arguments[$key];
+ $field_arguments['SubForm'] = (strcmp($id, $this->delete_cancel_input) ? $this->delete_input : $this->delete_cancel_input);
+ $field_arguments['NoParent'] = 1;
+ if(strlen($error = $form->AddInput($field_arguments)))
+ return($error);
+ $this->delete_fields[$id] = $field_arguments;
+ }
+ if(!IsSet($this->delete_fields[$this->delete_input])
+ && strlen($error = $form->AddInput(array(
+ 'TYPE'=>'submit',
+ 'NAME'=>$this->delete_input,
+ 'ID'=>$this->delete_input,
+ 'VALUE'=>$this->delete_label,
+ 'SubForm'=>$this->delete_input
+ ))))
+ return($error);
+ if(!IsSet($this->delete_fields[$this->delete_cancel_input]))
+ {
+ if(IsSet($arguments['CancelLabel']))
+ $this->cancel_label = $arguments['CancelLabel'];
+ if(strlen($error = $form->AddInput(array(
+ 'TYPE'=>'submit',
+ 'NAME'=>$this->delete_cancel_input,
+ 'ID'=>$this->delete_cancel_input,
+ 'VALUE'=>$this->cancel_label,
+ 'SubForm'=>$this->delete_cancel_input
+ ))))
+ return($error);
+ }
+ $this->delete_parameter = $this->GenerateInputID($form, $this->input, 'delete');
+ if(strlen($error = $form->AddInput(array(
+ 'TYPE'=>'hidden',
+ 'NAME'=>$this->delete_parameter,
+ 'ID'=>$this->delete_parameter,
+ 'VALUE'=>'1',
+ 'SubForm'=>$this->delete_input
+ ))))
+ return($error);
+ }
+ if((IsSet($arguments['State'])
+ && strlen($error = $this->SetInputProperty($form, 'State', $arguments['State'])))
+ || (IsSet($arguments['Entry'])
+ && strlen($error = $this->SetInputProperty($form, 'Entry', $arguments['Entry']))))
return($error);
return('');
}
Function AddInputPart(&$form)
{
- if(!strcmp($this->state, 'creating'))
+ $this->valid_marks['data']['message_id'] = $this->message_id;
+ $this->valid_marks['data']['preview_id'] = $this->preview_id;
+ switch($this->state)
{
- $this->valid_marks['data']['listing'] = '';
- $inputs = $properties = array();
- $tf = count($this->fields);
- for($f = 0, Reset($this->fields); $f < $tf; Next($this->fields), ++$f)
- {
- switch($input = Key($this->fields))
- {
- case $this->save:
- case $this->cancel:
- continue 2;
- }
- $inputs[] = $input;
- switch($this->fields[$input]['TYPE'])
- {
- case 'checkbox':
- case 'radio':
- $properties[$input] = array(
- 'SwitchedPosition'=>1
+ case 'create_previewing':
+ case 'update_previewing':
+ case 'creating':
+ case 'updating':
+ if(strlen($error = $form->Connect($this->preview_input, $this->ajax_input, 'ONCLICK', 'Submit', array(
+ 'SubForm'=>$this->save_input,
+ 'SetInputValue'=>array(
+ $this->action_input=>((!strcmp($this->state, 'creating') || !strcmp($this->state, 'create_previewing')) ? 'create_previewing' : 'update_previewing')
+ )
+ )))
+ || strlen($error = $form->AddInputPart($this->action_input))
+ || strlen($error = $form->AddInputPart($this->ajax_input)))
+ return($error);
+ case 'deleting':
+ $previewing = 0;
+ switch($this->state)
+ {
+ case 'create_previewing':
+ $previewing = 1;
+ case 'creating':
+ $creating = 1;
+ $updating = 0;
+ $fields = $this->fields;
+ break;
+ case 'update_previewing':
+ $previewing = 1;
+ case 'updating':
+ $creating = 0;
+ $updating = 1;
+ $fields = $this->fields;
+ break;
+ case 'deleting':
+ $creating = 0;
+ $updating = 0;
+ $fields = $this->delete_fields;
+ break;
+ }
+ $this->valid_marks['data']['listing'] =
+ $this->valid_marks['data']['toppagination'] =
+ $this->valid_marks['data']['bottompagination'] = '';
+ $inputs = $properties = array();
+ $tf = count($fields);
+ for($f = 0, Reset($fields); $f < $tf; Next($fields), ++$f)
+ {
+ switch($input = Key($fields))
+ {
+ case $this->preview_input:
+ case $this->save_input:
+ case $this->cancel_input:
+ case $this->delete_input:
+ case $this->delete_cancel_input:
+ continue 2;
+ }
+ $inputs[] = $input;
+ switch($fields[$input]['TYPE'])
+ {
+ case 'checkbox':
+ case 'radio':
+ $properties[$input] = array(
+ 'SwitchedPosition'=>1
+ );
+ break;
+ }
+ }
+ if($creating
+ || $updating)
+ {
+ if($this->preview)
+ {
+ $inputs[] = $this->preview_input;
+ $properties[$this->preview_input] = array(
+ 'CenteredGroup'=>'left',
);
+ }
+ $inputs[] = $this->save_input;
+ $properties[$this->save_input] = array(
+ 'CenteredGroup'=>($this->preview ? 'middle' : 'left'),
+ );
+ $inputs[] = $this->cancel_input;
+ $properties[$this->cancel_input] = array(
+ 'CenteredGroup'=>'right',
+ );
+ }
+ else
+ {
+ $inputs[] = $this->delete_input;
+ $properties[$this->delete_input] = array(
+ 'CenteredGroup'=>'left',
+ );
+ $inputs[] = $this->delete_cancel_input;
+ $properties[$this->delete_cancel_input] = array(
+ 'CenteredGroup'=>'right',
+ );
+ }
+ $layout = $this->GenerateInputID($form, $this->input, 'layout');
+ $form->AddInput(array(
+ 'ID'=>$layout,
+ 'TYPE'=>'custom',
+ 'CustomClass'=>'form_layout_vertical_class',
+ 'Inputs'=>$inputs,
+ 'Properties'=>$properties,
+ 'InvalidMark'=>$this->invalid_mark,
+ ));
+ $this->valid_marks['data']['result'] = '';
+ $this->valid_marks['data']['message'] = ($previewing ? ($creating ? $this->create_preview_message : $this->update_preview_message) : ($creating ? $this->create_message : ($updating ? $this->update_message : $this->delete_message)));
+ $i = $form->Invalid;
+ $ti = count($i);
+ if($ti)
+ {
+ Reset($i);
+ if($form->ShowAllErrors)
+ {
+ $p = HtmlSpecialChars($form->ErrorMessagePrefix);
+ $s = HtmlSpecialChars($form->ErrorMessageSuffix);
+ for($e = '', $f = 0; $f < $ti; ++$f, Next($i))
+ $e .= ($f > 0 ? "
\n" : '').$p.HtmlSpecialChars($i[Key($i)]).$s;
+ }
+ else
+ $e = HtmlSpecialChars($i[Key($i)]);
+ }
+ else
+ $e = '';
+ $this->valid_marks['data']['errormessage'] = (strlen($e) ? str_replace('{errormessage}', $e, $this->error_message_format) : '');
+ $this->valid_marks['data']['preview'] = (($previewing && strlen($e) == 0) ? $this->preview_output : '');
+ $this->valid_marks['data']['formheader'] = $this->form_header;
+ $this->valid_marks['data']['formfooter'] = $this->form_footer;
+ $this->valid_marks['input']['form'] = $layout;
+ if($creating)
+ {
+ if(strlen($error = $form->AddInputPart($this->create_parameter)))
+ return($error);
+ }
+ elseif($updating)
+ {
+ if(strlen($error = $form->SetInputValue($this->update_parameter, $this->entry))
+ || strlen($error = $form->AddInputPart($this->update_parameter)))
+ return($error);
+ }
+ else
+ {
+ if(strlen($error = $form->SetInputValue($this->save_input, $this->delete_label))
+ || strlen($error = $form->SetInputValue($this->delete_parameter, $this->entry))
+ || strlen($error = $form->AddInputPart($this->delete_parameter)))
+ return($error);
+ }
+ break;
+
+ default:
+ if($this->read
+ && strlen($error = $this->HasEntries($has_entries)))
+ return($error);
+ switch($this->state)
+ {
+ case 'created':
+ $message = $this->created_message;
+ break;
+ case 'updated':
+ $message = $this->updated_message;
+ break;
+ case 'deleted':
+ $message = $this->deleted_message;
+ break;
+ case 'create_canceled':
+ $message = $this->create_canceled_message;
+ break;
+ case 'update_canceled':
+ $message = $this->update_canceled_message;
+ break;
+ case 'delete_canceled':
+ $message = $this->delete_canceled_message;
+ break;
+ default:
+ $message = '';
break;
}
- }
- $inputs[] = $this->save;
- $properties[$this->save] = array(
- 'CenteredGroup'=>'left',
- );
- $inputs[] = $this->cancel;
- $properties[$this->cancel] = array(
- 'CenteredGroup'=>'right',
- );
- $layout = $this->GenerateInputID($form, $this->input, 'layout');
- $form->AddInput(array(
- 'ID'=>$layout,
- 'TYPE'=>'custom',
- "CustomClass"=>"form_layout_vertical_class",
- 'Inputs'=>$inputs,
- 'Properties'=>$properties,
- 'InvalidMark'=>$this->invalid_mark,
- ));
- $this->valid_marks['data']['result'] = '';
- $this->valid_marks['data']['message'] = $this->create_message;
- $this->valid_marks['data']['formheader'] = $this->form_header;
- $this->valid_marks['data']['formfooter'] = $this->form_footer;
- $this->valid_marks['input']['form'] = $layout;
- if(strlen($error = $form->AddInputPart($this->create_parameter)))
- return($error);
+ $this->valid_marks['data']['result'] = $message;
+ if(!$this->read
+ || !$has_entries)
+ {
+ $this->valid_marks['data']['listing'] =
+ $this->valid_marks['data']['toppagination'] =
+ $this->valid_marks['data']['bottompagination'] = '';
+ $this->valid_marks['data']['message'] = ($this->read ? $this->no_entries_message : '');
+ }
+ else
+ {
+ if(strlen($error = $this->GetListing($form, $this->valid_marks['data']['listing'])))
+ return($error);
+ $pages = $this->GeneratePagination($form);
+ if(count($pages) == 1)
+ {
+ $this->valid_marks['data']['toppagination'] =
+ $this->valid_marks['data']['bottompagination'] = '';
+ }
+ else
+ {
+ $this->valid_marks['data']['toppagination'] = $this->DisplayPagination($form, $pages, 'top');
+ $this->valid_marks['data']['bottompagination'] = $this->DisplayPagination($form, $pages, 'bottom');
+ }
+ $this->valid_marks['data']['message'] = $this->listing_message;
+ }
+ $this->valid_marks['data']['formheader'] = $this->valid_marks['data']['formfooter'] = $this->valid_marks['data']['errormessage'] = $this->valid_marks['data']['preview'] = '';
+ $this->valid_marks['data']['form'] = ($this->create ? '' : '');
+ break;
}
- elseif(strlen($error = $this->HasEntries($has_entries)))
- return($error);
- else
+ $p = $this->custom_parameters;
+ $tc = count($p);
+ for(Reset($p), $c = 0; $c < $tc; Next($p), ++$c)
{
- $this->valid_marks['data']['result'] = (!strcmp($this->state, 'create_canceled') ? $this->create_canceled_message : (!strcmp($this->state, 'created') ? $this->created_message : ''));
- if(!$has_entries)
- {
- $this->valid_marks['data']['listing'] = '';
- $this->valid_marks['data']['message'] = $this->no_entries_message;
- }
- else
- {
- if(strlen($error = $this->GetListing($form, $this->valid_marks['data']['listing'])))
- return($error);
- $this->valid_marks['data']['message'] = '';
- }
- $this->valid_marks['data']['formheader'] = $this->valid_marks['data']['formfooter'] = '';
- $this->valid_marks['data']['form'] = '';
+ $k = Key($p);
+ if(IsSet($this->external_parameters[$k]))
+ continue;
+ if(strlen($error = $form->AddInput(array(
+ 'TYPE'=>'hidden',
+ 'NAME'=>$k,
+ 'VALUE'=>$p[$k],
+ )))
+ || strlen($error = $form->AddInputPart($k)))
+ return($error);
}
return(parent::AddInputPart($form));
}
Function LoadInputValues(&$form, $submitted)
{
+ if(count($this->ajax_message))
+ return;
+ $state = $this->state;
if(IsSet($_REQUEST[$this->create_parameter]))
{
- if(strlen($form->WasSubmitted($this->cancel)))
+ if(strlen($form->WasSubmitted($this->cancel_input)))
$this->state = 'create_canceled';
- elseif(strlen($form->WasSubmitted($this->save)))
+ elseif(strlen($form->WasSubmitted($this->save_input)))
$this->state = 'created';
+ elseif(strlen($form->WasSubmitted($this->preview_input)))
+ $this->state = 'create_previewing';
else
$this->state = 'creating';
}
+ elseif(IsSet($_REQUEST[$this->update_parameter]))
+ {
+ $this->entry = $_REQUEST[$this->update_parameter];
+ if(strlen($form->WasSubmitted($this->cancel_input)))
+ $this->state = 'update_canceled';
+ elseif(strlen($form->WasSubmitted($this->save_input)))
+ $this->state = 'updated';
+ elseif(strlen($form->WasSubmitted($this->preview_input)))
+ $this->state = 'update_previewing';
+ else
+ $this->state = 'updating';
+ }
+ elseif(IsSet($_REQUEST[$this->delete_parameter]))
+ {
+ $this->entry = $_REQUEST[$this->delete_parameter];
+ if(strlen($form->WasSubmitted($this->delete_cancel_input)))
+ $this->state = 'delete_canceled';
+ elseif(strlen($form->WasSubmitted($this->delete_input)))
+ $this->state = 'deleted';
+ else
+ $this->state = 'deleting';
+ }
+ elseif(IsSet($_REQUEST[$this->page_parameter]))
+ {
+ $page = intval($_REQUEST[$this->page_parameter]);
+ if($page >= 1)
+ $this->page = $page;
+ }
+ $previewing = 0;
+ $listing = 1;
+ switch($this->state)
+ {
+ case 'create_previewing':
+ case 'update_previewing':
+ $previewing = 1;
+ case 'creating':
+ case 'updating':
+ case 'deleting':
+ $listing = 0;
+ break;
+ }
+ if(strcmp($this->state, $state))
+ {
+ $message = array(
+ 'Event'=>$this->state,
+ 'From'=>$this->input,
+ 'ReplyTo'=>$this->input,
+ );
+ switch($this->state)
+ {
+ case 'updating':
+ case 'updated':
+ case 'deleting':
+ case 'deleted':
+ $message['Entry'] = $this->entry;
+ break;
+ }
+ $form->PostMessage($message);
+ }
+ if($listing)
+ {
+ $form->PostMessage(array(
+ 'Event'=>'listing',
+ 'From'=>$this->input,
+ 'ReplyTo'=>$this->input,
+ 'Page'=>$this->page,
+ ));
+ }
}
Function SetInputProperty(&$form, $property, $value)
@@ -264,9 +873,18 @@ class form_scaffolding_class extends for
case 'State':
switch($value)
{
+ case '':
+ case 'create_previewing':
+ case 'update_previewing':
case 'created':
case 'create_canceled':
case 'creating':
+ case 'updated':
+ case 'update_canceled':
+ case 'updating':
+ case 'deleted':
+ case 'delete_canceled':
+ case 'deleting':
$this->state = $value;
break;
@@ -275,12 +893,87 @@ class form_scaffolding_class extends for
}
break;
+ case 'Rows':
+ $this->rows = $value;
+ break;
+
+ case 'IDColumn':
+ return($this->SetIDColumn($value));
+
case 'Columns':
- $this->columns = $value;
+ return($this->SetColumns($value));
break;
- case 'Rows':
- $this->rows = $value;
+ case 'TotalEntries':
+ $this->total_entries = $value;
+ break;
+
+ case 'PageEntries':
+ $this->page_entries = $value;
+ break;
+
+ case 'Page':
+ $this->page = $value;
+ break;
+
+ case 'Entry':
+ $this->entry = $value;
+ break;
+
+ case 'PreviewOutput':
+ $this->preview_output = $value;
+ break;
+
+ case 'ListingMessage':
+ $this->listing_message = $value;
+ break;
+
+ case 'NoEntriesMessage':
+ $this->no_entries_message = $value;
+ break;
+
+ case 'CreateMessage':
+ $this->create_message = $value;
+ break;
+
+ case 'UpdateMessage':
+ $this->update_message = $value;
+ break;
+
+ case 'DeleteMessage':
+ $this->delete_message = $value;
+ break;
+
+ case 'CreatedMessage':
+ $this->created_message = $value;
+ break;
+
+ case 'UpdatedMessage':
+ $this->updated_message = $value;
+ break;
+
+ case 'DeletedMessage':
+ $this->deleted_message = $value;
+ break;
+
+ case 'CreateCanceledMessage':
+ $this->create_canceled_message = $value;
+ break;
+
+ case 'UpdateCanceledMessage':
+ $this->update_canceled_message = $value;
+ break;
+
+ case 'DeleteCanceledMessage':
+ $this->delete_canceled_message = $value;
+ break;
+
+ case 'CreatePreviewMessage':
+ $this->create_preview_message = $value;
+ break;
+
+ case 'UpdatePreviewMessage':
+ $this->update_preview_message = $value;
break;
default:
@@ -293,12 +986,107 @@ class form_scaffolding_class extends for
{
switch($property)
{
- case "State":
+ case 'State':
$value = $this->state;
break;
+
+ case 'Entry':
+ $value = $this->entry;
+ break;
+
+ case 'Page':
+ $value = $this->page;
+ break;
+
+ case 'Editing':
+ switch($this->state)
+ {
+ case 'create_previewing':
+ case 'update_previewing':
+ case 'creating':
+ case 'updating':
+ case 'deleting':
+ $value = 1;
+ break;
+
+ default:
+ $value = 0;
+ break;
+ }
+ break;
+
+ case 'Previewing':
+ switch($this->state)
+ {
+ case 'create_previewing':
+ case 'update_previewing':
+ $value = 1;
+ break;
+
+ default:
+ $value = 0;
+ break;
+ }
+ break;
+
default:
return($this->DefaultGetInputProperty($form, $property, $value));
}
+ return('');
+ }
+
+ Function ReplyMessage(&$form, $message, &$processed)
+ {
+ if(IsSet($message['AJAX']))
+ {
+ switch($message['Event'])
+ {
+ case 'create_previewing':
+ case 'update_previewing':
+ $this->ajax_message['Actions'] = array(
+ array(
+ 'Action'=>'ReplaceContent',
+ 'Container'=>$this->message_id,
+ "Content"=>(strcmp($message['Event'], 'create_previewing') ? $this->update_preview_message : $this->create_preview_message)
+ ),
+ array(
+ 'Action'=>'ReplaceContent',
+ 'Container'=>$this->preview_id,
+ "Content"=>$this->preview_output
+ )
+ );
+ break;
+ }
+ if(strlen($error = $form->ReplyMessage($this->ajax_message, $processed)))
+ return($error);
+ $this->ajax_message = array();
+ }
+ return('');
+ }
+
+ Function PostMessage(&$form, $message, &$processed)
+ {
+ if(!strcmp($message['From'], $this->ajax_input))
+ {
+ $action = $form->GetSubmittedValue($this->action_input);
+ $action_message = array(
+ 'Event'=>$action,
+ 'From'=>$this->input,
+ 'ReplyTo'=>$this->input,
+ 'AJAX'=>1
+ );
+ switch($action)
+ {
+ case 'update_previewing':
+ $action_message['Entry'] = $this->entry = $form->GetSubmittedValue($this->update_parameter);
+ case 'create_previewing':
+ if(strlen($error = $form->PostMessage($action_message)))
+ return($error);
+ $this->ajax_message = $message;
+ return('');
+ }
+ }
+ return($form->ReplyMessage($message, $processed));
}
};