versionFrom | meta.Title | meta.Description |
---|---|---|
9.0.0 |
Macro Parameter Editors |
A guide to creating macro property editors in Umbraco |
Every macro can contain parameters. Options for the Editor to set when they insert the Macro to customise the output. There are some useful default types. For example:
- True/False
- TextBox
- TextArea
- Numeric
- Single/Multiple Media Picker
- Single/Multiple Content Picker
- ... and some 'others'
Consult the Backoffice documentation for general information on Macros.
It is possible to create custom macro parameter types.
To create a custom Macro Parameter Type, first create a custom 'Property Editor' (or copy one from the core). See Property Editors documentation and in the corresponding Package Manifest file for the editor, set the isParameterEditor
property to be true.
{
"propertyEditors": [
{
"alias": "My.ParameterEditorAlias",
"name": "Parameter Editor Name",
"isParameterEditor": true,
"editor": {
"view": "/App_Plugins/My.ParameterEditor/ParameterEditorView.html"
}
}
]
}
However 'Parameter Editors' unlike 'Property Editors' cannot contain 'prevalues', since there is no UI to present configuration options in the Macro Parameter tab when a particular type is chosen. However using the defaultConfig
option enables the passing of 'one off' default set of configuration for the parameter editor to use:
{
"propertyEditors": [
{
"alias": "My.ParameterEditorAlias",
...
"defaultConfig": {
"startNode": "1234",
"minItems": 0,
"maxItems": 6
}
}
]
}
This is only a problem if you have a macro parameter type, that needs to be used on lots of different macros, but with slightly different configurations in each instance.
We'll create an 'Image Position' Macro Parameter type providing a Radio Button list of options for positioning an image that has been inserted via an 'Insert Image' Macro into a Rich Text Editor.
{
"propertyEditors": [
{
"alias": "Our.Umbraco.ImagePosition",
"name": "Image Position",
"isParameterEditor": true,
"editor": {
"view": "/App_Plugins/Our.Umbraco.ImagePosition/ImagePosition.html",
"valueType": "STRING"
}
}
],
"javascript": [
"/App_Plugins/Our.Umbraco.ImagePosition/ImagePosition.controller.js"
]
}
<div ng-controller="Our.Umbraco.ImagePositionController">
<div class="radio" ng-repeat="position in positions" id="selectstatus-{{position.Name}}">
<label>
<input type="radio" name="position" ng-model="model.value" value="{{position.Name}}">{{position.Name}}
</label>
</div>
</div>
angular.module("umbraco").controller("Our.Umbraco.ImagePositionController", function ($scope) {
if ($scope.model.value == null) {
$scope.model.value = 'FullWidth';
}
// could read positions from defaultConfig
$scope.positions = [
{
Name: 'FullWidth'
},
{
Name: 'Left'
},
{
Name: 'Right'
},
{
Name: 'Center'
}
];
});
The final custom parameter should look like this:
In this example it doesn't really add anything to move the radio button options into configuration, however to illustrate the concept of providing defaultConfig, let's do that:
The package manifest becomes:
{
"propertyEditors": [
{
"alias": "Our.Umbraco.ImagePosition",
"name": "Image Position",
"isParameterEditor": true,
"editor": {
"view": "/App_Plugins/Our.Umbraco.ImagePosition/ImagePosition.html",
"valueType": "STRING"
},
"prevalues": {
"fields": [
{
"label": "Options",
"description": "Radio Button Options",
"key": "options",
"view": "textarea"
}
]
},
"defaultConfig": {
"options": [
{
"Name": "FullWidth"
},
{
"Name": "Lefty"
},
{
"Name": "Righty"
},
{
"Name": "Centerish"
}
]
}
}
],
"javascript": [
"/App_Plugins/Our.Umbraco.ImagePosition/ImagePosition.controller.js"
]
}
In the ImagePosition.controller.js
we can now read the 'options' values from the defaultConfig
in the package.manifest configuration:
$scope.positions = $scope.model.config.options;
@using Umbraco.Extensions
@inherits Umbraco.Cms.Web.Common.Macros.PartialViewMacroPage
@{
var imagePosition = Model.MacroParameters["imagePosition"];
//or if for convenience if you are using Umbraco.Extensions namespace there is a GetParameterValue extension method, which allows a default value to be specified if the parameter is not provided:
imagePosition = Model.GetParameterValue<string>("imagePosition","full-width");
}