Framework  3.9
SpreadsheetForm Class Reference

SpreadsheetForm. More...

+ Inheritance diagram for SpreadsheetForm:
+ Collaboration diagram for SpreadsheetForm:

Public Member Functions

 SpreadsheetForm ($subform, $items=array(), $blanks=5, $method="POST", $action="", $id="", $onStartRow=null, $isRowSelected=null)
 Creates a new SpreadsheetForm. More...
 
 showRowLabels ($columnTitle, $format, $defaultText)
 
 createSpreadsheetRowForms ($items, $subform)
 
 createOneSpreadsheetRow ($item, $row, $validator, $idx)
 
 setColumnWidth ($field, $width)
 Set the td width for the table. More...
 
 ajaxSubmit ($success, $failure=null)
 Put the form into AJAX submission mode. More...
 
 writeScript ()
 Generates the Javascript for all the subforms, and creates a SpreadsheetFormManager object. More...
 
 drawForm ()
 Draws the spreadsheet. More...
 
 save ()
 Overrides CompositeAutoForm::save() to provide support for selectable spreadsheet forms. More...
 
 getQueryString ($qs="")
 
- Public Member Functions inherited from CompositeAutoForm
 CompositeAutoForm ($method="POST", $action="", $containerClass="")
 Creates a new CompositeAutoForm. More...
 
 addForm ($form, $enableValidation=false)
 Add a sub-form to this form. More...
 
 preset ()
 Array of fields to be ignored when determining if a record is empty in cases where empty records should not trigger an error. More...
 
 drawReadOnly ()
 Draw the read-only sub-forms. More...
 
 button ($text, $url, $confirm=null, $isScript=false)
 Adds a custom button to the form. More...
 
 drawButtons ()
 Draws any additional buttons specified in the calling script. More...
 

Public Attributes

 $colCount = 0
 
 $subform
 The prototype subform used to model each row in the spreadsheet. More...
 
 $columnWidths = array()
 Array of column widths, used to control relative cell sizes in the table output. More...
 
 $msg
 Text to appear below buttons at top and above table. More...
 
 $onStartRow = null
 Callback hook to determine row style or suppression of row. More...
 
 $isRowSelected = null
 Callback hook to determine whether a given row is selected. Assigning a callback to this hook turns on selection mode. Only selected sub-forms are saved. More...
 
 $isRowEmpty = null
 Callback hook to determine if a given row should be saved, or skipped because it is an empty row. More...
 
 $rowLabelFormat = null
 
 $rowLabelTitle = null
 
 $rowLabelDefaultText = ""
 
 $emptyMessage = "The spreadsheet is empty"
 The message to display if the item list is empty and the number of blank rows is set to zero. More...
 
 $onFormChanged = null
 Javascript function to be called when any value is changed within the spreadsheet. More...
 
 $ajaxSubmitHandler = false
 JavaScript Callback for AJAX Submit mode - called on success. More...
 
 $ajaxFailureHandler = false
 JavaScript Callback for AJAX Submit mode - called on failure. More...
 
- Public Attributes inherited from CompositeAutoForm
 $forms
 
 $buttons = array()
 
 $method
 
 $action
 
 $containerClass
 
 $buttonAlignment = "left"
 
 $preset = array()
 
 $readOnlyForm
 Specifies whether the entire form is read-only. More...
 
 $onSaveComplete = null
 Callback event handler that is fired after all the subordinate AutoForms have finished saving data to the database. More...
 

Detailed Description

SpreadsheetForm.

Provides input forms in a spreadsheet layout where each row is a subform containing one dataitem object's field renderers.

Definition at line 48 of file spreadsheet_form.inc.

Member Function Documentation

◆ ajaxSubmit()

SpreadsheetForm::ajaxSubmit (   $success,
  $failure = null 
)

Put the form into AJAX submission mode.

You must supply a Javascript function to call once the submission is complete.

Parameters
string$successthe Javascript callback function for success
string$failurethe Javascript callback function for failure

Definition at line 234 of file spreadsheet_form.inc.

235  {
236  $id = $this->id ? $this->id : "composite_auto_form";
237  if ($failure == null)
238  {
239  $failure = "function() {document.id('{$id}_error').set('text','Failed to communicate with server'); }";
240  }
241 
242  $this->ajaxSubmitHandler = $success;
243  $this->ajaxFailureHandler = $failure;
244  }

