menatwork/contao-multicolumnwizard
Contao MultiColumnWizard field/widget for DCA: build editable tables with multiple columns, using columnFields config or a columnsCallback. Supports select/text inputs and optional drag & drop row sorting. Contao 4 users: use the MCW bundle.
Installation:
composer require menatwork/contao-multicolumnwizard-bundle
composer require menatwork/contao-multicolumnwizard
config/bundles.php (Contao 4) or include the autoloader (Contao 3).Basic Setup:
config/autoload.php (Contao 4) or system/config/config.php (Contao 3):
$GLOBALS['TL_CONFIG']['includeDCA'][] = 'system/modules/multicolumnwizard/dca.php';
First Use Case:
templateSelection field to tl_theme with columns for client OS and browser (as shown in the README).Static Column Definitions:
columnFields to define fixed columns with nested input types (e.g., select, text, checkbox).'eval' => [
'columnFields' => [
'filter_date' => [
'inputType' => 'text',
'eval' => ['style' => 'width:100px'],
],
'filter_status' => [
'inputType' => 'select',
'options' => ['active', 'inactive'],
],
],
],
Dynamic Columns via Callback:
columnsCallback to generate columns dynamically (e.g., fetch options from a database or API).'eval' => [
'columnsCallback' => ['MyClass', 'getDynamicColumns'],
],
getDynamicColumns() to return an array of column definitions:
public static function getDynamicColumns()
{
return [
'dynamic_field' => [
'inputType' => 'select',
'options' => self::getOptionsFromDatabase(),
],
];
}
Drag-and-Drop Reordering:
dragAndDrop to let editors reorder columns via GUI.'eval' => [
'dragAndDrop' => true,
'columnFields' => [...],
],
Conditional Logic:
eval rules (e.g., mandatory, tl_class) to enforce validation or styling.'eval' => [
'mandatory' => true,
'tl_class' => 'w50',
],
Integration with Backend Modules:
BackendModule and injecting the field into your template.$this->Template->mcwField = $this->generateMultiColumnWizard('tl_my_table', 'my_mcw_field');
Nested MCWs:
'columnFields' => [
'advanced_filters' => [
'inputType' => 'multiColumnWizard',
'eval' => [
'columnFields' => [...],
],
],
],
Data Persistence:
serialize()/unserialize() or JSON encode/decode for storage.$data = unserialize($record['my_mcw_field']);
Frontend Rendering:
{% set mcwData = data.my_mcw_field|serialize|json_decode %}
{% for column, fields in mcwData %}
{{ column }}: {{ fields.filter_date }}
{% endfor %}
Validation:
validate() in a DCA callback or use Contao’s built-in eval rules.'eval' => [
'validate' => ['mcwCustomValidator'],
],
Deprecated Dependencies:
DC_General is not required (removed in v3.3.14+).Drag-and-Drop Issues:
dragAndDrop is set to true.Data Serialization:
serialize()/unserialize() if using Contao’s ORM (e.g., Model::find() handles this automatically).json_encode()/json_decode() for cleaner debugging:
$decoded = json_decode(json_encode(unserialize($record['my_mcw_field'])), true);
Performance:
columnsCallback methods that query the database on every page load. Cache results or use lazy loading.prepareDataContainer callback.Contao 4 Compatibility:
vendor/menatwork/contao-multicolumnwizard-bundle/src/Resources/contao/templates/ to customize UI.Localization:
TL_LANG:
'label' => &$GLOBALS['TL_LANG']['DCA']['tl_my_table']['my_column'],
Inspect Field Data:
public function loadDataContainer($dc)
{
if ($dc->id == 'tl_my_table') {
$objModel = Model::findByPk($dc->id);
var_dump(unserialize($objModel->my_mcw_field));
}
}
Check JavaScript Errors:
define('TL_DEBUG', false);
Clear Cache:
php bin/contao-console cache:clear
Verify Bundle Activation:
config/bundles.php (Contao 4):
return [
// ...
Menatwork\MultiColumnWizardBundle\MenatworkMultiColumnWizardBundle::class => ['all' => true],
];
Custom Column Types:
multiColumnWizard widget in Contao’s backend.System/Widgets/).Backend Templates:
templates/be_wizards/ (Contao 3) or templates/backend/ (Contao 4)./path/to/project/templates/backend/mcw/
Hooks:
getColumnFields hook to modify column definitions dynamically:
$GLOBALS['TL_HOOKS']['getColumnFields'][] = ['MyClass', 'modifyColumnFields'];
Frontend Widgets:
How can I help you explore Laravel packages today?