locomotivemtl / charcoal-ui
UI tools (Dashboard, Layout, Form and Menu)
Installs: 15 923
Dependents: 1
Suggesters: 0
Security: 0
Stars: 3
Watchers: 8
Forks: 2
Open Issues: 0
pkg:composer/locomotivemtl/charcoal-ui
Requires
- php: >7.1
- locomotivemtl/charcoal-config: ~0.10
- locomotivemtl/charcoal-factory: ~0.4
- locomotivemtl/charcoal-translator: ~0.3
- locomotivemtl/charcoal-user: ~0.6
- locomotivemtl/charcoal-view: ~0.4
- psr/log: ^1.0
Requires (Dev)
- mustache/mustache: ^2.11
- php-coveralls/php-coveralls: ^2.2
- phpunit/phpunit: ^7.5
- pimple/pimple: ^3.0
- squizlabs/php_codesniffer: ^3.3
- tedivm/stash: ~0.14
Suggests
- pimple/pimple: DI Container to register the various Service Providers.
- dev-master / 0.3.x-dev
- 0.3.13.1
- 0.3.13
- 0.3.12
- 0.3.11
- 0.3.10.1
- 0.3.10
- 0.3.9
- 0.3.8.2
- 0.3.8.1
- 0.3.8
- 0.3.7
- 0.3.6
- 0.3.5
- 0.3.4
- 0.3.3
- 0.3.2
- 0.3.1
- 0.3
- 0.2.10
- 0.2.9
- 0.2.8
- 0.2.7
- 0.2.6
- 0.2.5
- 0.2.4
- 0.2.3
- 0.2.2
- 0.2.1
- 0.2
- 0.1.5
- 0.1.4
- 0.1.3
- 0.1.2
- 0.1.1
- 0.1
- dev-feature/camelizePropertiesAndUseArrayAccess
- dev-acl-manager-refactor
- dev-mcaskill-patch-view
- dev-mcaskill-form-view
- dev-mcaskill-labeller
This package is auto-updated.
Last update: 2025-11-07 02:24:36 UTC
README
The Charcoal\Ui module provides tools to create UI elements (dashboards, layouts, forms and menus) from simple metadata / config.
Table of contents
- How to install
- Base UI Item
- Dashboard
- Layout
- Form
- Form Group
- Form Input
- Menu
- Menu Item
- Service Providers
- Development
How to install
The preferred (and only supported) way of installing charcoal-ui is with composer:
$ composer require locomotivemtl/charcoal-ui
Dependencies
- PHP 7.1+
psr/log- A PSR-3 compliant logger should be provided to the various services / classes.
locomotivemtl/charcoal-config0.6+- The UI objects are configurable with various configs.
locomotivemtl/charcoal-translation- To provide l10n to the UI objects.
locomotivemtl/charcoal-view0.1+- The base
UiItemareViewable, meaning they can be rendered with aView.
- The base
Example Usage
Form
use Charcoal\Config\GenericMetadata; use Charcoal\Ui\Form\FormBuilder; use Charcoal\Ui\Form\FormFactory; $metadata = new GenericMetadata([ 'properties' => [ 'first_name' => [ 'type' => 'string', ], 'last_name' => [ 'type' => 'string', ], 'email' => [ 'type' => 'email', ], ], ]); $formData = [ 'first_name' => 'Mathieu', 'last_name' => 'Ducharme', 'email' => 'mat@locomotive.ca', ]; $formConfig = [ 'type' => 'charcoal/ui/form/generic' 'template_ident' => 'foo/bar/form', 'template_data' => [], 'label' => 'Example Form', 'groups' => [ 'info' => [ 'layout' => [ 'structure' => [ 'columns' => [ [ 1, 1 ], [ 1 ], ], ], ], 'properties' => [ 'first_name', 'last_name', 'email', ], ], ], ]; $formBuilder = new FormBuilder([ 'form_factory' => new FormFactory(), 'view' => $container['view'], ]); $form = $formBuilder->build($formConfig); $form->setMetadata($metadata); $form->setFormData($formData); echo $form->render();
Base UI Item
All UI classes implements the same basic class: \Charcoal\Ui\UiItemInterface. This interface defines a basic set of properties that are shared across (almost) all ui item types.
Base UI Item config
| Key | Type | Default | Description |
|---|---|---|---|
| type | string |
||
| title | string[1] |
||
| subtitle | string[1] |
||
| description | string[1] |
||
| notes | string[1] |
||
| template_ident | string |
'' |
The default view template. |
[1] indicates a l10n string (TranslationString)
View Integration
The UiItemInterface is a Viewable item; that means it also implements the \Charcoal\View\ViewableInterface. The AbstractUiItem fully implements this interface by using \Charcoal\View\ViewableTrait.
Viewable objects can set a View object with setView($view) have a template_ident (which can be set with setTemplateIdent($id)). See the charcoal-view module for details.
The easiest way to use a View is by setting a ViewInterface object as view service on a DI container / Service Provider.
Dashboard
Dashboards define a layout of widgets.
layoutis aLayoutInterfaceobject that can be created with aLayoutBuilder.widgetsis a collection of anyUiItemInterfaceobjects. - Any PHP class can actually be a "widget", but base widgets are provided as convenience.
Dashboard config
| Key | Type | Default | Description |
|---|---|---|---|
| type | string |
||
| layout | LayoutConfig |
||
| widgets | array |
Dashboard dependencies
loggerviewwidget_factory
Dashboard API
setLayout()layout()setWidgets(array $widgets)widgets()addWidget()numWidgets()hasWidget()
Layout
Layouts define a grid (column-based) structure.
Layout config
| Key | Type | Default | Description |
|---|---|---|---|
| structure | array |
||
| structure.columns | array |
Example layout JSON config
"layout": { "structure": [ { "columns": [ 2, 1 ] }, { "columns": [ 1 ] }, { "columns": [ 1 ] } ] }
Layout API
setStructure(array $layouts)structure()numRows()rowIndex($position = null)rowData($position = null)rowNumColumns($position = null)rowNumCells($position = null)rowFirstCellIndex($position = null)cellRowIndex($position = null)numCellsTotal()cellSpan($position = null)cellSpanBy12($position = null)cellStartsRow($position = null)cellEndsRow($position = null)start()end()
Layout Aware objects
In the charcoal-ui module, 3 base objects use a layout: dashboards, forms and form groups.
Those classes implement the Layout requirement by implementing the \Charcoal\Ui\Layout\LayoutAwareInterface with the use of its corresponding LayoutAwareTrait.
Form
Forms define a layout of form groups, form options, data and metadata.
- Forms have groups, which have inputs.
- Groups can be layouted with a
layoutobject. - Form can be pre-populated with form data.
- Metadata ca
Form config
| Key | Type | Default | Description |
|---|---|---|---|
| type | string |
||
| action | string |
'' |
URL where the form will be submitted. |
| method | string |
'post' |
HTTP method to submit ("post" or "get"). |
| layout | LayoutConfig |
||
| groups | FormGroupConfig[] |
||
| form_data | array |
||
| metadata | array |
Form dependencies
viewgroup_factory
Form API
setAction($action)action()setMethod($method)method()setGroups(array $groups)groups()addGroup($groupIdent, $groupData)numGroups()hasGroups()setFormData(array $formData)formData()addFormData()
Form Group
Form group config
| Key | Type | Default | Description |
|---|---|---|---|
| form | |||
| template_ident | string |
||
| template_controller | string |
||
| priority | int |
||
| layout | LayoutConfig |
||
| properties | array |
Form group API
setForm($form)setInputs(array $groups)inputs()addInput($inputIdent, $inputData)numInputs()hasInputs()
Form Input
formlabelproperty_identtemplate_identtemplate_dataread_onlyrequireddisabledmultipleinput_idinput_name
Menu
Menu Item
Menu items define a menu level (ident, label and url) and its children (array of Menu Item).
Menu item config
identicon_identlabelurlchildren
Menu item API
setIdent($ident)ident()setLabel($label)label()setUrl($url)url()setChildren($children)children()numChildren()hasChildren()
Creational Helpers
Most UI elements are very dynamic. The types of object to create is often read from a string in a configuration object. Therefore, factories are the preferred way of instanciating new UI items.
Ui items have also many inter-connected dependencies. Builders should therefore be used for object creation / instanciation. They use a factory internally, and have a build($opts) methods that allow to retrieve class name from a dynamic source, do initialization, dpendencies management and more. Builders require Pimple for a DI container.
Factories
\Charcoal\Ui\Dashboard\DashboardFactory\Charcoal\Ui\Layout\LayoutFactory\Charcoal\Ui\Form\FormFactory\Charcoal\Ui\FormGroup\FormGroupFactory\Charcoal\Ui\FormInput\FormInputFactory\Charcoal\Ui\Menu\MenuFactory\Charcoal\Ui\MenuItem\MenuItemFactory
Builders
\Charcoal\Ui\Dashboard\DashboardBuilder\Charcoal\Ui\Layout\LayoutBuilder\Charcoal\Ui\Form\FormBuilder\Charcoal\Ui\FormGroup\FormGroupBuilder\Charcoal\Ui\FormInput\FormInputBuilder\Charcoal\Ui\Menu\MenuBuilder\Charcoal\Ui\MenuItem\MenuItemBuilder
Service Providers
Service providers are provided in the Charcoal\Ui\ServiceProvider namespace for for convenience. They are the recommended way of using charcoal-ui, as they register all the creational utilities to a container, taking care of dependencies.
\Charcoal\Ui\ServiceProvider\DashboardServiceProviderdashboard/factorydashboard/builder
\Charcoal\Ui\ServiceProvider\FormServiceProviderform/factoryform/builderform/group/factoryform/input/factoryform/input/builder
\Charcoal\Ui\ServiceProvider\LayoutServiceProviderlayout/factorylayout/builder
\Charcoal\Ui\ServiceProvider\MenuServiceProvidermenu/factorymenu/buildermenu/item/factorymenu/item/builder
\Charcoal\Ui\ServiceProvider\UiServiceProvider- Register all the other service providers (dashboard, form, layout and menu).
Required services
There are a few dependencies on external services, that should be set on the same DI container as the one passed to the service providers:
logger, a PSR-3 logger instance.- Typically a
monologinstance fromcharcoal-app.
- Typically a
view, a\Charcoal\View\ViewInterfaceinstance.- Typically provided with
\Charcoal\App\Provider\ViewServiceProvider.
- Typically provided with
Development
To install the development environment:
$ composer install --prefer-source
API documentation
- The auto-generated
phpDocumentorAPI documentation is available at https://locomotivemtl.github.io/charcoal-ui/docs/master/ - The auto-generated
apigenAPI documentation is available at https://codedoc.pub/locomotivemtl/charcoal-ui/master/
Development dependencies
phpunit/phpunitsquizlabs/php_codesniffersatooshi/php-coveralls
Continuous Integration
| Service | Badge | Description |
|---|---|---|
| Travis | Runs code sniff check and unit tests. Auto-generates API documentation. | |
| Scrutinizer | Code quality checker. Also validates API documentation quality. | |
| Coveralls | Unit Tests code coverage. | |
| Sensiolabs | Another code quality checker, focused on PHP. |
Coding Style
The Charcoal-Ui module follows the Charcoal coding-style:
- PSR-1
- PSR-2
- PSR-4, autoloading is therefore provided by Composer.
- phpDocumentor comments.
- Read the phpcs.xml file for all the details on code style.
Coding style validation / enforcement can be performed with
composer phpcs. An auto-fixer is also available withcomposer phpcbf.
Authors
- Mathieu Ducharme mat@locomotive.ca
License
Charcoal is licensed under the MIT license. See LICENSE for details.