Ferreteria/v2/usage/forms/creating

From Woozle Writes Code
< Ferreteria‎ | v2‎ | usage‎ | forms
Jump to navigation Jump to search

How to create a form for editing record-based data:

from Template:Vbzcart/code (function PageForm()): <php> $oForm = new fcForm_DB($this); $oField = new fcFormField_<type>($oForm,'<field name>'); $oCtrl = new fcFormControl_HTML[_<type>]($oField,array(<HTML attributes>)); </php> The first line creates a Form object, the next line creates a Field, and the third line assigns a Control to the Field. Adding additional fields and controls follows the format of the last 2 lines.

Recent changes:

  • There is now also a Storage object (in addition to the Control object) for each Field (aka Native) object, but you don't need to create it (see next note).
  • Creating the Control object for each Field is now also optional; each Field (aka "native object") now has default Control and Storage classes which it instantiates when needed. You can access them via $oField->ControlObject() and $oField->StorageObject() respectively.

Fields and Controls

Field types (Template:Ferreteria/code):

  • fcFormField_Text
  • fcFormField_Num
  • fcFormField_Time
    • ->Format(<date format>)

Control types (Template:Ferreteria/code):

  • fcFormControl_HTML - generic single-line text-editing field
  • fcFormControl_HTML_TextArea - multiline text
    • attributes: rows, cols
  • fcFormControl_HTML_Hidden - hidden values
  • fcFormControl_HTML_DropDown - drop-down chooser
    • ->Records(<dataset>);
  • fcFormControl_HTML_CheckBox - checkbox
  • fcFormControl_HTML_Timestamp - time/date
    • ->Format(<string>);

Automatic Values

In some cases, you want to set field values from code. This can include either forcing a value (user cannot edit it), or suggesting a default value which the user can edit or ignore.

  • To force a value (these can be done in either order):
    • Set the control to non-editable: [control]->Editable(FALSE);
    • Set the field value: [field]->SetValue(<value>);
    • If you only want to set the value for new or non-new records (e.g. to set a WhenCreated or WhenEdited timestamp), you can put those lines inside a if ($this->IsNew()) or if (!$this->IsNew()) clause.
  • To suggest a default value that can be edited (this has not been tested):
    • [field]->SetDefault(<value>);

Examples

General: <php>// set a default value for new records $oField->SetDefaultNative($this->TitleID());</php> Timestamp: <php> $oField = new fcFormField_Time($oForm,'WhenEnt'); $oCtrl = new fcFormControl_HTML_Timestamp($oField,array('size'=>10)); $oCtrl->Format('m/Y'); </php> This sets the format of the Control for the "WhenEnt" field based on the parameter string used by the PHP date() function – in this case, just the month (2 digits) and year (4 digits) are displayed.

Dropdown selector: <php> $oField = new fcFormField_Num($oForm,'ID_Place'); $oCtrl = new fcFormControl_HTML_DropDown($oField,array()); $oCtrl->Records($this->PlaceTable()->GetData_forDropDown()); </php>

TextArea: <php>$oCtrl = new fcFormControl_HTML_TextArea($oField,array('rows'=>3,'cols'=>60));</php>

Other Elements

See "displaying" for the care and feeding of form templates.