◆ createOneSpreadsheetRow()

SpreadsheetForm::createOneSpreadsheetRow (   $item,
  $row,
  $validator,
  $idx 
)

Definition at line 146 of file spreadsheet_form.inc.

147  {
148  $layout = "table_row";
149 
150  if ($this->onStartRow)
151  {
152  $ret = call_user_func($this->onStartRow, $item);
153  }
154 
155  // If the row callback explicitly returns false, omit this row
156  if ($ret === false) return;
157 
158  $row->data =& $item;
159  $row->id = $this->id . "_$idx";
160  $row->validator = $validator;
161  $row->validator->id = $row->id;
162  if ($ret) $row->formCSS = $ret;
163 
164 
165  $fields = $row->data->getFields();
166  // clone a new instance of each field renderer
167  // created for the template subform.
168  foreach($fields as $field => $type)
169  {
170  if ($item->filter && $item->filter->isExcluded($field)) continue;
171 
172  $r = $row->getRenderer($field);
173  if($r)
174  {
175  $renderer = clone($r);
176  $renderer->parent = $row;
177  $row->override($field, "", $renderer);
178  }
179  }
180 
181  $additional = array();
182  foreach($row->additional as $r)
183  {
184  $renderer = $r['renderer'];
185  // JDG 5/24/11 - fix get field name
186  $r2 = clone($renderer);
187  $r2->parent = &$row;
188  $r['renderer'] = $r2;
189 
190  $additional[] = $r;
191 
192  trace("#@#@#@ ID: {$r2->parent->id}", 3);
193  $row->override($r['field'], $r['label'], $r2);
194  }
195 
196  $row->additional = $additional;
197 
198  trace(print_r($row->additional, true), 3);
199 
200  //$form = SubordinateAutoForm::create($this, $row, true);
201  $subform = new SubordinateAutoForm($this, $row, true);
202 
203  if ($this->isRowSelected)
204  {
205  $layout = "selectable_table_row";
206  $subform->isSelected = call_user_func($this->isRowSelected, $item);
207  }
208 
209  $subform->form->layout = AutoFormLayout::create($layout, $subform);
210 
211  if ($ret)
212  {
213  $subform->containerClass = trim($this->containerClass. " " . $ret);
214  }
215  }
static create($type, $form)
$subform
The prototype subform used to model each row in the spreadsheet.
trace($msg, $lvl=3, $callStack=null)
Send output to the trace log.
Definition: functions.inc:1010

◆ createSpreadsheetRowForms()

SpreadsheetForm::createSpreadsheetRowForms (   $items,
  $subform 
)

Definition at line 121 of file spreadsheet_form.inc.

122  {
123  $subform->subordinate = true;
124  $subform->layout = AutoFormLayout::create("table_row", $subform);
125 
126  // Don't allow HTMLEditor in spreadsheet form,
127  // override with Text Editor
128  $fields = $subform->data->getFields();
129  foreach($fields as $field => $type)
130  {
131  $renderer = $subform->getRenderer($field);
132  if(get_class($renderer) == "HTMLFieldRenderer")
133  {
134  $subform->override($field, "", new TextFieldRenderer($subform));
135  }
136  }
137 
138  $idx = 1;
139  foreach($items as $item)
140  {
141  $this->createOneSpreadsheetRow($item, clone($subform), clone($subform->validator), $idx);
142  $idx++;
143  }
144  }
createOneSpreadsheetRow($item, $row, $validator, $idx)
Field renderer for text data fields.

◆ drawForm()

SpreadsheetForm::drawForm ( )

Draws the spreadsheet.

Each row is a subordinate form instance with the renderers cloned from the prototype row form supplied in the constructor.

Reimplemented from CompositeAutoForm.

Definition at line 289 of file spreadsheet_form.inc.

