37 require_once realpath(dirname(__FILE__).
"/composite_auto_form.inc");
99 $this->formCSS =
"list spreadsheet";
104 $this->
id = get_class($target).
"_form";
106 for($i=0; $i < $blanks; $i++)
108 $items[] = clone($target);
116 $this->rowLabelTitle = $columnTitle;
117 $this->rowLabelFormat = $format;
118 $this->rowLabelDefaultText = $defaultText;
128 $fields =
$subform->data->getFields();
129 foreach($fields as $field => $type)
131 $renderer =
$subform->getRenderer($field);
132 if(get_class($renderer) ==
"HTMLFieldRenderer")
139 foreach($items as $item)
148 $layout =
"table_row";
150 if ($this->onStartRow)
152 $ret = call_user_func($this->onStartRow, $item);
156 if ($ret ===
false)
return;
159 $row->id = $this->
id .
"_$idx";
160 $row->validator = $validator;
161 $row->validator->id = $row->id;
162 if ($ret) $row->formCSS = $ret;
165 $fields = $row->data->getFields();
168 foreach($fields as $field => $type)
170 if ($item->filter && $item->filter->isExcluded($field))
continue;
172 $r = $row->getRenderer($field);
175 $renderer = clone($r);
176 $renderer->parent = $row;
177 $row->override($field,
"", $renderer);
181 $additional = array();
182 foreach($row->additional as $r)
184 $renderer = $r[
'renderer'];
186 $r2 = clone($renderer);
188 $r[
'renderer'] = $r2;
192 trace(
"#@#@#@ ID: {$r2->parent->id}", 3);
193 $row->override($r[
'field'], $r[
'label'], $r2);
196 $row->additional = $additional;
198 trace(print_r($row->additional,
true), 3);
203 if ($this->isRowSelected)
205 $layout =
"selectable_table_row";
206 $subform->isSelected = call_user_func($this->isRowSelected, $item);
213 $subform->containerClass = trim($this->containerClass.
" " . $ret);
225 $this->columnWidths[$field] = $width;
236 $id = $this->
id ? $this->id :
"composite_auto_form";
237 if ($failure ==
null)
239 $failure =
"function() {document.id('{$id}_error').set('text','Failed to communicate with server'); }";
242 $this->ajaxSubmitHandler = $success;
243 $this->ajaxFailureHandler = $failure;
251 if (!count($this->forms))
return;
253 $script = parent::writeScript();
255 $id = $this->
id ? $this->id :
"composite_auto_form";
257 if ($this->onFormChanged) $options =
"onFormChanged: {$this->onFormChanged}";
259 $script .= <<<ENDSCRIPT
260 <script type=
'text/javascript'>
261 window.addEvent(
'domready',
function()
263 document.id(
'{$id}').manager =
new SpreadsheetFormManager(
'{$id}', {{$options}});
268 if ($this->ajaxSubmitHandler && !$this->readOnlyForm)
270 $script .= <<<ENDSCRIPT
272 document.id(
'{$id}').iFrameFormRequest(
274 'onRequest':
function() {
return onCompositeFormSubmit(document.id(
'{$id}')); },
275 'onComplete': {$this->ajaxSubmitHandler},
276 'onFailure': {$this->ajaxFailureHandler}
291 if (!count($this->forms))
297 $id = $this->
id ? $this->id :
"composite_auto_form";
299 echo
"<form id='$id' method='{$this->method}' action='{$this->action}' enctype='multipart/form-data'";
300 echo
" onsubmit='return onCompositeFormSubmit(this);'";
306 $obj =& $form->getData();
307 $pk = $obj->getPrimaryKey();
309 $filter = $obj->getFilter();
310 $fields = $obj->getFields();
313 if ($this->layout->externalErrorBox) $this->layout->errorBox();
315 if ($this->buttons_at_top)
322 if (!$this->layout->externalErrorBox) $this->layout->errorBox();
324 if ($form->markRequiredFields && $form->validator->hasRequiredFields())
326 $this->layout->requiredFields($form->requiredFieldsText);
329 $this->layout->startUngrouped();
332 echo
"<thead><tr>\n";
334 if ($this->isRowSelected)
336 echo
"<th> </th>";
339 if ($this->rowLabelTitle)
341 echo
"<th>{$this->rowLabelTitle}</th>";
344 foreach($fields as $field => $type)
346 if ($field != $pk && !array_key_exists($field, $form->hidden) && !($filter && $filter->isExcluded($field)))
348 $renderer = $form->getRenderer($field);
351 $styles =
"text-align: center;";
352 if(array_key_exists($field, $this->columnWidths))
354 $width = $this->columnWidths[$field];
357 if (is_numeric($width))
359 $styles .=
" width: {$width}px";
363 $styles .=
"width: {$width}";
367 $renderer->_printLabel($field, 1, $styles);
373 foreach($form->additional as $r)
375 $renderer = $r[
'renderer'];
377 $field = $r[
'field'];
379 $field = $renderer->field;
381 if(array_key_exists($field, $form->hidden))
384 $styles =
"text-align: center;";
385 if(array_key_exists($field, $this->columnWidths))
387 $width = $this->columnWidths[$field];
390 if (is_numeric($width))
392 $styles .=
" width: {$width}px";
396 $styles .=
"width: {$width}";
400 $renderer->_printLabel($field, 1, $styles);
403 echo
"</tr></thead>\n";
405 foreach($this->forms as $form)
409 $output = ob_get_contents();
412 $output = preg_replace(
"/\\bname=(['\"])([^'\"]*?)['\"]/",
"name=$1{$form->id}__$2$1", $output);
414 if ($this->rowLabelTitle)
416 $output = preg_replace(
"/<tr id=(.*?)>/",
"<tr id=$1><td>".($form->getData()->format($this->rowLabelFormat)).
"</td>", $output);
424 $this->layout->endUngrouped();
442 foreach($this->forms as $form)
444 if ($this->isRowSelected !=
null)
448 if (!$_POST[$form->id.
"__#selected"])
450 trace(
"SKIPPING {$form->id}", 4);
455 foreach($_POST as $name => $value)
457 if (strpos($name,
"__") ===
false)
459 unset($_POST[$name]);
463 $prefix = $form->id.
"__";
464 $len = strlen($prefix);
466 foreach($_POST as $name => $value)
468 if (!strncmp($name, $prefix, $len))
470 $_POST[substr($name, $len)] = $value;
474 if (is_callable($this->isRowEmpty))
476 if (call_user_func($this->isRowEmpty))
continue;
479 if (!$form->save()) $valid =
false;
493 foreach($this->forms as $form)
495 $obj = $form->getData();
496 $pk = $obj->getPrimaryKey();
500 $name =
"{$form->id}_$pk}";
501 $params .= $sep.urlencode($pk).
"[".urlencode($name).
"]=".urlencode($val);
Field renderer for text data fields.
trace($msg, $lvl=3, $callStack=null)
Send output to the trace log.
appendToQueryString($qs, $params)
Appends the specified parameters to the supplied query string.