--- 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 ? '
'.$this->create_message.'
' : ''); + 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'] = '
'.$this->create_message.'
'; + $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)); } };