offsite-solutions / tholos
Tholos Framework
Package info
github.com/offsite-solutions/Tholos
Language:JavaScript
pkg:composer/offsite-solutions/tholos
Requires
- php: >=8.4
- ext-bcmath: *
- ext-curl: *
- ext-json: *
- ext-mbstring: *
- ext-openssl: *
- ext-pcntl: *
- ext-redis: *
- ext-simplexml: *
- ext-zip: *
- azurre/php-array-xml-converter: 0.5.1
- mpdf/mpdf: 8.2.6
- offsite-solutions/eisodos: @dev
- phpoffice/phpspreadsheet: 1.30.0
README
Tholos is a PHP component-based GUI framework built on top of the Eisodos framework. It provides a server-rendered, database-driven component architecture for building HTML applications with AJAX capabilities, PDF generation, role-based access control, and data caching.
Applications are designed visually using TholosBuilder (a companion web app) and compiled into .tcd (Tholos Component Definition) cache files that the Tholos runtime loads and renders.
Requirements
- PHP >= 8.4
- Eisodos framework (
offsite-solutions/eisodos) - Database: Oracle or PostgreSQL (via Eisodos connectors)
- Redis (optional, for caching)
- Extensions: json, mbstring, bcmath, pcntl, simplexml, zip, openssl, curl, redis
Installation
# Production composer install --no-interaction --prefer-dist --no-dev --no-ansi --optimize-autoloader # Development (symlinks Eisodos from ../../_eisodos/Base) COMPOSER=composer.dev.json composer update --no-interaction --prefer-dist --no-dev --no-ansi --optimize-autoloader
Architecture Overview
Bootstrap Chain
Tholos::init()
+-- TholosLogger::init()
+-- TholosApplication::init()
+-- Load _tholos.init (component types, type index, component index)
+-- Load .tcd files (component definitions for current route)
+-- Instantiate TApplication (mandatory root)
+-- Instantiate TRoleManager (optional)
+-- Resolve TRoute from tholos_route parameter
+-- Resolve TAction from tholos_action parameter (default: 'index')
+-- Instantiate all components in creation order
+-- initComponents() -- calls init() on every component
+-- autoOpen() -- runs TDataProviders with AutoOpenAllowed=true
+-- render() -- walks the component tree, returns HTML
+-- Finalize response (HTML, JSON, PDF, XML, etc.)
Access singletons via Tholos::$app (TholosApplication) and Tholos::$logger (TholosLogger).
Application Structure
Every Tholos application follows this component hierarchy:
TApplication
+-- TRoleManager (optional, access control)
+-- TPage / TPDFPage (layout templates)
+-- TDataProxy (optional, remote server calls)
+-- TPAdES (optional, digital signatures)
+-- TRoute (one per logical route)
+-- TAction (one or more per route)
| +-- TTemplate / TContainer / TForm / TModal / ...
| +-- TConfirmDialog
| +-- TFileProcessor
+-- TStoredProcedure / TQuery / TQueryGroup
+-- TExternalDataProvider / TAPIPost
Request Flow
- Route Resolution --
tholos_routeparameter selects theTRoutecomponent - Action Resolution --
tholos_actionparameter selects theTAction(default:index) - Initialization -- all components'
init()is called; TRoute optionally runsInitSessionProvider - Auto-Open -- TDataProviders with
AutoOpenAllowed=trueexecute their queries/procedures - Rendering -- recursive tree walk: each component's
render()returns HTML; children are rendered first, their output passed as$contentto the parent - Response -- output finalized based on TAction's
ResponseTypeproperty
Component System
All components extend TComponent. Components are defined in TholosBuilder and compiled into .tcd files. At runtime, TholosApplication loads these definitions, instantiates the PHP classes, and calls their lifecycle methods.
Component Lifecycle
Constructor (properties and events loaded from .tcd)
|
v
init()
+-- Set runtime properties
+-- Fire onAfterInit event
|
v
render(sender, content)
+-- checkRole() -- verify FunctionCode access
+-- Fire onBeforeRender event
+-- generateProps() -- populate prop_* template parameters
+-- generateEvents() -- populate event_* parameters, fire PHP events
+-- Eisodos template engine renders the component template
+-- Fire onAfterRender event
+-- Return HTML string
Properties
Each component has typed properties defined in TholosBuilder:
| Type | Description |
|---|---|
STRING |
Plain string value |
NUMBER |
Numeric value |
BOOLEAN |
true/false (configurable via Tholos.BoolTrue / Tholos.BoolFalse) |
TEXT |
Multi-line text |
JSON |
JSON structure |
ARRAY |
Array value |
TEMPLATE |
Eisodos template name |
PARAMETER |
Reference to an Eisodos parameter (resolved via $parameterHandler->getParam()) |
COMPONENT |
Reference to another component by ID |
Properties are accessed via $component->getProperty('Name', $default) which automatically parses dynamic expressions.
Property Expression Language
Property values support a dynamic expression syntax that is resolved at runtime:
Reference expressions (@)
| Syntax | Resolves to |
|---|---|
@this.PropertyName |
This component's own property |
@parent.PropertyName |
Parent component's property |
@route.PropertyName |
Current route's property |
@ComponentName.PropertyName |
Named sibling component's property |
@(ComponentType).PropertyName |
First parent of the given type |
@(>ComponentType).PropertyName |
First child of the given type |
@(parameter).ParamName |
Eisodos parameter value |
Defaults (|) -- cascading fallback chain:
@(parameter).Tholos.TGrid.Scrollable|false
If the parameter doesn't exist, the value false is used. Multiple defaults can be chained: @comp.prop|@other.prop|literal.
Concatenation (++) -- joins multiple expressions:
@this.Name++_++@(parameter).Suffix
Chained property access (.) -- navigate through COMPONENT-type properties:
@MyDataProvider.DBField.Value
If DBField is a COMPONENT property, it resolves to that component, then reads Value from it.
Callback (%) -- calls a template callback function:
%callback_function_name
Events
Components define two types of events:
PHP Events (type=PHP) -- server-side, called during rendering:
- Referenced as
Application\EventClass::methodName - Called via
Tholos::$app->eventHandler($component, 'eventName') - The handler receives the sender component and can modify properties/response
- Common:
onBeforeRender,onAfterRender,onAfterInit,onBeforeCreate
GUI Events (type=GUI) -- client-side JavaScript:
- Value is a JavaScript function call or component method reference
- Rendered into the HTML template as
event_eventnameparameters - Client-side dispatch:
Tholos.eventHandler(senderID, targetID, componentType, methodName, routePath, eventData, userParameters)
Role-Based Access Control
TRoleManager (optional child of TApplication) controls access:
- Each component can set a
FunctionCodeproperty - At render time,
checkRole()verifies the current user has that function code - Use
#as FunctionCode to require login without a specific role - CSRF protection: enabled via
CSRFEnabled, token incsrf_token_valueparameter, header name incsrf_header_name
Component Reference
For the full, detailed component type reference (all properties, events, methods, inheritance, and parent constraints), see:
docs/Tholos_Component_Types.md
Below is a functional overview of each component category.
Layout & Structure
| Component | Description |
|---|---|
TAction |
Defines an action within a route. ResponseType controls output format: HTML, JSON, JSONDATA, PLAINTEXT, XML, PDF, NONE. References a TPage for layout. |
TPage |
HTML page layout wrapper. Renders its Template property via Eisodos template engine. |
TTemplate |
Renders an Eisodos template by name (from Template property). |
TContainer |
Generic HTML container. ContainerType property sets the tag (div, span, section, etc.). |
TCell |
Table cell container. |
TColumn |
Column-based layout container. |
TFormContainer |
Groups form controls visually. |
TWidget |
Panel/card container with optional header. |
TModal |
Bootstrap modal dialog. |
TPartial |
Renders content and stores it in a named parameter (ParameterName) instead of outputting HTML. Supports Cacheable mode. |
TDocumentTitle |
Sets the HTML <title>. |
TJSLib |
Includes JavaScript/CSS files via head or foot items. |
Navigation & Routing
| Component | Description |
|---|---|
TRoute |
Represents a route. Matched by tholos_route parameter. Can run InitSessionProvider on init. PersistentSession controls session persistence. |
TAction |
Action within a route. Matched by tholos_action parameter (default: index). HTTPMethod constrains allowed methods (GET, POST, etc.). |
TConfirmDialog |
Confirmation dialog with configurable buttons (OK, Cancel, Yes, No, Custom). |
TConfirmButton |
Button within a TConfirmDialog. |
Form Controls
All form controls extend TFormControl which extends TControl. Common properties: DBField (data binding), Value, Label, LabelSize, ControlSize, Placeholder, Readonly, Required, Visible, Enabled.
| Component | Description |
|---|---|
TForm |
HTML <form> wrapper. Properties: URL, Method, Target, Validator, ValidateOnInit. Events: onBeforeSubmit, onSubmitSuccess, onSubmitError, onValidateSuccess, onValidateError, onSuccessAlert, onErrorAlert, onCancel. |
TEdit |
Text input (<input>). Properties: HTMLInputType (text, password, email, etc.), MaxLength, Autocomplete. Event: onEnterKeyPressed. |
TCheckbox |
Checkbox control. Properties: CheckedValue, UncheckedValue. |
TRadio |
Radio button group. Child TRadio.item entries define options. |
TDateTimePicker |
Date/time picker (Tempus Dominus). Properties: DateFormat, DateFormatParameter. |
TLOV |
List of Values -- dropdown/autocomplete. Properties: LOVSource (data provider), AjaxURL for remote search, Multiple. Child TLOVParameter for parameters. |
TFileUpload |
File upload control. |
TText |
Multi-line textarea. |
THTMLEdit |
Rich text editor (RichTextEditor). |
TStatic |
Read-only display value. |
TLabel |
Label element. |
THidden |
Hidden input field. |
TImage |
Image display. |
TLink |
Hyperlink. |
TButton |
Button with click event. |
TButtonDropdown |
Dropdown button with menu items. |
Data Layer
| Component | Description |
|---|---|
TDataProvider |
Abstract base for all data sources. Properties: AutoOpenAllowed, Result, RowCount, TotalRowCount, Success, DatabaseIndex, DataProxy, Caching. |
TQuery |
SQL SELECT query. Properties: sql (with :columns, :orderby, :filter placeholders), Filter, orderby, Offset, RowsPerPage, CountTotalRows, CacheValidity, PartitionedBy. |
TStoredProcedure |
Database stored procedure call. Properties: Procedure, TransactionMode, GenerateDataResult, ErrorCodeParameter, ErrorMessageParameter, CallbackParameter. |
TQueryGroup |
Groups multiple queries to execute together. |
TExternalDataProvider |
Fetches data from an external HTTP endpoint. |
TJSONDataProvider |
Parses JSON data sources. |
TAPIPost |
Extends TStoredProcedure for HTTP API calls. Properties: URL, URLPath, HTTPRequestMethod. TDBParam children serialized to JSON body. |
TDBField |
Maps a database field to a component value. Properties: FieldName, Value, DBValue, DataType (string, integer, float, date, datetime, time, bool, JSON), NullResultParameter, ParseValue. Event: onSetValue (can modify value). |
TDBParam |
Stored procedure parameter binding. Properties: ParameterName, ParameterMode (IN/OUT/INOUT), MDB2DataType, Value, DefaultValue, ParameterNameTransformation. |
TDataProxy |
Proxies data calls to a remote server via HTTP. Properties: URL, HTTPRequestMethod, AJAXMode, TimeOut. Child TDataProxyParameter components define request parameters. |
TQueryFilter |
Adds WHERE conditions to a TQuery. Properties: FieldName, Relation (=, <>, <, >, LIKE, IN, BETWEEN), Value, FilterGroupParameter. |
TQueryFilterGroup |
Groups TQueryFilters with AND/OR logic. |
TDPOpen |
Triggers opening of a referenced data provider. |
Grid System
TGrid renders tabular data with filtering, sorting, pagination, transposing, and Excel/chart export.
Key TGrid Properties:
| Property | Description |
|---|---|
ListSource |
Component reference to TDataProvider |
RowsPerPage |
Rows per page (0 = no pagination) |
ActivePage |
Current page (1-based) |
SortedBy |
Component reference to the currently sorted TGridColumn |
SortingDirection |
ASC or DESC |
Scrollable |
Horizontal scrolling (boolean) |
ScrollableY |
Vertical scrolling (boolean) |
Selectable |
Row selection enabled (boolean) |
Transposed |
Transpose rows/columns (boolean) |
GridHTMLType |
table or div rendering mode |
UUID |
Unique ID for persistent state |
Persistent |
Session key for saving grid state |
MasterValue |
Filter value for master-detail relationships |
ViewMode |
GRID or CHART |
ShowRefreshButton |
Show refresh button (boolean) |
ShowScrollCheckbox |
Show scroll toggle (boolean) |
ShowTransposeCheckbox |
Show transpose toggle (boolean) |
Grid Child Components:
| Component | Description |
|---|---|
TGridColumn |
Column definition. Properties: DBField, Header, Sortable, SortingDirection, GridFilter, MarkChanges. |
TGridFilter |
Column filter definition. Properties: DefaultRelation, Value, Name. |
TGridRow |
Row template definition. |
TGridRowActions |
Row-level action buttons container. |
TGridParameter |
Additional grid parameters. |
Grid Filtering (client-side):
Filters are submitted as parameters in the format gridname_f_N=columnname:relation:value (slots 1-99). Relations: =, <>, <, >, <=, >=, LIKE, IN, BETWEEN.
Grid AJAX Refresh:
TGrid_submit(sender, target, urldata) posts form data to the action URL, receives {html: "..."} JSON, and replaces the grid DOM. Emits masterDataChange for detail grids.
Composite Components
| Component | Description |
|---|---|
TWizard |
Multi-step wizard. Property: ActiveStep. Child TWizardStep components define steps with StepNumber, Title. Events: onBeforeStep, onAfterStep. |
TTabs |
Tabbed interface. Property: DefaultTabPane. Child TTabPane components with Name and Title. Event: onTabChange. |
TIterator |
Loop component. Properties: ListSource, JSONSource. For each row in the data source, renders all children with propagated field values. Event: onZeroResult. selfRenderer=true. |
TLinkedComponent |
Delegates rendering to a referenced Component. |
TTimer |
Client-side timer. |
TWorkflow / TWorkflowStep |
Workflow state machine. |
Map Components
| Component | Description |
|---|---|
TMap |
Google Maps integration. Properties: APIKey, Latitude, Longitude, Zoom, Width, Height. |
TMapSource |
Map data marker. Properties: Latitude, Longitude, Title, InfoWindow. |
PDF & Signatures
| Component | Description |
|---|---|
TPDFPage |
PDF rendering via mPDF. Properties: Template, HeaderContainerName, FooterContainerName, BodyContainerName, CSSFile, Watermark, PDFConfig (JSON mPDF config). Uses %%PARAMETER token syntax for substitution. |
TPAdES |
PAdES digital signatures. Properties: CertificatePath, CertificatePassword, Reason, Location, ContactInfo. Method: signPDF(). |
Parameters
| Component | Description |
|---|---|
TParameter |
Base parameter component. |
TGlobalParameter |
Sets a global Eisodos parameter. |
TDataParameter |
Data-bound parameter. |
TDataProxyParameter |
Parameter for TDataProxy requests. |
TAPIParameter |
Parameter for TExternalDataProvider. |
TLOVParameter |
Parameter for TLOV data source. |
Template System
Templates are located in assets/templates/tholos/ and processed by the Eisodos template engine.
Naming Convention
| Pattern | Purpose |
|---|---|
ComponentType.main.template |
Default render template |
ComponentType.partial.ID.template |
Partial render (head, foot, row, etc.) |
ComponentType.init.head.template |
HTML head items (CSS, JS includes) |
ComponentType.init.foot.template |
HTML foot items (scripts) |
Template Variables
Every component's generateProps() makes these available to templates:
$prop_*-- all component properties (lowercased name)$prop_ID-- full element ID:{renderID}_{Name}(e.g.,TRI8a3f_btnSave)$prop_name-- component name$prop_componenttype-- component type name$prop_datavalues-- generateddata-*HTML attributes$prop_route-- route/action path$prop_parent_name/$prop_parent_id-- parent info$content-- rendered child content$sender-- sender component name$Tholos_renderID-- current render ID$Tholos_nonce-- CSP nonce for inline scripts
Template Syntax
## Comment line (stripped from output) $variable_name <!-- Variable substitution --> $variable~='default'; <!-- Variable with default value --> $templateabs_path__name <!-- Include another template (/ replaced with __) --> <!-- Callback function (short form) --> [%_function_name=Tholos\TholosCallback::_eqs;param=prop_visible;value=true;false=hidden;true=</>%] <!-- Callback function (block form) --> <%FUNC% _function_name=Tholos\TholosCallback::_eqs param=prop_readonly value=true true=readonly="readonly" false=</> %FUNC%>
Built-in Callback Functions (TholosCallback)
| Function | Parameters | Description |
|---|---|---|
_eq |
param, value, true, false | If parameter equals value, render true template; else false template |
_eqs |
param, value, true, false | Same as _eq but returns strings instead of rendering templates |
_neq |
param, value, true, false | Not-equals version of _eq |
_neqs |
param, value, true, false | Not-equals version of _eqs |
_case |
param, case1..N, else | Switch/case rendering templates |
_cases |
param, case1..N, else | Switch/case returning strings |
_safehtml |
param | HTML-safe output with <pre> wrapping for newlines |
_trim |
value | Trim whitespace |
_param2 |
param | Double parameter resolution |
_listToOptions |
separator, options, selected | Generates <option> tags from delimited list |
_generateListValues |
component_id | Generates TLOV/TRadio option markup |
Base Template Fragments
These fragments are included by most component templates:
TComponent.properties-- renders<input type="hidden" data-*>for component dataTComponent.basedata-- generatesstyleanddata-*attributes (handles visibility)TComponent.labelicon-- renders label with optional iconTFormControl.labelsize/TFormControl.controlsize-- Bootstrap column classesTControl.baseevents-- standard control event scriptsTControl.customevents-- custom event binding scriptsTControl.helpblock-- validation/help text blockTContainer.baseevents-- container event scripts
Client-Side JavaScript API
TholosApplication.js
The global Tholos object provides the client-side framework:
Core Methods:
// Event dispatch -- the central client-side mechanism Tholos.eventHandler(senderID, targetID, componentType, methodName, routePath, eventData, userParameters) // Post-submission handler (called after AJAX form submit) Tholos.action(success, sender, target) // Data access Tholos.getData(target) // Get jQuery data object Tholos.setData(target, key, value) Tholos.getObject(target) // Get jQuery element Tholos.getComponentType(target) // UI Tholos.pageLoader(show, animate) // Loading indicator Tholos.showHelp(helpIndex) // Context help popup // Utilities Tholos.EncodeQueryData(data) // URL-encode object Tholos.trace(msg, sender, target, eventData) Tholos.debug(msg, sender, target, eventData)
Component Methods (called via eventHandler):
| Method | Description |
|---|---|
TAction_navigate(sender, target, route, eventData) |
Navigate to a route. Middle-click opens new window. |
TControl_getValue(sender, target) |
Get control's current value |
TControl_setLabel(sender, target, eventData) |
Update label text |
TControl_setRequired(sender, target, eventData) |
Set required attribute |
TControl_setVisible(sender, target, eventData) |
Show/hide control |
TControl_getVisible(sender, target) |
Get visibility state |
TFormControl_setVisible(sender, target, eventData) |
Show/hide form row |
TForm_setEnabled(sender, target, eventData) |
Enable/disable entire form |
TComponent_setEnabled(sender, target, eventData) |
Enable/disable component |
TComponent_setDataParameters(sender, target, route, eventData) |
Update data-* attributes |
TLOV_getValue(sender, target) |
Get LOV selected value(s) |
TCheckbox_getValue(sender, target) |
Get checkbox state |
TRadio_getValue(sender, target) |
Get selected radio value |
TRadio_setEnabled(sender, target, eventData) |
Enable/disable radio group |
TGrid_submit(sender, target, urldata) |
AJAX grid refresh |
TGrid_getValue(sender, target) |
Get selected row value |
TGrid_getFilterSQL(sender, target) |
Get current filter SQL |
TGrid_setVisible(sender, target, eventData) |
Show/hide grid |
TGrid_changeViewMode(formId, viewMode) |
Switch GRID/CHART |
TGrid.js
Grid-specific functions:
TGrid_submit(sender, target, urldata) // AJAX refresh, updates DOM, emits masterDataChange TGrid_parseChartData(formId, data) // Convert grid data to Chart.js format TGrid_reloadPreviousState(formId) // Restore saved grid state
Grid Events (jQuery custom events):
masterDataChange-- emitted when master grid selection changes (for detail grids)masterRefresh-- emitted when master grid refreshesonAfterRefresh-- triggered after grid AJAX refresh completesleavingChartTab-- triggered when switching from chart to grid view
Client-Side Libraries
- jQuery + jQuery UI
- Bootstrap 5
- Select2 (dropdown/autocomplete)
- Tempus Dominus (date/time picker)
- Chart.js (grid chart view)
- jQuery Resizable Columns (grid column resize)
- jQuery AJAXQ (request queuing)
- RichTextEditor (THTMLEdit)
Response Types
TAction's ResponseType property determines how the rendered output is delivered:
| Type | Content-Type | Description |
|---|---|---|
HTML |
text/html | Full HTML5 page |
HTMLSnippet |
text/html | Partial HTML (for AJAX loaders) |
JSON |
application/json | {success, errormsg, errorcode, html, callback, data} |
JSONDATA |
application/json | Raw JSON data |
XML |
application/xml | XML output |
PLAINTEXT |
text/plain | Plain text |
PDF |
application/pdf | PDF via mPDF (requires TPDFPage) |
BINARY |
varies | File download |
PROXY |
varies | Proxied response from TDataProxy |
CUSTOM |
varies | Custom response handling |
NONE |
-- | No output (side-effects only) |
Caching System
Tholos supports three caching backends configured via Tholos.CacheMethod:
| Backend | Setting | Description |
|---|---|---|
| File | file |
JSON cache files in Tholos.CacheDir |
| Redis | redis |
Redis server at Tholos.CacheServer:Tholos.CachePort |
| Memory | memory |
PHP session-scoped parameters |
Cache Scope
- Private -- scoped to the current session (file prefix:
{sessionID}_{cacheID}) - Global -- shared across sessions
TQuery Caching
Set on TQuery via Caching property:
| Mode | Description |
|---|---|
Disabled |
No caching |
Enabled |
Cache entire result set |
Partitioned |
Cache by PartitionedBy field value |
CacheValidity sets lifetime in minutes. CacheSQLConflict controls behavior when cached SQL doesn't match current query: ReadCache, RewriteCache, or DisableCaching.
Cache File Structure
{prefix}_{cacheID}.cache-- cached data (JSON){prefix}_{cacheID}.index-- metadata (partition, validity, SQL hash, item count){prefix}_{cacheID}@{partition}.cache-- partitioned cache segment
Configuration Parameters
Key Eisodos parameters used by Tholos (typically set in application config):
Application
| Parameter | Description |
|---|---|
Tholos.ApplicationCacheDir |
Directory for compiled .tcd files |
Tholos.AccessLog |
Access log file path |
Tholos.AccessLog.Format |
Log format (use % as variable prefix) |
Caching
| Parameter | Default | Description |
|---|---|---|
Tholos.CacheDir |
Cache files directory | |
Tholos.CacheMethod |
file |
file, redis, or memory |
Tholos.CacheServer |
localhost |
Redis host |
Tholos.CachePort |
6379 |
Redis port |
Tholos.CacheTimeout |
0.0 |
Redis connection timeout |
Tholos.CacheLockWait |
100 |
File lock wait (microseconds) |
Tholos.CacheLockLoop |
20 |
Max lock retry attempts |
Boolean Handling
| Parameter | Default | Description |
|---|---|---|
Tholos.BoolFalse |
false,f,n,0 |
Comma-separated values treated as false |
Tholos.BoolTrue |
true,t,y,1,* |
Comma-separated values treated as true |
| Parameter | Description |
|---|---|
Tholos.mPDF |
JSON mPDF configuration |
Security
| Parameter | Description |
|---|---|
Tholos.CSPEnabled |
Enable Content Security Policy headers |
Tholos.CSPJavascriptHosts |
CSP script-src allowed hosts |
Tholos.CSPFontHosts |
CSP font-src allowed hosts |
Tholos.nonce |
CSP nonce (auto-generated if empty) |
Debugging
| Parameter | Description |
|---|---|
Tholos.debugLevel |
Server-side debug verbosity |
Tholos.debugToFile |
Debug log path (tokens: SESSIONID, TIME) |
Tholos.debugToUrl |
Remote debug endpoint |
Tholos.JSDebugLevel |
Client-side JavaScript debug level |
Grid Defaults
| Parameter | Description |
|---|---|
Tholos.TGrid.Scrollable |
Default horizontal scroll for all grids |
Tholos.TGrid.RowsPerPage |
Default rows per page |
TholosBuilder
TholosBuilder is a companion web application used to visually design Tholos applications. It provides:
- Visual Component Tree -- JSTree-based hierarchy editor for building component structures
- Property Editor -- type-aware property editing with validation
- Event Editor -- configure PHP and GUI event handlers with method references
- Wizards -- auto-generate common patterns:
- Query Wizard -- creates TQuery + TDBFields from a SELECT statement
- Stored Procedure Wizard -- creates TStoredProcedure + TDBParams from procedure signature
- Grid Wizard -- creates TGrid + TGridColumns from a data source
- Edit Form Wizard -- creates TForm + form controls from field definitions
- Compilation -- compiles the component tree into
.tcdcache files and_tholos.init - Version Control -- task-based change tracking with user assignment
Compilation Output
The compiler (compile2()) generates:
-
_tholos.init-- PHP file containing:$this->componentTypes[]-- type definitions with inheritance$this->componentTypeIndex[]-- type ID to class path mapping$this->componentIndex[]-- component ID to metadata mapping
-
{RouteName}.tcd-- PHP file per route containing:$this->componentDefinitions[]-- array keyed by component ID with:pid-- parent IDh-- type hierarchy path (e.g.,TStoredProcedure.TDataProvider.TComponent)o-- component namep-- JSON-encoded properties ({n, t, v, c, d})e-- JSON-encoded events ({n, t, v, m, p, c, i, a})
-
{RouteName}.tcs-- human-readable source representation (for version control)
Naming Conventions
- All PHP component classes are prefixed with
T(e.g.,TComponent,TGrid,TAction) - Constructor parameters use trailing underscore:
$componentType_,$id_,$parent_id_ - Component property and event keys are lowercased internally
- Element IDs in rendered HTML:
{renderID}_{ComponentName}(e.g.,TRI8a3f_btnSave) - Component definitions use compact JSON keys:
n(name),t(type),v(value),c(component_id),d(nodata) - Template files follow:
ComponentType.purpose.templatepattern - Grid filter parameters:
gridname_f_N(N = 1-99) - Grid state parameters:
TGrid_PropertyName_prefix