Zum Inhalt

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}_exact parameter
  • 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