V1 DataTable System Analysis¶
Reference documentation for the Yii 1.1 DataTable/GridView system used in calServer V1. This serves as architectural reference for the V2 TableMaster implementation.
Widget Class Hierarchy¶
CGridView (Yii base)
TbExtendedGridView (Bootstrap extension)
KTbExtendedGridView (Custom wrapper) <-- Main production widget
TbGroupGridView (Bootstrap with grouping)
KTbGroupGridView (Custom wrapper) <-- Secondary widget for row grouping
Key files:
- httpdocs/protected/components/KTbExtendedGridView.php -- Main grid widget
- httpdocs/protected/components/KTbGroupGridView.php -- Grouped rows variant
- httpdocs/protected/components/KGridViewTrait.php -- Shared trait (DRY)
Column Types¶
| Type | Base Class | Purpose |
|---|---|---|
KTbDataColumn |
TbDataColumn | Standard data display with sort/filter |
TButtonColumn |
TbButtonColumn | Action buttons (View, Edit, Delete, Clone) |
KCCheckBoxColumn |
CCheckBoxColumn | Bulk selection with conditional hiding |
KTbHtmlColumn |
-- | HTML content rendering |
TbEditableColumn |
-- | Inline editing (x-editable) |
Column metadata:
- name -- Attribute for sort/filter
- header -- Display label
- visible -- Initial visibility
- filter -- Dropdown options or boolean for text input
- truncate -- Text truncation length
- tooltip -- Field-level tooltips
Filter System¶
- Filter row below header:
<tr class="filters"> - Wildcard support:
*(multi-char),?(single-char), e.g.Fluke*,*179 - Exact match toggle via
{field}_exactparameter - Dropdown filters with dynamic population from model
- Filter reset button in nav bar
- Hidden filter fields preserved across AJAX requests
Paging & Sorting¶
Paging:
- Configurable page sizes via FrontendUser::getPageSizes() (dropdown)
- Default: 10 per page, user-customizable
- "All" option with modal confirmation for large datasets
- Summary: "Displaying {start}-{end} of {count} results"
Sorting: - Column header click toggles sort direction - Caret indicator for sort direction - Sort state preserved across filter/page changes
Column Chooser (EColumnsDialog)¶
Core: httpdocs/protected/extensions/ecolumns/EColumns.php (900+ lines)
Features:
- jQuery UI Sortable for column reordering
- Checkbox-based visibility toggle
- Fixed left/right columns (not reorderable), e.g. ['CCheckBoxColumn']
- Search field (appears when >14 columns)
- Apply/Reset/Cancel buttons
Storage options:
- session -- Per-session (default), per-role, per-grid variant
- cookie -- 100-day persistence
- db -- Database table tbl_columns
Cache key: User_{userId}_Language_{lang}_{controllerId}_Ecolumns_{gridId}
Action Buttons¶
Built via GridColumnsHelper:
- buildViewButton() -- Detail view link
- buildUpdateButton() -- Edit form link
- buildDeleteButton($gridViewId) -- Confirmation modal delete
- buildCloneButton() -- Record duplication
- buildReportButton() -- Report viewer
- buildDccButton() -- XML validation report
- buildDefaultActionColumn() -- Permission-aware combined action column
Template format: '{view} {update} {delete}'
Bulk Actions¶
Widget: KTbBulkActions
Setup via GridViewHelper::buildBulkActions($pkName, $checkboxName, $buttons):
- Multi-delete with confirmation modal
- Custom bulk actions configurable
- Checkbox change handler auto-registered
Helper Classes¶
GridViewHelper (simplifies 180+ _admin.php files):
- renderGrid($view, $config) -- Main entry with defaults
- renderGroupedGrid($view, $config) -- Grouping variant
- buildMultiDeleteButton($gridViewId, $deleteUrl)
- Layout helpers: beginGridLayout() / endGridLayout()
GridColumnsHelper (simplifies 176+ _columns.php files):
- renderColumnsDialog($view, $config) -- EColumnsDialog factory
- All column button builders (see Action Buttons above)
- buildActionColumn($buttons, $template, $htmlOptions)
Grid Statistics (V1)¶
- 92 KTbExtendedGridView instances in frontend views
- 218 GridViewHelper usages
- Largest modules: frontendInventory (60+), frontendCalibration (20+), frontendCustomer (10+)
Data Binding¶
Standard pattern: CActiveDataProvider with CDbCriteria
- Pagination, sorting, filtering delegated to provider
- Eager loading via with() relations
- AJAX grid update: jQuery yiiGridView plugin handles partial HTML refresh