290  {
291  if (!count($this->forms))
292  {
293  echo $this->emptyMessage;
294  return;
295  }
296 
297  $id = $this->id ? $this->id : "composite_auto_form";
298 
299  echo "<form id='$id' method='{$this->method}' action='{$this->action}' enctype='multipart/form-data'";
300  echo " onsubmit='return onCompositeFormSubmit(this);'";
301  echo ">\n";
302 
303  $layout = ($this->isRowSelected) ? "selectable_table_header" : "table_header";
304  $form = $this->subform;
305  $form->layout = AutoFormLayout::create($layout, $form);
306  $obj =& $form->getData();
307  $pk = $obj->getPrimaryKey();
308 
309  $filter = $obj->getFilter();
310  $fields = $obj->getFields();
311 
312 
313  if ($this->layout->externalErrorBox) $this->layout->errorBox();
314 
315  if ($this->buttons_at_top)
316  {
317  echo "<p>";
318  $this->drawButtons();
319  echo "</p>";
320  }
321 
322  if (!$this->layout->externalErrorBox) $this->layout->errorBox();
323 
324  if ($form->markRequiredFields && $form->validator->hasRequiredFields())
325  {
326  $this->layout->requiredFields($form->requiredFieldsText);
327  }
328 
329  $this->layout->startUngrouped();
330 
331  // Draw headings
332  echo "<thead><tr>\n";
333 
334  if ($this->isRowSelected)
335  {
336  echo "<th>&nbsp;</th>";
337  }
338 
339  if ($this->rowLabelTitle)
340  {
341  echo "<th>{$this->rowLabelTitle}</th>";
342  }
343 
344  foreach($fields as $field => $type)
345  {
346  if ($field != $pk && !array_key_exists($field, $form->hidden) && !($filter && $filter->isExcluded($field)))
347  {
348  $renderer = $form->getRenderer($field);
349  if($renderer)
350  {
351  $styles = "text-align: center;";
352  if(array_key_exists($field, $this->columnWidths))
353  {
354  $width = $this->columnWidths[$field];
355  if ($width)
356  {
357  if (is_numeric($width))
358  {
359  $styles .= " width: {$width}px";
360  }
361  else
362  {
363  $styles .= "width: {$width}";
364  }
365  }
366  }
367  $renderer->_printLabel($field, 1, $styles);
368  $this->colCount++;
369  }
370  }
371  }
372 
373  foreach($form->additional as $r)
374  {
375  $renderer = $r['renderer'];
376  // JDG 5/24/11 - fix get field name
377  $field = $r['field'];
378  if(!$field)
379  $field = $renderer->field;
380 
381  if(array_key_exists($field, $form->hidden))
382  continue;
383 
384  $styles = "text-align: center;";
385  if(array_key_exists($field, $this->columnWidths))
386  {
387  $width = $this->columnWidths[$field];
388  if ($width)
389  {
390  if (is_numeric($width))
391  {
392  $styles .= " width: {$width}px";
393  }
394  else
395  {
396  $styles .= "width: {$width}";
397  }
398  }
399  }
400  $renderer->_printLabel($field, 1, $styles);
401  $this->colCount++;
402  }
403  echo "</tr></thead>\n";
404 
405  foreach($this->forms as $form)
406  {
407  ob_start();
408  $form->drawForm();
409  $output = ob_get_contents();
410  ob_end_clean();
411 
412  $output = preg_replace("/\\bname=(['\"])([^'\"]*?)['\"]/", "name=$1{$form->id}__$2$1", $output);
413 
414  if ($this->rowLabelTitle)
415  {
416  $output = preg_replace("/<tr id=(.*?)>/", "<tr id=$1><td>".($form->getData()->format($this->rowLabelFormat))."</td>", $output);
417  }
418 
419  //$form->form->layout->startUngrouped();
420  echo $output;
421  //$form->form->layout->endUngrouped();
422  }
423 
424  $this->layout->endUngrouped();
425  $this->drawButtons();
426  echo "</form>\n";
427  }
drawButtons()
Draws any additional buttons specified in the calling script.
$isRowSelected
Callback hook to determine whether a given row is selected. Assigning a callback to this hook turns o...
$emptyMessage
The message to display if the item list is empty and the number of blank rows is set to zero.

◆ getQueryString()

SpreadsheetForm::getQueryString (   $qs = "")

Definition at line 489 of file spreadsheet_form.inc.

