Active Record Scaffold Views

Available from Prado versions 3.1b onwards.

Active Record classes can be used together with TScaffoldListView and TScaffoldEditView ( TScaffoldView links both TScaffoldListView and TScaffoldEditView) to create simple Create/Read/Update/Delete (CRUD) web applications.

The scaffold views are intended to assist in prototyping web application, they are not designed to be as customiziable as more complex components such as TDataGrid. The scaffold views provide the following builtin functionality:

  • Listing of all active record items.
  • Searching records.
  • Paging and sorting.
  • Deleting an item.
  • Inserting a new item.
  • Updating an existing item.
  • Validates required fields and basic data types.
  • Presents specialized controls such as date pickers.

Scaffold views are dependent on Active Records and currently supports the following databases: Mysql, Sqlite and Postgres SQL. Support for other databases can be considered when there are sufficient demand.

Setting up a Scaffold View

To use the scaffold view, we first define an Active Record class that represents a table or view in the database. Consider the following Active Record class that corresponds to the users table as defined in the Active Record quickstart page.

class UserRecord extends TActiveRecord
{
    const TABLE='users';
    
    public $username;
    public $email;
}

The scaffold view classes are in the System.Data.ActiveRecord.Scaffold.* namespace. This namespace can be "imported" in the Application Configuration using the application.xml file or through the php code using the Prado::using() method. To start using the TScaffoldView simply set the RecordClass property value equal to an Active Record class name.

<com:TScaffoldView RecordClass="UserRecord" />

The above code will list the current records in the users table. Each record can be edited by clicking on the "edit" button and deleted by clicking on the "delete" button. A new record can be added by clicking on the "Add new record" button, enter some data (notice the automatic validation of required fields and data types), and click the "save" button. Specifying search terms in the search textbox to find particular records. Finally, the record list can be sorted for each column by changing the sorting column and order.

The TScaffoldView is a template control composed of other scaffold controls. The following properties gives access to these composite controls.

  • ListView -- the TScaffoldListView displaying the record list.
  • EditView -- the TScaffoldEditView that renders the inputs for editing and adding records.
  • SearchControl -- the TScaffoldSearch responsible to the search user interface.

All these composite controls can be customized as we shall see below.

TScaffoldListView

A list of Active Records can be displayed using the TScaffoldListView with the following useful properties.

  • Header -- a TRepeater displaying the Active Record property/field names.
  • Sort -- a TDropDownList displaying the combination of properties and its possible ordering.
  • Pager -- a TPager control displaying the links and/or buttons that navigate to different pages in the Active Record data.
  • List -- a TRepeater that renders a row of Active Record data.

Custom rendering of the each Active Record can be achieved by specifying the ItemTemplate and/or AlternatingItemTemplate property of the List repeater. The TScaffoldListView will listen for two command events named "delete" and "edit". A "delete" command will delete a the record for the row where the "delete" command originates. An "edit" command will push the record data to be edited by a TScaffoldEditView with ID specified by the EditViewID property. The following example lists the usernames only with bold formatting.

<com:TScaffoldListView RecordClass="UserRecord" >
    <prop:List.ItemTemplate>
        <strong><%# $this->Data->username %></strong>
    </prop:List.ItemTemplate>
</com:TScaffoldListView>
Info: For the TScaffoldView the list view can be accessed throught the ListView property of a TScaffoldView. Thus, the subproperty ListView.List.ItemTemplate on TScaffoldView is equivalent to the List.ItemTemplate subproperty of TScaffoldListView in the above example.

The SearchCondition property and SearchParameters property (takes array values) can be specified to customize the records to be shown. The SearchCondition will be used as the Condition property of TActiveRecordCriteria and the SearchParameters property corresponds to Parameters property of TActiveRecordCriteria.

TScaffoldEditView

<com:TScaffoldEditView RecordPk="user1" RecordClass="UserRecord" />

Combining list + edit views

<com:TScaffoldEditView ID="edit_view" RecordClass="UserRecord" />
<com:TScaffoldListView EditViewID="edit_view" RecordClass="UserRecord" />

Customizing the TScaffoldView

<com:TScaffoldView RecordClass="UserRecord" >
    <prop:ListView.List.ItemTemplate>
        <%# $this->DataItem->username %>
        <com:TLinkButton Text="Edit" CommandName="edit" />
    </prop:ListView.List.ItemTemplate>
</com:TScaffoldView/>