490  {
491  $values = array();
492 
493  foreach($this->forms as $form)
494  {
495  $obj = $form->getData();
496  $pk = $obj->getPrimaryKey();
497  $val = $obj->$pk;
498  if($val)
499  {
500  $name = "{$form->id}_$pk}";
501  $params .= $sep.urlencode($pk)."[".urlencode($name)."]=".urlencode($val);
502  $sep = "&";
503  }
504  }
505 
506  if($params && $qs)
507  $params = appendToQueryString($qs, $params);
508 
509  return $params;
510  }
appendToQueryString($qs, $params)
Appends the specified parameters to the supplied query string.
Definition: functions.inc:1594

◆ save()

SpreadsheetForm::save ( )

Overrides CompositeAutoForm::save() to provide support for selectable spreadsheet forms.

See also
CompositeAutoForm::save()

Reimplemented from CompositeAutoForm.

Definition at line 433 of file spreadsheet_form.inc.

434  {
435  global $method;
436 
437  // Do magic
438 
439  $valid = true;
440 
441 
442  foreach($this->forms as $form)
443  {
444  if ($this->isRowSelected != null)
445  {
446  // Selectable mode - skip form save if not selected
447 
448  if (!$_POST[$form->id."__#selected"])
449  {
450  trace("SKIPPING {$form->id}", 4);
451  continue;
452  }
453  }
454 
455  foreach($_POST as $name => $value)
456  {
457  if (strpos($name, "__") === false)
458  {
459  unset($_POST[$name]);
460  }
461  }
462 
463  $prefix = $form->id."__";
464  $len = strlen($prefix);
465 
466  foreach($_POST as $name => $value)
467  {
468  if (!strncmp($name, $prefix, $len))
469  {
470  $_POST[substr($name, $len)] = $value;
471  }
472  }
473 
474  if (is_callable($this->isRowEmpty))
475  {
476  if (call_user_func($this->isRowEmpty)) continue;
477  }
478 
479  if (!$form->save()) $valid = false;
480  }
481 
482  return $valid;
483  }

◆ setColumnWidth()

SpreadsheetForm::setColumnWidth (   $field,
  $width 
)

Set the td width for the table.

Parameters
string$field
number$width

Definition at line 223 of file spreadsheet_form.inc.

224  {
225  $this->columnWidths[$field] = $width;
226  }

◆ showRowLabels()

SpreadsheetForm::showRowLabels (   $columnTitle,
  $format,
  $defaultText 
)

Definition at line 114 of file spreadsheet_form.inc.

115  {
116  $this->rowLabelTitle = $columnTitle;
117  $this->rowLabelFormat = $format;
118  $this->rowLabelDefaultText = $defaultText;
119  }

◆ SpreadsheetForm()

SpreadsheetForm::SpreadsheetForm (   $subform,
  $items = array(),
  $blanks = 5,
  $method = "POST",
  $action = "",
  $id = "",
  $onStartRow = null,
  $isRowSelected = null 
)

Creates a new SpreadsheetForm.

Parameters
AutoForm$subforman instance of AutoForm containing the target DataItem object. The target should have the filters set as desired and those filters will apply to all objects displayed in the spreadsheet. The "template" form should have any field aliases, hidden fields, and any other options set. The template form will be used for all the items displayed.
array$itemsarray of dataitem objects to be displayed in an editable table row. If you wish to display only empty rows, send an empty array.
number$blanksthe number of blank rows desired, 0 if only previously saved dataitem objects supplied in the items array will be displayed.
string$methodthe form submission method (i.e. GET or POST)
string$actionthe target action URI (leave blank for default post-back processing)
string$idthe DOM id for the spreadsheet
string$onStartRowcallback to be called before generating each row
string$isRowSelectedcallback to determine the selection status for each row

Definition at line 90 of file spreadsheet_form.inc.

91  {
92  $this->subform = $subform;
93  $this->onStartRow = $onStartRow;
94  $this->isRowSelected = $isRowSelected;
95 
96  // Create one instance of AutoForm to apply certain setting
97  // for all forms, e.g., aliases and hiddens
98  parent::CompositeAutoForm($method, $action);
99  $this->formCSS = "list spreadsheet";
100  $this->layout = AutoFormLayout::create("spreadsheet", $this);
101 
102  $target = $subform->data;
103 
104  $this->id = get_class($target)."_form";
105 
106  for($i=0; $i < $blanks; $i++)
107  {
108  $items[] = clone($target);
109  }
110 
111  $this->createSpreadsheetRowForms($items, $subform);
112  }
$onStartRow
Callback hook to determine row style or suppression of row.
createSpreadsheetRowForms($items, $subform)

◆ writeScript()

SpreadsheetForm::writeScript ( )

Generates the Javascript for all the subforms, and creates a SpreadsheetFormManager object.

Reimplemented from CompositeAutoForm.

Definition at line 249 of file spreadsheet_form.inc.

250  {
251  if (!count($this->forms)) return;
252 
253  $script = parent::writeScript();
254 
255  $id = $this->id ? $this->id : "composite_auto_form";
256 
257  if ($this->onFormChanged) $options = "onFormChanged: {$this->onFormChanged}";
258 
259  $script .= <<<ENDSCRIPT
260  <script type='text/javascript'>
261  window.addEvent('domready', function()
262  {
263  document.id('{$id}').manager = new SpreadsheetFormManager('{$id}', {{$options}});
264  });
265  </script>
266 ENDSCRIPT;
267 
268  if ($this->ajaxSubmitHandler && !$this->readOnlyForm)
269  {
270  $script .= <<<ENDSCRIPT
271  <script>
272  document.id('{$id}').iFrameFormRequest(
273  {
274  'onRequest': function() { return onCompositeFormSubmit(document.id('{$id}')); },
275  'onComplete': {$this->ajaxSubmitHandler},
276  'onFailure': {$this->ajaxFailureHandler}
277  });
278  </script>
279 ENDSCRIPT;
280  }
281 
282  return $script;
283  }

Member Data Documentation

◆ $ajaxFailureHandler

SpreadsheetForm::$ajaxFailureHandler = false

JavaScript Callback for AJAX Submit mode - called on failure.

Definition at line 63 of file spreadsheet_form.inc.

◆ $ajaxSubmitHandler

SpreadsheetForm::$ajaxSubmitHandler = false

JavaScript Callback for AJAX Submit mode - called on success.

Definition at line 62 of file spreadsheet_form.inc.

◆ $colCount

SpreadsheetForm::$colCount = 0

Definition at line 50 of file spreadsheet_form.inc.

◆ $columnWidths

SpreadsheetForm::$columnWidths = array()

Array of column widths, used to control relative cell sizes in the table output.

Definition at line 52 of file spreadsheet_form.inc.

◆ $emptyMessage

SpreadsheetForm::$emptyMessage = "The spreadsheet is empty"

The message to display if the item list is empty and the number of blank rows is set to zero.

Definition at line 60 of file spreadsheet_form.inc.

◆ $isRowEmpty

SpreadsheetForm::$isRowEmpty = null

Callback hook to determine if a given row should be saved, or skipped because it is an empty row.

Definition at line 56 of file spreadsheet_form.inc.

◆ $isRowSelected

SpreadsheetForm::$isRowSelected = null

Callback hook to determine whether a given row is selected. Assigning a callback to this hook turns on selection mode. Only selected sub-forms are saved.

Definition at line 55 of file spreadsheet_form.inc.

◆ $msg

SpreadsheetForm::$msg

Text to appear below buttons at top and above table.

Definition at line 53 of file spreadsheet_form.inc.

◆ $onFormChanged

SpreadsheetForm::$onFormChanged = null

Javascript function to be called when any value is changed within the spreadsheet.

Definition at line 61 of file spreadsheet_form.inc.

◆ $onStartRow

SpreadsheetForm::$onStartRow = null

Callback hook to determine row style or suppression of row.

Definition at line 54 of file spreadsheet_form.inc.

◆ $rowLabelDefaultText

SpreadsheetForm::$rowLabelDefaultText = ""

Definition at line 59 of file spreadsheet_form.inc.

◆ $rowLabelFormat

SpreadsheetForm::$rowLabelFormat = null

Definition at line 57 of file spreadsheet_form.inc.

◆ $rowLabelTitle

SpreadsheetForm::$rowLabelTitle = null

Definition at line 58 of file spreadsheet_form.inc.

◆ $subform

SpreadsheetForm::$subform

The prototype subform used to model each row in the spreadsheet.

Definition at line 51 of file spreadsheet_form.inc.


The documentation for this class was generated from the following file: