<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://open-csp.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ebc16062-dd09-4928-8cf3-821f492b0c44</id>
	<title>CSP Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://open-csp.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ebc16062-dd09-4928-8cf3-821f492b0c44"/>
	<link rel="alternate" type="text/html" href="https://open-csp.org/Special:Contributions/Ebc16062-dd09-4928-8cf3-821f492b0c44"/>
	<updated>2026-04-29T16:49:38Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/FlexForm/2.1/input/file&amp;diff=3987</id>
		<title>DevOps:Doc/FlexForm/2.1/input/file</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/FlexForm/2.1/input/file&amp;diff=3987"/>
		<updated>2026-03-27T08:59:21Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Name===&lt;br /&gt;
file&lt;br /&gt;
===Type===&lt;br /&gt;
input&lt;br /&gt;
===Synopsis===&lt;br /&gt;
Using file uploads&lt;br /&gt;
===Description===&lt;br /&gt;
Use a form to upload one or multiple files.&lt;br /&gt;
===Parameters===&lt;br /&gt;
input type=&amp;quot;file&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;target&#039;&#039;&#039;* : Name of the File page to be created&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;id&#039;&#039;&#039;* : This must always be unique, that is, it can only occur once on a page. Do not include a hyphen (&amp;quot;-&amp;quot;), underscore (&amp;quot;_&amp;quot;), or any special characters (also no spaces).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;action&#039;&#039;&#039;* : defaults to &#039;&#039;&#039;upload&#039;&#039;&#039;. Read more below on using this to convert docx documents to pages in the wiki.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;name&#039;&#039;&#039;* : As with any input field, a name is mandatory&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;pagecontent&#039;&#039;&#039;: Text content to be added on the File Page. If you are using &#039;&#039;&#039;convertfrom&#039;&#039;&#039; then any images uploading during the convert will get the pagecontent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;comment&#039;&#039;&#039;: Text to show in recent changes or contributions list &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;force &#039;&#039;&#039;: Force images to a certain format (png, jpg or gif). When using this option, any file uploaded that is not supported will be uploaded as is.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;error_id &#039;&#039;&#039;: Id of a DOM Element where error notices will be shown&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;verbose_id &#039;&#039;&#039;: Id of a DOM element where information about the file is shown&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;use_label &#039;&#039;&#039;: Doesn&#039;t require a value. When an input field has a label attached to it, then the label will become the upload button and the input field will be hidden&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;dropzone &#039;&#039;&#039;: Doesn&#039;t require a value. Will turn the verbose div into an additional file drop zone. If you also &#039;&#039;&#039;use_label&#039;&#039;&#039;, then the label will become the dropzone.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;parsecontent&#039;&#039;&#039;: Will force FlexForm to insert values from other form fields inside the pagecontent field. Use square brackets, like [fieldname], where values should be inserted.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;template&#039;&#039;&#039; : If you want to store a template call inside the content of the File page, you can &#039;&#039;&#039;template=&amp;lt;name of your template&amp;gt;&#039;&#039;&#039; in combination with &#039;&#039;&#039;parsecontent&#039;&#039;&#039;. [flexform-template] inside your content field will be replaced by &#039;&#039;&#039;{{&amp;lt;name of your template&#039;&#039;&#039; and &#039;&#039;&#039;[/flexform-template]&#039;&#039;&#039; will be replaced by &#039;&#039;&#039;}}&#039;&#039;&#039;. See example 3 on the examples page.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;multiple&#039;&#039;&#039; = multiple&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;*&#039;&#039;&#039;= a required variable&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;target&#039;&#039;&#039; is basically the name you want to use to store the file or files. It recognizes &#039;&#039;&#039;[mwrandom]&#039;&#039;&#039;, &#039;&#039;&#039;[filename]&#039;&#039;&#039; and other form fields, by using their name with square brackets around them (see example). &#039;&#039;&#039;pagecontent&#039;&#039;&#039; can also hold form variables.&lt;br /&gt;
&lt;br /&gt;
=== action=&amp;quot;convertfrom:????&amp;quot; ===&lt;br /&gt;
====Pandoc====&lt;br /&gt;
The &#039;&#039;&#039;action&#039;&#039;&#039; argument defaults to &#039;&#039;upload&#039;&#039;. If you use &#039;&#039;&#039;action=&amp;quot;convertfrom:????&amp;quot;&#039;&#039;&#039; and you have [https://pandoc.org/ Pandoc] installed on your system, FlexForm will convert a document and create it as a page in the Wiki. &#039;&#039;&#039;target&#039;&#039;&#039; will then be used as a Page Title. Depending on your version of Pandoc, the results might differ. &#039;&#039;&#039;convertfrom&#039;&#039;&#039; allows all Pandoc to MediaWiki text conversions. &#039;&#039;&#039;docx&#039;&#039;&#039; would be a good example : action=&amp;quot;convertfrom:docx&amp;quot;. Any images uploaded during the convert can have their content of their filepages be filled using &#039;&#039;&#039;pagecontent&#039;&#039;&#039;. Since version 2.2.9 you can also add an argument &#039;&#039;&#039;slot=&amp;quot;&amp;lt;name of slot&amp;gt;&amp;quot;&#039;&#039;&#039; to have the converted Document be save to a specific slot on the target page, instead of the main slot. Keep in mind, MediaWiki slots need to be defined in your LocalSettings.&lt;br /&gt;
&lt;br /&gt;
Since &#039;&#039;&#039;version 2.7.0&#039;&#039;&#039; you have two new arguments when using Pandoc conversion : &#039;&#039;&#039;pandoc_prefix&#039;&#039;&#039; and &#039;&#039;&#039;pandoc_suffix&#039;&#039;&#039;. As your converted (word) document will become a Wiki page, you might want to add some text before or after the converted content ( e.g. a template ). &#039;&#039;&#039;pandoc_prefix&#039;&#039;&#039; will add content at the top of the converted page and &#039;&#039;&#039;pandoc_suffix&#039;&#039;&#039; will add it to the end of the converted document.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Since version 2.8.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* There is now also a &#039;&#039;&#039;convertto&#039;&#039;&#039; option. You now also need to define in local settings what &#039;&#039;&#039;convertfrom&#039;&#039;&#039; is allowed and what &#039;&#039;&#039;convertto&#039;&#039;&#039; is allowed. See [[DevOps:Doc/FlexForm/2.0/Installation of FlexForm|DevOps:Doc/FlexForm/2.0/Installation of FlexForm.]] There two new options for Pandoc conversion : &#039;&#039;&#039;uploadoriginalas&#039;&#039;&#039; and &#039;&#039;&#039;additional-arguments.&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;uploadoriginalas&#039;&#039;&#039; : added by using a pipe e.g. &#039;&#039;&#039;|uploadoriginalas:&#039;&#039;&#039; This will allow the original document to also be uploaded into the wiki, besides it also having a converted version. After the &amp;quot;:&amp;quot; you type the name for the to be uploaded file. You can use [filename] to have it uploaded by its original filename. You can also use [target], it will then upload it using the same name as the converted document. &lt;br /&gt;
* &#039;&#039;&#039;additional-argumen&#039;&#039;&#039;t : Lets you use additional Pandoc argument when converting. See the Pandoc documentation. You also have to define what additional arguments are allowed in the local settings. &#039;&#039;&#039;[path]&#039;&#039;&#039; inside additional-argument will be replace with the Wiki installation path.&lt;br /&gt;
* Local Settings example :&amp;lt;syntaxhighlight lang=&amp;quot;php5&amp;quot;&amp;gt;&lt;br /&gt;
$wgFlexFormConfig[&#039;pandoc-convert-to&#039;][] = &#039;mediawiki&#039;;&lt;br /&gt;
$wgFlexFormConfig[&#039;pandoc-convert-to&#039;][] = &#039;html&#039;;&lt;br /&gt;
$wgFlexFormConfig[&#039;pandoc-convert-from&#039;][] = &#039;docx&#039;;&lt;br /&gt;
$wgFlexFormConfig[&#039;pandoc-convert-from&#039;][] = &#039;ppt&#039;;&lt;br /&gt;
$wgFlexFormConfig[&#039;pandoc-allow-additional-arguments&#039;][] = &#039;lua-filter&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* FlexForm convert example (using [https://pandoc.org/lua-filters.html Pandoc Lua filter]) : &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;file&amp;quot; id=&amp;quot;docxUpload&amp;quot; name=&amp;quot;docx&amp;quot; target=&amp;quot;File:[filename].docx&amp;quot; pagecontent=&amp;quot;&amp;quot; required=&amp;quot;required&amp;quot; action=&amp;quot;convertfrom:docx|uploadoriginalas:[target]|convertto:mediawiki|additional-arguments:lua-filter=[path]fix-headings.lua&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Excel ( since version 2.2.9 )====&lt;br /&gt;
You can also use &#039;&#039;&#039;action=&amp;quot;convertfrom:xls&amp;quot;&#039;&#039;&#039; or &#039;&#039;&#039;action=&amp;quot;convertfrom:xlsx&amp;quot;&#039;&#039;&#039;. This allows for converting an Excel xls or xlsx file to JSON. Images are not supported. The argument &#039;&#039;&#039;slot&#039;&#039;&#039; is supported. &#039;&#039;This conversion is not done using Pandoc and thus will work without having Pandoc installed&#039;&#039;. (just make sure you run composer update after you update FlexForm).&lt;br /&gt;
&lt;br /&gt;
As off v2.4.0 the Excel convert action has two extra parameters that allow you to choose an Excel Sheet name, if the Excel document has multiple sheets. &#039;&#039;&#039;sheet_by_id&#039;&#039;&#039; and &#039;&#039;&#039;sheet_by_name&#039;&#039;&#039;. If you do not use them, it will work as &#039;&#039;&#039;sheet_by_id=&amp;quot;0&amp;quot;&#039;&#039;&#039; (making it backwards compatible). If you use both arguments, then &#039;&#039;&#039;sheet_by_name&#039;&#039;&#039; will get the priority.&lt;br /&gt;
&lt;br /&gt;
An excel document like this :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;options&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;description&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;HitCounter&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;WSStats&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;More&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$wgDisableCounters&lt;br /&gt;
|automatically show hitcounts on a page and Special page&lt;br /&gt;
|yes&lt;br /&gt;
|no&lt;br /&gt;
|WSStats allows for adding this to a page using parser function&lt;br /&gt;
|-&lt;br /&gt;
|$wgHitcounterUpdateFreq&lt;br /&gt;
|frequency of counters update&lt;br /&gt;
|yes&lt;br /&gt;
|no&lt;br /&gt;
|WSStats uses MW DB abstraction layer to update hitcount. The approach is  different&lt;br /&gt;
|-&lt;br /&gt;
|skip_user_groups&lt;br /&gt;
|Skip certain user groups in counting&lt;br /&gt;
|no&lt;br /&gt;
|yes&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|count_all_usergroups&lt;br /&gt;
|Count pages independend of a user group&lt;br /&gt;
|no&lt;br /&gt;
|yes&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
Will result in the following JSON:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;options&amp;quot;: &amp;quot;$wgDisableCounters&amp;quot;,&lt;br /&gt;
        &amp;quot;description&amp;quot;: &amp;quot;automatically show hitcounts on a page and Special page&amp;quot;,&lt;br /&gt;
        &amp;quot;HitCounter&amp;quot;: &amp;quot;yes&amp;quot;,&lt;br /&gt;
        &amp;quot;WSStats&amp;quot;: &amp;quot;no&amp;quot;,&lt;br /&gt;
        &amp;quot;More&amp;quot;: &amp;quot;WSStats allows for adding this to a page using parser function&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;options&amp;quot;: &amp;quot;$wgHitcounterUpdateFreq&amp;quot;,&lt;br /&gt;
        &amp;quot;description&amp;quot;: &amp;quot;frequency of counters update&amp;quot;,&lt;br /&gt;
        &amp;quot;HitCounter&amp;quot;: &amp;quot;yes&amp;quot;,&lt;br /&gt;
        &amp;quot;WSStats&amp;quot;: &amp;quot;no&amp;quot;,&lt;br /&gt;
        &amp;quot;More&amp;quot;: &amp;quot;WSStats uses MW DB abstraction layer to update hitcount. The approach is different&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;options&amp;quot;: &amp;quot;skip_user_groups&amp;quot;,&lt;br /&gt;
        &amp;quot;description&amp;quot;: &amp;quot;Skip certain user groups in counting&amp;quot;,&lt;br /&gt;
        &amp;quot;HitCounter&amp;quot;: &amp;quot;no&amp;quot;,&lt;br /&gt;
        &amp;quot;WSStats&amp;quot;: &amp;quot;yes&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;options&amp;quot;: &amp;quot;count_all_usergroups&amp;quot;,&lt;br /&gt;
        &amp;quot;description&amp;quot;: &amp;quot;Count pages independend of a user group&amp;quot;,&lt;br /&gt;
        &amp;quot;HitCounter&amp;quot;: &amp;quot;no&amp;quot;,&lt;br /&gt;
        &amp;quot;WSStats&amp;quot;: &amp;quot;yes&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===HTMLtoImage===&lt;br /&gt;
You can also use the field input to upload an image created from part of the page shown where the form is rendered.&lt;br /&gt;
&lt;br /&gt;
Basically, you tell FlexForm you want to render a part of your screen as an image and upload it to the wiki.&lt;br /&gt;
&lt;br /&gt;
The syntax is the same as above, but it only needs : target, name and pagecontent. The other arguments are ignored. Additionally it needs an argument called &#039;&#039;&#039;presentor=&amp;quot;canvas&amp;quot;&#039;&#039;&#039; and it needs the ID of the element you want to convert to an image: &#039;&#039;&#039;canvas_source_id&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;By default the image will always be a .jpg file. We plan to support png if this is requested.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
For example you have a DIV element with id=&amp;quot;content-to-convert&amp;quot;. Within this DIV you have content you want to convert to an image an upload to the Wiki.&lt;br /&gt;
&lt;br /&gt;
A FlexForm to utilize this would look something like this :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;content-to-convert&amp;quot; style=&amp;quot;width:500px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;h1&amp;gt;Test Screenshot&amp;lt;/h1&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Lots of other content here&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
  &amp;lt;input type=&amp;quot;file&amp;quot; presentor=&amp;quot;canvas&amp;quot; id=&amp;quot;canvasUpload&amp;quot; target=&amp;quot;testCanvasFile.jpg&amp;quot; pagecontent=&amp;quot;testing&amp;quot; canvas_source_id=&amp;quot;content-to-convert&amp;quot;  /&amp;gt;&lt;br /&gt;
  &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;upload&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;You cannot use both file uploads in one form.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Note===&lt;br /&gt;
An &#039;&#039;&#039;input type=&amp;quot;file&amp;quot;&#039;&#039;&#039; always needs a unique ID! ( do not use &amp;quot;-&amp;quot;, &amp;quot;_&amp;quot;, any special characters ( also no spaces ) ).&lt;br /&gt;
&lt;br /&gt;
A form that needs to upload files needs this argument : &#039;&#039;&#039;enctype=&amp;quot;multipart/form-data&amp;quot;&#039;&#039;&#039;. The argument needs to be added to the Form tag, not the input tag. See also : https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/enctype&lt;br /&gt;
&lt;br /&gt;
As FlexForm first handles File Upload, it will add the files processed to use in an _edit or a _create.&lt;br /&gt;
Every file upload field needs a name attribute and once a file has been uploaded you can use them in an edit or create in the following format :&lt;br /&gt;
 &lt;br /&gt;
*&#039;&#039;&#039;FFUploadedFile-UploadName-&#039;&#039;&#039;&#039;&#039;&amp;lt;name attribute of input field&amp;gt;&#039;&#039; : Will hold the original file name uploaded&lt;br /&gt;
*&#039;&#039;&#039;FFUploadedFile-UploadBase-&#039;&#039;&#039;&#039;&#039;&amp;lt;name attribute of input field&amp;gt;&#039;&#039; : Will hold the original file name uploaded without the extension&lt;br /&gt;
*&#039;&#039;&#039;FFUploadedFile-NewName-&#039;&#039;&#039;&#039;&#039;&amp;lt;name attribute of input field&amp;gt;&#039;&#039; : Will hold the name of the file as it is uploaded into the Wiki ( Without the File: prefix )&lt;br /&gt;
&lt;br /&gt;
If you use a multiple file upload, then the above values will all be &#039;&#039;&#039;,&#039;&#039;&#039; separated.&lt;br /&gt;
&lt;br /&gt;
===Links===&lt;br /&gt;
====Tutorial====&lt;br /&gt;
[https://wikibase-solutions.com/developer-logs/flexform-multiple-file-upload Link to a quick tutorial video shows you how to use one FlexForm form to]:&lt;br /&gt;
* upload multiple files. Docs : [https://www.open-csp.org/DevOps:Doc/FlexForm/1.0/input/file input file documentation]&lt;br /&gt;
* add a template to the source of the file pages. Docs : [https://www.open-csp.org/DevOps:Doc/FlexForm/1.0/input/file input file documentation]&lt;br /&gt;
* have form input fields be added to the arguments for the template. Docs : [https://www.open-csp.org/DevOps:Doc/FlexForm/1.0/input/file input file documentation]&lt;br /&gt;
* show a success message after upload. Docs : [https://www.open-csp.org/DevOps:Doc/FlexForm/1.0/Form_options form options]&lt;br /&gt;
* add a comment line to your upload visible in the Contributions list and recent changes. Docs : [https://www.open-csp.org/DevOps:Doc/FlexForm/1.0/Form_options form options]&lt;br /&gt;
* use a dropzone to drag and drop files. Docs : [https://www.open-csp.org/DevOps:Doc/FlexForm/1.0/input/file input file documentation]&lt;br /&gt;
* align form fields using a MW table. Docs : [[mediawikiwiki:Help:Tables|MediaWiki tables]]&lt;br /&gt;
* add current date using Magic Words. Docs : [[mediawikiwiki:Help:Magic_words|MediaWiki magic words]]&lt;br /&gt;
&lt;br /&gt;
====Other links====&lt;br /&gt;
https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/enctype&lt;br /&gt;
&lt;br /&gt;
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file&lt;br /&gt;
&lt;br /&gt;
https://pandoc.org/&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/FlexForm/2.0/Installation_of_FlexForm&amp;diff=3945</id>
		<title>DevOps:Doc/FlexForm/2.0/Installation of FlexForm</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/FlexForm/2.0/Installation_of_FlexForm&amp;diff=3945"/>
		<updated>2026-03-03T08:38:22Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;FlexForm is installed using [https://www.mediawiki.org/wiki/Composer/For_extensions Composer]: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
composer require open-csp/flex-form&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can install FlexForm from [https://github.com/Open-CSP/FlexForm github] by installing it in extensions/FlexForm. You do have to run composer --update inside that folder after installation to get all dependencies. &lt;br /&gt;
&lt;br /&gt;
==== Setup ====&lt;br /&gt;
You can tweak &#039;&#039;&#039;FlexForm&#039;&#039;&#039; to an extent in your &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Will render form that makes no sense when inspected in the browser.&lt;br /&gt;
$wgFlexFormConfig[&#039;secure&#039;] = true;&lt;br /&gt;
&lt;br /&gt;
// A salt key for encryption. Used together with &amp;quot;secure&amp;quot; option. Must be set when using multiple instances of a wiki.&lt;br /&gt;
$wgFlexFormConfig[&#039;sec_key&#039;] = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Interval time in ms, defaults to 3 minutes (180000 ms). Form is submitted on each interval regardless of changes.&lt;br /&gt;
$wgFlexFormConfig[&#039;auto_save_interval&#039;] = 30000;&lt;br /&gt;
&lt;br /&gt;
// Time in ms, defaults to 3 seconds (3000 ms). Form is submitted after the specified time, timer starts when there is a change in the form. Timer resets if there is another change before the time has passed.&lt;br /&gt;
$wgFlexFormConfig[&#039;auto_save_after_change&#039;] = 3000;&lt;br /&gt;
&lt;br /&gt;
// Text on the autosave button to toggle on.&lt;br /&gt;
$wgFlexFormConfig[&#039;auto_save_btn_on&#039;] = &#039;Autosave on&#039;;&lt;br /&gt;
&lt;br /&gt;
// Text on the autosave button to toggle off.&lt;br /&gt;
$wgFlexFormConfig[&#039;auto_save_btn_off&#039;] = &#039;Autosave off&#039;;&lt;br /&gt;
&lt;br /&gt;
// Currently the only form.&lt;br /&gt;
$wgFlexFormConfig[&#039;FlexFormDefaultTheme&#039;] = &amp;quot;plain&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// reCaptcha site key.&lt;br /&gt;
$wgFlexFormConfig[&#039;rc_site_key&#039;] = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// reCaptcha secret key.&lt;br /&gt;
$wgFlexFormConfig[&#039;rc_secret_key&#039;] = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Where to store images temporarily that need to be format converted.&lt;br /&gt;
$wgFlexFormConfig[&#039;file_temp_path&#039;] = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Defaults to false. Set to yes if FlexForm is allowed to create new users.&lt;br /&gt;
$wgFlexFormConfig[&#039;can_create_user&#039;] = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Defaults to false. Will filter all parser arguments to plain text, except value parameters. Will also disallow onClick and onFocus parameter. This feature will most likely be removed in future updates.&lt;br /&gt;
$wgFlexFormConfig[&#039;filter_input_tags&#039;] = false;&lt;br /&gt;
&lt;br /&gt;
// Defaults to what is described by the loadscript form argument. When you change it do a different folder, then loadScript argument will be looking in this folder for its JavaScript file to load with the Form.&lt;br /&gt;
$wgFlexFormConfig[&#039;loadScriptPath&#039;] = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Defaults to sysop. Only a user in the allowedGroups is able to edit pages with a FlexForm in the source.&lt;br /&gt;
$wgFlexFormConfig[&#039;allowedGroups&#039;] = [&amp;quot;sysop&amp;quot;,&amp;quot;moderator&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
// Defaults to true. When a user in the allowedGroups creates a form it will become valid and will be rendered. Someone not in the allowedGroups can create a form and save it, but it will never be rendered until a user from the allowedGroups will edit and re-save the page. Only then will a form become valid. The message &amp;quot;FORM CANNOT BE RENDERED, NOT VALIDATED&amp;quot; will be shown instead of the form when it is invalid or depending on the next setting an image stating it cannot be rendered.&lt;br /&gt;
$wgFlexFormConfig[&#039;renderonlyapprovedforms&#039;] = true;&lt;br /&gt;
&lt;br /&gt;
// When a form is invalid, an invalid image will be rendered instead of the form. Set to true to render i18n invalid message.&lt;br /&gt;
$wgFlexFormConfig[&#039;renderi18nErrorInsteadofImageForApprovedForms&#039;] = false;&lt;br /&gt;
&lt;br /&gt;
// Defaults to false. This differs from FlexForm before 2.0. FlexForm will now honor the UserCan functions in MediaWiki. If a form edits or creates a page a user has no rights to, the form will fail.&lt;br /&gt;
$wgFlexFormConfig[&#039;userscaneditallpages&#039;] = false;&lt;br /&gt;
&lt;br /&gt;
// Defaults to true. If a user is not in the allowedGroups then hide edit and editsource menu items for any page containing a FlexForm form.&lt;br /&gt;
$wgFlexFormConfig[&#039;hideEdit&#039;] = true;&lt;br /&gt;
&lt;br /&gt;
// Defaults to false. Will turn titles given to wscreate into url friendly slugs. Creating only latin character and converting spaces and special characters.&lt;br /&gt;
$wgFlexFormConfig[&#039;create-seo-titles&#039;] = true;&lt;br /&gt;
&lt;br /&gt;
// If you have a custom/different version of Pandoc than the one set by your hosting provider, you can add its local path here and FlexForm will use it, instead of the one set by environment variables&lt;br /&gt;
$wgFlexFormConfig[&#039;pandoc-install-path&#039;] = &#039;/bin/pandoc&#039;; // This will look for Pandoc executable in the root/bin of your MediaWiki instalment&lt;br /&gt;
&lt;br /&gt;
// FlexForm will by default always do an extra null edit on a save or an edit. This is mainly due to SMW. Not always this is necessary, so with this option you can turn it off. ( resulting in less handling time )&lt;br /&gt;
$wgFlexFormConfig[&#039;forceNullEdit&#039;] = true; // Default to true for backwards compatibility&lt;br /&gt;
&lt;br /&gt;
// As of version 2.7.1: This will enable FlexFormOpenAPI, making it possible to use API &#039;CanUserBeCreated&#039; which does not require read-rights.&lt;br /&gt;
$wgFlexFormConfig[&#039;allowFlexFormOpenAPI&#039;] = false;&lt;br /&gt;
&lt;br /&gt;
// As of version 2.7.1:  When sending email, should we use MediaWiki mail settings (defaults to false)? If set to true: when MediaWiki wgSMTP is set, FlexForm will use those settings, if they are not set, FlexForm will not use SMTP.&lt;br /&gt;
$wgFlexFormConfig[&#039;use_mediawiki_mail_settings&#039;] = false;&lt;br /&gt;
&lt;br /&gt;
// When sending email, should we use separate smtp?&lt;br /&gt;
// As off version 2.7.1: If this is set to true AND &#039;use_mediawiki_mail_settings&#039; is also set to true, then &#039;use_mediawiki_mail_settings&#039; is ignored&lt;br /&gt;
$wgFlexFormConfig[&#039;use_smtp&#039;] = false;&lt;br /&gt;
&lt;br /&gt;
$wgFlexFormConfig[&#039;smtp_host&#039;] = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$wgFlexFormConfig[&#039;smtp_authentication&#039;] = true;&lt;br /&gt;
&lt;br /&gt;
$wgFlexFormConfig[&#039;smtp_username&#039;] = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$wgFlexFormConfig[&#039;smtp_password&#039;] = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$wgFlexFormConfig[&#039;smtp_secure&#039;] = &amp;quot;TLS&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$wgFlexFormConfig[&#039;smtp_port&#039;] = &amp;quot;587&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// If you have very complicated forms and the result is not what you expect, you can turn on Debug and review every step FlexForm makes. The results are not documented and very nerdly. Before version v2.6.3 debug on would not actually create or edit a page. As off 2.6.4 it does, it will show the debug results on the FlexForm Special page.&lt;br /&gt;
// $wgFlexFormConfig[&#039;debug&#039;] = true; // Defaults to false&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Installation ====&lt;br /&gt;
* Add the following line at the end of your &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; to enable the extension:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
wfLoadExtension( &#039;FlexForm&#039; );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* It is also recommended to turn off the parser cache when using FlexForm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$wgParserCacheType = CACHE_NONE;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Run the [https://www.mediawiki.org/wiki/Manual:Update.php update script] which will automatically create the necessary database tables that this extension needs. &lt;br /&gt;
* Navigate to Special:Version on your wiki to verify that the extension is successfully installed.&lt;br /&gt;
&lt;br /&gt;
==== Migrate from version 1.x to 2.0 ====&lt;br /&gt;
* Please notice the changes in the config settings.&lt;br /&gt;
* Do not forget to run update.php.&lt;br /&gt;
* Also, by default, the setting &#039;&#039;&#039;renderonlyapprovedforms&#039;&#039;&#039; will be &#039;&#039;&#039;true&#039;&#039;&#039;. Meaning that once you install FlexForm v2.0 all your existing FlexForm forms in your wiki will be shown as unvalidated. Visit [[DevOps:Doc/FlexForm/2.0/Validated Forms|Validated Forms]] to read how to solve this easily.&lt;br /&gt;
&lt;br /&gt;
==== Notification/Messages ====&lt;br /&gt;
FlexForm has a notification system built in. This is used to show possible errors or success/custom messages. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;As of version 2.2.2 this is a default feature&#039;&#039;&#039; and &amp;lt;nowiki&amp;gt;&amp;lt;form showmessage /&amp;gt;&amp;lt;/nowiki&amp;gt; is deprecated.&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=Wiki:Testpagina_Liselot&amp;diff=3907</id>
		<title>Wiki:Testpagina Liselot</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=Wiki:Testpagina_Liselot&amp;diff=3907"/>
		<updated>2026-01-09T09:33:51Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_token name=&amp;quot;tokenfield[]&amp;quot; id=&amp;quot;tokener&amp;quot; query=&amp;quot;[[Class::Doc]][[Title::!!!]](limit=99999)(returntext=Title)&amp;quot; placeholder=&amp;quot;Search for Documentation Titles&amp;quot; multiple=&amp;quot;multiple&amp;quot; allowclear=&amp;quot;allowclear&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/_token&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=Wiki:Test_DG&amp;diff=3901</id>
		<title>Wiki:Test DG</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=Wiki:Test_DG&amp;diff=3901"/>
		<updated>2025-11-20T10:07:16Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: removing deprecated #ca functions in preparation for MW 1.43 upgrade (issue #6)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#ask: [[Class::Employee]]&lt;br /&gt;
|?Has list number&lt;br /&gt;
|?Has first name&lt;br /&gt;
|?Has last name&lt;br /&gt;
|?Has employee number&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;br /&gt;
Test if tokens can return a property value (here returnid=Has first name, and Has last name) rather than a pagename. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;_form action=&amp;quot;get&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{#tag:_token&lt;br /&gt;
|&lt;br /&gt;
|id=t7019-tokens&lt;br /&gt;
|name=FirstName[]&lt;br /&gt;
|placeholder=First name...&lt;br /&gt;
|multiple=multiple&lt;br /&gt;
|query=[[Class::Employee]][[Has first name::!!!]](limit=9999)(returntext=Has first name)(returnid=Has first name)&lt;br /&gt;
|placeholder&lt;br /&gt;
|allowclear&lt;br /&gt;
|class=w-100&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;_token id=&amp;quot;tokens-last-name&amp;quot; name=&amp;quot;LasttName[]&amp;quot; placeholder=&amp;quot;Last name...&amp;quot; multiple=&amp;quot;multiple&amp;quot; query=&amp;quot;[[Class::Employee]][[Has last name::!!!]](limit=9999)(returntext=Has last name)(returnid=Has last name)&amp;quot;  allowclear class=&amp;quot;w-100&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;_input type=&amp;quot;submit&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/_form&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=User:Ebc16062-dd09-4928-8cf3-821f492b0c44&amp;diff=3900</id>
		<title>User:Ebc16062-dd09-4928-8cf3-821f492b0c44</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=User:Ebc16062-dd09-4928-8cf3-821f492b0c44&amp;diff=3900"/>
		<updated>2025-11-20T10:06:09Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=User:E00a555c-1e5d-4eb3-b26b-5be8dc16c657&amp;diff=3899</id>
		<title>User:E00a555c-1e5d-4eb3-b26b-5be8dc16c657</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=User:E00a555c-1e5d-4eb3-b26b-5be8dc16c657&amp;diff=3899"/>
		<updated>2025-11-20T10:05:56Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/FlexForm/1.1/token&amp;diff=3886</id>
		<title>DevOps:Doc/FlexForm/1.1/token</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/FlexForm/1.1/token&amp;diff=3886"/>
		<updated>2025-10-13T12:10:02Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: Undo revision 3885 by Ebc16062-dd09-4928-8cf3-821f492b0c44 (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Name===&lt;br /&gt;
_token&lt;br /&gt;
===Type===&lt;br /&gt;
_token&lt;br /&gt;
===Synopsis===&lt;br /&gt;
Token input field&lt;br /&gt;
===Description===&lt;br /&gt;
Use of select2 tokens&lt;br /&gt;
===Parameters===&lt;br /&gt;
&#039;&#039;&#039;_token&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;name&#039;&#039;&#039; = e.g. tokenfield[]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;separator&#039;&#039;&#039; = token values have by default comma separated values when adding to a Template. You can specify a different separator using this argument . e.g. separator=&amp;quot;;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;allowtags&#039;&#039;&#039; = allow user to add custom values that are not suggested through autocompletion or otherwise. As of version 2.2.19, use a value of &#039;allowtags&#039;; prior to that, just give the attribute name, without any value.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;allowsort&#039;&#039;&#039; = (no value or (as of version 2.2.19 -&amp;gt;) value of &#039;allowsort&#039;) Allow user to sort values (drag and drop selected token). &#039;&#039;&#039;Does not work with query source.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;allowclear&#039;&#039;&#039; = (no value or (as of version 2.2.19 -&amp;gt;) value of &#039;allowclear&#039;) allow user to clear his selection. Will only work when you have set a placeholder.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;input-length-trigger&#039;&#039;&#039; = integer number of characters before lookup actually happens, defaults to 3&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;id&#039;&#039;&#039; = &#039;&#039;&#039;&#039;&#039;mandatory&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;query&#039;&#039;&#039; = If you have [https://www.semantic-mediawiki.org Semantic MediaWiki] installed, you can do a SMW Ask query here to fill the options list. &lt;br /&gt;
* &#039;&#039;&#039;returntext&#039;&#039;&#039; lets you set a property for the visible label of the token&lt;br /&gt;
* &#039;&#039;&#039;returnid&#039;&#039;&#039; (optional) lets you set a property for the value to be stored. This defaults to the page name.&lt;br /&gt;
* &#039;&#039;&#039;limit&#039;&#039;&#039; (optional) lets you sets the maximum number of pages to be returned by the query&lt;br /&gt;
* &#039;&#039;&#039;fquery&#039;&#039;&#039; (optional) lets you set a SMW Filter query that will be added to the query. Additional you can use [fffield=&#039;&amp;lt;name of a form field&amp;gt;&#039;] inside the fquery to dynamically add a value of a form field in the filter query.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;callback&#039;&#039;&#039; = templateCallBack&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;multiple&#039;&#039;&#039; = multiple&lt;br /&gt;
&lt;br /&gt;
===Example===&lt;br /&gt;
Example 1 : Search for pages in the Doc page types.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_token name=&amp;quot;tokenfield[]&amp;quot; id=&amp;quot;tokener&amp;quot; query=&amp;quot;[[Class::Doc]][[Title::!!!]](limit=99999)(returntext=Title)&amp;quot; placeholder=&amp;quot;Search for Documentation Titles&amp;quot; multiple=&amp;quot;multiple&amp;quot; allowclear=&amp;quot;allowclear&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/_token&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;_form restrictions=&amp;quot;lifted&amp;quot; action=&amp;quot;get&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;_token name=&amp;quot;tokenfield[]&amp;quot; id=&amp;quot;tokener&amp;quot; query=&amp;quot;[[Class::Doc]][[Title::!!!]](limit=99999)(returntext=Title)&amp;quot; placeholder=&amp;quot;Search for Documentation Titles&amp;quot; multiple=&amp;quot;multiple&amp;quot; allowclear=&amp;quot;allowclear&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/_token&amp;gt;&lt;br /&gt;
&amp;lt;/_form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 2 : Select one or more cars or create a new one&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_token name=&amp;quot;car[]&amp;quot; id=&amp;quot;test-tokens-multiple&amp;quot; multiple=&amp;quot;multiple&amp;quot; allowtags=&amp;quot;allowtags&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;volvo&amp;quot;&amp;gt;Volvo&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;saab&amp;quot; selected=&amp;quot;selected&amp;quot;&amp;gt;Saab&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;tesla&amp;quot; selected=&amp;quot;selected&amp;quot;&amp;gt;Tesla&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/_token&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;form restrictions=&amp;quot;lifted&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;_token name=&amp;quot;car[]&amp;quot; id=&amp;quot;test-tokens-multiple&amp;quot; multiple=&amp;quot;multiple&amp;quot; allowtags=&amp;quot;allowtags&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;option value=&amp;quot;volvo&amp;quot;&amp;gt;Volvo&amp;lt;/option&amp;gt;&lt;br /&gt;
 &amp;lt;option value=&amp;quot;saab&amp;quot; selected=&amp;quot;selected&amp;quot;&amp;gt;Saab&amp;lt;/option&amp;gt;&lt;br /&gt;
 &amp;lt;option value=&amp;quot;tesla&amp;quot; selected=&amp;quot;selected&amp;quot;&amp;gt;Tesla&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/_token&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example 3 : using the &#039;&#039;&#039;selected&#039;&#039;&#039; and &#039;&#039;&#039;options&#039;&#039;&#039; attributes&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_token name=&amp;quot;TestSelected[]&amp;quot; id=&amp;quot;test-tokens-selected&amp;quot; selected=&amp;quot;C&amp;quot; options=&amp;quot;A,B,C,D,E&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;form restrictions=&amp;quot;lifted&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;_token name=&amp;quot;TestSelected[]&amp;quot; id=&amp;quot;test-tokens-selected&amp;quot; selected=&amp;quot;C&amp;quot; options=&amp;quot;A,B,C,D,E&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example 4 : using fquery&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;select name=&amp;quot;Version&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;+&amp;quot;&amp;gt;Any version&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;1.0&amp;quot;&amp;gt;1.0&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;1.1&amp;quot;&amp;gt;1.1&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;2.0&amp;quot;&amp;gt;2.0&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;2.1&amp;quot;&amp;gt;2.1&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
&amp;lt;_token name=&amp;quot;Doc page&amp;quot; id=&amp;quot;tokens-with-fquery&amp;quot; query=&amp;quot;[[Class::Doc]][[Doc subject::DevOps:Doc/FlexForm]][[Title::!!!]](limit=99999)(returntext=Title)(fquery=[[Subject version::[fffield=Version] ]])&amp;quot; input-length-trigger=&amp;quot;1&amp;quot; placeholder=&amp;quot;Search for Documentation Titles&amp;quot; multiple=&amp;quot;multiple&amp;quot; allowclear=&amp;quot;allowclear&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/_token&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form restrictions=&amp;quot;lifted&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;select name=&amp;quot;Version&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;+&amp;quot;&amp;gt;Any version&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;1.0&amp;quot;&amp;gt;1.0&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;1.1&amp;quot;&amp;gt;1.1&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;2.0&amp;quot;&amp;gt;2.0&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;2.1&amp;quot;&amp;gt;2.1&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
&amp;lt;_token name=&amp;quot;Doc page&amp;quot; id=&amp;quot;tokens-with-fquery&amp;quot; query=&amp;quot;[[Class::Doc]][[Doc subject::DevOps:Doc/FlexForm]][[Title::!!!]](limit=99999)(returntext=Title)(fquery=[[Subject version::[fffield=Version] ]])&amp;quot; input-length-trigger=&amp;quot;1&amp;quot; placeholder=&amp;quot;Search for Documentation Titles&amp;quot; multiple=&amp;quot;multiple&amp;quot; allowclear=&amp;quot;allowclear&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/_token&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Note===&lt;br /&gt;
In an SMW query, the &#039;&#039;&#039;!!!&#039;&#039;&#039; will be replaced with whatever the user types.&lt;br /&gt;
&lt;br /&gt;
===Links===&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/FlexForm/1.1/token&amp;diff=3885</id>
		<title>DevOps:Doc/FlexForm/1.1/token</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/FlexForm/1.1/token&amp;diff=3885"/>
		<updated>2025-10-13T12:09:33Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Name===&lt;br /&gt;
_token&lt;br /&gt;
===Type===&lt;br /&gt;
_token&lt;br /&gt;
===Synopsis===&lt;br /&gt;
Token input field&lt;br /&gt;
===Description===&lt;br /&gt;
Use of select2 tokens&lt;br /&gt;
===Parameters===&lt;br /&gt;
&#039;&#039;&#039;_token&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;name&#039;&#039;&#039; = e.g. tokenfield[]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;separator&#039;&#039;&#039; = token values have by default comma separated values when adding to a Template. You can specify a different separator using this argument . e.g. separator=&amp;quot;;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;allowtags&#039;&#039;&#039; = allow user to add custom values that are not suggested through autocompletion or otherwise. As of version 2.2.19, use a value of &#039;allowtags&#039;; prior to that, just give the attribute name, without any value.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;allowsort&#039;&#039;&#039; = (no value or (as of version 2.2.19 -&amp;gt;) value of &#039;allowsort&#039;) Allow user to sort values (drag and drop selected token). &#039;&#039;&#039;Does not work with query source.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;allowclear&#039;&#039;&#039; = (no value or (as of version 2.2.19 -&amp;gt;) value of &#039;allowclear&#039;) allow user to clear his selection. Will only work when you have set a placeholder.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;input-length-trigger&#039;&#039;&#039; = integer number of characters before lookup actually happens, defaults to 3&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;id&#039;&#039;&#039; = &#039;&#039;&#039;&#039;&#039;mandatory&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;query&#039;&#039;&#039; = If you have [https://www.semantic-mediawiki.org Semantic MediaWiki] installed, you can do a SMW Ask query here to fill the options list. &lt;br /&gt;
* &#039;&#039;&#039;returntext&#039;&#039;&#039; lets you set a property for the visible label of the token&lt;br /&gt;
* &#039;&#039;&#039;returnid&#039;&#039;&#039; (optional) lets you set a property for the value to be stored. This defaults to the page name.&lt;br /&gt;
* &#039;&#039;&#039;limit&#039;&#039;&#039; (optional) lets you sets the maximum number of pages to be returned by the query&lt;br /&gt;
* &#039;&#039;&#039;fquery&#039;&#039;&#039; (optional) lets you set a SMW Filter query that will be added to the query. Additional you can use [fffield=&#039;&amp;lt;name of a form field&amp;gt;&#039;] inside the fquery to dynamically add a value of a form field in the filter query.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;callback&#039;&#039;&#039; = templateCallBack&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;multiple&#039;&#039;&#039; = multiple&lt;br /&gt;
&lt;br /&gt;
===Example===&lt;br /&gt;
Example 1 : Search for pages in the Doc page types.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_token name=&amp;quot;tokenfield[]&amp;quot; id=&amp;quot;tokener&amp;quot; query=&amp;quot;[[Class::Doc]][[Title::!!!]](limit=99999)(returntext=Title)&amp;quot; placeholder=&amp;quot;Search for Documentation Titles&amp;quot; multiple=&amp;quot;multiple&amp;quot; allowclear=&amp;quot;allowclear&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/_token&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;_form restrictions=&amp;quot;lifted&amp;quot; action=&amp;quot;get&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;_token name=&amp;quot;tokenfield[]&amp;quot; id=&amp;quot;tokener&amp;quot; query=&amp;quot;[[Class::Doc]][[Title::!!!]](limit=99999)(returntext=Title)&amp;quot; placeholder=&amp;quot;Search for Documentation Titles&amp;quot; multiple=&amp;quot;multiple&amp;quot; allowclear=&amp;quot;allowclear&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/_token&amp;gt;&lt;br /&gt;
&amp;lt;/_form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 2 : Select one or more cars or create a new one&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_token name=&amp;quot;car[]&amp;quot; id=&amp;quot;test-tokens-multiple&amp;quot; multiple=&amp;quot;multiple&amp;quot; allowtags=&amp;quot;allowtags&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;volvo&amp;quot;&amp;gt;Volvo&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;saab&amp;quot; selected=&amp;quot;selected&amp;quot;&amp;gt;Saab&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;tesla&amp;quot; selected=&amp;quot;selected&amp;quot;&amp;gt;Tesla&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/_token&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;form restrictions=&amp;quot;lifted&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;_token name=&amp;quot;car[]&amp;quot; id=&amp;quot;test-tokens-multiple&amp;quot; multiple=&amp;quot;multiple&amp;quot; allowtags=&amp;quot;allowtags&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;volvo&amp;quot;&amp;gt;Volvo&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;saab&amp;quot; selected=&amp;quot;selected&amp;quot;&amp;gt;Saab&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;tesla&amp;quot; selected=&amp;quot;selected&amp;quot;&amp;gt;Tesla&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/_token&amp;gt;&lt;br /&gt;
Test&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example 3 : using the &#039;&#039;&#039;selected&#039;&#039;&#039; and &#039;&#039;&#039;options&#039;&#039;&#039; attributes&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_token name=&amp;quot;TestSelected[]&amp;quot; id=&amp;quot;test-tokens-selected&amp;quot; selected=&amp;quot;C&amp;quot; options=&amp;quot;A,B,C,D,E&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;form restrictions=&amp;quot;lifted&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;_token name=&amp;quot;TestSelected[]&amp;quot; id=&amp;quot;test-tokens-selected&amp;quot; selected=&amp;quot;C&amp;quot; options=&amp;quot;A,B,C,D,E&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example 4 : using fquery&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;select name=&amp;quot;Version&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;+&amp;quot;&amp;gt;Any version&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;1.0&amp;quot;&amp;gt;1.0&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;1.1&amp;quot;&amp;gt;1.1&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;2.0&amp;quot;&amp;gt;2.0&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;2.1&amp;quot;&amp;gt;2.1&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
&amp;lt;_token name=&amp;quot;Doc page&amp;quot; id=&amp;quot;tokens-with-fquery&amp;quot; query=&amp;quot;[[Class::Doc]][[Doc subject::DevOps:Doc/FlexForm]][[Title::!!!]](limit=99999)(returntext=Title)(fquery=[[Subject version::[fffield=Version] ]])&amp;quot; input-length-trigger=&amp;quot;1&amp;quot; placeholder=&amp;quot;Search for Documentation Titles&amp;quot; multiple=&amp;quot;multiple&amp;quot; allowclear=&amp;quot;allowclear&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/_token&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form restrictions=&amp;quot;lifted&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;select name=&amp;quot;Version&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;+&amp;quot;&amp;gt;Any version&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;1.0&amp;quot;&amp;gt;1.0&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;1.1&amp;quot;&amp;gt;1.1&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;2.0&amp;quot;&amp;gt;2.0&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;2.1&amp;quot;&amp;gt;2.1&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
&amp;lt;_token name=&amp;quot;Doc page&amp;quot; id=&amp;quot;tokens-with-fquery&amp;quot; query=&amp;quot;[[Class::Doc]][[Doc subject::DevOps:Doc/FlexForm]][[Title::!!!]](limit=99999)(returntext=Title)(fquery=[[Subject version::[fffield=Version] ]])&amp;quot; input-length-trigger=&amp;quot;1&amp;quot; placeholder=&amp;quot;Search for Documentation Titles&amp;quot; multiple=&amp;quot;multiple&amp;quot; allowclear=&amp;quot;allowclear&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/_token&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Note===&lt;br /&gt;
In an SMW query, the &#039;&#039;&#039;!!!&#039;&#039;&#039; will be replaced with whatever the user types.&lt;br /&gt;
&lt;br /&gt;
===Links===&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/FlexForm/1.1/token&amp;diff=3884</id>
		<title>DevOps:Doc/FlexForm/1.1/token</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/FlexForm/1.1/token&amp;diff=3884"/>
		<updated>2025-10-13T12:09:03Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Name===&lt;br /&gt;
_token&lt;br /&gt;
===Type===&lt;br /&gt;
_token&lt;br /&gt;
===Synopsis===&lt;br /&gt;
Token input field&lt;br /&gt;
===Description===&lt;br /&gt;
Use of select2 tokens&lt;br /&gt;
===Parameters===&lt;br /&gt;
&#039;&#039;&#039;_token&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;name&#039;&#039;&#039; = e.g. tokenfield[]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;separator&#039;&#039;&#039; = token values have by default comma separated values when adding to a Template. You can specify a different separator using this argument . e.g. separator=&amp;quot;;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;allowtags&#039;&#039;&#039; = allow user to add custom values that are not suggested through autocompletion or otherwise. As of version 2.2.19, use a value of &#039;allowtags&#039;; prior to that, just give the attribute name, without any value.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;allowsort&#039;&#039;&#039; = (no value or (as of version 2.2.19 -&amp;gt;) value of &#039;allowsort&#039;) Allow user to sort values (drag and drop selected token). &#039;&#039;&#039;Does not work with query source.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;allowclear&#039;&#039;&#039; = (no value or (as of version 2.2.19 -&amp;gt;) value of &#039;allowclear&#039;) allow user to clear his selection. Will only work when you have set a placeholder.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;input-length-trigger&#039;&#039;&#039; = integer number of characters before lookup actually happens, defaults to 3&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;id&#039;&#039;&#039; = &#039;&#039;&#039;&#039;&#039;mandatory&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;query&#039;&#039;&#039; = If you have [https://www.semantic-mediawiki.org Semantic MediaWiki] installed, you can do a SMW Ask query here to fill the options list. &lt;br /&gt;
* &#039;&#039;&#039;returntext&#039;&#039;&#039; lets you set a property for the visible label of the token&lt;br /&gt;
* &#039;&#039;&#039;returnid&#039;&#039;&#039; (optional) lets you set a property for the value to be stored. This defaults to the page name.&lt;br /&gt;
* &#039;&#039;&#039;limit&#039;&#039;&#039; (optional) lets you sets the maximum number of pages to be returned by the query&lt;br /&gt;
* &#039;&#039;&#039;fquery&#039;&#039;&#039; (optional) lets you set a SMW Filter query that will be added to the query. Additional you can use [fffield=&#039;&amp;lt;name of a form field&amp;gt;&#039;] inside the fquery to dynamically add a value of a form field in the filter query.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;callback&#039;&#039;&#039; = templateCallBack&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;multiple&#039;&#039;&#039; = multiple&lt;br /&gt;
&lt;br /&gt;
===Example===&lt;br /&gt;
Example 1 : Search for pages in the Doc page types.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_token name=&amp;quot;tokenfield[]&amp;quot; id=&amp;quot;tokener&amp;quot; query=&amp;quot;[[Class::Doc]][[Title::!!!]](limit=99999)(returntext=Title)&amp;quot; placeholder=&amp;quot;Search for Documentation Titles&amp;quot; multiple=&amp;quot;multiple&amp;quot; allowclear=&amp;quot;allowclear&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/_token&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;_form restrictions=&amp;quot;lifted&amp;quot; action=&amp;quot;get&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;_token name=&amp;quot;tokenfield[]&amp;quot; id=&amp;quot;tokener&amp;quot; query=&amp;quot;[[Class::Doc]][[Title::!!!]](limit=99999)(returntext=Title)&amp;quot; placeholder=&amp;quot;Search for Documentation Titles&amp;quot; multiple=&amp;quot;multiple&amp;quot; allowclear=&amp;quot;allowclear&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/_token&amp;gt;&lt;br /&gt;
&amp;lt;/_form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example 2 : Select one or more cars or create a new one&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_token name=&amp;quot;car[]&amp;quot; id=&amp;quot;test-tokens-multiple&amp;quot; multiple=&amp;quot;multiple&amp;quot; allowtags=&amp;quot;allowtags&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;volvo&amp;quot;&amp;gt;Volvo&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;saab&amp;quot; selected=&amp;quot;selected&amp;quot;&amp;gt;Saab&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;tesla&amp;quot; selected=&amp;quot;selected&amp;quot;&amp;gt;Tesla&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/_token&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;form restrictions=&amp;quot;lifted&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;_token name=&amp;quot;car[]&amp;quot; id=&amp;quot;test-tokens-multiple&amp;quot; multiple=&amp;quot;multiple&amp;quot; allowtags=&amp;quot;allowtags&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;option value=&amp;quot;volvo&amp;quot;&amp;gt;Volvo&amp;lt;/option&amp;gt;&lt;br /&gt;
 &amp;lt;option value=&amp;quot;saab&amp;quot; selected=&amp;quot;selected&amp;quot;&amp;gt;Saab&amp;lt;/option&amp;gt;&lt;br /&gt;
 &amp;lt;option value=&amp;quot;tesla&amp;quot; selected=&amp;quot;selected&amp;quot;&amp;gt;Tesla&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/_token&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example 3 : using the &#039;&#039;&#039;selected&#039;&#039;&#039; and &#039;&#039;&#039;options&#039;&#039;&#039; attributes&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_token name=&amp;quot;TestSelected[]&amp;quot; id=&amp;quot;test-tokens-selected&amp;quot; selected=&amp;quot;C&amp;quot; options=&amp;quot;A,B,C,D,E&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;form restrictions=&amp;quot;lifted&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;_token name=&amp;quot;TestSelected[]&amp;quot; id=&amp;quot;test-tokens-selected&amp;quot; selected=&amp;quot;C&amp;quot; options=&amp;quot;A,B,C,D,E&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example 4 : using fquery&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;select name=&amp;quot;Version&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;+&amp;quot;&amp;gt;Any version&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;1.0&amp;quot;&amp;gt;1.0&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;1.1&amp;quot;&amp;gt;1.1&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;2.0&amp;quot;&amp;gt;2.0&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;2.1&amp;quot;&amp;gt;2.1&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
&amp;lt;_token name=&amp;quot;Doc page&amp;quot; id=&amp;quot;tokens-with-fquery&amp;quot; query=&amp;quot;[[Class::Doc]][[Doc subject::DevOps:Doc/FlexForm]][[Title::!!!]](limit=99999)(returntext=Title)(fquery=[[Subject version::[fffield=Version] ]])&amp;quot; input-length-trigger=&amp;quot;1&amp;quot; placeholder=&amp;quot;Search for Documentation Titles&amp;quot; multiple=&amp;quot;multiple&amp;quot; allowclear=&amp;quot;allowclear&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/_token&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form restrictions=&amp;quot;lifted&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;select name=&amp;quot;Version&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;+&amp;quot;&amp;gt;Any version&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;1.0&amp;quot;&amp;gt;1.0&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;1.1&amp;quot;&amp;gt;1.1&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;2.0&amp;quot;&amp;gt;2.0&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;2.1&amp;quot;&amp;gt;2.1&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
&amp;lt;_token name=&amp;quot;Doc page&amp;quot; id=&amp;quot;tokens-with-fquery&amp;quot; query=&amp;quot;[[Class::Doc]][[Doc subject::DevOps:Doc/FlexForm]][[Title::!!!]](limit=99999)(returntext=Title)(fquery=[[Subject version::[fffield=Version] ]])&amp;quot; input-length-trigger=&amp;quot;1&amp;quot; placeholder=&amp;quot;Search for Documentation Titles&amp;quot; multiple=&amp;quot;multiple&amp;quot; allowclear=&amp;quot;allowclear&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/_token&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Note===&lt;br /&gt;
In an SMW query, the &#039;&#039;&#039;!!!&#039;&#039;&#039; will be replaced with whatever the user types.&lt;br /&gt;
&lt;br /&gt;
===Links===&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/FlexForm/2.1,_2.5/create_pages&amp;diff=3883</id>
		<title>DevOps:Doc/FlexForm/2.1, 2.5/create pages</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/FlexForm/2.1,_2.5/create_pages&amp;diff=3883"/>
		<updated>2025-10-10T09:51:50Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
* These tests assume you are using a wiki with $wgCapitalLinks set to true (the default setting). Else tests like A1 and A2 will produce different results, as the first letter won&#039;t be capitalized automatically. You can still use these tests, but you will have to carefully evaluate the results yourself, as some of the instructions will not be applicable. &lt;br /&gt;
* Tests should be done with FlexForm extension setting create-seo-titles set to true as well as false. Note that create-seo-titles is only applied to input from formfields that is inserted in mwwrite of a create, not to hardcoded values in mwwrite. Therefore most of these tests (except for D) should have the same results with create-seo-titles set to true or false.&lt;br /&gt;
* To execute the tests, copy the content shown below to a page on your wiki. The content contains test instructions as well as forms to test different _create options.&lt;br /&gt;
* After you finish testing, delete the created test pages. You can for example find these in your contributions or use the Semantic MediaWiki query to get a list of pages and delete them through Special:DeleteBatch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== A. next_available test ==&lt;br /&gt;
* Test each create multiple times&lt;br /&gt;
* Verify that the created page gets a new number each time, i.e. &amp;quot;Test page1&amp;quot; then &amp;quot;Test page2&amp;quot; then &amp;quot;Test page3&amp;quot; etc.&lt;br /&gt;
* Tests A1, A2, A3, A4 and A6 (with namespace option &amp;quot;(Main)&amp;quot;) should result in similar pagetitles&lt;br /&gt;
** note: with create-seo-titles set to true, A4 will produce a different pagetitle, for example &amp;quot;Test-page1&amp;quot;&lt;br /&gt;
* Tests A5 and A6 (with namespace options &amp;quot;template&amp;quot; and &amp;quot;Template&amp;quot;) should result in similar pagetitles&lt;br /&gt;
** note: you might see &amp;quot;Template&amp;quot; in the created page in a different language, if your user preference is set to a language other than English&lt;br /&gt;
&lt;br /&gt;
=== A1. Test_page ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== A2. test_page ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== A3. :Test_page ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;:Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== A4. Test page ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== A5. Template:test_page ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Template:test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== A6. [namespace]:Test_page ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;[namespace]:Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
&amp;lt;select name=&amp;quot;namespace&amp;quot; placeholder=&amp;quot;Choose a namespace&amp;quot; required=&amp;quot;required&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;&amp;quot;&amp;gt;(Main)&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;Template&amp;quot; &amp;gt;Template&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;template&amp;quot;&amp;gt;template&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== B. add_random test ==&lt;br /&gt;
* Test each create multiple times&lt;br /&gt;
* Verify that the created page gets a new number each time, i.e. &amp;quot;Test page1759998954&amp;quot; then &amp;quot;Test page1759998946&amp;quot; etc.&lt;br /&gt;
** note: the numbers are not fully random as they are based on timestamp, but each create should result in a unique number. &lt;br /&gt;
* Tests B1, B2, B3 and B5 (with namespace option &amp;quot;(Main)&amp;quot;) should result in similar pagetitles&lt;br /&gt;
* Tests B4 and B5 (with namespace options &amp;quot;template&amp;quot; and &amp;quot;Template&amp;quot;) should result in similar pagetitles&lt;br /&gt;
** note: you might see &amp;quot;Template&amp;quot; in the created page in a different language, if your user preference is set to a language other than English&lt;br /&gt;
&lt;br /&gt;
=== B1. Test_page ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== B2. test_page ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== B3. :Test_page ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;:Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== B4. Template:test_page ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Template:test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== B5. [namespace]:Test_page ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;[namespace]:Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
&amp;lt;select name=&amp;quot;namespace&amp;quot; placeholder=&amp;quot;Choose a namespace&amp;quot; required=&amp;quot;required&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;&amp;quot;&amp;gt;(Main)&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;Template&amp;quot; &amp;gt;Template&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;template&amp;quot;&amp;gt;template&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== B6. Test_page/ ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page/&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== B7. Test_page- ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page-&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== C. range tests ==&lt;br /&gt;
* Test each create multiple times&lt;br /&gt;
* C1 should create titles &amp;quot;Test_page/2019000&amp;quot;, &amp;quot;Test_page/2019001&amp;quot;, &amp;quot;Test_page/2019002&amp;quot; etc.&lt;br /&gt;
* C2 should create titles &amp;quot;Test_page/1&amp;quot;, &amp;quot;Test_page/2&amp;quot;, &amp;quot;Test_page/3&amp;quot; etc.&lt;br /&gt;
* C3 should create titles &amp;quot;Test_page/0001&amp;quot;, &amp;quot;Test_page/0002&amp;quot;, &amp;quot;Test_page/0003&amp;quot; etc.&lt;br /&gt;
* C3 should create titles &amp;quot;Template:Test_page/0001&amp;quot;, &amp;quot;Template:Test_page/0002&amp;quot;, &amp;quot;Template:Test_page/0003&amp;quot; etc.&lt;br /&gt;
** note: you might see &amp;quot;Template&amp;quot; in the created page in a different language, if your user preference is set to a language other than English&lt;br /&gt;
&lt;br /&gt;
=== C1. Test_page/range:2019000-2019999 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page/&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;range:2019000-2019999&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== C2. Test_page/range:1-9999 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page/&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;range:1-9999&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== C3. Test_page/range:1-9999 with mwleadingzero ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page/&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;range:1-9999&amp;quot; mwleadingzero mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== C4. template:Test_page/range:1-9999 with mwleadingzero ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;template:Test_page/&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;range:1-9999&amp;quot; mwleadingzero mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== D. create-seo-titles test ==&lt;br /&gt;
* The create should result a page title where values from input fields are cleaned up. Symbols and spaces are replace with &amp;quot;-&amp;quot; and all letters are lower case (except for the first one if $wgCapitalLinks is set to true)&lt;br /&gt;
* D1 should give an error message as it&#039;s an invalid pagetitle: &amp;quot;Could not create page Test#@*( PAge. Invalid title.&amp;quot;&lt;br /&gt;
* D2 should create &amp;quot;Test page/test-page&amp;quot; (or invalid title when create-seo-titles is set to false)&lt;br /&gt;
* D3 should create &amp;quot;Test-page&amp;quot; (or invalid title when create-seo-titles is set to false)&lt;br /&gt;
&lt;br /&gt;
=== D1. Test_#@*( PAge ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_#@*( PAge&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== D2. Test page/[Title] ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test page/[Title]&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Title&amp;quot; value=&amp;quot;Test_#@*( PAge&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== D3. [Title] ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;[Title]&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Title&amp;quot; value=&amp;quot;test_#@*( PAge&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Potentially useful Semantic MediaWiki query to find created pages (if you are using SMW) ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{#ask:[[~*Test page*]]&lt;br /&gt;
|?=Page&lt;br /&gt;
|?#-=Page&lt;br /&gt;
|?Modification date&lt;br /&gt;
|sort=Modification date&lt;br /&gt;
|order=desc&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/FlexForm/2.1,_2.5/create_pages&amp;diff=3882</id>
		<title>DevOps:Doc/FlexForm/2.1, 2.5/create pages</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/FlexForm/2.1,_2.5/create_pages&amp;diff=3882"/>
		<updated>2025-10-10T07:24:59Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
* These tests assume you are using a wiki with $wgCapitalLinks set to true (the default setting). Else tests like A1 and A2 will produce different results, as the first letter won&#039;t be capitalized automatically. You can still use these tests, but you will have to carefully evaluate the results yourself, as some of the instructions will not be applicable. &lt;br /&gt;
* Tests should be done with FlexForm extension setting create-seo-titles set to true as well as false.&lt;br /&gt;
* To execute the tests, copy the content shown below to a page on your wiki. The content contains test instructions as well as forms to test different _create options.&lt;br /&gt;
* After you finish testing, delete the created test pages. You can for example find these in your contributions or use the Semantic MediaWiki query to get a list of pages and delete them through Special:DeleteBatch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== A. next_available test ==&lt;br /&gt;
* Test each create multiple times&lt;br /&gt;
* Verify that the created page gets a new number each time, i.e. &amp;quot;Test page1&amp;quot; then &amp;quot;Test page2&amp;quot; then &amp;quot;Test page3&amp;quot; etc.&lt;br /&gt;
* Tests A1, A2, A3, A4 and A6 (with namespace option &amp;quot;(Main)&amp;quot;) should result in similar pagetitles&lt;br /&gt;
** note: with create-seo-titles set to true, A4 will produce a different pagetitle, for example &amp;quot;Test-page1&amp;quot;&lt;br /&gt;
* Tests A5 and A6 (with namespace options &amp;quot;template&amp;quot; and &amp;quot;Template&amp;quot;) should result in similar pagetitles&lt;br /&gt;
** note: you might see &amp;quot;Template&amp;quot; in the created page in a different language, if your user preference is set to a language other than English&lt;br /&gt;
&lt;br /&gt;
=== A1. Test_page ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== A2. test_page ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== A3. :Test_page ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;:Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== A4. Test page ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== A5. Template:test_page ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Template:test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== A6. [namespace]:Test_page ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;[namespace]:Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
&amp;lt;select name=&amp;quot;namespace&amp;quot; placeholder=&amp;quot;Choose a namespace&amp;quot; required=&amp;quot;required&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;&amp;quot;&amp;gt;(Main)&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;Template&amp;quot; &amp;gt;Template&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;template&amp;quot;&amp;gt;template&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== B. add_random test ==&lt;br /&gt;
* Test each create multiple times&lt;br /&gt;
* Verify that the created page gets a new number each time, i.e. &amp;quot;Test page1759998954&amp;quot; then &amp;quot;Test page1759998946&amp;quot; etc.&lt;br /&gt;
** note: the numbers are not fully random as they are based on timestamp, but each create should result in a unique number. &lt;br /&gt;
* Tests B1, B2, B3 and B5 (with namespace option &amp;quot;(Main)&amp;quot;) should result in similar pagetitles&lt;br /&gt;
* Tests B4 and B5 (with namespace options &amp;quot;template&amp;quot; and &amp;quot;Template&amp;quot;) should result in similar pagetitles&lt;br /&gt;
** note: you might see &amp;quot;Template&amp;quot; in the created page in a different language, if your user preference is set to a language other than English&lt;br /&gt;
* When using the create-seo-titles extension setting of FlexForm, B6 and B7 should result in similar pagetitles&lt;br /&gt;
&lt;br /&gt;
=== B1. Test_page ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== B2. test_page ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== B3. :Test_page ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;:Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== B4. Template:test_page ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Template:test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== B5. [namespace]:Test_page ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;[namespace]:Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
&amp;lt;select name=&amp;quot;namespace&amp;quot; placeholder=&amp;quot;Choose a namespace&amp;quot; required=&amp;quot;required&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;&amp;quot;&amp;gt;(Main)&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;Template&amp;quot; &amp;gt;Template&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;template&amp;quot;&amp;gt;template&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== B6. Test_page/ ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page/&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== B7. Test_page- ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page-&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== C. range tests ==&lt;br /&gt;
* Test each create multiple times&lt;br /&gt;
* C1 should create titles &amp;quot;Test_page/2019000&amp;quot;, &amp;quot;Test_page/2019001&amp;quot;, &amp;quot;Test_page/2019002&amp;quot; etc.&lt;br /&gt;
* C2 should create titles &amp;quot;Test_page/1&amp;quot;, &amp;quot;Test_page/2&amp;quot;, &amp;quot;Test_page/3&amp;quot; etc.&lt;br /&gt;
* C3 should create titles &amp;quot;Test_page/0001&amp;quot;, &amp;quot;Test_page/0002&amp;quot;, &amp;quot;Test_page/0003&amp;quot; etc.&lt;br /&gt;
* C3 should create titles &amp;quot;Template:Test_page/0001&amp;quot;, &amp;quot;Template:Test_page/0002&amp;quot;, &amp;quot;Template:Test_page/0003&amp;quot; etc.&lt;br /&gt;
** note: you might see &amp;quot;Template&amp;quot; in the created page in a different language, if your user preference is set to a language other than English&lt;br /&gt;
&lt;br /&gt;
=== C1. Test_page/range:2019000-2019999 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page/&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;range:2019000-2019999&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== C2. Test_page/range:1-9999 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page/&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;range:1-9999&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== C3. Test_page/range:1-9999 with mwleadingzero ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page/&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;range:1-9999&amp;quot; mwleadingzero mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== C4. template:Test_page/range:1-9999 with mwleadingzero ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;template:Test_page/&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;range:1-9999&amp;quot; mwleadingzero mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== D. create-seo-titles test ==&lt;br /&gt;
* The create should result a page title where values from input fields are cleaned up. Symbols and spaces are replace with &amp;quot;-&amp;quot; and all letters are lower case (except for the first one if $wgCapitalLinks is set to true)&lt;br /&gt;
* D1 should give an error message as it&#039;s an invalid pagetitle: &amp;quot;Could not create page Test#@*( PAge. Invalid title.&amp;quot;&lt;br /&gt;
* D2 should create &amp;quot;Test page/test-page&amp;quot;&lt;br /&gt;
* D3 should create &amp;quot;Test-page&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== D1. Test_#@*( PAge ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_#@*( PAge&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== D2. Test page/[Title] ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test page/[Title]&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Title&amp;quot; value=&amp;quot;Test_#@*( PAge&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== D3. [Title] ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;[Title]&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Title&amp;quot; value=&amp;quot;test_#@*( PAge&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Potentially useful Semantic MediaWiki query to find created pages (if you are using SMW) ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{#ask:[[~*Test page*]]&lt;br /&gt;
|?=Page&lt;br /&gt;
|?#-=Page&lt;br /&gt;
|?Modification date&lt;br /&gt;
|sort=Modification date&lt;br /&gt;
|order=desc&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/FlexForm/2.1,_2.5/create_pages&amp;diff=3879</id>
		<title>DevOps:Doc/FlexForm/2.1, 2.5/create pages</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/FlexForm/2.1,_2.5/create_pages&amp;diff=3879"/>
		<updated>2025-10-09T12:32:27Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
* These tests assume you are using a wiki with $wgCapitalLinks set to true (the default setting). Else tests like A1 and A2 will produce different results, as the first letter won&#039;t be capitalized automatically. You can still use these tests, but you will have to carefully evaluate the results yourself, as some of the instructions will not be applicable. &lt;br /&gt;
* Tests should be done with FlexForm extension setting create-seo-titles set to true as well as false.&lt;br /&gt;
* To execute the tests, copy the wikitext shown below to a page on your wiki. The page should show test instructions as well as forms to test different _create options. &lt;br /&gt;
* After you finish testing, delete the created test pages. You can for example find these in your contributions or use the Semantic MediaWiki query to get a list of pages and delete them through Special:DeleteBatch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
== A. next_available test ==&lt;br /&gt;
* Test each create multiple times&lt;br /&gt;
* Verify that the created page gets a new number each time, i.e. &amp;quot;Test page1&amp;quot; then &amp;quot;Test page2&amp;quot; then &amp;quot;Test page3&amp;quot; etc.&lt;br /&gt;
* Tests A1, A2, A3, A4 and A6 (with namespace option &amp;quot;(Main)&amp;quot;) should result in similar pagetitles&lt;br /&gt;
** note: with create-seo-titles set to true, A4 will produce a different pagetitle, for example &amp;quot;Test-page1&amp;quot;&lt;br /&gt;
* Tests A5 and A6 (with namespace options &amp;quot;template&amp;quot; and &amp;quot;Template&amp;quot;) should result in similar pagetitles&lt;br /&gt;
** note: you might see &amp;quot;Template&amp;quot; in the created page in a different language, if your user preference is set to a language other than English&lt;br /&gt;
&lt;br /&gt;
=== A1. Test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== A2. test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== A3. :Test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;:Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== A4. Test page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== A5. Template:test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Template:test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== A6. [namespace]:Test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;[namespace]:Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
&amp;lt;select name=&amp;quot;namespace&amp;quot; placeholder=&amp;quot;Choose a namespace&amp;quot; required=&amp;quot;required&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;&amp;quot;&amp;gt;(Main)&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;Template&amp;quot; &amp;gt;Template&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;template&amp;quot;&amp;gt;template&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== B. add_random test ==&lt;br /&gt;
* Test each create multiple times&lt;br /&gt;
* Verify that the created page gets a new number each time, i.e. &amp;quot;Test page1759998954&amp;quot; then &amp;quot;Test page1759998946&amp;quot; etc.&lt;br /&gt;
** note: the numbers are not fully random as they are based on timestamp, but each create should result in a unique number. &lt;br /&gt;
* Tests B1, B2, B3 and B5 (with namespace option &amp;quot;(Main)&amp;quot;) should result in similar pagetitles&lt;br /&gt;
* Tests B4 and B5 (with namespace options &amp;quot;template&amp;quot; and &amp;quot;Template&amp;quot;) should result in similar pagetitles&lt;br /&gt;
** note: you might see &amp;quot;Template&amp;quot; in the created page in a different language, if your user preference is set to a language other than English&lt;br /&gt;
* When using the create-seo-titles extension setting of FlexForm, B6 and B7 should result in similar pagetitles&lt;br /&gt;
&lt;br /&gt;
=== B1. Test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== B2. test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== B3. :Test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;:Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== B4. Template:test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Template:test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== B5. [namespace]:Test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;[namespace]:Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
&amp;lt;select name=&amp;quot;namespace&amp;quot; placeholder=&amp;quot;Choose a namespace&amp;quot; required=&amp;quot;required&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;&amp;quot;&amp;gt;(Main)&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;Template&amp;quot; &amp;gt;Template&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;template&amp;quot;&amp;gt;template&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== B6. Test_page/ ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page/&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== B7. Test_page- ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page-&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== C. range tests ==&lt;br /&gt;
* Test each create multiple times&lt;br /&gt;
* C1 should create titles &amp;quot;Test_page/2019000&amp;quot;, &amp;quot;Test_page/2019001&amp;quot;, &amp;quot;Test_page/2019002&amp;quot; etc.&lt;br /&gt;
* C2 should create titles &amp;quot;Test_page/1&amp;quot;, &amp;quot;Test_page/2&amp;quot;, &amp;quot;Test_page/3&amp;quot; etc.&lt;br /&gt;
* C3 should create titles &amp;quot;Test_page/0001&amp;quot;, &amp;quot;Test_page/0002&amp;quot;, &amp;quot;Test_page/0003&amp;quot; etc.&lt;br /&gt;
* C3 should create titles &amp;quot;Template:Test_page/0001&amp;quot;, &amp;quot;Template:Test_page/0002&amp;quot;, &amp;quot;Template:Test_page/0003&amp;quot; etc.&lt;br /&gt;
** note: you might see &amp;quot;Template&amp;quot; in the created page in a different language, if your user preference is set to a language other than English&lt;br /&gt;
&lt;br /&gt;
=== C1. Test_page/range:2019000-2019999 ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page/&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;range:2019000-2019999&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C2. Test_page/range:1-9999 ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page/&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;range:1-9999&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C3. Test_page/range:1-9999 with mwleadingzero ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page/&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;range:1-9999&amp;quot; mwleadingzero mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C4. template:Test_page/range:1-9999 with mwleadingzero ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;template:Test_page/&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;range:1-9999&amp;quot; mwleadingzero mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== D. create-seo-titles test ==&lt;br /&gt;
* The create should result a page title where values from input fields are cleaned up. Symbols and spaces are replace with &amp;quot;-&amp;quot; and all letters are lower case (except for the first one if $wgCapitalLinks is set to true)&lt;br /&gt;
* D1 should give an error message as it&#039;s an invalid pagetitle: &amp;quot;Could not create page Test#@*( PAge. Invalid title.&amp;quot;&lt;br /&gt;
* D2 should create &amp;quot;Test page/test-page&amp;quot;&lt;br /&gt;
* D3 should create &amp;quot;Test-page&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== D1. Test_#@*( PAge ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_#@*( PAge&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== D2. Test page/[Title] ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test page/[Title]&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Title&amp;quot; value=&amp;quot;Test_#@*( PAge&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== D3. [Title] ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;[Title]&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Title&amp;quot; value=&amp;quot;test_#@*( PAge&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Potentially useful Semantic MediaWiki query to find created pages (if you are using SMW) ==&lt;br /&gt;
{{#ask:[[~*Test page*]]&lt;br /&gt;
|?=Page&lt;br /&gt;
|?#-=Page&lt;br /&gt;
|?Modification date&lt;br /&gt;
|sort=Modification date&lt;br /&gt;
|order=desc&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/FlexForm/2.1,_2.5/create_pages&amp;diff=3878</id>
		<title>DevOps:Doc/FlexForm/2.1, 2.5/create pages</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/FlexForm/2.1,_2.5/create_pages&amp;diff=3878"/>
		<updated>2025-10-09T11:48:52Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
* These tests assume you are using a wiki with $wgCapitalLinks set to true (the default setting). Else tests like A1 and A2 will produce different results, as the first letter won&#039;t be capitalized automatically. You can still use these tests, but you will have to carefully evaluate the results yourself, as some of the instructions will not be applicable. &lt;br /&gt;
* Tests should be done with FlexForm extension setting create-seo-titles set to true as well as false.&lt;br /&gt;
* To execute the tests, copy the wikitext shown below to a page on your wiki. The page should show test instructions as well as forms to test different _create options. &lt;br /&gt;
* After you finish testing, delete the created test pages. You can for example find these in your contributions or use the Semantic MediaWiki query to get a list of pages and delete them through Special:DeleteBatch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
== A. next_available test ==&lt;br /&gt;
* Test each create multiple times&lt;br /&gt;
* Verify that the created page gets a new number each time, i.e. &amp;quot;Test page1&amp;quot; then &amp;quot;Test page2&amp;quot; then &amp;quot;Test page3&amp;quot; etc.&lt;br /&gt;
* Tests A1, A2, A3, A4 and A6 (with namespace option &amp;quot;(Main)&amp;quot;) should result in similar pagetitles&lt;br /&gt;
** note: with create-seo-titles set to true, A4 will produce a different pagetitle, for example &amp;quot;Test-page1&amp;quot;&lt;br /&gt;
* Tests A5 and A6 (with namespace options &amp;quot;template&amp;quot; and &amp;quot;Template&amp;quot;) should result in similar pagetitles&lt;br /&gt;
** note: you might see &amp;quot;Template&amp;quot; in the created page in a different language, if your user preference is set to a language other than English&lt;br /&gt;
&lt;br /&gt;
=== A1. Test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== A2. test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== A3. :Test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;:Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== A4. Test page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== A5. Template:test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Template:test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== A6. [namespace]:Test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;[namespace]:Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
&amp;lt;select name=&amp;quot;namespace&amp;quot; placeholder=&amp;quot;Choose a namespace&amp;quot; required=&amp;quot;required&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;&amp;quot;&amp;gt;(Main)&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;Template&amp;quot; &amp;gt;Template&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;template&amp;quot;&amp;gt;template&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== B. add_random test ==&lt;br /&gt;
* Test each create multiple times&lt;br /&gt;
* Verify that the created page gets a new number each time, i.e. &amp;quot;Test page1759998954&amp;quot; then &amp;quot;Test page1759998946&amp;quot; etc.&lt;br /&gt;
** note: the numbers are not fully random as they are based on timestamp, but each create should result in a unique number. &lt;br /&gt;
* Tests B1, B2, B3 and B5 (with namespace option &amp;quot;(Main)&amp;quot;) should result in similar pagetitles&lt;br /&gt;
* Tests B4 and B5 (with namespace options &amp;quot;template&amp;quot; and &amp;quot;Template&amp;quot;) should result in similar pagetitles&lt;br /&gt;
** note: you might see &amp;quot;Template&amp;quot; in the created page in a different language, if your user preference is set to a language other than English&lt;br /&gt;
* When using the create-seo-titles extension setting of FlexForm, B6 and B7 should result in similar pagetitles&lt;br /&gt;
&lt;br /&gt;
=== B1. Test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== B2. test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== B3. :Test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;:Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== B4. Template:test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Template:test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== B5. [namespace]:Test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;[namespace]:Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
&amp;lt;select name=&amp;quot;namespace&amp;quot; placeholder=&amp;quot;Choose a namespace&amp;quot; required=&amp;quot;required&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;&amp;quot;&amp;gt;(Main)&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;Template&amp;quot; &amp;gt;Template&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;template&amp;quot;&amp;gt;template&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== B6. Test_page/ ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page/&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== B7. Test_page- ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page-&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== C. range tests ==&lt;br /&gt;
* Test each create multiple times&lt;br /&gt;
* C1 should create titles &amp;quot;Test_page/2019000&amp;quot;, &amp;quot;Test_page/2019001&amp;quot;, &amp;quot;Test_page/2019002&amp;quot; etc.&lt;br /&gt;
* C2 should create titles &amp;quot;Test_page/1&amp;quot;, &amp;quot;Test_page/2&amp;quot;, &amp;quot;Test_page/3&amp;quot; etc.&lt;br /&gt;
* C3 should create titles &amp;quot;Test_page/0001&amp;quot;, &amp;quot;Test_page/0002&amp;quot;, &amp;quot;Test_page/0003&amp;quot; etc.&lt;br /&gt;
* C3 should create titles &amp;quot;Template:Test_page/0001&amp;quot;, &amp;quot;Template:Test_page/0002&amp;quot;, &amp;quot;Template:Test_page/0003&amp;quot; etc.&lt;br /&gt;
** note: you might see &amp;quot;Template&amp;quot; in the created page in a different language, if your user preference is set to a language other than English&lt;br /&gt;
&lt;br /&gt;
=== C1. Test_page/range:2019000-2019999 ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page/&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;range:2019000-2019999&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C2. Test_page/range:1-9999 ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page/&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;range:1-9999&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C3. Test_page/range:1-9999 with mwleadingzero ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page/&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;range:1-9999&amp;quot; mwleadingzero mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C4. template:Test_page/range:1-9999 with mwleadingzero ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;template:Test_page/&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;range:1-9999&amp;quot; mwleadingzero mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== D. create-seo-titles test ==&lt;br /&gt;
* The create should result in a cleaned up page title where symbols are replace with &amp;quot;-&amp;quot; and all letters are lower case (except for the first one if $wgCapitalLinks is set to true)&lt;br /&gt;
&lt;br /&gt;
=== D1. Test_#@*( PAge ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_#@*( PAge&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Potentially useful Semantic MediaWiki query to find created pages (if you are using SMW) ==&lt;br /&gt;
{{#ask:[[~*Test page*]]&lt;br /&gt;
|?=Page&lt;br /&gt;
|?#-=Page&lt;br /&gt;
|?Modification date&lt;br /&gt;
|sort=Modification date&lt;br /&gt;
|order=desc&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/FlexForm/2.1,_2.5/create_pages&amp;diff=3877</id>
		<title>DevOps:Doc/FlexForm/2.1, 2.5/create pages</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/FlexForm/2.1,_2.5/create_pages&amp;diff=3877"/>
		<updated>2025-10-09T11:48:12Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
* These tests assume you are using a wiki with $wgCapitalLinks set to true (the default setting). Else tests like A1 and A2 will produce different results, as the first letter won&#039;t be capitalized automatically. You can still use these tests, but you will have to carefully evaluate the results yourself, as some of the instructions will not be applicable. &lt;br /&gt;
* Tests should be done with FlexForm extension setting create-seo-titles set to true as well as false.&lt;br /&gt;
* To execute the tests, copy the wikitext shown below to a page on your wiki. The page should show test instructions as well as forms to test different _create options. &lt;br /&gt;
* After you finish testing, delete the created test pages. You can for example find these in your contributions or use the Semantic MediaWiki query to get a list of pages and delete them through Special:DeleteBatch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
== A. next_available test ==&lt;br /&gt;
* Test each create multiple times&lt;br /&gt;
* Verify that the created page gets a new number each time, i.e. &amp;quot;Test page1&amp;quot; then &amp;quot;Test page2&amp;quot; then &amp;quot;Test page3&amp;quot; etc.&lt;br /&gt;
* Tests A1, A2, A3, A4 and A6 (with namespace option &amp;quot;(Main)&amp;quot;) should result in similar pagetitles&lt;br /&gt;
** note: with create-seo-titles set to true, A4 will produce a different pagetitle, for example &amp;quot;Test-page1&amp;quot;&lt;br /&gt;
* Tests A5 and A6 (with namespace options &amp;quot;template&amp;quot; and &amp;quot;Template&amp;quot;) should result in similar pagetitles&lt;br /&gt;
** note: you might see &amp;quot;Template&amp;quot; in the created page in a different language, if your user preference is set to a language other than English&lt;br /&gt;
&lt;br /&gt;
=== A1. Test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== A2. test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== A3. :Test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;:Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== A4. Test page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== A5. Template:test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Template:test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== A6. [namespace]:Test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;[namespace]:Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
&amp;lt;select name=&amp;quot;namespace&amp;quot; placeholder=&amp;quot;Choose a namespace&amp;quot; required=&amp;quot;required&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;&amp;quot;&amp;gt;(Main)&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;Template&amp;quot; &amp;gt;Template&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;template&amp;quot;&amp;gt;template&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== B. add_random test ==&lt;br /&gt;
* Test each create multiple times&lt;br /&gt;
* Verify that the created page gets a new number each time, i.e. &amp;quot;Test page1759998954&amp;quot; then &amp;quot;Test page1759998946&amp;quot; etc.&lt;br /&gt;
** note: the numbers are not fully random as they are based on timestamp, but each create should result in a unique number. &lt;br /&gt;
* Tests B1, B2, B3 and B5 (with namespace option &amp;quot;(Main)&amp;quot;) should result in similar pagetitles&lt;br /&gt;
* Tests B4 and B5 (with namespace options &amp;quot;template&amp;quot; and &amp;quot;Template&amp;quot;) should result in similar pagetitles&lt;br /&gt;
** note: you might see &amp;quot;Template&amp;quot; in the created page in a different language, if your user preference is set to a language other than English&lt;br /&gt;
* When using the create-seo-titles extension setting of FlexForm, B6 and B7 should result in similar pagetitles&lt;br /&gt;
&lt;br /&gt;
=== B1. Test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== B2. test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== B3. :Test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;:Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== B4. Template:test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Template:test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== B5. [namespace]:Test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;[namespace]:Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
&amp;lt;select name=&amp;quot;namespace&amp;quot; placeholder=&amp;quot;Choose a namespace&amp;quot; required=&amp;quot;required&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;&amp;quot;&amp;gt;(Main)&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;Template&amp;quot; &amp;gt;Template&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;template&amp;quot;&amp;gt;template&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== B6. Test_page/ ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page/&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== B7. Test_page- ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page-&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== C. range tests ==&lt;br /&gt;
* Test each create multiple times&lt;br /&gt;
* C1 should create titles &amp;quot;Test_page/2019000&amp;quot;, &amp;quot;Test_page/2019001&amp;quot;, &amp;quot;Test_page/2019002&amp;quot; etc.&lt;br /&gt;
* C2 should create titles &amp;quot;Test_page/1&amp;quot;, &amp;quot;Test_page/2&amp;quot;, &amp;quot;Test_page/3&amp;quot; etc.&lt;br /&gt;
* C3 should create titles &amp;quot;Test_page/0001&amp;quot;, &amp;quot;Test_page/0002&amp;quot;, &amp;quot;Test_page/0003&amp;quot; etc.&lt;br /&gt;
* C3 should create titles &amp;quot;Template:Test_page/0001&amp;quot;, &amp;quot;Template:Test_page/0002&amp;quot;, &amp;quot;Template:Test_page/0003&amp;quot; etc.&lt;br /&gt;
** note: you might see &amp;quot;Template&amp;quot; in the created page in a different language, if your user preference is set to a language other than English&lt;br /&gt;
&lt;br /&gt;
=== C1. Test_page/range:2019000-2019999 ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page/&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;range:2019000-2019999&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C2. Test_page/range:1-9999 ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page/&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;range:1-9999&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C3. Test_page/range:1-9999 with mwleadingzero ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page/&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;range:1-9999&amp;quot; mwleadingzero mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C4. template:Test_page/range:1-9999 with mwleadingzero ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;template:Test_page/&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;range:1-9999&amp;quot; mwleadingzero mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== D. create-seo-titles test ==&lt;br /&gt;
* The create should result in a cleaned up page title where symbols are replace with &amp;quot;-&amp;quot; and all letters are lower case (except for the first one if $wgCapitalLinks is set to true)&lt;br /&gt;
&lt;br /&gt;
=== D1. Test_#@*( page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_#@*( PAge&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Potentially useful Semantic MediaWiki query to find created pages (if you are using SMW) ==&lt;br /&gt;
{{#ask:[[~*Test page*]]&lt;br /&gt;
|?=Page&lt;br /&gt;
|?#-=Page&lt;br /&gt;
|?Modification date&lt;br /&gt;
|sort=Modification date&lt;br /&gt;
|order=desc&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/FlexForm/2.1,_2.5/create_pages&amp;diff=3876</id>
		<title>DevOps:Doc/FlexForm/2.1, 2.5/create pages</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/FlexForm/2.1,_2.5/create_pages&amp;diff=3876"/>
		<updated>2025-10-09T11:47:42Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
* These tests assume you are using a wiki with $wgCapitalLinks set to true (the default setting). Else tests like A1 and A2 will produce different results, as the first letter won&#039;t be capitalized automatically. You can still use these tests, but you will have to carefully evaluate the results yourself, as some of the instructions will not be applicable. &lt;br /&gt;
* Tests should be done with FlexForm extension setting create-seo-titles set to true as well as false.&lt;br /&gt;
* To execute the tests, copy the wikitext shown below to a page on your wiki. The page should show test instructions as well as forms to test different _create options. &lt;br /&gt;
* After you finish testing, delete the created test pages. You can for example find these in your contributions or use the Semantic MediaWiki query to get a list of pages and delete them through Special:DeleteBatch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
== A. next_available test ==&lt;br /&gt;
* Test each create multiple times&lt;br /&gt;
* Verify that the created page gets a new number each time, i.e. &amp;quot;Test page1&amp;quot; then &amp;quot;Test page2&amp;quot; then &amp;quot;Test page3&amp;quot; etc.&lt;br /&gt;
* Tests A1, A2, A3, A4 and A6 (with namespace option &amp;quot;(Main)&amp;quot;) should result in similar pagetitles&lt;br /&gt;
** note: with create-seo-titles set to true, A4 will produce a different pagetitle, for example &amp;quot;Test-page1&amp;quot;&lt;br /&gt;
* Tests A5 and A6 (with namespace options &amp;quot;template&amp;quot; and &amp;quot;Template&amp;quot;) should result in similar pagetitles&lt;br /&gt;
** note: you might see &amp;quot;Template&amp;quot; in the created page in a different language, if your user preference is set to a language other than English&lt;br /&gt;
&lt;br /&gt;
=== A1. Test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== A2. test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== A3. :Test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;:Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== A4. Test page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== A5. Template:test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Template:test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== A6. [namespace]:Test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;[namespace]:Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;next_available&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
&amp;lt;select name=&amp;quot;namespace&amp;quot; placeholder=&amp;quot;Choose a namespace&amp;quot; required=&amp;quot;required&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;&amp;quot;&amp;gt;(Main)&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;Template&amp;quot; &amp;gt;Template&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;template&amp;quot;&amp;gt;template&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== B. add_random test ==&lt;br /&gt;
* Test each create multiple times&lt;br /&gt;
* Verify that the created page gets a new number each time, i.e. &amp;quot;Test page1759998954&amp;quot; then &amp;quot;Test page1759998946&amp;quot; etc.&lt;br /&gt;
** note: the numbers are not fully random as they are based on timestamp, but each create should result in a unique number. &lt;br /&gt;
* Tests B1, B2, B3 and B5 (with namespace option &amp;quot;(Main)&amp;quot;) should result in similar pagetitles&lt;br /&gt;
* Tests B4 and B5 (with namespace options &amp;quot;template&amp;quot; and &amp;quot;Template&amp;quot;) should result in similar pagetitles&lt;br /&gt;
** note: you might see &amp;quot;Template&amp;quot; in the created page in a different language, if your user preference is set to a language other than English&lt;br /&gt;
* When using the create-seo-titles extension setting of FlexForm, B6 and B7 should result in similar pagetitles&lt;br /&gt;
&lt;br /&gt;
=== B1. Test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== B2. test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== B3. :Test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;:Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== B4. Template:test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Template:test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== B5. [namespace]:Test_page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;[namespace]:Test_page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
&amp;lt;select name=&amp;quot;namespace&amp;quot; placeholder=&amp;quot;Choose a namespace&amp;quot; required=&amp;quot;required&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;&amp;quot;&amp;gt;(Main)&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;Template&amp;quot; &amp;gt;Template&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;template&amp;quot;&amp;gt;template&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== B6. Test_page/ ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page/&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== B7. Test_page- ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page-&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;add_random&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== C. range tests ==&lt;br /&gt;
* Test each create multiple times&lt;br /&gt;
* C1 should create titles &amp;quot;Test_page/2019000&amp;quot;, &amp;quot;Test_page/2019001&amp;quot;, &amp;quot;Test_page/2019002&amp;quot; etc.&lt;br /&gt;
* C2 should create titles &amp;quot;Test_page/1&amp;quot;, &amp;quot;Test_page/2&amp;quot;, &amp;quot;Test_page/3&amp;quot; etc.&lt;br /&gt;
* C3 should create titles &amp;quot;Test_page/0001&amp;quot;, &amp;quot;Test_page/0002&amp;quot;, &amp;quot;Test_page/0003&amp;quot; etc.&lt;br /&gt;
* C3 should create titles &amp;quot;Template:Test_page/0001&amp;quot;, &amp;quot;Template:Test_page/0002&amp;quot;, &amp;quot;Template:Test_page/0003&amp;quot; etc.&lt;br /&gt;
** note: you might see &amp;quot;Template&amp;quot; in the created page in a different language, if your user preference is set to a language other than English&lt;br /&gt;
&lt;br /&gt;
=== C1. Test_page/range:2019000-2019999 ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page/&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;range:2019000-2019999&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C2. Test_page/range:1-9999 ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page/&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;range:1-9999&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C3. Test_page/range:1-9999 with mwleadingzero ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_page/&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;range:1-9999&amp;quot; mwleadingzero mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C4. template:Test_page/range:1-9999 with mwleadingzero ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;template:Test_page/&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwoption=&amp;quot;range:1-9999&amp;quot; mwleadingzero mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== D. create-seo-titles test ==&lt;br /&gt;
* The create should result in a cleaned up page title where symbols are replace with &amp;quot;-&amp;quot; and all letters are lower case (except for the first one if $wgCapitalLinks is set to true)&lt;br /&gt;
&lt;br /&gt;
=== D1. Test_#@*( page ===&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_create mwwrite=&amp;quot;Test_#@*( page&amp;quot; mwtemplate=&amp;quot;Test&amp;quot; mwfollow /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Content&amp;quot; value=&amp;quot;{{#time:r|now||l}}&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Potentially useful Semantic MediaWiki query to find created pages (if you are using SMW) ==&lt;br /&gt;
{{#ask:[[~*Test page*]]&lt;br /&gt;
|?=Page&lt;br /&gt;
|?#-=Page&lt;br /&gt;
|?Modification date&lt;br /&gt;
|sort=Modification date&lt;br /&gt;
|order=desc&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=Open_CSP_Steering_committee&amp;diff=3867</id>
		<title>Open CSP Steering committee</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=Open_CSP_Steering_committee&amp;diff=3867"/>
		<updated>2025-09-24T09:36:28Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Agenda of the steering committee meetings ==&lt;br /&gt;
&lt;br /&gt;
* Welcome and Recap&lt;br /&gt;
* Project Status and Updates&lt;br /&gt;
* Technical Roadmap&lt;br /&gt;
* Marketing activities&lt;br /&gt;
* Risk Management&lt;br /&gt;
* Open Discussion&lt;br /&gt;
* Action Items and Next Meeting&lt;br /&gt;
== Members ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Role/focus&lt;br /&gt;
!Organization&lt;br /&gt;
{{Steering committee member&lt;br /&gt;
|Name=Ad Strack van Schijndel&lt;br /&gt;
|Role=Chairperson&lt;br /&gt;
|Organization=Juggel&lt;br /&gt;
}}{{Steering committee member&lt;br /&gt;
|Name=Charlot Cobben&lt;br /&gt;
|Role=Maintainer&lt;br /&gt;
|Organization=Wikibase Solutions&lt;br /&gt;
}}{{Steering committee member&lt;br /&gt;
|Name=Marijn van Wezel&lt;br /&gt;
|Role=Maintainer&lt;br /&gt;
|Organization=Independent&lt;br /&gt;
}}{{Steering committee member&lt;br /&gt;
|Name=Cindy Cicalese&lt;br /&gt;
|Role=Linking pin MediaWiki&lt;br /&gt;
|Organization=Wikimedia Foundation&lt;br /&gt;
}}{{Steering committee member&lt;br /&gt;
|Name=Jeffrey Wang&lt;br /&gt;
|Role=Linking pin Canasta&lt;br /&gt;
|Organization=MyWikis&lt;br /&gt;
}}{{Steering committee member&lt;br /&gt;
|Name=Rich Evans&lt;br /&gt;
|Role=Ambassador&lt;br /&gt;
|Organization=NASA GRC&lt;br /&gt;
}}{{Steering committee member&lt;br /&gt;
|Name=Bryan Hildebrand&lt;br /&gt;
|Role=Ambassador&lt;br /&gt;
|Organization=Tegnosis Knowledge Management&lt;br /&gt;
}}{{Steering committee member&lt;br /&gt;
|Name=Viktor Schelling&lt;br /&gt;
|Role=tba&lt;br /&gt;
|Organization=Independent&lt;br /&gt;
}} &lt;br /&gt;
|}&lt;br /&gt;
== Meetings ==&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
         --&amp;gt;&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
            --&amp;gt;&amp;lt;div class=&amp;quot;col&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
               --&amp;gt;&amp;lt;div class=&amp;quot;timeline-steps aos-init aos-animate&amp;quot; data-aos=&amp;quot;fade-up&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
                  --&amp;gt;{{#invoke:Timeline|show}}&amp;lt;!--&lt;br /&gt;
               --&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;!--&lt;br /&gt;
            --&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;!--&lt;br /&gt;
        --&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;!--&lt;br /&gt;
   --&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#ifingroup:user|&lt;br /&gt;
{{#ask: [[Class::Meeting report]]&lt;br /&gt;
|?Date&lt;br /&gt;
|?Attendees&lt;br /&gt;
|format=table&lt;br /&gt;
}}}}&lt;br /&gt;
&lt;br /&gt;
{{#ifingroup:user|&lt;br /&gt;
=== Create new meeting report ===&lt;br /&gt;
{{Create meeting form&lt;br /&gt;
|Meeting type=Steering committee&lt;br /&gt;
}}}}&lt;br /&gt;
{{#slot:ws-data|{{FULLPAGENAME}}}}&lt;br /&gt;
{{#ifingroup:moderator,sysop |&lt;br /&gt;
&lt;br /&gt;
=== Edit Agenda meetings ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID:{{FULLPAGENAME}}}}&amp;quot; format=&amp;quot;json&amp;quot; template=&amp;quot;jsonk|milestones&amp;quot; formfield=&amp;quot;timeline-instance&amp;quot; mwslot=&amp;quot;ws-data&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_instance name=&amp;quot;timeline-instance&amp;quot; format=&amp;quot;json&amp;quot; default-content=&amp;quot;{{#slotdata:ws-data|{{FULLPAGENAME}} |milestones}}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;timeline-edit&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;date&amp;quot;&amp;gt;Date&amp;lt;/label&amp;gt;&amp;lt;input type=&amp;quot;date&amp;quot; name=&amp;quot;date&amp;quot; placeholder=&amp;quot;date&amp;quot; /&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;timeline-edit&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;title&amp;quot;&amp;gt;Title&amp;lt;/label&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;title&amp;quot; placeholder=&amp;quot;title&amp;quot; /&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;timeline-edit&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;link&amp;quot;&amp;gt;Link&amp;lt;/label&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;link&amp;quot; placeholder=&amp;quot;url&amp;quot; /&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/_instance&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;save&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=Open_CSP_Steering_committee&amp;diff=3866</id>
		<title>Open CSP Steering committee</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=Open_CSP_Steering_committee&amp;diff=3866"/>
		<updated>2025-09-24T09:36:12Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: User:Ebc16062-dd09-4928-8cf3-821f492b0c44&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Agenda of the steering committee meetings ==&lt;br /&gt;
&lt;br /&gt;
* Welcome and Recap&lt;br /&gt;
* Project Status and Updates&lt;br /&gt;
* Technical Roadmap&lt;br /&gt;
* Marketing activities&lt;br /&gt;
* Risk Management&lt;br /&gt;
* Open Discussion&lt;br /&gt;
* Action Items and Next Meeting&lt;br /&gt;
== Members ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Role/focus&lt;br /&gt;
!Organization&lt;br /&gt;
{{Steering committee member&lt;br /&gt;
|Name=Ad Strack van Schijndel&lt;br /&gt;
|Role=Chairperson&lt;br /&gt;
|Organization=Juggel&lt;br /&gt;
}}{{Steering committee member&lt;br /&gt;
|Name=Charlot Cobben&lt;br /&gt;
|Role=Maintainer&lt;br /&gt;
|Organization=Wikibase Solutions&lt;br /&gt;
}}{{Steering committee member&lt;br /&gt;
|Name=Marijn van Wezel&lt;br /&gt;
|Role=Maintainer&lt;br /&gt;
|Organization=Independent&lt;br /&gt;
}}{{Steering committee member&lt;br /&gt;
|Name=Cindy Cicalese&lt;br /&gt;
|Role=Linking pin MediaWiki&lt;br /&gt;
|Organization=Wikimedia Foundation&lt;br /&gt;
}}{{Steering committee member&lt;br /&gt;
|Name=Jeffrey Wang&lt;br /&gt;
|Role=Linking pin Canasta&lt;br /&gt;
|Organization=MyWikis&lt;br /&gt;
}}{{Steering committee member&lt;br /&gt;
|Name=Rich Evans&lt;br /&gt;
|Role=Ambassador&lt;br /&gt;
|Organization=NASA GRC&lt;br /&gt;
}}{{Steering committee member&lt;br /&gt;
|Name=Bryan Hildebrand&lt;br /&gt;
|Role=Ambassador&lt;br /&gt;
|Organization=Tegnosis Knowledge Management&lt;br /&gt;
}}{{Steering committee member&lt;br /&gt;
|Name=Viktor Schelling&lt;br /&gt;
|Role=tba&lt;br /&gt;
|Organization=Independent&lt;br /&gt;
}} &lt;br /&gt;
|}&lt;br /&gt;
== Meetings ==&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
         --&amp;gt;&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
            --&amp;gt;&amp;lt;div class=&amp;quot;col&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
               --&amp;gt;&amp;lt;div class=&amp;quot;timeline-steps aos-init aos-animate&amp;quot; data-aos=&amp;quot;fade-up&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
                  --&amp;gt;{{#invoke:Timeline|show}}&amp;lt;!--&lt;br /&gt;
               --&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;!--&lt;br /&gt;
            --&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;!--&lt;br /&gt;
        --&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;!--&lt;br /&gt;
   --&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#ifingroup:user|&lt;br /&gt;
{{#ask: [[Class::Meeting report]]&lt;br /&gt;
|?Date&lt;br /&gt;
|?Attendees&lt;br /&gt;
|format=table&lt;br /&gt;
}}}}&lt;br /&gt;
&lt;br /&gt;
{{#ifingroup:user|&lt;br /&gt;
=== Create new meeting report ===&lt;br /&gt;
{{Create meeting form&lt;br /&gt;
|Meeting type=Steering committee&lt;br /&gt;
}}}}&lt;br /&gt;
{{#slot:ws-data|{{FULLPAGENAME}}}}&lt;br /&gt;
{{#ifingroup:moderator,sysop |&lt;br /&gt;
&lt;br /&gt;
=== Edit Agenda meetings ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID:{{FULLPAGENAME}}}}&amp;quot; format=&amp;quot;json&amp;quot; template=&amp;quot;jsonk|milestones&amp;quot; formfield=&amp;quot;timeline-instance&amp;quot; mwslot=&amp;quot;ws-data&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_instance name=&amp;quot;timeline-instance&amp;quot; format=&amp;quot;json&amp;quot; default-content=&amp;quot;{{#slotdata:ws-data|{{FULLPAGENAME}} |milestones}}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;timeline-edit&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;date&amp;quot;&amp;gt;Date&amp;lt;/label&amp;gt;&amp;lt;input type=&amp;quot;date&amp;quot; name=&amp;quot;date&amp;quot; placeholder=&amp;quot;date&amp;quot; /&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;timeline-edit&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;title&amp;quot;&amp;gt;Title&amp;lt;/label&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;title&amp;quot; placeholder=&amp;quot;title&amp;quot; /&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;timeline-edit&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;link&amp;quot;&amp;gt;Link&amp;lt;/label&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;link&amp;quot; placeholder=&amp;quot;url&amp;quot; /&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/_instance&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;save&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/FlexForm/2.1/Form_options&amp;diff=3724</id>
		<title>DevOps:Doc/FlexForm/2.1/Form options</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/FlexForm/2.1/Form_options&amp;diff=3724"/>
		<updated>2025-08-21T09:36:57Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: /* Use reCaptcha Version 3 on a flexform */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Name===&lt;br /&gt;
form&lt;br /&gt;
===Type===&lt;br /&gt;
form&lt;br /&gt;
===Synopsis===&lt;br /&gt;
Various FlexForm options&lt;br /&gt;
===Description===&lt;br /&gt;
Parameters you can add to the _form tag.&lt;br /&gt;
===Parameters===&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;action&#039;&#039;&#039; ====&lt;br /&gt;
&lt;br /&gt;
====== &#039;&#039;Action telling Flexform what this form is for&#039;&#039; ======&lt;br /&gt;
There are three options :&lt;br /&gt;
* &#039;&#039;&#039;addToWiki&#039;&#039;&#039; : If no action is set, this is the default action. It will expect _create or _edit input telling it what to do with the form&lt;br /&gt;
* &#039;&#039;&#039;get&#039;&#039;&#039; :  Same as addToWiki, except now the page FlexForm is going to after submit will have all form input and values in the url of the page. Handy to e.g. forward to the Wiki Search page.&lt;br /&gt;
* &#039;&#039;&#039;email&#039;&#039;&#039;: Same as addToWiki, except now FlexForm will also look for the email options inside a form&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;formtarget&#039;&#039;&#039; ====&lt;br /&gt;
&lt;br /&gt;
====== &#039;&#039;Change the html post action to a custom one&#039;&#039; ======&lt;br /&gt;
In some rare cases you might want to create a FlexForm, but not have FlexForm handle the post data. In that case use formtarget=&amp;quot;your url here&amp;quot; to tell html form where to go when someone submits the data.&lt;br /&gt;
&lt;br /&gt;
See example 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Note: Keep in mind that this option will completely ignore FlexForm on form submission. No pages will be created or edited.&#039;&#039;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;messageonsuccess&#039;&#039;&#039; ====&lt;br /&gt;
&lt;br /&gt;
====== &#039;&#039;Show a custom message when form is successfully posted&#039;&#039; ======&lt;br /&gt;
It&#039;s sometimes handy to show a custom message when a form has been successfully posted, especially when after a post you return to the same form page.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;( new since v2.2.10 )&#039;&#039; The message will also be parsed to check for square bracket form attribute names and replace them with their values.&lt;br /&gt;
&lt;br /&gt;
See example 2&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;attachmessageto&#039;&#039;&#039; ====&lt;br /&gt;
&lt;br /&gt;
====== &#039;&#039;Where to show the message&#039;&#039; ======&lt;br /&gt;
By default, except for Ajax form submit, the default &#039;&#039;MediaWiki Message notifier&#039;&#039; is used to show your &#039;&#039;&#039;messageonsuccess&#039;&#039;&#039; or any of the other messages FlexForm might give (e.g. an error). Sometimes it can be handy to control where the notification pops-up, instead of the default right-top. You can use &#039;&#039;&#039;attachmessageto&#039;&#039;&#039; to attach the notification to an id of a certain HTML element. The notification will happen there. E.g. &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;form attachmessageto=&amp;quot;#my-unique-id&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;mwreturn&#039;&#039;&#039; ====&lt;br /&gt;
&lt;br /&gt;
====== &#039;&#039;Redirect to this page after submitting the form&#039;&#039; ======&lt;br /&gt;
When a form is submitted FlexForm will return to the page the Form was submitted from. You can change it to go to another page ( like a thank-you page for example ) by setting mwreturn. mwreturn=&amp;quot;Thank-you-page&amp;quot;. Provide a URL (the [https://www.mediawiki.org/wiki/Help:Magic_words#URL_data &amp;lt;code&amp;gt;localurl&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;fullurl&amp;lt;/code&amp;gt; magic words] may come in handy).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;permissions&#039;&#039;&#039; ====&lt;br /&gt;
&lt;br /&gt;
====== &#039;&#039;Overrule user permission on page edit or page create&#039;&#039; ======&lt;br /&gt;
&#039;&#039;&#039;Since version 2.1.12&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
FlexForm will check the users permission to edit or create a page. If a user is not allowed to create a page and the user submits a FlexForm that should create a page, a message will show the user has not the correct rights. ( The Wiki admin sets those rights ). Sometimes you do not want to give users ( or user groups ) edit or create rights, but you do want them to be able to e.g. create a new page using a FlexForm. You can then use the permissions argument. The value can be &amp;quot;can-edit&amp;quot;, &amp;quot;can-create&amp;quot; or both &amp;quot;can-edit;can-create&amp;quot;. The user will then be given the edit or create right using this FlexForm only.&lt;br /&gt;
&lt;br /&gt;
Note that the user will also need to be able to view the &#039;&#039;&#039;Special:FlexForm&#039;&#039;&#039; page to be able to submit forms, so this may need to be configured separately. For example if you want to allow anonymous users that are not logged in to use a form while normally they are not allowed to view pages in the wiki, you could add the special page to the $wgWhitelistRead setting.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Since version 2.3.10&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you are using Semantic MediaWiki and the permissions argument, FlexForm will finish it creation or edit process by running the rebuildData function of Semantic MediaWiki for the specific page to make sure properties will be set.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;no_submit_on_return&#039;&#039;&#039; ====&lt;br /&gt;
&lt;br /&gt;
====== &#039;&#039;Disable enter key for submitting a form&#039;&#039; ======&lt;br /&gt;
A HTML form usually gets submitted on pressing enter when there&#039;s like one text field. To disable that use the no_submit_on_return option.&lt;br /&gt;
This will add some JavaScript to the form disabling form submission on typing an enter.&lt;br /&gt;
&lt;br /&gt;
See example 3&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;recaptcha-v3-action&#039;&#039;&#039; ====&lt;br /&gt;
===== &#039;&#039;&#039;recaptcha-action ( since v.2.2.11 ) =====&lt;br /&gt;
&lt;br /&gt;
====== Use reCaptcha Version 3 on a flexform ======&lt;br /&gt;
Have FlexForm use Google reCAPTCHA v3 to prevent spamming in a form.&lt;br /&gt;
&lt;br /&gt;
You need to add you recaptcha key and secret in the configuration.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$wgFlexFormConfig[&#039;rc_site_key&#039;]   = &amp;quot;&amp;quot;; // reCaptcha site key&lt;br /&gt;
$wgFlexFormConfig[&#039;rc_secret_key&#039;] = &amp;quot;&amp;quot;; // reCaptcha secret key&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Then you can use &amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;recaptcha-v3-action=&amp;quot;action name&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Where action name is the name of the action to describe the form. It&#039;s an extra security measurement. You can choose your own name e.g. : contactform&lt;br /&gt;
&lt;br /&gt;
See example 4&lt;br /&gt;
&lt;br /&gt;
Since version 2.2.11 FlexForm supports ReCaptcha version 3, ReCaptcha Enterprise and ReCaptcha V2 (I&#039;m not a robot).&lt;br /&gt;
We have renamed the form argument recaptcha-v3-action to recaptcha--action, but we still support the previous argument for backwards compatibility.&lt;br /&gt;
&lt;br /&gt;
We have also changed the configuration settings to :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$wgFlexFormConfig[&#039;rc_use&#039;] = &amp;quot;enterprise&amp;quot;; // Defaults to v3. Can be v2, v3 and enterprise&lt;br /&gt;
$wgFlexFormConfig[&#039;rc_site_key&#039;] = &amp;quot;&amp;quot;; // for v2 and v3&lt;br /&gt;
$wgFlexFormConfig[&#039;rc_secret_key&#039;] = &amp;quot;&amp;quot;; // for v2 and v3&lt;br /&gt;
$wgFlexFormConfig[&#039;rce_project&#039;] = &amp;quot;&amp;quot;; // for enterprise&lt;br /&gt;
$wgFlexFormConfig[&#039;rce_site_key&#039;] = &amp;quot;&amp;quot;; // for enterprise&lt;br /&gt;
$wgFlexFormConfig[&#039;rce_api_key&#039;] = &amp;quot;&amp;quot;; // for enterprise&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Note&#039;&#039;: reCAPTCHA v3 will not work when submitting the form through AJAX (mwidentifier=&amp;quot;ajax&amp;quot;)&amp;lt;hr&amp;gt;&lt;br /&gt;
&#039;&#039;Note&#039;&#039;: Please read the Google reCaptcha documentation on how to get your &#039;&#039;&#039;site key&#039;&#039;&#039; and &#039;&#039;&#039;secret key&#039;&#039;&#039; ( for reCaptcha v2 and v3 ), and read the reCaptcha Enterprise documentation to set and retrieve the &#039;&#039;&#039;Project&#039;&#039;&#039;, &#039;&#039;&#039;Site key&#039;&#039;&#039; and &#039;&#039;&#039;Api key&#039;&#039;&#039;s&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;autosave&#039;&#039;&#039; ====&lt;br /&gt;
&lt;br /&gt;
====== &#039;&#039;Auto save forms on interval, after change or both&#039;&#039; ======&lt;br /&gt;
FlexForm autosave function allows for saving the open form in the background while someone is writing in it.&lt;br /&gt;
&lt;br /&gt;
This feature has 3 options:&lt;br /&gt;
&lt;br /&gt;
Save a form in the background on &#039;&#039;&#039;oninterval&#039;&#039;&#039;, on &#039;&#039;&#039;onchange&#039;&#039;&#039; or &#039;&#039;&#039;onboth&#039;&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
As of v1.1.28 &#039;&#039;&#039;onintervalafterchange&#039;&#039;&#039; has been added.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It support &amp;quot;normal&amp;quot; forms as well as a form with mwidentifier=&amp;quot;ajax&amp;quot;, meaning a form setup to be posted as an Ajax call. Also tested with TinyMCE ( tinymce extension ).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TinyMCE Note&#039;&#039;&#039;: FlexForm will look for all elements that have a class name starting with &amp;quot;tinymce&amp;quot;, as suggested by TinyMCE.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When using &#039;&#039;onboth&#039;&#039;, &#039;&#039;oninterval&#039;&#039; or &#039;&#039;onintervalafterchange&#039;&#039; a button will be added to the top of the form showing autosave interval is on. Clicking the button will turn interval saving off. When you turn it off and autosave is set to auto, the after change will still autosave. &#039;&#039;onintervalafterchange&#039;&#039; will add this button after a change has been detected.&lt;br /&gt;
&lt;br /&gt;
====== Config ======&lt;br /&gt;
&#039;&#039;The interval time and the after on change time can be set in the config file. When using interval or auto, the text for the button that appears above the form can be set in the config file.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To style the button to switch off and on the Interval saving classes are added to it in different states:&lt;br /&gt;
&lt;br /&gt;
When on it will have the classes : &#039;&#039;btn btn-primary ws-interval-on&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When off it will have the classes : &#039;&#039;btn btn ws-interval-off&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====== Parameters ======&lt;br /&gt;
&lt;br /&gt;
On form create tag add autosave as parameter. e.g.&lt;br /&gt;
&lt;br /&gt;
This will set autosave to auto.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form id=&amp;quot;unique id per form&amp;quot; autosave=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Set autosave to interval only :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form id=&amp;quot;unique id per form&amp;quot; autosave=&amp;quot;oninterval&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Set autosave to change only :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form id=&amp;quot;unique id per form&amp;quot; autosave=&amp;quot;onchange&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note: A form needs to have an unique identifier set by its id&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Set autosave to interval after change only :&lt;br /&gt;
This will set the interval saving after a change has been detected. So it is basically the same as &#039;&#039;&#039;oninterval&#039;&#039;&#039;, except it won&#039;t start if there are no changes yet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form id=&amp;quot;unique id per form&amp;quot; autosave=&amp;quot;onintervalafterchange&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Set autosave to &#039;&#039;&#039;none&#039;&#039;&#039; to not have autosave. This can be useful for templates that contain forms, when they should only have autosave in specific situations.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form id=&amp;quot;test-autosave-form&amp;quot; autosave=&amp;quot;{{#if:...|auto|none}}&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
==== &#039;&#039;&#039;setwikicomment&#039;&#039;&#039; ====&lt;br /&gt;
&lt;br /&gt;
====== &#039;&#039;Set the summary text shown in the recent changes and or contributions&#039;&#039; ======&lt;br /&gt;
This can be really handy to describe what form or action was responsible for the changes in the Wiki.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form setwikicomment=&amp;quot;Edit user preference form&amp;quot; &amp;gt;&lt;br /&gt;
   Your flexform elements here&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
==== &#039;&#039;&#039;loadscript&#039;&#039;&#039; ====&lt;br /&gt;
====== &#039;&#039;Tell FlexForm to load a specific JavaScript with a form&#039;&#039; ======&lt;br /&gt;
Sometimes it can be handy to load a JavaScript to work with a Form. For example for Validation or Realtime look-ups and you only need to load that JavaScript for a specific form, instead of having it always be loaded in e.g. common.js.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;loadscript&#039;&#039;&#039; by default looks into the &#039;&#039;FlexForm/Modules/customJS/loadScripts&#039;&#039; extension folder to find the JavaScript you have entered as value for loadscript. If your JavaScript is called validateForms.js, then you copy that JavaScript into the default folder and add &#039;&#039;&#039;loadscript=&amp;quot;validateForms&amp;quot;&#039;&#039;&#039; to the Form tag.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can also specify a different default folder using the config setting : &#039;&#039;&#039;$wgFlexFormConfig[&#039;loadScriptPath&#039;]&#039;&#039;&#039; = &amp;lt;path to your scripts&amp;gt;. See also &#039;&#039;Installation of FlexForm&#039;&#039;.&lt;br /&gt;
By request, if the script cannot be found, the form will not be rendered and a message is shown, so there is always a visual check available.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
==== &#039;&#039;&#039;extension&#039;&#039;&#039; ====&lt;br /&gt;
&lt;br /&gt;
====== &#039;&#039;Have an extension do additional tasks with form values&#039;&#039; ======&lt;br /&gt;
You can create an extension for FlexForm that can do additonal tasks to a Form. See extension Docs for more information&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form extension=&amp;quot;&amp;lt;name of your extension&amp;quot; &amp;gt;&lt;br /&gt;
   Your flexform elements here&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
==== &#039;&#039;&#039;json&#039;&#039;&#039; ====&lt;br /&gt;
FlexForm accepts a certain form of JSON Schema to render a Form. See Form options/JSON for more information an on how to utilize this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
==== &#039;&#039;&#039;json-type&#039;&#039;&#039; ====&lt;br /&gt;
This argument is used together with the json argument. See Form options/JSON for more information an on how to utilize this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
==== &#039;&#039;&#039;no_disable_on_submit&#039;&#039;&#039; ====&lt;br /&gt;
When a form is submitted, the submit button will be set to disabled and a spinner is shown. To disable this behavior, you can add the &#039;&#039;&#039;no_disable_on_submit&#039;&#039;&#039; argument.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
===Examples===&lt;br /&gt;
Example 1 : formtarget&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form formtarget=&amp;quot;https://example.com/handleform.php&amp;quot; &amp;gt;&lt;br /&gt;
   Your flexform elements here&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Example 2 : messageonsuccess&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form messageonsuccess=&amp;quot;Information posted, thanks!&amp;quot;&amp;gt;&lt;br /&gt;
    Your flexform elements here&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Example 3 : no_submit_on_return&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form no_submit_on_return&amp;gt;&lt;br /&gt;
    Your flexform elements here&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Example 4 : reCaptcha v3&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form recaptcha-v3-action=&amp;quot;contactform&amp;quot;&amp;gt;&lt;br /&gt;
    Your flexform elements here&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Note===&lt;br /&gt;
If you want your form to have at least a bit of styling, you can use FlexForm&#039;s CSS. Simple add class=&amp;quot;simple&amp;quot; to your form tag. This class will only work on FlexForm Forms. Not on any other element in HTML.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form class=&amp;quot;simple&amp;quot;&amp;gt;&lt;br /&gt;
    Your flexform elements here&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Normal default rendering:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form action=&amp;quot;get&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;label for=&amp;quot;testnostyle&amp;quot;&amp;gt;My label&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;testnostyle&amp;quot; id=&amp;quot;testnostyle&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;ok&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;form action=&amp;quot;get&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;label for=&amp;quot;testnostyle&amp;quot;&amp;gt;My label&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;testnostyle&amp;quot; id=&amp;quot;testnostyle&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;ok&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &#039;&#039;&#039;simple&#039;&#039;&#039; class style:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form action=&amp;quot;get&amp;quot; class=&amp;quot;simple&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;label for=&amp;quot;teststyle&amp;quot;&amp;gt;My label&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;teststyle&amp;quot; id=&amp;quot;teststyle&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;ok&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form action=&amp;quot;get&amp;quot; class=&amp;quot;simple&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;label for=&amp;quot;teststyle&amp;quot;&amp;gt;My label&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;teststyle&amp;quot; id=&amp;quot;teststyle&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;ok&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Links===&lt;br /&gt;
https://developers.google.com/recaptcha/docs/v3&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=Wiki:Testpagina_Liselot&amp;diff=3723</id>
		<title>Wiki:Testpagina Liselot</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=Wiki:Testpagina_Liselot&amp;diff=3723"/>
		<updated>2025-08-21T09:34:22Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#ask:[[Class::Doc]][[Doc subject::DevOps:Doc/FlexForm]][[Subject version::2.1]][[Subject version::!2.5]]&lt;br /&gt;
|?Subject version&lt;br /&gt;
|limit=999&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{#ask:[[Class::Doc]][[Doc subject::DevOps:Doc/FlexForm]][[Subject version::2.0]][[Subject version::!2.5]][[Subject version::!2.1]]&lt;br /&gt;
|?Subject version&lt;br /&gt;
|limit=999&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=Template:Doc_sidebar&amp;diff=3344</id>
		<title>Template:Doc sidebar</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=Template:Doc_sidebar&amp;diff=3344"/>
		<updated>2025-02-03T09:08:33Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the &#039;&#039;&#039;Doc sidebar&#039;&#039;&#039; template. It should be called in the following format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Doc sidebar}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;{{#vardefine:@allow sidebar edit |{{#ifingroup:user |{{#if:{{#urlget:veaction}}{{#urlget:action}}||yes}} }} }}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#vardefine:@logo |File:{{#show:{{#caprint:$class[Doc properties][Doc subject]}}|?Title}}_logo.png }}&amp;lt;!-- &lt;br /&gt;
--&amp;gt;{{#cadefine:@available-versions|{{#ask: [[Doc subject::{{#caprint:$class[Doc properties][Doc subject]}}]] [[Title::{{#caprint:$base[Base properties][Title]}}]] |?Subject version= |mainlabel=- | searchlabel= }}|,|noparse}}&amp;lt;!-- &lt;br /&gt;
 --&amp;gt;{{#vardefine:@valid-selected-version|{{#if: {{#casearch:@available-versions|{{#urlget:selected-version|999}} }}|{{#urlget:selected-version}}|}} }} &amp;lt;!-- &lt;br /&gt;
 --&amp;gt;{{#vardefine:@selected-version|{{#if: {{#var:@valid-selected-version}} | {{#var:@valid-selected-version}} | {{#casort:@available-versions|rsort}}{{#caprint:@available-versions[0]}} }} }}&amp;lt;!-- &lt;br /&gt;
 --&amp;gt;{{#vardefine:@shown-version|{{#cadefine:@my-versions|{{#caprint:$class[Doc properties][Subject version]}}|,|noparse}}{{#if: {{#casearch:@my-versions|{{#var:@selected-version}} }}|{{#var:@selected-version}}|{{#casort:@my-versions|rsort}}{{#caprint:@my-versions[0]}} }} }}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;div class=&amp;quot;tab-content&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#tag:_input||type=radio|id=sidebar-view|name=toggle-sidebar|checked=checked|class=d-none sidebar-view}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;div class=&amp;quot;card sidebar-view-tab&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;{{#ifeq:{{#var:@allow sidebar edit}} |yes |&amp;lt;span style=&amp;quot;float:right&amp;quot;&amp;gt;{{#tag:wslabel|Edit|for=sidebar-edit|class=btn btn-secondary}}&amp;lt;/span&amp;gt;}}&lt;br /&gt;
&amp;lt;p class=&amp;quot;m-0&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;far fa-file&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; &amp;lt;span class=&amp;quot;lead&amp;quot;&amp;gt;{{#caprint:$base[Base properties][Title]}}&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;badge badge-info small&amp;quot;&amp;gt;{{PAGESIZE:{{FULLPAGENAME}}}} bytes&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;badge badge-primary small&amp;quot;&amp;gt;{{#wsstats:id={{PAGEID}}}}&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;i class=&amp;quot;fas fa-info-circle&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; &amp;lt;span class=&amp;quot;text-muted font-weight-light small&amp;quot;&amp;gt;{{#caprint:$class[Doc properties][Doc synopsis]}}&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;{{#ifeq:{{#var:@allow sidebar edit}} |yes |&amp;lt;_form action=&amp;quot;addToWiki&amp;quot; class=&amp;quot;text-center&amp;quot; setwikicomment=&amp;quot;Uploaded using the screenshot options&amp;quot; messageonsuccess=&amp;quot;Screenshot can be located in your contributions list&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;_input type=&amp;quot;file&amp;quot; presentor=&amp;quot;canvas&amp;quot; name=&amp;quot;screenshot-uploader&amp;quot; id=&amp;quot;canvasUpload&amp;quot; target=&amp;quot;screenshot-{{FULLPAGENAME}}.jpg&amp;quot; pagecontent=&amp;quot;testing&amp;quot; parsecontent canvas_source_id=&amp;quot;content&amp;quot;  /&amp;gt;&lt;br /&gt;
&amp;lt;_input type=&amp;quot;button&amp;quot; buttontype=&amp;quot;submit&amp;quot; html=&amp;quot;all&amp;quot; class=&amp;quot;btn btn-light&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fas fa-camera-retro&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; Screenshot&amp;lt;/_input&amp;gt;&amp;lt;/_form&amp;gt;}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card-header --&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;{{#ifexist:{{#var:@logo}}|[[{{#var:@logo}}|150px]]}}&lt;br /&gt;
  {{#if: {{#caprint:$class[Doc properties][Subject version]}} | {{Sidebar item&lt;br /&gt;
|Label=[[{{#caprint:$class[Doc properties][Doc subject]}}]]&lt;br /&gt;
| Value={{#ifeq: {{#var:@selected-version}}|{{#var:@shown-version}}|Version {{#var:@shown-version}}|This page is for version {{#var:@shown-version}}&amp;lt;br&amp;gt;[{{fullurl:{{#ask: [[Doc subject::{{#caprint:$class[Doc properties][Doc subject]}}]] [[Title::{{#caprint:$base[Base properties][Title]}}]] [[Subject version::{{#var:@selected-version}}]] |link=none |mainlabel= |limit=1 | searchlabel= }} |selected-version={{#var:@selected-version}} }} Go to {{#var:@selected-version}}] }} }}{{Sidebar item&lt;br /&gt;
|Label=[[{{#caprint:$class[Doc properties][Doc subject]}}]]&lt;br /&gt;
}} }}{{Sidebar item&lt;br /&gt;
  |Value=&amp;lt;b&amp;gt;Target audience&amp;lt;/b&amp;gt;: {{#caprint:$class[Doc properties][Doc target group]}}&lt;br /&gt;
}}{{Sidebar item&lt;br /&gt;
  |Value=&amp;lt;span class=&amp;quot;btn btn-light&amp;quot;&amp;gt;[{{fullurl:Search-documentation|order=desc&amp;amp;ordertype=Modification+date&amp;amp;filters=Doc+subject^^{{urlencode:{{PAGENAME:{{#caprint:$class[Doc properties][Doc subject]}} }} }} }} Search Docs]&amp;lt;/span&amp;gt;}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card-body --&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card &lt;br /&gt;
&lt;br /&gt;
--&amp;gt;{{#ifeq:{{#var:@allow sidebar edit}} |yes |&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#tag:wsfield||type=radio|id=sidebar-edit|name=toggle-sidebar|class=d-none sidebar-edit}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;div class=&amp;quot;card sidebar-edit-tab&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;wsform action=&amp;quot;addToWiki&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
// wsedits for base properties&lt;br /&gt;
--&amp;gt;{{#tag:wsedit ||target={{PAGEID}} |template=Base properties |formfield=Title |mwslot=ws-base-props}}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
// wscreate or wsedits for page properties&lt;br /&gt;
// use casize to check if the slot already exists. Then wsedit, else wscreate.&lt;br /&gt;
--&amp;gt;{{#if:{{#casize:$class}}&lt;br /&gt;
|{{#tag:wsedit ||target={{PAGEID}} |template=Doc properties |formfield=Doc synopsis|mwslot=ws-class-props}}&lt;br /&gt;
{{#tag:wsedit ||target={{PAGEID}} |template=Doc properties |formfield=Doc subject |mwslot=ws-class-props}}&lt;br /&gt;
{{#tag:wsedit ||target={{PAGEID}} |template=Doc properties |formfield=Doc parent |mwslot=ws-class-props}}&lt;br /&gt;
{{#tag:wsedit ||target={{PAGEID}} |template=Doc properties |formfield=Doc sort order |mwslot=ws-class-props}}&lt;br /&gt;
{{#tag:wsedit ||target={{PAGEID}} |template=Doc properties |formfield=Doc target group |mwslot=ws-class-props}}&lt;br /&gt;
{{#tag:wsedit ||target={{PAGEID}} |template=Doc properties |formfield=Subject version |mwslot=ws-class-props}}&lt;br /&gt;
|&amp;lt;wscreate mwwrite=&amp;quot;{{FULLPAGENAME}}&amp;quot; mwtemplate=&amp;quot;Doc properties&amp;quot; mwslot=&amp;quot;ws-class-props&amp;quot; mwfields=&amp;quot;Doc synopsis,Doc subject,Doc parent,Doc sort order,Doc target group,Subject version&amp;quot; /&amp;gt;&lt;br /&gt;
}}&amp;lt;!-- end of #if  --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;float:right&amp;quot;&amp;gt;{{#tag:wslabel|Close|for=sidebar-view|class=btn btn-secondary}}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;b class=&amp;quot;d-block&amp;quot;&amp;gt;{{#caprint:$base[Base properties][Class]}}&amp;lt;/b&amp;gt;&lt;br /&gt;
{{#caprint:$base[Base properties][Title]}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card-header --&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
{{Sidebar item&lt;br /&gt;
|Label=Title&lt;br /&gt;
|Value={{#tag:wsfield ||type=text |name=Title |required=required |class=form-control |value={{#caprint:$base[Base properties][Title]}} }}&lt;br /&gt;
}}&lt;br /&gt;
{{Sidebar item&lt;br /&gt;
|Label=Doc synopsis&lt;br /&gt;
|Value={{#tag:wsfield ||type=text |name=Doc synopsis|required=required |class=form-control |value={{#caprint:$class[Doc properties][Doc synopsis]}} }}&lt;br /&gt;
}}&lt;br /&gt;
{{Sidebar item&lt;br /&gt;
|Label=Doc subject&lt;br /&gt;
|Value={{#tag:wsfield ||type=text |name=Doc subject |required=required |class=form-control |value={{#caprint:$class[Doc properties][Doc subject]}} }}&lt;br /&gt;
}}&lt;br /&gt;
{{Sidebar item&lt;br /&gt;
|Label=Subject version&lt;br /&gt;
|Value={{#tag:wsfield ||type=text |name=Subject version |class=form-control |value={{#caprint:$class[Doc properties][Subject version]}} }}&lt;br /&gt;
}}&lt;br /&gt;
{{Sidebar item&lt;br /&gt;
|Label=Doc parent&lt;br /&gt;
|Value={{#tag:wstoken &lt;br /&gt;
  |{{#caamap:{{#caprint:$class[Doc properties][Doc parent]}} |,|__Value__|{{#tag:wsfield |{{#show:__Value__ |?Title}}|type=option|value=__Value__|selected=selected}} |}}&lt;br /&gt;
  |id=Doc-parent-tokens&lt;br /&gt;
  |name=Doc parent[]&lt;br /&gt;
  |placeholder=Search...&lt;br /&gt;
  |multiple=&lt;br /&gt;
  |query=[[Class::+]][[Doc title with versions::!!!]](limit=99999)(returntext=Doc title with versions)&lt;br /&gt;
  }}&lt;br /&gt;
}}&lt;br /&gt;
{{Sidebar item&lt;br /&gt;
|Label=Doc sort order&lt;br /&gt;
|Value={{#tag:wsfield ||type=number |name=Doc sort order |required=required |class=form-control |value={{#caprint:$class[Doc properties][Doc sort order]}} }}&lt;br /&gt;
}}&lt;br /&gt;
{{Sidebar item&lt;br /&gt;
|Label=Doc target group&lt;br /&gt;
|Value={{#cadefine:$value settings |{{Wiki:Setting/Doc target group}} }}&lt;br /&gt;
{{#cadefine:$values selected |{{#caprint:$class[Doc properties][Doc target group]}} }}&lt;br /&gt;
{{#camerge:$value options |$value settings |$values selected }}&lt;br /&gt;
{{#caunique:$value options}}&lt;br /&gt;
{{#tag:wsselect&lt;br /&gt;
  |{{#camap:$value options |__Value__|{{#tag:wsfield|__Value__|type=option|value=__Value__|selected={{#if:{{#casearch:$values selected|__Value__}}|selected}} }} |}}&lt;br /&gt;
  |name=Doc target group |required=required |class=form-control |id=doc_target_group-field |placeholder=select a value &lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;text-right&amp;quot;&amp;gt;&lt;br /&gt;
{{#tag:wslabel|Close|for=sidebar-view|class=btn btn-secondary mb-0}}&lt;br /&gt;
&amp;lt;wsfield type=&amp;quot;submit&amp;quot; value=&amp;quot;Save&amp;quot; class=&amp;quot;btn btn-primary&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card-body --&amp;gt;&lt;br /&gt;
&amp;lt;/wsform&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card --&amp;gt;&lt;br /&gt;
|}}&amp;lt;!-- end of #ifeq @allow sidebar edit == yes --&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .tab-content &lt;br /&gt;
--&amp;gt;&amp;lt;div class=&amp;quot;treeview w-20 border mb-3&amp;quot;&amp;gt;&amp;lt;h6 class=&amp;quot;pt-3 pl-3&amp;quot;&amp;gt;Related documents for version {{#var:@shown-version}}&amp;lt;/h6&amp;gt;&amp;lt;hr&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{#caprint:$class[Doc properties][Doc subject]}}|{{#ask:[[Doc subject::{{#caprint:$class[Doc properties][Doc subject]}}]][[!{{#caprint:$class[Doc properties][Doc subject]}}]] [[Subject version::{{#var:@shown-version}} ]]&lt;br /&gt;
|?=Page&lt;br /&gt;
|?Title&lt;br /&gt;
|link=none&lt;br /&gt;
|limit=1000&lt;br /&gt;
|format=tree&lt;br /&gt;
|template=tree&lt;br /&gt;
|parent=Doc parent&lt;br /&gt;
|order=desc,asc,asc&lt;br /&gt;
|sort=Doc target group,Doc sort order,Title&lt;br /&gt;
}} }}&amp;lt;/div&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;{{DocsData}}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;{{Show SEO in sidebar}}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=User:Ebc16062-dd09-4928-8cf3-821f492b0c44&amp;diff=3343</id>
		<title>User:Ebc16062-dd09-4928-8cf3-821f492b0c44</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=User:Ebc16062-dd09-4928-8cf3-821f492b0c44&amp;diff=3343"/>
		<updated>2025-02-03T09:07:42Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[{{fullurl:Search-documentation|order=desc&amp;amp;ordertype=Modification+date&amp;amp;filters=Doc+subject^^{{urlencode:{{PAGENAME:{{#caprint:$class[Doc properties][Doc subject]}} }} }} }} Search Docs]&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=User:Ebc16062-dd09-4928-8cf3-821f492b0c44&amp;diff=3342</id>
		<title>User:Ebc16062-dd09-4928-8cf3-821f492b0c44</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=User:Ebc16062-dd09-4928-8cf3-821f492b0c44&amp;diff=3342"/>
		<updated>2025-02-03T09:07:30Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: Created page with &amp;quot;[{{fullurl:{{FULLPAGENAME}}|Search-documentation|order=desc&amp;amp;ordertype=Modification+date&amp;amp;filters=Doc+subject^^{{urlencode:{{PAGENAME:{{#caprint:$class[Doc properties][Doc subje...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[{{fullurl:{{FULLPAGENAME}}|Search-documentation|order=desc&amp;amp;ordertype=Modification+date&amp;amp;filters=Doc+subject^^{{urlencode:{{PAGENAME:{{#caprint:$class[Doc properties][Doc subject]}} }} }} }} Search Docs]&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/FlexForm/2.1/input/file/examples&amp;diff=3175</id>
		<title>DevOps:Doc/FlexForm/2.1/input/file/examples</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/FlexForm/2.1/input/file/examples&amp;diff=3175"/>
		<updated>2024-02-22T13:16:36Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==== Example 1 ====&lt;br /&gt;
This will upload a file. If the filename is DCM10001.jpg, the file will be uploaded as &#039;&#039;&#039;pictures-DCM10001-732138982.jpg&#039;&#039;&#039;, The filepage will have &#039;&#039;&#039;Information of the test file&#039;&#039;&#039;. Finally using &#039;&#039;&#039;error_id&#039;&#039;&#039; and &#039;&#039;&#039;verbose_id&#039;&#039;&#039;, means the user should add two div&#039;s, one with an id=&amp;quot;div-error&amp;quot; and one with an id=&amp;quot;div-verbose&amp;quot; with these name themselves.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;file&amp;quot; id=&amp;quot;file-upload&amp;quot; name=&amp;quot;test&amp;quot; target=&amp;quot;pictures-[filename]-[mwrandom]&amp;quot; pagecontent=&amp;quot;Information of the test file&amp;quot; error_id=&amp;quot;div-error&amp;quot; verbose_id=&amp;quot;div-verbose&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example 2 ====&lt;br /&gt;
Always make sure an image will be transformed to jpeg.&lt;br /&gt;
&lt;br /&gt;
Allow for multiple file upload.&lt;br /&gt;
&lt;br /&gt;
Add form text field &amp;quot;description&amp;quot; on the files page content.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form enctype=&amp;quot;multipart/form-data&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;file&amp;quot; id=&amp;quot;file-upload&amp;quot; name=&amp;quot;myfile&amp;quot; multiple=&amp;quot;multiple&amp;quot; parsecontent target=&amp;quot;pictures-[filename]-[mwrandom]&amp;quot; pagecontent=&amp;quot;Information for this image: [description]&amp;quot; force=&amp;quot;jpg&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;description&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;upload&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example 3 ====&lt;br /&gt;
Store a template to the pagecontent. You can use this if you want the filepage to have structured content or if you want to store structured data with an extension like SMW.&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form enctype=&amp;quot;multipart/form-data&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;file&amp;quot; id=&amp;quot;file-upload&amp;quot; name=&amp;quot;myfile&amp;quot; target=&amp;quot;picture-[mwrandom]&amp;quot; parsecontent template=&amp;quot;Uploaded file&amp;quot; pagecontent=&amp;quot;[flexform-template]|Uploaded from page={{FULLPAGENAME}}|Uploaded by={{CURRENTLOGGEDUSER}}|Comment=[Comment][/flexform-template]&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Comment&amp;quot; placeholder=&amp;quot;Comment&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;upload&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example 4 ====&lt;br /&gt;
Convert a Microsoft Docx document to a page in the Wiki. In our example the pagename will be the filename.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form enctype=&amp;quot;multipart/form-data&amp;quot; messageonsuccess=&amp;quot;File has been converted and uploaded&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;myfile&amp;quot; id=&amp;quot;file-upload&amp;quot; multiple=&amp;quot;multiple&amp;quot; parsecontent target=&amp;quot;[filename]&amp;quot; pagecontent=&amp;quot;This image belongs to : [filename]&amp;quot; action=&amp;quot;convertfrom:docx&amp;quot; comment=&amp;quot;converted and uploaded from {{PAGENAME}}&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;upload&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example 5 ====&lt;br /&gt;
Convert a Microsoft Excel document to a page in the Wiki. The Excel content is stored in json format in a slot and a create is used to also store a template in the main slot.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form action=&amp;quot;addToWiki&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot; messageonsuccess=&amp;quot;File has been converted and uploaded&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;fieldset class=&amp;quot;form-group&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Upload and convert Excel to Json&amp;lt;/legend&amp;gt;&lt;br /&gt;
  &amp;lt;_create noseo mwwrite=&amp;quot;[FFUploadedFile-NewName-myfile]&amp;quot; mwtemplate=&amp;quot;Test excel convert&amp;quot; mwfields=&amp;quot;FFUploadedFile-UploadName-myfile::Original filename&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;input type=&amp;quot;file&amp;quot; class=&amp;quot;form-control-file&amp;quot; id=&amp;quot;testingFile&amp;quot; name=&amp;quot;myfile&amp;quot; parsecontent target=&amp;quot;[filename]&amp;quot; action=&amp;quot;convertfrom:xlsx&amp;quot; slot=&amp;quot;ws-data&amp;quot; comment=&amp;quot;converted and uploaded from {{PAGENAME}}&amp;quot; accept=&amp;quot;.xlsx&amp;quot; target=&amp;quot;excel-data-[mwrandom]-[filename]&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;upload&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/FlexForm/2.1/input/file/examples&amp;diff=3174</id>
		<title>DevOps:Doc/FlexForm/2.1/input/file/examples</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/FlexForm/2.1/input/file/examples&amp;diff=3174"/>
		<updated>2024-02-22T13:15:54Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==== Example 1 ====&lt;br /&gt;
This will upload a file. If the filename is DCM10001.jpg, the file will be uploaded as &#039;&#039;&#039;pictures-DCM10001-732138982.jpg&#039;&#039;&#039;, The filepage will have &#039;&#039;&#039;Information of the test file&#039;&#039;&#039;. Finally using &#039;&#039;&#039;error_id&#039;&#039;&#039; and &#039;&#039;&#039;verbose_id&#039;&#039;&#039;, means the user should add two div&#039;s, one with an id=&amp;quot;div-error&amp;quot; and one with an id=&amp;quot;div-verbose&amp;quot; with these name themselves.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;file&amp;quot; id=&amp;quot;file-upload&amp;quot; name=&amp;quot;test&amp;quot; target=&amp;quot;pictures-[filename]-[mwrandom]&amp;quot; pagecontent=&amp;quot;Information of the test file&amp;quot; error_id=&amp;quot;div-error&amp;quot; verbose_id=&amp;quot;div-verbose&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example 2 ====&lt;br /&gt;
Always make sure an image will be transformed to jpeg.&lt;br /&gt;
&lt;br /&gt;
Allow for multiple file upload.&lt;br /&gt;
&lt;br /&gt;
Add form text field &amp;quot;description&amp;quot; on the files page content.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form enctype=&amp;quot;multipart/form-data&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;file&amp;quot; id=&amp;quot;file-upload&amp;quot; name=&amp;quot;myfile&amp;quot; multiple=&amp;quot;multiple&amp;quot; parsecontent target=&amp;quot;pictures-[filename]-[mwrandom]&amp;quot; pagecontent=&amp;quot;Information for this image: [description]&amp;quot; force=&amp;quot;jpg&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;description&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;upload&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example 3 ====&lt;br /&gt;
Store a template to the pagecontent. You can use this if you want the filepage to have structured content or if you want to store structured data with an extension like SMW.&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form enctype=&amp;quot;multipart/form-data&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;file&amp;quot; id=&amp;quot;file-upload&amp;quot; name=&amp;quot;myfile&amp;quot; target=&amp;quot;picture-[mwrandom]&amp;quot; parsecontent template=&amp;quot;Uploaded file&amp;quot; pagecontent=&amp;quot;[flexform-template]|Uploaded from page={{FULLPAGENAME}}|Uploaded by={{CURRENTLOGGEDUSER}}|Comment=[Comment][/flexform-template]&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Comment&amp;quot; placeholder=&amp;quot;Comment&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;upload&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example 4 ====&lt;br /&gt;
Convert a Microsoft Docx document to a page in the Wiki. In our example the pagename will be the filename.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form enctype=&amp;quot;multipart/form-data&amp;quot; messageonsuccess=&amp;quot;File has been converted and uploaded&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;myfile&amp;quot; id=&amp;quot;file-upload&amp;quot; multiple=&amp;quot;multiple&amp;quot; parsecontent target=&amp;quot;[filename]&amp;quot; pagecontent=&amp;quot;This image belongs to : [filename]&amp;quot; action=&amp;quot;convertfrom:docx&amp;quot; comment=&amp;quot;converted and uploaded from {{PAGENAME}}&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;upload&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example 5 ====&lt;br /&gt;
Convert a Microsoft Excel document to a page in the Wiki. The Excel content is stored in json format to a slot and a create is used to also store a template call to the main slot.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form action=&amp;quot;addToWiki&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot; messageonsuccess=&amp;quot;File has been converted and uploaded&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;fieldset class=&amp;quot;form-group&amp;quot;&amp;gt;&amp;lt;legend&amp;gt;Upload and convert Excel to Json&amp;lt;/legend&amp;gt;&lt;br /&gt;
  &amp;lt;_create noseo mwwrite=&amp;quot;[FFUploadedFile-NewName-myfile]&amp;quot; mwtemplate=&amp;quot;Test excel convert&amp;quot; mwfields=&amp;quot;FFUploadedFile-UploadName-myfile::Original filename&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;input type=&amp;quot;file&amp;quot; class=&amp;quot;form-control-file&amp;quot; id=&amp;quot;testingFile&amp;quot; name=&amp;quot;myfile&amp;quot; parsecontent target=&amp;quot;[filename]&amp;quot; action=&amp;quot;convertfrom:xlsx&amp;quot; slot=&amp;quot;ws-data&amp;quot; comment=&amp;quot;converted and uploaded from {{PAGENAME}}&amp;quot; accept=&amp;quot;.xlsx&amp;quot; target=&amp;quot;excel-data-[mwrandom]-[filename]&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;upload&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/fieldset&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/FlexForm/2.1/input/file/examples&amp;diff=3146</id>
		<title>DevOps:Doc/FlexForm/2.1/input/file/examples</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/FlexForm/2.1/input/file/examples&amp;diff=3146"/>
		<updated>2024-01-10T14:01:18Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==== Example 1 ====&lt;br /&gt;
This will upload a file. If the filename is DCM10001.jpg, the file will be uploaded as &#039;&#039;&#039;pictures-DCM10001-732138982.jpg&#039;&#039;&#039;, The filepage will have &#039;&#039;&#039;Information of the test file&#039;&#039;&#039;. Finally using &#039;&#039;&#039;error_id&#039;&#039;&#039; and &#039;&#039;&#039;verbose_id&#039;&#039;&#039;, means the user should add two div&#039;s, one with an id=&amp;quot;div-error&amp;quot; and one with an id=&amp;quot;div-verbose&amp;quot; with these name themselves.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;file&amp;quot; id=&amp;quot;file-upload&amp;quot; name=&amp;quot;test&amp;quot; target=&amp;quot;pictures-[filename]-[mwrandom]&amp;quot; pagecontent=&amp;quot;Information of the test file&amp;quot; error_id=&amp;quot;div-error&amp;quot; verbose_id=&amp;quot;div-verbose&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example 2 ====&lt;br /&gt;
Always make sure an image will be transformed to jpeg.&lt;br /&gt;
&lt;br /&gt;
Allow for multiple file upload.&lt;br /&gt;
&lt;br /&gt;
Add form text field &amp;quot;description&amp;quot; on the files page content.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form enctype=&amp;quot;multipart/form-data&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;file&amp;quot; id=&amp;quot;file-upload&amp;quot; name=&amp;quot;myfile&amp;quot; multiple=&amp;quot;multiple&amp;quot; parsecontent target=&amp;quot;pictures-[filename]-[mwrandom]&amp;quot; pagecontent=&amp;quot;Information for this image: [description]&amp;quot; force=&amp;quot;jpg&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;description&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;upload&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example 3 ====&lt;br /&gt;
Store a template to the pagecontent. You can use this if you want the filepage to have structured content or if you want to store structured data with an extension like SMW.&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form enctype=&amp;quot;multipart/form-data&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;file&amp;quot; id=&amp;quot;file-upload&amp;quot; name=&amp;quot;myfile&amp;quot; target=&amp;quot;picture-[mwrandom]&amp;quot; parsecontent template=&amp;quot;Uploaded file&amp;quot; pagecontent=&amp;quot;[flexform-template]|Uploaded from page={{FULLPAGENAME}}|Uploaded by={{CURRENTLOGGEDUSER}}|Comment=[Comment][/flexform-template]&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Comment&amp;quot; placeholder=&amp;quot;Comment&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;upload&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example 4 ====&lt;br /&gt;
Convert a Microsoft Docx document to a page in the Wiki. In our example the pagename will be the filename.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form enctype=&amp;quot;multipart/form-data&amp;quot; messageonsuccess=&amp;quot;File has been converted and uploaded&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;myfile&amp;quot; id=&amp;quot;file-upload&amp;quot; multiple=&amp;quot;multiple&amp;quot; parsecontent target=&amp;quot;[filename]&amp;quot; pagecontent=&amp;quot;This image belongs to : [filename]&amp;quot; action=&amp;quot;convertfrom:docx&amp;quot; comment=&amp;quot;converted and uploaded from {{PAGENAME}}&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;upload&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_architecture&amp;diff=3088</id>
		<title>DevOps:Doc/Open CSP/2.0/Class definition architecture</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_architecture&amp;diff=3088"/>
		<updated>2023-10-31T12:29:15Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Open CSP stores metadata of pages in slots. Pages are displayed with various components (for which the Chameleon skin is used), which can look differently based on the configuration found in class definition pages. &lt;br /&gt;
&lt;br /&gt;
== Metadata stored in slots ==&lt;br /&gt;
Before slots were used, there were two common ways to deal with structured data:&lt;br /&gt;
&lt;br /&gt;
* A) Have templates with structured data in between the content (free text) of a page. &lt;br /&gt;
* B) Have one template that wraps the entire page content, with some parameters for structured data and also a parameter for free text&lt;br /&gt;
&lt;br /&gt;
The advantage of using slots is that you can separate the metadata from the content and also separate the storing of the data from displaying it. This reduces the risk of making mistakes when editing, while allowing you to have forms for editing structured data and to use VisualEditor to edit the main content.&lt;br /&gt;
&lt;br /&gt;
Note: data is stored in SMW properties as well, but class definitions do not rely on this. SMW is used for example for [[Search]] and [[Pages]]. It would technically be possible to modify the Open CSP framework to work with a different data storage extension, if you would make your own alternatives for the pages that use SMW queries or WikiSearch.&lt;br /&gt;
&lt;br /&gt;
The following slots are used by Open CSP:&lt;br /&gt;
&lt;br /&gt;
=== csp-base-props ===&lt;br /&gt;
In this slot &#039;&#039;&#039;Template:Base properties&#039;&#039;&#039; is used to store data dat is common to all pages, such as the Class and Title:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Base properties&lt;br /&gt;
|Class=&lt;br /&gt;
|Title=&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== csp-class-props ===&lt;br /&gt;
In this slot &#039;&#039;&#039;Template:Csp class properties&#039;&#039;&#039; is used to store data that is specific to each class, based on the class definition:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp class properties&lt;br /&gt;
|Parameter1=Value1&lt;br /&gt;
|Parameter2=Value2&lt;br /&gt;
|...&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== csp-data ===&lt;br /&gt;
This is a json slot which the framework only uses for class definition pages, but could be used for storing any json data on content pages as well (if you make your own templates/forms for this).&lt;br /&gt;
&lt;br /&gt;
=== Example slots of a content page ===&lt;br /&gt;
Let&#039;s say we have a page about a person, this could have the following slots:&lt;br /&gt;
&lt;br /&gt;
csp-base-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Base properties&lt;br /&gt;
|Class=Person&lt;br /&gt;
|Title=Example person&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;csp-class-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp class properties&lt;br /&gt;
|First name=John&lt;br /&gt;
|Last name=Smith&lt;br /&gt;
|Date of birth=1986-03-16&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example slots of a class definition page ===&lt;br /&gt;
To continue the previous example, a &amp;quot;Person&amp;quot; class definition page would have pagename &#039;&#039;&#039;Wiki:Class definition/Person&#039;&#039;&#039; and could have the following slots:&lt;br /&gt;
&lt;br /&gt;
csp-base-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Base properties&lt;br /&gt;
|Class=Class definition&lt;br /&gt;
|Title=Person&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;csp-class-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp class properties&lt;br /&gt;
|Defines class=Person&lt;br /&gt;
|Pagetitle format=title&lt;br /&gt;
|Layout areas=&#039;sub-header sidebar&#039; &#039;main sidebar&#039;&lt;br /&gt;
|Layout columns=3fr 1fr&lt;br /&gt;
|Layout rows=auto 1fr&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;csp-data:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;CspParameterDefinitions&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;First name&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Last name&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Date of birth&amp;quot;,&lt;br /&gt;
            &amp;quot;formfieldTemplate&amp;quot;: &amp;quot;Csp formfield/date&amp;quot;,&lt;br /&gt;
            &amp;quot;displayTemplate&amp;quot;: &amp;quot;Csp parameter display/date&amp;quot;,&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Components ==&lt;br /&gt;
Open CSP uses the Chameleon skin to be able to display pages with customizable components. The following components are used:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Header:&#039;&#039;&#039; always visible at the top of a page&lt;br /&gt;
* &#039;&#039;&#039;Main&#039;&#039;&#039;: this component displays the content that is stored in the main slot of a page, i.e. the text that is written by users&lt;br /&gt;
* &#039;&#039;&#039;Sub-header&#039;&#039;&#039;: by default shown below the header with &#039;&#039;&#039;Template:Csp default subheader&#039;&#039;&#039;, can be customized through class definitions&lt;br /&gt;
* &#039;&#039;&#039;Sidebar&#039;&#039;&#039;: by default shown on right side with &#039;&#039;&#039;Template:Csp default sidebar&#039;&#039;&#039;, can be customized through class definitions, metadata is displayed in this component&lt;br /&gt;
* &#039;&#039;&#039;Footer&#039;&#039;&#039;: by default not displayed, can be customized through class definitions&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Open CSP uses system messages inside these components. These system message contain some logic with various parser functions and Lua functions, in order to display a component based on the slot data of page as well as the slot data of the corresponding class definition page. This logic works as follows:&lt;br /&gt;
&lt;br /&gt;
* A component contains a system message that invokes a Lua function, for example &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#invoke:CspComponents|parseComponentIfApplicable|sidebar}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. This Lua function does the following:&lt;br /&gt;
* Retrieve slotdata from current page&lt;br /&gt;
* Get &amp;quot;Class&amp;quot; parameter from slotdata (return if it does not exist)&lt;br /&gt;
* Get class definition pagename corresponding to the class&lt;br /&gt;
* Get slotdata from class definition page (return if it does not exist)&lt;br /&gt;
* If the component is not found in the &amp;quot;Layout areas&amp;quot; parameter of the class definition page, return&lt;br /&gt;
* Parse component template (for example &#039;&#039;&#039;Template:Csp default sidebar&#039;&#039;&#039;, unless a different template is found in the class definition data)&lt;br /&gt;
* Pass all of the slotdata from the current page as well as the class definition slotdata to this template, in the form of an ArrayFunctions export&lt;br /&gt;
&lt;br /&gt;
== The &amp;quot;Wiki&amp;quot; namespace ==&lt;br /&gt;
Open CSP uses the Wiki namespace. Technically this is the standard Project namespace, which has been labeled &amp;quot;Wiki&amp;quot;. This namespace is intended for technical pages for development or configuration of the wiki. It is not intended for users that only write or read content on the wiki. For example class definitions and the &amp;quot;Slots&amp;quot; page are in this namespace. The class definition architecture currently relies on the class definition pages having a specific pagetitle format, so you should not move these pages to different namespaces or modify their titles. If you want to restrict access to this namespace, that is possible by using an extension like Lockdown.&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_architecture&amp;diff=3087</id>
		<title>DevOps:Doc/Open CSP/2.0/Class definition architecture</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_architecture&amp;diff=3087"/>
		<updated>2023-10-31T12:17:11Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Open CSP stores metadata of pages in slots. Pages are displayed with various components (for which the Chameleon skin is used), which can look differently based on the configuration found in class definition pages. &lt;br /&gt;
&lt;br /&gt;
== Metadata stored in slots ==&lt;br /&gt;
Before slots were used, there were two common ways to deal with structured data:&lt;br /&gt;
&lt;br /&gt;
* A) Have templates with structured data in between the content (free text) of a page. &lt;br /&gt;
* B) Have one template that wraps the entire page content, with some parameters for structured data and also a parameter for free text&lt;br /&gt;
&lt;br /&gt;
The advantage of using slots is that you can separate the metadata from the content and also separate the storing of the data from displaying it. This reduces the risk of making mistakes when editing, while allowing you to have forms for editing structured data and to use VisualEditor to edit the main content.&lt;br /&gt;
&lt;br /&gt;
Note: data is stored in SMW properties as well, but class definitions do not rely on this. SMW is used for example for [[Search]] and [[Pages]]. It would technically be possible to modify the Open CSP framework to work with a different data storage extension, if you would make your own alternatives for the pages that use SMW queries or WikiSearch.&lt;br /&gt;
&lt;br /&gt;
The following slots are used by Open CSP:&lt;br /&gt;
&lt;br /&gt;
=== csp-base-props ===&lt;br /&gt;
In this slot &#039;&#039;&#039;Template:Base properties&#039;&#039;&#039; is used to store data dat is common to all pages, such as the Class and Title:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Base properties&lt;br /&gt;
|Class=&lt;br /&gt;
|Title=&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== csp-class-props ===&lt;br /&gt;
In this slot &#039;&#039;&#039;Template:Csp class properties&#039;&#039;&#039; is used to store data that is specific to each class, based on the class definition:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp class properties&lt;br /&gt;
|Parameter1=Value1&lt;br /&gt;
|Parameter2=Value2&lt;br /&gt;
|...&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== csp-data ===&lt;br /&gt;
This is a json slot which the framework only uses for class definition pages, but could be used for storing any json data on content pages as well (if you make your own templates/forms for this).&lt;br /&gt;
&lt;br /&gt;
=== Example slots of a content page ===&lt;br /&gt;
Let&#039;s say we have a page about a person, this could have the following slots:&lt;br /&gt;
&lt;br /&gt;
csp-base-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Base properties&lt;br /&gt;
|Class=Person&lt;br /&gt;
|Title=Example person&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;csp-class-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp class properties&lt;br /&gt;
|First name=John&lt;br /&gt;
|Last name=Smith&lt;br /&gt;
|Date of birth=1986-03-16&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example slots of a class definition page ===&lt;br /&gt;
To continue the previous example, a &amp;quot;Person&amp;quot; class definition page would have pagename &#039;&#039;&#039;Wiki:Class definition/Person&#039;&#039;&#039; and could have the following slots:&lt;br /&gt;
&lt;br /&gt;
csp-base-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Base properties&lt;br /&gt;
|Class=Class definition&lt;br /&gt;
|Title=Person&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;csp-class-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp class properties&lt;br /&gt;
|Defines class=Person&lt;br /&gt;
|Pagetitle format=title&lt;br /&gt;
|Layout areas=&#039;sub-header sidebar&#039; &#039;main sidebar&#039;&lt;br /&gt;
|Layout columns=3fr 1fr&lt;br /&gt;
|Layout rows=auto 1fr&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;csp-data:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;CspParameterDefinitions&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;First name&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Last name&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Date of birth&amp;quot;,&lt;br /&gt;
            &amp;quot;formfieldTemplate&amp;quot;: &amp;quot;Csp formfield/date&amp;quot;,&lt;br /&gt;
            &amp;quot;displayTemplate&amp;quot;: &amp;quot;Csp parameter display/date&amp;quot;,&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Components ==&lt;br /&gt;
Open CSP uses the Chameleon skin to be able to display pages with customizable components. The following components are used:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Header:&#039;&#039;&#039; always visible at the top of a page&lt;br /&gt;
* &#039;&#039;&#039;Main&#039;&#039;&#039;: this component displays the content that is stored in the main slot of a page, i.e. the text that is written by users&lt;br /&gt;
* &#039;&#039;&#039;Sub-header&#039;&#039;&#039;: by default shown below the header with &#039;&#039;&#039;Template:Csp default subheader&#039;&#039;&#039;, can be customized through class definitions&lt;br /&gt;
* &#039;&#039;&#039;Sidebar&#039;&#039;&#039;: by default shown on right side with &#039;&#039;&#039;Template:Csp default sidebar&#039;&#039;&#039;, can be customized through class definitions, metadata is displayed in this component&lt;br /&gt;
* &#039;&#039;&#039;Footer&#039;&#039;&#039;: by default not displayed, can be customized through class definitions&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Open CSP uses system messages inside these components. These system message contain some logic with various parser functions and Lua functions, in order to display a component based on the slot data of page as well as the slot data of the corresponding class definition page. This logic works as follows:&lt;br /&gt;
&lt;br /&gt;
* A component contains a system message that invokes a Lua function, for example &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#invoke:CspComponents|parseComponentIfApplicable|sidebar}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. This Lua function does the following:&lt;br /&gt;
* Retrieve slotdata from current page&lt;br /&gt;
* Get &amp;quot;Class&amp;quot; parameter from slotdata (return if it does not exist)&lt;br /&gt;
* Get class definition pagename corresponding to the class&lt;br /&gt;
* Get slotdata from class definition page (return if it does not exist)&lt;br /&gt;
* If the component is not found in the &amp;quot;Layout areas&amp;quot; parameter of the class definition page, return&lt;br /&gt;
* Parse component template (for example &#039;&#039;&#039;Template:Csp default sidebar&#039;&#039;&#039;, unless a different template is found in the class definition data)&lt;br /&gt;
* Pass all of the slotdata from the current page as well as the class definition slotdata to this template, in the form of an ArrayFunctions export&lt;br /&gt;
&lt;br /&gt;
== The &amp;quot;Wiki&amp;quot; namespace ==&lt;br /&gt;
Open CSP uses the Wiki namespace. Technically this is the standard Project namespace, which has been labeled &amp;quot;Wiki&amp;quot;. This namespace is intended for technical pages for development or configuration of the wiki. It is not intended for users that only write or read content on the wiki. For example class definitions and the &amp;quot;Slots&amp;quot; page are in this namespace. The class definition architecture currently relies on the class definition pages having a specific pagetitle format, so you should not move these pages to different namespaces or modify the title. If you want to restrict access to this namespace, that is possible by using an extension like WikiGuard or Lockdown.&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_customization_options&amp;diff=3086</id>
		<title>DevOps:Doc/Open CSP/2.0/Class definition customization options</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_customization_options&amp;diff=3086"/>
		<updated>2023-10-31T12:02:03Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In &#039;&#039;&#039;Open CSP 2.0&#039;&#039;&#039; the default sidebar was added, this allows you to have sidebars without having to create custom sidebar templates for each class definition. There are some customization options built into the default sidebar as well. It is recommended to use these customization options when possible and to only create fully custom sidebar templates when absolutely necessary, as the fully custom sidebar templates require a lot more maintenance work when for example some parserfunctions get deprecated or changed. This document describes the various customization options. Note that it is also possible to configure class definitions to use custom templates for the sub-header and footer components, however these do not have extensive customization options like the sidebar and are therefore not described further in this document.&lt;br /&gt;
&lt;br /&gt;
== Parameters and formfield/display templates ==&lt;br /&gt;
* Edit parameters on a class definition page, to configure what will show up on your sidebar. &lt;br /&gt;
* Note that the parameter configuration is also used for setting properties, but you can use &amp;quot;(none)&amp;quot; as property name value if you don&#039;t want to set a property.&lt;br /&gt;
* Only the &amp;quot;parameter name&amp;quot; field is required. When you only fill this, you will get default text fields in the sidebars.&lt;br /&gt;
* Choose a displayTemplate to configure how a parameter is displayed in the view tab of the default sidebar.&lt;br /&gt;
* Choose a formfieldTemplate to configure what type of form field is used in the edit tab of the default sidebar.&lt;br /&gt;
* DisplayTemplate and formfieldTemplate can both be set to &amp;quot;(none)&amp;quot; to not have a parameter show up in respectively the view and edit tabs of the default sidebar.&lt;br /&gt;
&lt;br /&gt;
== Custom formfield/display templates ==&lt;br /&gt;
* It is possible to add custom template names in the displayTemplate and formfieldTemplate fields.&lt;br /&gt;
* All fields that are filled for a parameter will be passed to the templates so they can be accessed through template parameters there. For example you can use &amp;lt;nowiki&amp;gt;{{{allowedValues|}}}&amp;lt;/nowiki&amp;gt; in a formfieldTemplate. It might be useful to look at the csp-data slot of the class definition to see all of the parameters.&lt;br /&gt;
* The values of parameters on a content page are also passed to the display/formfield templates as the &amp;quot;value&amp;quot; parameter.&lt;br /&gt;
* In a display/formfield template you cannot access values of other parameters directly, but you can do this by using &amp;lt;nowiki&amp;gt;{{#invoke:CspFunctions|getParentArgs|$pageData}}&amp;lt;/nowiki&amp;gt;, which will return the $pageData parameter that is used in &#039;&#039;&#039;Template:Csp default sidebar&#039;&#039;&#039; (and contains an [[mediawikiwiki:Extension:ArrayFunctions|ArrayFunctions]] export with slotdata of the page).&lt;br /&gt;
* It is possible to add fields to the json data in the csp-data slot that cannot be filled through the parameters form. For example Open CSP 2.0 does not yet include the option to specify a placeholder for your formfields, but you can add placeholder to the json data and then use &amp;lt;nowiki&amp;gt;{{{placeholder|}}}&amp;lt;/nowiki&amp;gt; in a custom formfieldTemplate.&lt;br /&gt;
&lt;br /&gt;
== Custom sidebar template where you are adding to the default sidebar ==&lt;br /&gt;
In many cases you won&#039;t necessarily want to replace the default sidebar, but you may want to add another card above or below it with additional functionality. It is possible to use the default sidebar within a custom sidebar template. For example like the following code snippet:&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp default sidebar&lt;br /&gt;
|$pageData={{{$pageData|}}}&lt;br /&gt;
|$classData={{{$classData|}}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Csp sidebar tabs&lt;br /&gt;
|id=another-card&lt;br /&gt;
|canEdit=yes&lt;br /&gt;
|closeButton=&lt;br /&gt;
|title=Another card&lt;br /&gt;
|subTitle=Below the default sidebar&lt;br /&gt;
|view=&amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;viewtab content&amp;lt;/div&amp;gt;&lt;br /&gt;
|edit=&amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;edittab content&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fully custom sidebar template ==&lt;br /&gt;
In a fully custom sidebar template you can do anything you want. You will still get the $pageData and $classData parameters passed to this template so you can use those. The following is an example of custom sidebar code that will produce a sidebar similar to the default one, perhaps this will give you some ideas for what&#039;s possible:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;tab-content&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;input type=&amp;quot;radio&amp;quot; id=&amp;quot;sidebar-view&amp;quot; name=&amp;quot;toggle-sidebar&amp;quot; checked=&amp;quot;checked&amp;quot; class=&amp;quot;d-none sidebar-view&amp;quot; /&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;div class=&amp;quot;card sidebar-view-tab&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;{{#ifeq:{{#ifingroup:user |{{#if:{{#urlget:veaction}}{{#urlget:action}}||yes}} }}|yes |&amp;lt;span style=&amp;quot;float:right&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;sidebar-edit&amp;quot; class=&amp;quot;btn btn-secondary&amp;quot;&amp;gt;Edit&amp;lt;/label&amp;gt;&amp;lt;/span&amp;gt;}}&lt;br /&gt;
&amp;lt;b class=&amp;quot;d-block&amp;quot;&amp;gt;{{#af_get:{{{$pageData}}}|csp-base-props|Base properties|1|Class|_text}}&amp;lt;/b&amp;gt;&lt;br /&gt;
{{#af_get:{{{$pageData}}}|csp-base-props|Base properties|1|Title|_text}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card-header --&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp sidebar item&lt;br /&gt;
|Label=Title&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-base-props|Base properties|1|Title |_text}}&lt;br /&gt;
}}{{Csp sidebar item&lt;br /&gt;
|Label=TextInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TextInput |_text}}&lt;br /&gt;
}}{{Csp sidebar item&lt;br /&gt;
|Label=TokenInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TokenInput |_text}}&lt;br /&gt;
}}{{Csp sidebar item&lt;br /&gt;
|Label=AskTokenInput&lt;br /&gt;
|Value={{#af_join:{{#af_map:{{#af_split:{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|AskTokenInput |_text}}|,}}|@@|[[{{{@@}}}|{{#show:{{{@@}}}|?Title}}]]}}|&amp;lt;br&amp;gt;}}&lt;br /&gt;
}}{{Test date display&lt;br /&gt;
|Name=DateInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|DateInput |_text}}&lt;br /&gt;
}}&lt;br /&gt;
{{Csp sidebar item&lt;br /&gt;
|Label=DateInputTwo&lt;br /&gt;
|Value={{#if:{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|DateInputTwo |_text}} |{{#time: j M Y H:i |{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|DateInputTwo |_text}} }} }}&lt;br /&gt;
}}{{Csp sidebar item&lt;br /&gt;
|Label=TextInputTwo&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TextInputTwo |_text}}&lt;br /&gt;
}}{{Csp sidebar item&lt;br /&gt;
|Label=CheckboxInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|CheckboxInput |_text}}&lt;br /&gt;
}}{{Csp sidebar item&lt;br /&gt;
|Label=TextAreaInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TextAreaInput |_text}}&lt;br /&gt;
}}{{Csp sidebar item&lt;br /&gt;
|Label=NumberInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|NumberInput |_text}}&lt;br /&gt;
}}{{Csp sidebar item&lt;br /&gt;
|Label=SelectInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|SelectInput |_text}}&lt;br /&gt;
}}{{Csp sidebar item&lt;br /&gt;
|Label=TokenMultipleInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TokenMultipleInput |_text}}&lt;br /&gt;
}}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card-body --&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card &lt;br /&gt;
&lt;br /&gt;
--&amp;gt;{{#ifeq:{{#ifingroup:user |{{#if:{{#urlget:veaction}}{{#urlget:action}}||yes}} }}|yes |&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;input type=&amp;quot;radio&amp;quot; id=&amp;quot;sidebar-edit&amp;quot; name=&amp;quot;toggle-sidebar&amp;quot; class=&amp;quot;d-none sidebar-edit&amp;quot; /&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;div class=&amp;quot;card sidebar-edit-tab&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;float:right&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;sidebar-view&amp;quot; class=&amp;quot;btn btn-secondary&amp;quot; &amp;gt;Close&amp;lt;/label&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;b class=&amp;quot;d-block&amp;quot;&amp;gt;{{#af_get:{{{$pageData}}}|csp-base-props|Base properties|1|Class|_text}}&amp;lt;/b&amp;gt;&lt;br /&gt;
{{#af_get:{{{$pageData}}}|csp-base-props|Base properties|1|Title|_text}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card-header --&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
// _edits: no edit when formfieldType is set to &amp;quot;(none)&amp;quot;&lt;br /&gt;
--&amp;gt;&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Base properties&amp;quot; formfield=&amp;quot;Title&amp;quot; mwslot=&amp;quot;csp-base-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;TextInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;TokenInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;AskTokenInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;DateInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;DateInputTwo&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;TextInputTwo&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;CheckboxInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;TextAreaInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;NumberInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;SelectInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;TokenMultipleInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;TestNoDisplay&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;!-- end of _edits&lt;br /&gt;
&lt;br /&gt;
// form fields&lt;br /&gt;
--&amp;gt;{{Csp sidebar item&lt;br /&gt;
|Label=Title&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Title&amp;quot; class=&amp;quot;form-control&amp;quot; required=&amp;quot;required&amp;quot; value=&amp;quot;{{#af_get:{{{$pageData}}}|csp-base-props|Base properties|1|Title|_text}}&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Csp sidebar item&lt;br /&gt;
|Label=TextInput&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;TextInput&amp;quot; class=&amp;quot;form-control&amp;quot; required=&amp;quot;required&amp;quot; value=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TextInput|_text}}&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Csp sidebar item&lt;br /&gt;
|Label=TokenInput&lt;br /&gt;
|Value=&amp;lt;_token id=&amp;quot;token-{{lc:{{anchorencode:TokenInput}} }}&amp;quot; name=&amp;quot;TokenInput[]&amp;quot; class=&amp;quot;form-control&amp;quot; allowclear selected=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TokenInput|_text}}&amp;quot; options=&amp;quot;Ay,Bee,Cee&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Csp sidebar item&lt;br /&gt;
|Label=AskTokenInput&lt;br /&gt;
|Value=&amp;lt;_token id=&amp;quot;token-{{lc:{{anchorencode:AskTokenInput}} }}&amp;quot; name=&amp;quot;AskTokenInput[]&amp;quot; class=&amp;quot;form-control&amp;quot; required=&amp;quot;required&amp;quot; multiple=&amp;quot;multiple&amp;quot;  input-length-trigger=&amp;quot;1&amp;quot; query=&amp;quot;[[Class::+]][[Title::!!!]](limit=999)(returntext=Title)&amp;quot; &amp;gt;&lt;br /&gt;
{{#af_join:{{#af_map:{{#af_split:{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|AskTokenInput|_text}} }} |$value|&amp;lt;option value=&amp;quot;{{{$value}}}&amp;quot; selected=&amp;quot;selected&amp;quot;&amp;gt;{{#show:{{{$value}}}|?Title}}&amp;lt;/option&amp;gt;}}|\n}}&lt;br /&gt;
&amp;lt;/_token&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Test date formfield&lt;br /&gt;
|Name=DateInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|DateInput|_text}} &lt;br /&gt;
}}{{Csp sidebar item&lt;br /&gt;
|Label=DateInputTwo&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;datetime-local&amp;quot; name=&amp;quot;DateInputTwo&amp;quot; class=&amp;quot;form-control&amp;quot; value=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|DateInputTwo|_text}}&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;div class=&#039;alert alert-danger&#039;&amp;gt;No template defined in parameter definitions&amp;lt;/div&amp;gt;{{Csp sidebar item&lt;br /&gt;
|Label=&amp;lt;label for=&amp;quot;checkbox-{{lc:{{anchorencode:CheckboxInput}} }}&amp;quot; &amp;gt;CheckboxInput&amp;lt;/label&amp;gt;&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;CheckboxInput&amp;quot; value=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;checkbox-{{lc:{{anchorencode:CheckboxInput}} }}&amp;quot; name=&amp;quot;CheckboxInput&amp;quot; value=&amp;quot;Yes&amp;quot; checked=&amp;quot;{{#ifeq:{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|CheckboxInput|_text}} |Yes|checked}}&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Csp sidebar item&lt;br /&gt;
|Label=TextAreaInput&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;textarea&amp;quot; name=&amp;quot;TextAreaInput&amp;quot; class=&amp;quot;form-control&amp;quot; &amp;gt;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TextAreaInput|_text}}&amp;lt;/input&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Csp sidebar item&lt;br /&gt;
|Label=NumberInput&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;number&amp;quot; name=&amp;quot;NumberInput&amp;quot; class=&amp;quot;form-control&amp;quot; value=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|NumberInput|_text}}&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Csp sidebar item&lt;br /&gt;
|Label=SelectInput&lt;br /&gt;
|Value=&amp;lt;select name=&amp;quot;SelectInput&amp;quot; class=&amp;quot;form-control&amp;quot; allowclear selected=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|SelectInput|_text}}&amp;quot; options=&amp;quot;Alpha,Bravo,Charlie&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Csp sidebar item&lt;br /&gt;
|Label=TokenMultipleInput&lt;br /&gt;
|Value=&amp;lt;_token id=&amp;quot;token-{{lc:{{anchorencode:TokenMultipleInput}} }}&amp;quot; name=&amp;quot;TokenMultipleInput[]&amp;quot; class=&amp;quot;form-control&amp;quot; multiple=&amp;quot;multiple&amp;quot; selected=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TokenMultipleInput|_text}}&amp;quot; options=&amp;quot;Alpha,Bravo,Charlie&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Csp sidebar item&lt;br /&gt;
|Label=TestNoDisplay&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;TestNoDisplay&amp;quot; class=&amp;quot;form-control&amp;quot; value=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TestNoDisplay|_text}}&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;div class=&amp;quot;text-right&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;label for=&amp;quot;sidebar-view&amp;quot; class=&amp;quot;btn btn-secondary&amp;quot;&amp;gt;Close&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Save&amp;quot; class=&amp;quot;btn btn-primary&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card-body --&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card --&amp;gt;&lt;br /&gt;
|}}&amp;lt;!-- end of #ifeq @allow sidebar edit == yes --&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_architecture&amp;diff=3038</id>
		<title>DevOps:Doc/Open CSP/2.0/Class definition architecture</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_architecture&amp;diff=3038"/>
		<updated>2023-10-05T12:57:00Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Open CSP stores metadata of pages in slots. Pages are displayed with various components (for which the Chameleon skin is used), which can look differently based on the configuration found in class definition pages. &lt;br /&gt;
&lt;br /&gt;
== Metadata stored in slots ==&lt;br /&gt;
Before slots were used, there were two common ways to deal with structured data:&lt;br /&gt;
&lt;br /&gt;
* A) Have templates with structured data in between the content (free text) of a page. &lt;br /&gt;
* B) Have one template that wraps the entire page content, with some parameters for structured data and also a parameter for free text&lt;br /&gt;
&lt;br /&gt;
The advantage of using slots is that you can separate the metadata from the content and also separate the storing of the data from displaying it. This reduces the risk of making mistakes when editing, while allowing you to have forms for editing structured data and to use VisualEditor to edit the main content.&lt;br /&gt;
&lt;br /&gt;
Note: data is stored in SMW properties as well, but class definitions do not rely on this. SMW is used for example for [[Search]] and [[Pages]]. It would technically be possible to modify the Open CSP framework to work with a different data storage extension, if you would make your own alternatives for the pages that use SMW queries or WikiSearch.&lt;br /&gt;
&lt;br /&gt;
The following slots are used by Open CSP:&lt;br /&gt;
&lt;br /&gt;
=== csp-base-props ===&lt;br /&gt;
In this slot &#039;&#039;&#039;Template:Base properties&#039;&#039;&#039; is used to store data dat is common to all pages, such as the Class and Title:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Base properties&lt;br /&gt;
|Class=&lt;br /&gt;
|Title=&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== csp-class-props ===&lt;br /&gt;
In this slot &#039;&#039;&#039;Template:Csp class properties&#039;&#039;&#039; is used to store data that is specific to each class, based on the class definition:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp class properties&lt;br /&gt;
|Parameter1=Value1&lt;br /&gt;
|Parameter2=Value2&lt;br /&gt;
|...&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== csp-data ===&lt;br /&gt;
This is a json slot which the framework only uses for class definition pages, but could be used for storing any json data on content pages as well (if you make your own templates/forms for this).&lt;br /&gt;
&lt;br /&gt;
=== Example slots of a content page ===&lt;br /&gt;
Let&#039;s say we have a page about a person, this could have the following slots:&lt;br /&gt;
&lt;br /&gt;
csp-base-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Base properties&lt;br /&gt;
|Class=Person&lt;br /&gt;
|Title=Example person&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;csp-class-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp class properties&lt;br /&gt;
|First name=John&lt;br /&gt;
|Last name=Smith&lt;br /&gt;
|Date of birth=1986-03-16&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example slots of a class definition page ===&lt;br /&gt;
To continue the previous example, a &amp;quot;Person&amp;quot; class definition page would have pagename &#039;&#039;&#039;Wiki:Class definition/Person&#039;&#039;&#039; and could have the following slots:&lt;br /&gt;
&lt;br /&gt;
csp-base-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Base properties&lt;br /&gt;
|Class=Class definition&lt;br /&gt;
|Title=Person&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;csp-class-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp class properties&lt;br /&gt;
|Defines class=Person&lt;br /&gt;
|Pagetitle format=title&lt;br /&gt;
|Layout areas=&#039;sub-header sidebar&#039; &#039;main sidebar&#039;&lt;br /&gt;
|Layout columns=3fr 1fr&lt;br /&gt;
|Layout rows=auto 1fr&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;csp-data:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;CspParameterDefinitions&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;First name&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Last name&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Date of birth&amp;quot;,&lt;br /&gt;
            &amp;quot;formfieldTemplate&amp;quot;: &amp;quot;Csp formfield/date&amp;quot;,&lt;br /&gt;
            &amp;quot;displayTemplate&amp;quot;: &amp;quot;Csp parameter display/date&amp;quot;,&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Components ==&lt;br /&gt;
Open CSP uses the Chameleon skin to be able to display pages with customizable components. The following components are used:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Header:&#039;&#039;&#039; always visible at the top of a page&lt;br /&gt;
* &#039;&#039;&#039;Main&#039;&#039;&#039;: this component displays the content that is stored in the main slot of a page, i.e. the text that is written by users&lt;br /&gt;
* &#039;&#039;&#039;Sub-header&#039;&#039;&#039;: by default shown below the header with &#039;&#039;&#039;Template:Csp default subheader&#039;&#039;&#039;, can be customized through class definitions&lt;br /&gt;
* &#039;&#039;&#039;Sidebar&#039;&#039;&#039;: by default shown on right side with &#039;&#039;&#039;Template:Csp default sidebar&#039;&#039;&#039;, can be customized through class definitions, metadata is displayed in this component&lt;br /&gt;
* &#039;&#039;&#039;Footer&#039;&#039;&#039;: by default not displayed, can be customized through class definitions&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Open CSP uses system messages inside these components. These system message contain some logic with various parser functions and Lua functions, in order to display a component based on the slot data of page as well as the slot data of the corresponding class definition page. This logic works as follows:&lt;br /&gt;
&lt;br /&gt;
* A component contains a system message that invokes a Lua function, for example &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#invoke:CspComponents|parseComponentIfApplicable|sidebar}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. This Lua function does the following:&lt;br /&gt;
* Retrieve slotdata from current page&lt;br /&gt;
* Get &amp;quot;Class&amp;quot; parameter from slotdata (return if it does not exist)&lt;br /&gt;
* Get class definition pagename corresponding to the class&lt;br /&gt;
* Get slotdata from class definition page (return if it does not exist)&lt;br /&gt;
* If the component is not found in the &amp;quot;Layout areas&amp;quot; parameter of the class definition page, return&lt;br /&gt;
* Parse component template (for example &#039;&#039;&#039;Template:Csp default sidebar&#039;&#039;&#039;, unless a different template is found in the class definition data)&lt;br /&gt;
* Pass all of the slotdata from the current page as well as the class definition slotdata to this template, in the form of an ArrayFunctions export&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_architecture&amp;diff=3037</id>
		<title>DevOps:Doc/Open CSP/2.0/Class definition architecture</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_architecture&amp;diff=3037"/>
		<updated>2023-10-05T12:46:25Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Open CSP stores metadata of pages in slots. Pages are displayed with various components (for which the Chameleon skin is used), which can look differently based on the configuration found in class definition pages. &lt;br /&gt;
&lt;br /&gt;
== Metadata stored in slots ==&lt;br /&gt;
Before slots were used, there were two common ways to deal with structured data:&lt;br /&gt;
&lt;br /&gt;
* A) Have templates with structured data in between the content (free text) of a page. &lt;br /&gt;
* B) Have one template that wraps the entire page content, with some parameters for structured data and also a parameter for free text&lt;br /&gt;
&lt;br /&gt;
The advantage of using slots is that you can separate the metadata from the content and also separate the storing of the data from displaying it. This reduces the risk of making mistakes when editing, while allowing you to have forms for editing structured data and to use VisualEditor to edit the main content.&lt;br /&gt;
&lt;br /&gt;
Note: data is stored in SMW properties as well, but class definitions do not rely on this. SMW is used for example for [[Search]] and [[Pages]]. It would technically be possible to modify the Open CSP framework to work with a different data storage extension, if you would make your own alternatives for the pages that use SMW queries or WikiSearch.&lt;br /&gt;
&lt;br /&gt;
The following slots are used by Open CSP:&lt;br /&gt;
&lt;br /&gt;
=== csp-base-props ===&lt;br /&gt;
In this slot &#039;&#039;&#039;Template:Base properties&#039;&#039;&#039; is used to store data dat is common to all pages, such as the Class and Title:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Base properties&lt;br /&gt;
|Class=&lt;br /&gt;
|Title=&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== csp-class-props ===&lt;br /&gt;
In this slot &#039;&#039;&#039;Template:Csp class properties&#039;&#039;&#039; is used to store data that is specific to each class, based on the class definition:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp class properties&lt;br /&gt;
|Parameter1=Value1&lt;br /&gt;
|Parameter2=Value2&lt;br /&gt;
|...&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== csp-data ===&lt;br /&gt;
This is a json slot which the framework only uses for class definition pages, but could be used for storing any json data on content pages as well (if you make your own templates/forms for this).&lt;br /&gt;
&lt;br /&gt;
=== Example slots of a content page ===&lt;br /&gt;
Let&#039;s say we have a page about a person, this could have the following slots:&lt;br /&gt;
&lt;br /&gt;
csp-base-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Base properties&lt;br /&gt;
|Class=Person&lt;br /&gt;
|Title=Example person&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;csp-class-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp class properties&lt;br /&gt;
|First name=John&lt;br /&gt;
|Last name=Smith&lt;br /&gt;
|Date of birth=1986-03-16&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example slots of a class definition page ===&lt;br /&gt;
To continue the previous example, a &amp;quot;Person&amp;quot; class definition page would have pagename &#039;&#039;&#039;Wiki:Class definition/Person&#039;&#039;&#039; and could have the following slots:&lt;br /&gt;
&lt;br /&gt;
csp-base-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Base properties&lt;br /&gt;
|Class=Class definition&lt;br /&gt;
|Title=Person&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;csp-class-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp class properties&lt;br /&gt;
|Defines class=Person&lt;br /&gt;
|Pagetitle format=title&lt;br /&gt;
|Layout areas=&#039;sub-header sidebar&#039; &#039;main sidebar&#039;&lt;br /&gt;
|Layout columns=3fr 1fr&lt;br /&gt;
|Layout rows=auto 1fr&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;csp-data:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;CspParameterDefinitions&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;First name&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Last name&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Date of birth&amp;quot;,&lt;br /&gt;
            &amp;quot;formfieldTemplate&amp;quot;: &amp;quot;Csp formfield/date&amp;quot;,&lt;br /&gt;
            &amp;quot;displayTemplate&amp;quot;: &amp;quot;Csp parameter display/date&amp;quot;,&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Components ==&lt;br /&gt;
Open CSP uses the Chameleon skin to be able to display pages with customizable components. The following components are used:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Header:&#039;&#039;&#039; always visible at the top of a page&lt;br /&gt;
* &#039;&#039;&#039;Main&#039;&#039;&#039;: this component displays the content that is stored in the main slot of a page, i.e. the text that is written by users&lt;br /&gt;
* &#039;&#039;&#039;Sub-header&#039;&#039;&#039;: by default shown below the header with &#039;&#039;&#039;Template:Csp default subheader&#039;&#039;&#039;, can be customized through class definitions&lt;br /&gt;
* &#039;&#039;&#039;Sidebar&#039;&#039;&#039;: by default shown on right side with &#039;&#039;&#039;Template:Csp default sidebar&#039;&#039;&#039;, can be customized through class definitions, metadata is displayed in this component&lt;br /&gt;
* &#039;&#039;&#039;Footer&#039;&#039;&#039;: by default not displayed, can be customized through class definitions&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Open CSP uses system messages inside these components. These system message contain some logic with various parser functions and Lua functions, in order to display a component based on the slot data of page as well as the slot data of the corresponding class definition page. This logic works as follows:&lt;br /&gt;
&lt;br /&gt;
* A component contains a system message that invokes a Lua function, for example &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#invoke:CspComponents|parseComponentIfApplicable|sidebar}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. This Lua function does the following:&lt;br /&gt;
* Retrieve slotdata from current page&lt;br /&gt;
* Get &amp;quot;Class&amp;quot; parameter from slotdata (return if it does not exist)&lt;br /&gt;
* Get class definition pagename corresponding to the class&lt;br /&gt;
* Get slotdata from class definition page (return if it does not exist)&lt;br /&gt;
* Parse component template (for example &#039;&#039;&#039;Template:Csp default sidebar&#039;&#039;&#039;, unless a different template is found in the class definition data)&lt;br /&gt;
* Pass all of the slotdata from the current page as well as the class definition slotdata to this template, in the form of an ArrayFunctions export&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_architecture&amp;diff=3036</id>
		<title>DevOps:Doc/Open CSP/2.0/Class definition architecture</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_architecture&amp;diff=3036"/>
		<updated>2023-10-05T12:44:54Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: /* Components */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Open CSP stores metadata of pages in slots. Pages are displayed with various components (for which the Chameleon skin is used), which can look differently based on the configuration found in class definition pages. &lt;br /&gt;
&lt;br /&gt;
== Metadata stored in slots ==&lt;br /&gt;
Before slots were used, there were two common ways to deal with structured data:&lt;br /&gt;
&lt;br /&gt;
* A) Have templates with structured data in between the content (free text) of a page. &lt;br /&gt;
* B) Have one template that wraps the entire page content, with some parameters for structured data and also a parameter for free text&lt;br /&gt;
&lt;br /&gt;
The advantage of using slots is that you can separate the metadata from the content and also separate the storing of the data from displaying it. This reduces the risk of making mistakes when editing, while allowing you to have forms for editing structured data and to use VisualEditor to edit the main content.&lt;br /&gt;
&lt;br /&gt;
Note: data is stored in SMW properties as well, but class definitions do not rely on this. SMW is used for example for [[Search]] and [[Pages]]. It would technically be possible to modify the Open CSP framework to work with a different data storage extension, if you would make your own alternatives for the pages that use SMW queries or WikiSearch.&lt;br /&gt;
&lt;br /&gt;
The following slots are used by Open CSP:&lt;br /&gt;
&lt;br /&gt;
=== csp-base-props ===&lt;br /&gt;
In this slot &#039;&#039;&#039;Template:Base properties&#039;&#039;&#039; is used to store data dat is common to all pages, such as the Class and Title:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Base properties&lt;br /&gt;
|Class=&lt;br /&gt;
|Title=&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== csp-class-props ===&lt;br /&gt;
In this slot &#039;&#039;&#039;Template:Csp class properties&#039;&#039;&#039; is used to store data that is specific to each class, based on the class definition:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp class properties&lt;br /&gt;
|Parameter1=Value1&lt;br /&gt;
|Parameter2=Value2&lt;br /&gt;
|...&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== csp-data ===&lt;br /&gt;
This is a json slot which the framework only uses for class definition pages, but could be used for storing any json data on content pages as well (if you make your own templates/forms for this).&lt;br /&gt;
&lt;br /&gt;
=== Example slots of a content page ===&lt;br /&gt;
Let&#039;s say we have a page about a person, this could have the following slots:&lt;br /&gt;
&lt;br /&gt;
csp-base-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Base properties&lt;br /&gt;
|Class=Person&lt;br /&gt;
|Title=Example person&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;csp-class-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp class properties&lt;br /&gt;
|First name=John&lt;br /&gt;
|Last name=Smith&lt;br /&gt;
|Date of birth=1986-03-16&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example slots of a class definition page ===&lt;br /&gt;
To continue the previous example, a &amp;quot;Person&amp;quot; class definition page would have pagename &#039;&#039;&#039;Wiki:Class definition/Person&#039;&#039;&#039; and could have the following slots:&lt;br /&gt;
&lt;br /&gt;
csp-base-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Base properties&lt;br /&gt;
|Class=Class definition&lt;br /&gt;
|Title=Person&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;csp-class-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp class properties&lt;br /&gt;
|Defines class=Person&lt;br /&gt;
|Pagetitle format=title&lt;br /&gt;
|Layout areas=&#039;sub-header sidebar&#039; &#039;main sidebar&#039;&lt;br /&gt;
|Layout columns=3fr 1fr&lt;br /&gt;
|Layout rows=auto 1fr&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;csp-data:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;CspParameterDefinitions&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;First name&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Last name&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Date of birth&amp;quot;,&lt;br /&gt;
            &amp;quot;formfieldTemplate&amp;quot;: &amp;quot;Csp formfield/date&amp;quot;,&lt;br /&gt;
            &amp;quot;displayTemplate&amp;quot;: &amp;quot;Csp parameter display/date&amp;quot;,&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Components ==&lt;br /&gt;
Open CSP uses the Chameleon skin to be able to display pages with customizable components. The following components are used:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Header:&#039;&#039;&#039; always visible at the top of a page&lt;br /&gt;
* &#039;&#039;&#039;Main&#039;&#039;&#039;: this component displays the content that is stored in the main slot of a page, i.e. the text that is written by users&lt;br /&gt;
* &#039;&#039;&#039;Sub-header&#039;&#039;&#039;: by default shown below the header with &#039;&#039;&#039;Template:Csp default subheader&#039;&#039;&#039;, can be customized through class definitions&lt;br /&gt;
* &#039;&#039;&#039;Sidebar&#039;&#039;&#039;: by default shown on right side with &#039;&#039;&#039;Template:Csp default sidebar&#039;&#039;&#039;, can be customized through class definitions, metadata is displayed in this component&lt;br /&gt;
* &#039;&#039;&#039;Footer&#039;&#039;&#039;: by default not displayed, can be customized through class definitions&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Open CSP uses system messages inside these components. These system message contain some logic with various parser functions and Lua functions, in order to display a component based on the slot data of page as well as the slot data of the corresponding class definition page. This logic works as follows:&lt;br /&gt;
&lt;br /&gt;
* A component contains a system message that invokes a Lua function, for example &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#invoke:CspComponents|parseComponentIfApplicable|sidebar}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* This Lua function does the following:&lt;br /&gt;
* Retrieve slotdata from current page&lt;br /&gt;
* Get &amp;quot;Class&amp;quot; parameter from slotdata (return if it does not exist)&lt;br /&gt;
* Get class definition pagename corresponding to the class&lt;br /&gt;
* Get slotdata from class definition page (return if it does not exist)&lt;br /&gt;
* Parse component template (for example &#039;&#039;&#039;Template:Csp default sidebar&#039;&#039;&#039;, unless a different template is found in the class definition data)&lt;br /&gt;
* pass all of the slotdata from the current page as well as the class definition slotdata to this template, in the form of an ArrayFunctions export&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_architecture&amp;diff=3035</id>
		<title>DevOps:Doc/Open CSP/2.0/Class definition architecture</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_architecture&amp;diff=3035"/>
		<updated>2023-10-05T12:44:27Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: /* Components */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Open CSP stores metadata of pages in slots. Pages are displayed with various components (for which the Chameleon skin is used), which can look differently based on the configuration found in class definition pages. &lt;br /&gt;
&lt;br /&gt;
== Metadata stored in slots ==&lt;br /&gt;
Before slots were used, there were two common ways to deal with structured data:&lt;br /&gt;
&lt;br /&gt;
* A) Have templates with structured data in between the content (free text) of a page. &lt;br /&gt;
* B) Have one template that wraps the entire page content, with some parameters for structured data and also a parameter for free text&lt;br /&gt;
&lt;br /&gt;
The advantage of using slots is that you can separate the metadata from the content and also separate the storing of the data from displaying it. This reduces the risk of making mistakes when editing, while allowing you to have forms for editing structured data and to use VisualEditor to edit the main content.&lt;br /&gt;
&lt;br /&gt;
Note: data is stored in SMW properties as well, but class definitions do not rely on this. SMW is used for example for [[Search]] and [[Pages]]. It would technically be possible to modify the Open CSP framework to work with a different data storage extension, if you would make your own alternatives for the pages that use SMW queries or WikiSearch.&lt;br /&gt;
&lt;br /&gt;
The following slots are used by Open CSP:&lt;br /&gt;
&lt;br /&gt;
=== csp-base-props ===&lt;br /&gt;
In this slot &#039;&#039;&#039;Template:Base properties&#039;&#039;&#039; is used to store data dat is common to all pages, such as the Class and Title:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Base properties&lt;br /&gt;
|Class=&lt;br /&gt;
|Title=&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== csp-class-props ===&lt;br /&gt;
In this slot &#039;&#039;&#039;Template:Csp class properties&#039;&#039;&#039; is used to store data that is specific to each class, based on the class definition:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp class properties&lt;br /&gt;
|Parameter1=Value1&lt;br /&gt;
|Parameter2=Value2&lt;br /&gt;
|...&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== csp-data ===&lt;br /&gt;
This is a json slot which the framework only uses for class definition pages, but could be used for storing any json data on content pages as well (if you make your own templates/forms for this).&lt;br /&gt;
&lt;br /&gt;
=== Example slots of a content page ===&lt;br /&gt;
Let&#039;s say we have a page about a person, this could have the following slots:&lt;br /&gt;
&lt;br /&gt;
csp-base-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Base properties&lt;br /&gt;
|Class=Person&lt;br /&gt;
|Title=Example person&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;csp-class-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp class properties&lt;br /&gt;
|First name=John&lt;br /&gt;
|Last name=Smith&lt;br /&gt;
|Date of birth=1986-03-16&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example slots of a class definition page ===&lt;br /&gt;
To continue the previous example, a &amp;quot;Person&amp;quot; class definition page would have pagename &#039;&#039;&#039;Wiki:Class definition/Person&#039;&#039;&#039; and could have the following slots:&lt;br /&gt;
&lt;br /&gt;
csp-base-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Base properties&lt;br /&gt;
|Class=Class definition&lt;br /&gt;
|Title=Person&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;csp-class-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp class properties&lt;br /&gt;
|Defines class=Person&lt;br /&gt;
|Pagetitle format=title&lt;br /&gt;
|Layout areas=&#039;sub-header sidebar&#039; &#039;main sidebar&#039;&lt;br /&gt;
|Layout columns=3fr 1fr&lt;br /&gt;
|Layout rows=auto 1fr&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;csp-data:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;CspParameterDefinitions&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;First name&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Last name&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Date of birth&amp;quot;,&lt;br /&gt;
            &amp;quot;formfieldTemplate&amp;quot;: &amp;quot;Csp formfield/date&amp;quot;,&lt;br /&gt;
            &amp;quot;displayTemplate&amp;quot;: &amp;quot;Csp parameter display/date&amp;quot;,&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Components ==&lt;br /&gt;
Open CSP uses the Chameleon skin to be able to display pages with customizable components. The following components are used:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Header:&#039;&#039;&#039; always visible at the top of a page&lt;br /&gt;
* &#039;&#039;&#039;Main&#039;&#039;&#039;: this component displays the content that is stored in the main slot of a page, i.e. the text that is written by users&lt;br /&gt;
* &#039;&#039;&#039;Sub-header&#039;&#039;&#039;: by default shown below the header with &#039;&#039;&#039;Template:Csp default subheader&#039;&#039;&#039;, can be customized through class definitions&lt;br /&gt;
* &#039;&#039;&#039;Sidebar&#039;&#039;&#039;: by default shown on right side with &#039;&#039;&#039;Template:Csp default sidebar&#039;&#039;&#039;, can be customized through class definitions, metadata is displayed in this component&lt;br /&gt;
* &#039;&#039;&#039;Footer&#039;&#039;&#039;: by default not displayed, can be customized through class definitions&lt;br /&gt;
&lt;br /&gt;
Open CSP uses system messages inside these components. These system message contain some logic with various parser functions and Lua functions, in order to display a component based on the slot data of page as well as the slot data of the corresponding class definition page. This logic works as follows:&lt;br /&gt;
&lt;br /&gt;
* A component contains a system message that invokes a Lua function, for example &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#invoke:CspComponents|parseComponentIfApplicable|sidebar}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* This Lua function does the following:&lt;br /&gt;
* Retrieve slotdata from current page&lt;br /&gt;
* Get &amp;quot;Class&amp;quot; parameter from slotdata (return if it does not exist)&lt;br /&gt;
* Get class definition pagename corresponding to the class&lt;br /&gt;
* Get slotdata from class definition page (return if it does not exist)&lt;br /&gt;
* Parse component template (for example &#039;&#039;&#039;Template:Csp default sidebar&#039;&#039;&#039;, unless a different template is found in the class definition data)&lt;br /&gt;
* pass all of the slotdata from the current page as well as the class definition slotdata to this template, in the form of an ArrayFunctions export&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_architecture&amp;diff=3034</id>
		<title>DevOps:Doc/Open CSP/2.0/Class definition architecture</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_architecture&amp;diff=3034"/>
		<updated>2023-10-05T12:37:31Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Open CSP stores metadata of pages in slots. Pages are displayed with various components (for which the Chameleon skin is used), which can look differently based on the configuration found in class definition pages. &lt;br /&gt;
&lt;br /&gt;
== Metadata stored in slots ==&lt;br /&gt;
Before slots were used, there were two common ways to deal with structured data:&lt;br /&gt;
&lt;br /&gt;
* A) Have templates with structured data in between the content (free text) of a page. &lt;br /&gt;
* B) Have one template that wraps the entire page content, with some parameters for structured data and also a parameter for free text&lt;br /&gt;
&lt;br /&gt;
The advantage of using slots is that you can separate the metadata from the content and also separate the storing of the data from displaying it. This reduces the risk of making mistakes when editing, while allowing you to have forms for editing structured data and to use VisualEditor to edit the main content.&lt;br /&gt;
&lt;br /&gt;
Note: data is stored in SMW properties as well, but class definitions do not rely on this. SMW is used for example for [[Search]] and [[Pages]]. It would technically be possible to modify the Open CSP framework to work with a different data storage extension, if you would make your own alternatives for the pages that use SMW queries or WikiSearch.&lt;br /&gt;
&lt;br /&gt;
The following slots are used by Open CSP:&lt;br /&gt;
&lt;br /&gt;
=== csp-base-props ===&lt;br /&gt;
In this slot &#039;&#039;&#039;Template:Base properties&#039;&#039;&#039; is used to store data dat is common to all pages, such as the Class and Title:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Base properties&lt;br /&gt;
|Class=&lt;br /&gt;
|Title=&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== csp-class-props ===&lt;br /&gt;
In this slot &#039;&#039;&#039;Template:Csp class properties&#039;&#039;&#039; is used to store data that is specific to each class, based on the class definition:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp class properties&lt;br /&gt;
|Parameter1=Value1&lt;br /&gt;
|Parameter2=Value2&lt;br /&gt;
|...&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== csp-data ===&lt;br /&gt;
This is a json slot which the framework only uses for class definition pages, but could be used for storing any json data on content pages as well (if you make your own templates/forms for this).&lt;br /&gt;
&lt;br /&gt;
=== Example slots of a content page ===&lt;br /&gt;
Let&#039;s say we have a page about a person, this could have the following slots:&lt;br /&gt;
&lt;br /&gt;
csp-base-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Base properties&lt;br /&gt;
|Class=Person&lt;br /&gt;
|Title=Example person&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;csp-class-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp class properties&lt;br /&gt;
|First name=John&lt;br /&gt;
|Last name=Smith&lt;br /&gt;
|Date of birth=1986-03-16&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example slots of a class definition page ===&lt;br /&gt;
To continue the previous example, a &amp;quot;Person&amp;quot; class definition page would have pagename &#039;&#039;&#039;Wiki:Class definition/Person&#039;&#039;&#039; and could have the following slots:&lt;br /&gt;
&lt;br /&gt;
csp-base-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Base properties&lt;br /&gt;
|Class=Class definition&lt;br /&gt;
|Title=Person&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;csp-class-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp class properties&lt;br /&gt;
|Defines class=Person&lt;br /&gt;
|Pagetitle format=title&lt;br /&gt;
|Layout areas=&#039;sub-header sidebar&#039; &#039;main sidebar&#039;&lt;br /&gt;
|Layout columns=3fr 1fr&lt;br /&gt;
|Layout rows=auto 1fr&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;csp-data:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;CspParameterDefinitions&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;First name&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Last name&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Date of birth&amp;quot;,&lt;br /&gt;
            &amp;quot;formfieldTemplate&amp;quot;: &amp;quot;Csp formfield/date&amp;quot;,&lt;br /&gt;
            &amp;quot;displayTemplate&amp;quot;: &amp;quot;Csp parameter display/date&amp;quot;,&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Components ==&lt;br /&gt;
Open CSP uses the Chameleon skin to be able to display pages with customizable components. The following components are used:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Header:&#039;&#039;&#039; always visible at the top of a page&lt;br /&gt;
* &#039;&#039;&#039;Main&#039;&#039;&#039;: this component displays the content that is stored in the main slot of a page, i.e. the text that is written by users&lt;br /&gt;
* &#039;&#039;&#039;Sub-header&#039;&#039;&#039;: by default shown below the header with &#039;&#039;&#039;Template:Csp default subheader&#039;&#039;&#039;, can be customized through class definitions&lt;br /&gt;
* &#039;&#039;&#039;Sidebar&#039;&#039;&#039;: by default shown on right side with &#039;&#039;&#039;Template:Csp default sidebar&#039;&#039;&#039;, can be customized through class definitions, metadata is displayed in this component&lt;br /&gt;
* &#039;&#039;&#039;Footer&#039;&#039;&#039;: by default not displayed, can be customized through class definitions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Open CSP uses system messages inside these components. These system message contain some logic with various parser functions and Lua functions, in order to display a component based on the slot data of page as well as the slot data of the corresponding class definition page.&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_architecture&amp;diff=3033</id>
		<title>DevOps:Doc/Open CSP/2.0/Class definition architecture</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_architecture&amp;diff=3033"/>
		<updated>2023-10-05T12:32:13Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Open CSP stores metadata of pages in slots. Pages are displayed with various components (for which the Chameleon skin is used), which can look differently based on the configuration found in class definition pages. &lt;br /&gt;
&lt;br /&gt;
== Metadata stored in slots ==&lt;br /&gt;
Before slots were used, there were two common ways to deal with structured data:&lt;br /&gt;
&lt;br /&gt;
* A) Have templates with structured data in between the content (free text) of a page. &lt;br /&gt;
* B) Have one template that wraps the entire page content, with some parameters for structured data and also a parameter for free text&lt;br /&gt;
&lt;br /&gt;
The advantage of using slots is that you can separate the metadata from the content and also separate the storing of the data from displaying it. This reduces the risk of making mistakes when editing, while allowing you to have forms for editing structured data and to use VisualEditor to edit the main content.&lt;br /&gt;
&lt;br /&gt;
Note: data is stored in SMW properties as well, but class definitions do not rely on this. SMW is used for example for [[Search]] and [[Pages]]. It would technically be possible to modify the Open CSP framework to work with a different data storage extension, if you would make your own alternatives for the pages that use SMW queries or WikiSearch.&lt;br /&gt;
&lt;br /&gt;
The following slots are used by Open CSP:&lt;br /&gt;
&lt;br /&gt;
=== csp-base-props ===&lt;br /&gt;
In this slot &#039;&#039;&#039;Template:Base properties&#039;&#039;&#039; is used to store data dat is common to all pages, such as the Class and Title:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Base properties&lt;br /&gt;
|Class=&lt;br /&gt;
|Title=&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== csp-class-props ===&lt;br /&gt;
In this slot &#039;&#039;&#039;Template:Csp class properties&#039;&#039;&#039; is used to store data that is specific to each class, based on the class definition:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp class properties&lt;br /&gt;
|Parameter1=Value1&lt;br /&gt;
|Parameter2=Value2&lt;br /&gt;
|...&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== csp-data ===&lt;br /&gt;
This is a json slot which the framework only uses for class definition pages, but could be used for storing any json data on content pages as well (if you make your own templates/forms for this).&lt;br /&gt;
&lt;br /&gt;
=== Example slots of a content page ===&lt;br /&gt;
Let&#039;s say we have a page about a person, this could have the following slots:&lt;br /&gt;
&lt;br /&gt;
csp-base-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Base properties&lt;br /&gt;
|Class=Person&lt;br /&gt;
|Title=Example person&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;csp-class-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp class properties&lt;br /&gt;
|First name=John&lt;br /&gt;
|Last name=Smith&lt;br /&gt;
|Date of birth=1986-03-16&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example slots of a class definition page ===&lt;br /&gt;
To continue the previous example, a &amp;quot;Person&amp;quot; class definition page would have pagename &#039;&#039;&#039;Wiki:Class definition/Person&#039;&#039;&#039; and could have the following slots:&lt;br /&gt;
&lt;br /&gt;
csp-base-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Base properties&lt;br /&gt;
|Class=Class definition&lt;br /&gt;
|Title=Person&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;csp-class-props:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp class properties&lt;br /&gt;
|Defines class=Person&lt;br /&gt;
|Pagetitle format=title&lt;br /&gt;
|Layout areas=&#039;sub-header sidebar&#039; &#039;main sidebar&#039;&lt;br /&gt;
|Layout columns=3fr 1fr&lt;br /&gt;
|Layout rows=auto 1fr&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;csp-data:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;CspParameterDefinitions&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;First name&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Last name&amp;quot;,&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Date of birth&amp;quot;,&lt;br /&gt;
            &amp;quot;formfieldTemplate&amp;quot;: &amp;quot;Csp formfield/date&amp;quot;,&lt;br /&gt;
            &amp;quot;displayTemplate&amp;quot;: &amp;quot;Csp parameter display/date&amp;quot;,&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Components ==&lt;br /&gt;
Open CSP uses the Chameleon skin to be able to display pages with customizable components. The following components are used:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Header:&#039;&#039;&#039; always visible at the top of a page&lt;br /&gt;
* &#039;&#039;&#039;Main&#039;&#039;&#039;: this component displays the content that is stored in the main slot of a page, i.e. the text that is written by users&lt;br /&gt;
* &#039;&#039;&#039;Sub-header&#039;&#039;&#039;: by default shown below the header, can be customized through class definitions&lt;br /&gt;
* &#039;&#039;&#039;Sidebar&#039;&#039;&#039;: by default shown on right side, can be customized through class definitions, metadata is displayed in this component&lt;br /&gt;
* &#039;&#039;&#039;Footer&#039;&#039;&#039;: by default not displayed, can be customized through class definitions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Open CSP uses system messages inside these components. These system message contain some logic with various parser functions and Lua functions, in order to display a component based on the slot data of page as well as the slot data of the corresponding class definition page.&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_architecture&amp;diff=3032</id>
		<title>DevOps:Doc/Open CSP/2.0/Class definition architecture</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_architecture&amp;diff=3032"/>
		<updated>2023-10-05T12:01:20Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Open CSP stores metadata of pages in slots. Pages are displayed with various components (for which the Chameleon skin is used), which can look differently based on the configuration found in class definition pages. &lt;br /&gt;
&lt;br /&gt;
== Metadata stored in slots ==&lt;br /&gt;
Before slots were used, there were two common ways to deal with structured data:&lt;br /&gt;
&lt;br /&gt;
* A) Have templates with structured data in between the content (free text) of a page. &lt;br /&gt;
* B) Have one template that wraps the entire page content, with some parameters for structured data and also a parameter for free text&lt;br /&gt;
&lt;br /&gt;
The advantage of using slots is that you can separate the metadata from the content and also separate the storing of the data from displaying it. This reduces the risk of making mistakes when editing, while allowing you to have forms for editing structured data and to use VisualEditor to edit the main content.&lt;br /&gt;
&lt;br /&gt;
Note: data is stored in SMW properties as well, but class definitions do not rely on this. SMW is used for example for [[Search]] and [[Pages]]. It would technically be possible to modify the Open CSP framework to work with a different data storage extension, if you would make your own alternatives for the pages that use SMW queries or WikiSearch.&lt;br /&gt;
&lt;br /&gt;
The following slots are used by Open CSP:&lt;br /&gt;
&lt;br /&gt;
=== csp-base-props ===&lt;br /&gt;
In this slot &#039;&#039;&#039;Template:Base properties&#039;&#039;&#039; is used to store data dat is common to all pages, such as the Class and Title:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Base properties&lt;br /&gt;
|Class=&lt;br /&gt;
|Title=&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== csp-class-props ===&lt;br /&gt;
In this slot &#039;&#039;&#039;Template:Csp class properties&#039;&#039;&#039; is used to store data that is specific to each class, based on the class definition:&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp class properties&lt;br /&gt;
|Parameter1=Value1&lt;br /&gt;
|Parameter2=Value2&lt;br /&gt;
|...&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== csp-data ===&lt;br /&gt;
This is a json slot which the framework only uses for class definition pages, but could be used for storing any json data on content pages as well (if you make your own templates/forms for this).&lt;br /&gt;
&lt;br /&gt;
=== Example slots of a content page ===&lt;br /&gt;
&lt;br /&gt;
=== Example slots of a class definition page ===&lt;br /&gt;
&lt;br /&gt;
== Components ==&lt;br /&gt;
Open CSP uses the Chameleon skin to be able to display pages with customizable components. The following components are used:&lt;br /&gt;
&lt;br /&gt;
* Header&lt;br /&gt;
* Sub-header&lt;br /&gt;
* Sidebar&lt;br /&gt;
* Footer&lt;br /&gt;
* Main&lt;br /&gt;
&lt;br /&gt;
Open CSP uses system messages inside these components. These system message contain wikitext with some logic through various parser functions and lua functions, in order to display a component that takes into account class definitions.&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_architecture&amp;diff=3031</id>
		<title>DevOps:Doc/Open CSP/2.0/Class definition architecture</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_architecture&amp;diff=3031"/>
		<updated>2023-10-05T11:14:51Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Data stored in slots ==&lt;br /&gt;
Note: SMW properties are stored as well, but class definitions do not rely on this. SMW is required for example for [[Search]] and [[Pages]]. It would technically be possible to modify the Open CSP framework to work with a different data storage extension, if you would make your own alternatives for these pages (or perhaps if you do not need them).&lt;br /&gt;
&lt;br /&gt;
=== Slots of a content page ===&lt;br /&gt;
&lt;br /&gt;
=== Slots of a class definition page ===&lt;br /&gt;
&lt;br /&gt;
== Components ==&lt;br /&gt;
Open CSP uses the Chameleon skin to be able to display pages with customizable components. The following components are used:&lt;br /&gt;
&lt;br /&gt;
* Header&lt;br /&gt;
* Sub-header&lt;br /&gt;
* Sidebar&lt;br /&gt;
* Footer&lt;br /&gt;
* Main&lt;br /&gt;
&lt;br /&gt;
Open CSP uses system messages inside these components. These system message contain wikitext with some logic through various parser functions and lua functions, in order to display a component that takes into account class definitions.&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_architecture&amp;diff=3030</id>
		<title>DevOps:Doc/Open CSP/2.0/Class definition architecture</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_architecture&amp;diff=3030"/>
		<updated>2023-10-05T11:05:16Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: User:Ebc16062-dd09-4928-8cf3-821f492b0c44&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_architecture&amp;diff=3029</id>
		<title>DevOps:Doc/Open CSP/2.0/Class definition architecture</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_architecture&amp;diff=3029"/>
		<updated>2023-10-05T11:04:29Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: User:Ebc16062-dd09-4928-8cf3-821f492b0c44&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_customization_options&amp;diff=3028</id>
		<title>DevOps:Doc/Open CSP/2.0/Class definition customization options</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_customization_options&amp;diff=3028"/>
		<updated>2023-10-05T11:03:30Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: User:Ebc16062-dd09-4928-8cf3-821f492b0c44&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In &#039;&#039;&#039;Open CSP 2.0&#039;&#039;&#039; the default sidebar was added, this allows you to have sidebars without having to create custom sidebar templates for each class definition. There are some customization options built into the default sidebar as well. It is recommended to use these customization options when possible and to only create fully custom sidebar templates when absolutely necessary, as the fully custom sidebar templates require a lot more maintenance work when for example some parserfunctions get deprecated or changed. This document describes the various customization options.&lt;br /&gt;
&lt;br /&gt;
== Parameters and formfield/display templates ==&lt;br /&gt;
* Edit parameters on a class definition page, to configure what will show up on your sidebar. &lt;br /&gt;
* Note that the parameter configuration is also used for setting properties, but you can use &amp;quot;(none)&amp;quot; as property name value if you don&#039;t want to set a property.&lt;br /&gt;
* Only the &amp;quot;parameter name&amp;quot; field is required. When you only fill this, you will get default text fields in the sidebars.&lt;br /&gt;
* Choose a displayTemplate to configure how a parameter is displayed in the view tab of the default sidebar.&lt;br /&gt;
* Choose a formfieldTemplate to configure what type of form field is used in the edit tab of the default sidebar.&lt;br /&gt;
* DisplayTemplate and formfieldTemplate can both be set to &amp;quot;(none)&amp;quot; to not have a parameter show up in respectively the view and edit tabs of the default sidebar.&lt;br /&gt;
&lt;br /&gt;
== Custom formfield/display templates ==&lt;br /&gt;
* It is possible to add custom template names in the displayTemplate and formfieldTemplate fields.&lt;br /&gt;
* All fields that are filled for a parameter will be passed to the templates so they can be accessed through template parameters there. For example you can use &amp;lt;nowiki&amp;gt;{{{allowedValues|}}}&amp;lt;/nowiki&amp;gt; in a formfieldTemplate. It might be useful to look at the csp-data slot of the class definition to see all of the parameters.&lt;br /&gt;
* The values of parameters on a content page are also passed to the display/formfield templates as the &amp;quot;value&amp;quot; parameter.&lt;br /&gt;
* In a display/formfield template you cannot access values of other parameters directly, but you can do this by using &amp;lt;nowiki&amp;gt;{{#invoke:CspFunctions|getParentArgs|$pageData}}&amp;lt;/nowiki&amp;gt;, which will return the $pageData parameter that is used in &#039;&#039;&#039;Template:Csp default sidebar&#039;&#039;&#039; (and contains an [[mediawikiwiki:Extension:ArrayFunctions|ArrayFunctions]] export with slotdata of the page).&lt;br /&gt;
* It is possible to add fields to the json data in the csp-data slot that cannot be filled through the parameters form. For example Open CSP 2.0 does not yet include the option to specify a placeholder for your formfields, but you can add placeholder to the json data and then use &amp;lt;nowiki&amp;gt;{{{placeholder|}}}&amp;lt;/nowiki&amp;gt; in a custom formfieldTemplate.&lt;br /&gt;
&lt;br /&gt;
== Custom sidebar template where you are adding to the default sidebar ==&lt;br /&gt;
In many cases you won&#039;t necessarily want to replace the default sidebar, but you may want to add another card above or below it with additional functionality. It is possible to use the default sidebar within a custom sidebar template. For example like the following code snippet:&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp default sidebar&lt;br /&gt;
|$pageData={{{$pageData|}}}&lt;br /&gt;
|$classData={{{$classData|}}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Csp sidebar tabs&lt;br /&gt;
|id=another-card&lt;br /&gt;
|canEdit=yes&lt;br /&gt;
|closeButton=&lt;br /&gt;
|title=Another card&lt;br /&gt;
|subTitle=Below the default sidebar&lt;br /&gt;
|view=&amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;viewtab content&amp;lt;/div&amp;gt;&lt;br /&gt;
|edit=&amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;edittab content&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fully custom sidebar template ==&lt;br /&gt;
In a fully custom sidebar template you can do anything you want. You will still get the $pageData and $classData parameters passed to this template so you can use those. The following is an example of custom sidebar code that will produce a sidebar similar to the default one, perhaps this will give you some ideas for what&#039;s possible:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;tab-content&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;input type=&amp;quot;radio&amp;quot; id=&amp;quot;sidebar-view&amp;quot; name=&amp;quot;toggle-sidebar&amp;quot; checked=&amp;quot;checked&amp;quot; class=&amp;quot;d-none sidebar-view&amp;quot; /&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;div class=&amp;quot;card sidebar-view-tab&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;{{#ifeq:{{#ifingroup:user |{{#if:{{#urlget:veaction}}{{#urlget:action}}||yes}} }}|yes |&amp;lt;span style=&amp;quot;float:right&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;sidebar-edit&amp;quot; class=&amp;quot;btn btn-secondary&amp;quot;&amp;gt;Edit&amp;lt;/label&amp;gt;&amp;lt;/span&amp;gt;}}&lt;br /&gt;
&amp;lt;b class=&amp;quot;d-block&amp;quot;&amp;gt;{{#af_get:{{{$pageData}}}|csp-base-props|Base properties|1|Class|_text}}&amp;lt;/b&amp;gt;&lt;br /&gt;
{{#af_get:{{{$pageData}}}|csp-base-props|Base properties|1|Title|_text}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card-header --&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp sidebar item&lt;br /&gt;
|Label=Title&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-base-props|Base properties|1|Title |_text}}&lt;br /&gt;
}}{{Csp sidebar item&lt;br /&gt;
|Label=TextInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TextInput |_text}}&lt;br /&gt;
}}{{Csp sidebar item&lt;br /&gt;
|Label=TokenInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TokenInput |_text}}&lt;br /&gt;
}}{{Csp sidebar item&lt;br /&gt;
|Label=AskTokenInput&lt;br /&gt;
|Value={{#af_join:{{#af_map:{{#af_split:{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|AskTokenInput |_text}}|,}}|@@|[[{{{@@}}}|{{#show:{{{@@}}}|?Title}}]]}}|&amp;lt;br&amp;gt;}}&lt;br /&gt;
}}{{Test date display&lt;br /&gt;
|Name=DateInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|DateInput |_text}}&lt;br /&gt;
}}&lt;br /&gt;
{{Csp sidebar item&lt;br /&gt;
|Label=DateInputTwo&lt;br /&gt;
|Value={{#if:{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|DateInputTwo |_text}} |{{#time: j M Y H:i |{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|DateInputTwo |_text}} }} }}&lt;br /&gt;
}}{{Csp sidebar item&lt;br /&gt;
|Label=TextInputTwo&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TextInputTwo |_text}}&lt;br /&gt;
}}{{Csp sidebar item&lt;br /&gt;
|Label=CheckboxInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|CheckboxInput |_text}}&lt;br /&gt;
}}{{Csp sidebar item&lt;br /&gt;
|Label=TextAreaInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TextAreaInput |_text}}&lt;br /&gt;
}}{{Csp sidebar item&lt;br /&gt;
|Label=NumberInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|NumberInput |_text}}&lt;br /&gt;
}}{{Csp sidebar item&lt;br /&gt;
|Label=SelectInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|SelectInput |_text}}&lt;br /&gt;
}}{{Csp sidebar item&lt;br /&gt;
|Label=TokenMultipleInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TokenMultipleInput |_text}}&lt;br /&gt;
}}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card-body --&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card &lt;br /&gt;
&lt;br /&gt;
--&amp;gt;{{#ifeq:{{#ifingroup:user |{{#if:{{#urlget:veaction}}{{#urlget:action}}||yes}} }}|yes |&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;input type=&amp;quot;radio&amp;quot; id=&amp;quot;sidebar-edit&amp;quot; name=&amp;quot;toggle-sidebar&amp;quot; class=&amp;quot;d-none sidebar-edit&amp;quot; /&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;div class=&amp;quot;card sidebar-edit-tab&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;float:right&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;sidebar-view&amp;quot; class=&amp;quot;btn btn-secondary&amp;quot; &amp;gt;Close&amp;lt;/label&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;b class=&amp;quot;d-block&amp;quot;&amp;gt;{{#af_get:{{{$pageData}}}|csp-base-props|Base properties|1|Class|_text}}&amp;lt;/b&amp;gt;&lt;br /&gt;
{{#af_get:{{{$pageData}}}|csp-base-props|Base properties|1|Title|_text}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card-header --&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
// _edits: no edit when formfieldType is set to &amp;quot;(none)&amp;quot;&lt;br /&gt;
--&amp;gt;&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Base properties&amp;quot; formfield=&amp;quot;Title&amp;quot; mwslot=&amp;quot;csp-base-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;TextInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;TokenInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;AskTokenInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;DateInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;DateInputTwo&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;TextInputTwo&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;CheckboxInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;TextAreaInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;NumberInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;SelectInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;TokenMultipleInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;TestNoDisplay&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;!-- end of _edits&lt;br /&gt;
&lt;br /&gt;
// form fields&lt;br /&gt;
--&amp;gt;{{Csp sidebar item&lt;br /&gt;
|Label=Title&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Title&amp;quot; class=&amp;quot;form-control&amp;quot; required=&amp;quot;required&amp;quot; value=&amp;quot;{{#af_get:{{{$pageData}}}|csp-base-props|Base properties|1|Title|_text}}&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Csp sidebar item&lt;br /&gt;
|Label=TextInput&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;TextInput&amp;quot; class=&amp;quot;form-control&amp;quot; required=&amp;quot;required&amp;quot; value=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TextInput|_text}}&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Csp sidebar item&lt;br /&gt;
|Label=TokenInput&lt;br /&gt;
|Value=&amp;lt;_token id=&amp;quot;token-{{lc:{{anchorencode:TokenInput}} }}&amp;quot; name=&amp;quot;TokenInput[]&amp;quot; class=&amp;quot;form-control&amp;quot; allowclear selected=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TokenInput|_text}}&amp;quot; options=&amp;quot;Ay,Bee,Cee&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Csp sidebar item&lt;br /&gt;
|Label=AskTokenInput&lt;br /&gt;
|Value=&amp;lt;_token id=&amp;quot;token-{{lc:{{anchorencode:AskTokenInput}} }}&amp;quot; name=&amp;quot;AskTokenInput[]&amp;quot; class=&amp;quot;form-control&amp;quot; required=&amp;quot;required&amp;quot; multiple=&amp;quot;multiple&amp;quot;  input-length-trigger=&amp;quot;1&amp;quot; query=&amp;quot;[[Class::+]][[Title::!!!]](limit=999)(returntext=Title)&amp;quot; &amp;gt;&lt;br /&gt;
{{#af_join:{{#af_map:{{#af_split:{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|AskTokenInput|_text}} }} |$value|&amp;lt;option value=&amp;quot;{{{$value}}}&amp;quot; selected=&amp;quot;selected&amp;quot;&amp;gt;{{#show:{{{$value}}}|?Title}}&amp;lt;/option&amp;gt;}}|\n}}&lt;br /&gt;
&amp;lt;/_token&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Test date formfield&lt;br /&gt;
|Name=DateInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|DateInput|_text}} &lt;br /&gt;
}}{{Csp sidebar item&lt;br /&gt;
|Label=DateInputTwo&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;datetime-local&amp;quot; name=&amp;quot;DateInputTwo&amp;quot; class=&amp;quot;form-control&amp;quot; value=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|DateInputTwo|_text}}&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;div class=&#039;alert alert-danger&#039;&amp;gt;No template defined in parameter definitions&amp;lt;/div&amp;gt;{{Csp sidebar item&lt;br /&gt;
|Label=&amp;lt;label for=&amp;quot;checkbox-{{lc:{{anchorencode:CheckboxInput}} }}&amp;quot; &amp;gt;CheckboxInput&amp;lt;/label&amp;gt;&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;CheckboxInput&amp;quot; value=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;checkbox-{{lc:{{anchorencode:CheckboxInput}} }}&amp;quot; name=&amp;quot;CheckboxInput&amp;quot; value=&amp;quot;Yes&amp;quot; checked=&amp;quot;{{#ifeq:{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|CheckboxInput|_text}} |Yes|checked}}&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Csp sidebar item&lt;br /&gt;
|Label=TextAreaInput&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;textarea&amp;quot; name=&amp;quot;TextAreaInput&amp;quot; class=&amp;quot;form-control&amp;quot; &amp;gt;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TextAreaInput|_text}}&amp;lt;/input&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Csp sidebar item&lt;br /&gt;
|Label=NumberInput&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;number&amp;quot; name=&amp;quot;NumberInput&amp;quot; class=&amp;quot;form-control&amp;quot; value=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|NumberInput|_text}}&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Csp sidebar item&lt;br /&gt;
|Label=SelectInput&lt;br /&gt;
|Value=&amp;lt;select name=&amp;quot;SelectInput&amp;quot; class=&amp;quot;form-control&amp;quot; allowclear selected=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|SelectInput|_text}}&amp;quot; options=&amp;quot;Alpha,Bravo,Charlie&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Csp sidebar item&lt;br /&gt;
|Label=TokenMultipleInput&lt;br /&gt;
|Value=&amp;lt;_token id=&amp;quot;token-{{lc:{{anchorencode:TokenMultipleInput}} }}&amp;quot; name=&amp;quot;TokenMultipleInput[]&amp;quot; class=&amp;quot;form-control&amp;quot; multiple=&amp;quot;multiple&amp;quot; selected=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TokenMultipleInput|_text}}&amp;quot; options=&amp;quot;Alpha,Bravo,Charlie&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Csp sidebar item&lt;br /&gt;
|Label=TestNoDisplay&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;TestNoDisplay&amp;quot; class=&amp;quot;form-control&amp;quot; value=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TestNoDisplay|_text}}&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;div class=&amp;quot;text-right&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;label for=&amp;quot;sidebar-view&amp;quot; class=&amp;quot;btn btn-secondary&amp;quot;&amp;gt;Close&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Save&amp;quot; class=&amp;quot;btn btn-primary&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card-body --&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card --&amp;gt;&lt;br /&gt;
|}}&amp;lt;!-- end of #ifeq @allow sidebar edit == yes --&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_architecture&amp;diff=3027</id>
		<title>DevOps:Doc/Open CSP/2.0/Class definition architecture</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_architecture&amp;diff=3027"/>
		<updated>2023-10-05T11:03:05Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: User:Ebc16062-dd09-4928-8cf3-821f492b0c44&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_architecture&amp;diff=3026</id>
		<title>DevOps:Doc/Open CSP/2.0/Class definition architecture</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_architecture&amp;diff=3026"/>
		<updated>2023-10-05T11:00:47Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: User:Ebc16062-dd09-4928-8cf3-821f492b0c44&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definitions&amp;diff=3025</id>
		<title>DevOps:Doc/Open CSP/2.0/Class definitions</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definitions&amp;diff=3025"/>
		<updated>2023-10-05T10:17:21Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Open CSP you can add structured data to content pages by using class definitions. A class definition is a configuration for a specific type of page. For example you might have a &amp;quot;Person&amp;quot; class definition. On the class definition page you can configure that a person has parameters such as a first name, last name and date of birth. When a user creates a person page, they will have the option to fill these fields (or you could also configure them to be mandatory). The data is by default displayed in a sidebar on the right side of a page, but this layout can also be configured through the class definition. Managing class definitions is typically done by administrators, while users can create content pages with the defined classes. Data is stored in slots, so that users can edit the main content of a page in the same way as you would edit any wiki page.&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definitions&amp;diff=3024</id>
		<title>DevOps:Doc/Open CSP/2.0/Class definitions</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definitions&amp;diff=3024"/>
		<updated>2023-10-05T09:18:46Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Open CSP you can add structured data to content pages by using class definitions. A class definition is a configuration for a specific type of page. For example you might have a &amp;quot;Person&amp;quot; class definition. On the class definition page you can configure that a person has parameters such as a first name, last name and date of birth. When a user creates a person page, they will have the option to fill these fields. You can also configure fields to be mandatory. The data is by default displayed in a sidebar on the right side of a page, but this layout can also be configured through the class definition.&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_customization_options&amp;diff=3023</id>
		<title>DevOps:Doc/Open CSP/2.0/Class definition customization options</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_customization_options&amp;diff=3023"/>
		<updated>2023-10-05T09:06:32Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: /* Fully custom sidebar template */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In &#039;&#039;&#039;Open CSP 2.0&#039;&#039;&#039; the default sidebar was added, this allows you to have sidebars without having to create custom sidebar templates for each class definition. There are some customization options built into the default sidebar as well. It is recommended to use these customization options when possible and to only create fully custom sidebar templates when absolutely necessary, as the fully custom sidebar templates require a lot more maintenance work when for example some parserfunctions get deprecated or changed. This document describes the various customization options.&lt;br /&gt;
&lt;br /&gt;
== Parameters and formfield/display templates ==&lt;br /&gt;
* Edit parameters on a class definition page, to configure what will show up on your sidebar. &lt;br /&gt;
* Note that the parameter configuration is also used for setting properties, but you can use &amp;quot;(none)&amp;quot; as property name value if you don&#039;t want to set a property.&lt;br /&gt;
* Only the &amp;quot;parameter name&amp;quot; field is required. When you only fill this, you will get default text fields in the sidebars.&lt;br /&gt;
* Choose a displayTemplate to configure how a parameter is displayed in the view tab of the default sidebar.&lt;br /&gt;
* Choose a formfieldTemplate to configure what type of form field is used in the edit tab of the default sidebar.&lt;br /&gt;
* DisplayTemplate and formfieldTemplate can both be set to &amp;quot;(none)&amp;quot; to not have a parameter show up in respectively the view and edit tabs of the default sidebar.&lt;br /&gt;
&lt;br /&gt;
== Custom formfield/display templates ==&lt;br /&gt;
* It is possible to add custom template names in the displayTemplate and formfieldTemplate fields.&lt;br /&gt;
* All fields that are filled for a parameter will be passed to the templates so they can be accessed through template parameters there. For example you can use &amp;lt;nowiki&amp;gt;{{{allowedValues|}}}&amp;lt;/nowiki&amp;gt; in a formfieldTemplate. It might be useful to look at the csp-data slot of the class definition to see all of the parameters.&lt;br /&gt;
* The values of parameters on a content page are also passed to the display/formfield templates as the &amp;quot;value&amp;quot; parameter.&lt;br /&gt;
* In a display/formfield template you cannot access values of other parameters directly, but you can do this by using &amp;lt;nowiki&amp;gt;{{#invoke:CspFunctions|getParentArgs|$pageData}}&amp;lt;/nowiki&amp;gt;, which will return the $pageData parameter that is used in &#039;&#039;&#039;Template:Csp default sidebar&#039;&#039;&#039; (and contains an [[mediawikiwiki:Extension:ArrayFunctions|ArrayFunctions]] export with slotdata of the page).&lt;br /&gt;
* It is possible to add fields to the json data in the csp-data slot that cannot be filled through the parameters form. For example Open CSP 2.0 does not yet include the option to specify a placeholder for your formfields, but you can add placeholder to the json data and then use &amp;lt;nowiki&amp;gt;{{{placeholder|}}}&amp;lt;/nowiki&amp;gt; in a custom formfieldTemplate.&lt;br /&gt;
&lt;br /&gt;
== Custom sidebar template where you are adding to the default sidebar ==&lt;br /&gt;
In many cases you won&#039;t necessarily want to replace the default sidebar, but you may want to add another card above or below it with additional functionality. It is possible to use the default sidebar within a custom sidebar template. For example like the following code snippet:&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp default sidebar&lt;br /&gt;
|$pageData={{{$pageData|}}}&lt;br /&gt;
|$classData={{{$classData|}}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Csp sidebar tabs&lt;br /&gt;
|id=another-card&lt;br /&gt;
|canEdit=yes&lt;br /&gt;
|closeButton=&lt;br /&gt;
|title=Another card&lt;br /&gt;
|subTitle=Below the default sidebar&lt;br /&gt;
|view=&amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;viewtab content&amp;lt;/div&amp;gt;&lt;br /&gt;
|edit=&amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;edittab content&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fully custom sidebar template ==&lt;br /&gt;
In a fully custom sidebar template you can do anything you want. You will still get the $pageData and $classData parameters passed to this template so you can use those. The following is an example of custom sidebar code that will produce a sidebar similar to the default one, perhaps this will give you some ideas for what&#039;s possible:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;tab-content&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;input type=&amp;quot;radio&amp;quot; id=&amp;quot;sidebar-view&amp;quot; name=&amp;quot;toggle-sidebar&amp;quot; checked=&amp;quot;checked&amp;quot; class=&amp;quot;d-none sidebar-view&amp;quot; /&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;div class=&amp;quot;card sidebar-view-tab&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;{{#ifeq:{{#ifingroup:user |{{#if:{{#urlget:veaction}}{{#urlget:action}}||yes}} }}|yes |&amp;lt;span style=&amp;quot;float:right&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;sidebar-edit&amp;quot; class=&amp;quot;btn btn-secondary&amp;quot;&amp;gt;Edit&amp;lt;/label&amp;gt;&amp;lt;/span&amp;gt;}}&lt;br /&gt;
&amp;lt;b class=&amp;quot;d-block&amp;quot;&amp;gt;{{#af_get:{{{$pageData}}}|csp-base-props|Base properties|1|Class|_text}}&amp;lt;/b&amp;gt;&lt;br /&gt;
{{#af_get:{{{$pageData}}}|csp-base-props|Base properties|1|Title|_text}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card-header --&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp sidebar item&lt;br /&gt;
|Label=Title&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-base-props|Base properties|1|Title |_text}}&lt;br /&gt;
}}{{Csp sidebar item&lt;br /&gt;
|Label=TextInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TextInput |_text}}&lt;br /&gt;
}}{{Csp sidebar item&lt;br /&gt;
|Label=TokenInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TokenInput |_text}}&lt;br /&gt;
}}{{Csp sidebar item&lt;br /&gt;
|Label=AskTokenInput&lt;br /&gt;
|Value={{#af_join:{{#af_map:{{#af_split:{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|AskTokenInput |_text}}|,}}|@@|[[{{{@@}}}|{{#show:{{{@@}}}|?Title}}]]}}|&amp;lt;br&amp;gt;}}&lt;br /&gt;
}}{{Test date display&lt;br /&gt;
|Name=DateInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|DateInput |_text}}&lt;br /&gt;
}}&lt;br /&gt;
{{Csp sidebar item&lt;br /&gt;
|Label=DateInputTwo&lt;br /&gt;
|Value={{#if:{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|DateInputTwo |_text}} |{{#time: j M Y H:i |{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|DateInputTwo |_text}} }} }}&lt;br /&gt;
}}{{Csp sidebar item&lt;br /&gt;
|Label=TextInputTwo&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TextInputTwo |_text}}&lt;br /&gt;
}}{{Csp sidebar item&lt;br /&gt;
|Label=CheckboxInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|CheckboxInput |_text}}&lt;br /&gt;
}}{{Csp sidebar item&lt;br /&gt;
|Label=TextAreaInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TextAreaInput |_text}}&lt;br /&gt;
}}{{Csp sidebar item&lt;br /&gt;
|Label=NumberInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|NumberInput |_text}}&lt;br /&gt;
}}{{Csp sidebar item&lt;br /&gt;
|Label=SelectInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|SelectInput |_text}}&lt;br /&gt;
}}{{Csp sidebar item&lt;br /&gt;
|Label=TokenMultipleInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TokenMultipleInput |_text}}&lt;br /&gt;
}}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card-body --&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card &lt;br /&gt;
&lt;br /&gt;
--&amp;gt;{{#ifeq:{{#ifingroup:user |{{#if:{{#urlget:veaction}}{{#urlget:action}}||yes}} }}|yes |&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;input type=&amp;quot;radio&amp;quot; id=&amp;quot;sidebar-edit&amp;quot; name=&amp;quot;toggle-sidebar&amp;quot; class=&amp;quot;d-none sidebar-edit&amp;quot; /&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;div class=&amp;quot;card sidebar-edit-tab&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;float:right&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;sidebar-view&amp;quot; class=&amp;quot;btn btn-secondary&amp;quot; &amp;gt;Close&amp;lt;/label&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;b class=&amp;quot;d-block&amp;quot;&amp;gt;{{#af_get:{{{$pageData}}}|csp-base-props|Base properties|1|Class|_text}}&amp;lt;/b&amp;gt;&lt;br /&gt;
{{#af_get:{{{$pageData}}}|csp-base-props|Base properties|1|Title|_text}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card-header --&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
// _edits: no edit when formfieldType is set to &amp;quot;(none)&amp;quot;&lt;br /&gt;
--&amp;gt;&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Base properties&amp;quot; formfield=&amp;quot;Title&amp;quot; mwslot=&amp;quot;csp-base-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;TextInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;TokenInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;AskTokenInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;DateInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;DateInputTwo&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;TextInputTwo&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;CheckboxInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;TextAreaInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;NumberInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;SelectInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;TokenMultipleInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;TestNoDisplay&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;!-- end of _edits&lt;br /&gt;
&lt;br /&gt;
// form fields&lt;br /&gt;
--&amp;gt;{{Csp sidebar item&lt;br /&gt;
|Label=Title&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Title&amp;quot; class=&amp;quot;form-control&amp;quot; required=&amp;quot;required&amp;quot; value=&amp;quot;{{#af_get:{{{$pageData}}}|csp-base-props|Base properties|1|Title|_text}}&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Csp sidebar item&lt;br /&gt;
|Label=TextInput&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;TextInput&amp;quot; class=&amp;quot;form-control&amp;quot; required=&amp;quot;required&amp;quot; value=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TextInput|_text}}&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Csp sidebar item&lt;br /&gt;
|Label=TokenInput&lt;br /&gt;
|Value=&amp;lt;_token id=&amp;quot;token-{{lc:{{anchorencode:TokenInput}} }}&amp;quot; name=&amp;quot;TokenInput[]&amp;quot; class=&amp;quot;form-control&amp;quot; allowclear selected=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TokenInput|_text}}&amp;quot; options=&amp;quot;Ay,Bee,Cee&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Csp sidebar item&lt;br /&gt;
|Label=AskTokenInput&lt;br /&gt;
|Value=&amp;lt;_token id=&amp;quot;token-{{lc:{{anchorencode:AskTokenInput}} }}&amp;quot; name=&amp;quot;AskTokenInput[]&amp;quot; class=&amp;quot;form-control&amp;quot; required=&amp;quot;required&amp;quot; multiple=&amp;quot;multiple&amp;quot;  input-length-trigger=&amp;quot;1&amp;quot; query=&amp;quot;[[Class::+]][[Title::!!!]](limit=999)(returntext=Title)&amp;quot; &amp;gt;&lt;br /&gt;
{{#af_join:{{#af_map:{{#af_split:{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|AskTokenInput|_text}} }} |$value|&amp;lt;option value=&amp;quot;{{{$value}}}&amp;quot; selected=&amp;quot;selected&amp;quot;&amp;gt;{{#show:{{{$value}}}|?Title}}&amp;lt;/option&amp;gt;}}|\n}}&lt;br /&gt;
&amp;lt;/_token&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Test date formfield&lt;br /&gt;
|Name=DateInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|DateInput|_text}} &lt;br /&gt;
}}{{Csp sidebar item&lt;br /&gt;
|Label=DateInputTwo&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;datetime-local&amp;quot; name=&amp;quot;DateInputTwo&amp;quot; class=&amp;quot;form-control&amp;quot; value=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|DateInputTwo|_text}}&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;div class=&#039;alert alert-danger&#039;&amp;gt;No template defined in parameter definitions&amp;lt;/div&amp;gt;{{Csp sidebar item&lt;br /&gt;
|Label=&amp;lt;label for=&amp;quot;checkbox-{{lc:{{anchorencode:CheckboxInput}} }}&amp;quot; &amp;gt;CheckboxInput&amp;lt;/label&amp;gt;&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;CheckboxInput&amp;quot; value=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;checkbox-{{lc:{{anchorencode:CheckboxInput}} }}&amp;quot; name=&amp;quot;CheckboxInput&amp;quot; value=&amp;quot;Yes&amp;quot; checked=&amp;quot;{{#ifeq:{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|CheckboxInput|_text}} |Yes|checked}}&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Csp sidebar item&lt;br /&gt;
|Label=TextAreaInput&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;textarea&amp;quot; name=&amp;quot;TextAreaInput&amp;quot; class=&amp;quot;form-control&amp;quot; &amp;gt;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TextAreaInput|_text}}&amp;lt;/input&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Csp sidebar item&lt;br /&gt;
|Label=NumberInput&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;number&amp;quot; name=&amp;quot;NumberInput&amp;quot; class=&amp;quot;form-control&amp;quot; value=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|NumberInput|_text}}&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Csp sidebar item&lt;br /&gt;
|Label=SelectInput&lt;br /&gt;
|Value=&amp;lt;select name=&amp;quot;SelectInput&amp;quot; class=&amp;quot;form-control&amp;quot; allowclear selected=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|SelectInput|_text}}&amp;quot; options=&amp;quot;Alpha,Bravo,Charlie&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Csp sidebar item&lt;br /&gt;
|Label=TokenMultipleInput&lt;br /&gt;
|Value=&amp;lt;_token id=&amp;quot;token-{{lc:{{anchorencode:TokenMultipleInput}} }}&amp;quot; name=&amp;quot;TokenMultipleInput[]&amp;quot; class=&amp;quot;form-control&amp;quot; multiple=&amp;quot;multiple&amp;quot; selected=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TokenMultipleInput|_text}}&amp;quot; options=&amp;quot;Alpha,Bravo,Charlie&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Csp sidebar item&lt;br /&gt;
|Label=TestNoDisplay&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;TestNoDisplay&amp;quot; class=&amp;quot;form-control&amp;quot; value=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TestNoDisplay|_text}}&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;div class=&amp;quot;text-right&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;label for=&amp;quot;sidebar-view&amp;quot; class=&amp;quot;btn btn-secondary&amp;quot;&amp;gt;Close&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Save&amp;quot; class=&amp;quot;btn btn-primary&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card-body --&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card --&amp;gt;&lt;br /&gt;
|}}&amp;lt;!-- end of #ifeq @allow sidebar edit == yes --&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_customization_options&amp;diff=3022</id>
		<title>DevOps:Doc/Open CSP/2.0/Class definition customization options</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_customization_options&amp;diff=3022"/>
		<updated>2023-10-05T08:57:34Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In &#039;&#039;&#039;Open CSP 2.0&#039;&#039;&#039; the default sidebar was added, this allows you to have sidebars without having to create custom sidebar templates for each class definition. There are some customization options built into the default sidebar as well. It is recommended to use these customization options when possible and to only create fully custom sidebar templates when absolutely necessary, as the fully custom sidebar templates require a lot more maintenance work when for example some parserfunctions get deprecated or changed. This document describes the various customization options.&lt;br /&gt;
&lt;br /&gt;
== Parameters and formfield/display templates ==&lt;br /&gt;
* Edit parameters on a class definition page, to configure what will show up on your sidebar. &lt;br /&gt;
* Note that the parameter configuration is also used for setting properties, but you can use &amp;quot;(none)&amp;quot; as property name value if you don&#039;t want to set a property.&lt;br /&gt;
* Only the &amp;quot;parameter name&amp;quot; field is required. When you only fill this, you will get default text fields in the sidebars.&lt;br /&gt;
* Choose a displayTemplate to configure how a parameter is displayed in the view tab of the default sidebar.&lt;br /&gt;
* Choose a formfieldTemplate to configure what type of form field is used in the edit tab of the default sidebar.&lt;br /&gt;
* DisplayTemplate and formfieldTemplate can both be set to &amp;quot;(none)&amp;quot; to not have a parameter show up in respectively the view and edit tabs of the default sidebar.&lt;br /&gt;
&lt;br /&gt;
== Custom formfield/display templates ==&lt;br /&gt;
* It is possible to add custom template names in the displayTemplate and formfieldTemplate fields.&lt;br /&gt;
* All fields that are filled for a parameter will be passed to the templates so they can be accessed through template parameters there. For example you can use &amp;lt;nowiki&amp;gt;{{{allowedValues|}}}&amp;lt;/nowiki&amp;gt; in a formfieldTemplate. It might be useful to look at the csp-data slot of the class definition to see all of the parameters.&lt;br /&gt;
* The values of parameters on a content page are also passed to the display/formfield templates as the &amp;quot;value&amp;quot; parameter.&lt;br /&gt;
* In a display/formfield template you cannot access values of other parameters directly, but you can do this by using &amp;lt;nowiki&amp;gt;{{#invoke:CspFunctions|getParentArgs|$pageData}}&amp;lt;/nowiki&amp;gt;, which will return the $pageData parameter that is used in &#039;&#039;&#039;Template:Csp default sidebar&#039;&#039;&#039; (and contains an [[mediawikiwiki:Extension:ArrayFunctions|ArrayFunctions]] export with slotdata of the page).&lt;br /&gt;
* It is possible to add fields to the json data in the csp-data slot that cannot be filled through the parameters form. For example Open CSP 2.0 does not yet include the option to specify a placeholder for your formfields, but you can add placeholder to the json data and then use &amp;lt;nowiki&amp;gt;{{{placeholder|}}}&amp;lt;/nowiki&amp;gt; in a custom formfieldTemplate.&lt;br /&gt;
&lt;br /&gt;
== Custom sidebar template where you are adding to the default sidebar ==&lt;br /&gt;
In many cases you won&#039;t necessarily want to replace the default sidebar, but you may want to add another card above or below it with additional functionality. It is possible to use the default sidebar within a custom sidebar template. For example like the following code snippet:&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp default sidebar&lt;br /&gt;
|$pageData={{{$pageData|}}}&lt;br /&gt;
|$classData={{{$classData|}}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Csp sidebar tabs&lt;br /&gt;
|id=another-card&lt;br /&gt;
|canEdit=yes&lt;br /&gt;
|closeButton=&lt;br /&gt;
|title=Another card&lt;br /&gt;
|subTitle=Below the default sidebar&lt;br /&gt;
|view=&amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;viewtab content&amp;lt;/div&amp;gt;&lt;br /&gt;
|edit=&amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;edittab content&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fully custom sidebar template ==&lt;br /&gt;
In a fully custom sidebar template you can do anything you want. You will still get the $pageData and $classData parameters passed to this template so you can use those. The following is an example of custom sidebar code that will produce a sidebar similar to the default one, perhaps this will give you some ideas for what&#039;s possible:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;tab-content&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;input type=&amp;quot;radio&amp;quot; id=&amp;quot;sidebar-view&amp;quot; name=&amp;quot;toggle-sidebar&amp;quot; checked=&amp;quot;checked&amp;quot; class=&amp;quot;d-none sidebar-view&amp;quot; /&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;div class=&amp;quot;card sidebar-view-tab&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;{{#ifeq:{{#ifingroup:user |{{#if:{{#urlget:veaction}}{{#urlget:action}}||yes}} }}|yes |&amp;lt;span style=&amp;quot;float:right&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;sidebar-edit&amp;quot; class=&amp;quot;btn btn-secondary&amp;quot;&amp;gt;Edit&amp;lt;/label&amp;gt;&amp;lt;/span&amp;gt;}}&lt;br /&gt;
&amp;lt;b class=&amp;quot;d-block&amp;quot;&amp;gt;{{#af_get:{{{$pageData}}}|csp-base-props|Base properties|1|Class|_text}}&amp;lt;/b&amp;gt;&lt;br /&gt;
{{#af_get:{{{$pageData}}}|csp-base-props|Base properties|1|Title|_text}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card-header --&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
{{Sidebar item&lt;br /&gt;
|Label=Title&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-base-props|Base properties|1|Title |_text}}&lt;br /&gt;
}}{{Sidebar item&lt;br /&gt;
|Label=TextInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TextInput |_text}}&lt;br /&gt;
}}{{Sidebar item&lt;br /&gt;
|Label=TokenInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TokenInput |_text}}&lt;br /&gt;
}}{{Sidebar item&lt;br /&gt;
|Label=AskTokenInput&lt;br /&gt;
|Value={{#af_join:{{#af_map:{{#af_split:{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|AskTokenInput |_text}}|,}}|@@|[[{{{@@}}}|{{#show:{{{@@}}}|?Title}}]]}}|&amp;lt;br&amp;gt;}}&lt;br /&gt;
}}{{Test date display&lt;br /&gt;
|Name=DateInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|DateInput |_text}}&lt;br /&gt;
}}&lt;br /&gt;
{{Sidebar item&lt;br /&gt;
|Label=DateInputTwo&lt;br /&gt;
|Value={{#if:{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|DateInputTwo |_text}} |{{#time: j M Y H:i |{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|DateInputTwo |_text}} }} }}&lt;br /&gt;
}}{{Sidebar item&lt;br /&gt;
|Label=TextInputTwo&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TextInputTwo |_text}}&lt;br /&gt;
}}{{Sidebar item&lt;br /&gt;
|Label=CheckboxInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|CheckboxInput |_text}}&lt;br /&gt;
}}{{Sidebar item&lt;br /&gt;
|Label=TextAreaInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TextAreaInput |_text}}&lt;br /&gt;
}}{{Sidebar item&lt;br /&gt;
|Label=NumberInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|NumberInput |_text}}&lt;br /&gt;
}}{{Sidebar item&lt;br /&gt;
|Label=SelectInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|SelectInput |_text}}&lt;br /&gt;
}}{{Sidebar item&lt;br /&gt;
|Label=TokenMultipleInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TokenMultipleInput |_text}}&lt;br /&gt;
}}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card-body --&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card &lt;br /&gt;
&lt;br /&gt;
--&amp;gt;{{#ifeq:{{#ifingroup:user |{{#if:{{#urlget:veaction}}{{#urlget:action}}||yes}} }}|yes |&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;input type=&amp;quot;radio&amp;quot; id=&amp;quot;sidebar-edit&amp;quot; name=&amp;quot;toggle-sidebar&amp;quot; class=&amp;quot;d-none sidebar-edit&amp;quot; /&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;div class=&amp;quot;card sidebar-edit-tab&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;float:right&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;sidebar-view&amp;quot; class=&amp;quot;btn btn-secondary&amp;quot; &amp;gt;Close&amp;lt;/label&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;b class=&amp;quot;d-block&amp;quot;&amp;gt;{{#af_get:{{{$pageData}}}|csp-base-props|Base properties|1|Class|_text}}&amp;lt;/b&amp;gt;&lt;br /&gt;
{{#af_get:{{{$pageData}}}|csp-base-props|Base properties|1|Title|_text}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card-header --&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
// _edits: no edit when formfieldType is set to &amp;quot;(none)&amp;quot;&lt;br /&gt;
--&amp;gt;&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Base properties&amp;quot; formfield=&amp;quot;Title&amp;quot; mwslot=&amp;quot;csp-base-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;TextInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;TokenInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;AskTokenInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;DateInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;DateInputTwo&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;TextInputTwo&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;CheckboxInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;TextAreaInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;NumberInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;SelectInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;TokenMultipleInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;TestNoDisplay&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;!-- end of _edits&lt;br /&gt;
&lt;br /&gt;
// form fields&lt;br /&gt;
--&amp;gt;{{Sidebar item&lt;br /&gt;
|Label=Title&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Title&amp;quot; class=&amp;quot;form-control&amp;quot; required=&amp;quot;required&amp;quot; value=&amp;quot;{{#af_get:{{{$pageData}}}|csp-base-props|Base properties|1|Title|_text}}&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Sidebar item&lt;br /&gt;
|Label=TextInput&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;TextInput&amp;quot; class=&amp;quot;form-control&amp;quot; required=&amp;quot;required&amp;quot; value=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TextInput|_text}}&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Sidebar item&lt;br /&gt;
|Label=TokenInput&lt;br /&gt;
|Value=&amp;lt;_token id=&amp;quot;token-{{lc:{{anchorencode:TokenInput}} }}&amp;quot; name=&amp;quot;TokenInput[]&amp;quot; class=&amp;quot;form-control&amp;quot; allowclear selected=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TokenInput|_text}}&amp;quot; options=&amp;quot;Ay,Bee,Cee&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Sidebar item&lt;br /&gt;
|Label=AskTokenInput&lt;br /&gt;
|Value=&amp;lt;_token id=&amp;quot;token-{{lc:{{anchorencode:AskTokenInput}} }}&amp;quot; name=&amp;quot;AskTokenInput[]&amp;quot; class=&amp;quot;form-control&amp;quot; required=&amp;quot;required&amp;quot; multiple=&amp;quot;multiple&amp;quot;  input-length-trigger=&amp;quot;1&amp;quot; query=&amp;quot;[[Class::+]][[Title::!!!]](limit=999)(returntext=Title)&amp;quot; &amp;gt;&lt;br /&gt;
{{#af_join:{{#af_map:{{#af_split:{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|AskTokenInput|_text}} }} |$value|&amp;lt;option value=&amp;quot;{{{$value}}}&amp;quot; selected=&amp;quot;selected&amp;quot;&amp;gt;{{#show:{{{$value}}}|?Title}}&amp;lt;/option&amp;gt;}}|\n}}&lt;br /&gt;
&amp;lt;/_token&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Test date formfield&lt;br /&gt;
|Name=DateInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|DateInput|_text}} &lt;br /&gt;
}}{{Sidebar item&lt;br /&gt;
|Label=DateInputTwo&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;datetime-local&amp;quot; name=&amp;quot;DateInputTwo&amp;quot; class=&amp;quot;form-control&amp;quot; value=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|DateInputTwo|_text}}&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;div class=&#039;alert alert-danger&#039;&amp;gt;No template defined in parameter definitions&amp;lt;/div&amp;gt;{{Sidebar item&lt;br /&gt;
|Label=&amp;lt;label for=&amp;quot;checkbox-{{lc:{{anchorencode:CheckboxInput}} }}&amp;quot; &amp;gt;CheckboxInput&amp;lt;/label&amp;gt;&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;CheckboxInput&amp;quot; value=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;checkbox-{{lc:{{anchorencode:CheckboxInput}} }}&amp;quot; name=&amp;quot;CheckboxInput&amp;quot; value=&amp;quot;Yes&amp;quot; checked=&amp;quot;{{#ifeq:{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|CheckboxInput|_text}} |Yes|checked}}&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Sidebar item&lt;br /&gt;
|Label=TextAreaInput&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;textarea&amp;quot; name=&amp;quot;TextAreaInput&amp;quot; class=&amp;quot;form-control&amp;quot; &amp;gt;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TextAreaInput|_text}}&amp;lt;/input&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Sidebar item&lt;br /&gt;
|Label=NumberInput&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;number&amp;quot; name=&amp;quot;NumberInput&amp;quot; class=&amp;quot;form-control&amp;quot; value=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|NumberInput|_text}}&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Sidebar item&lt;br /&gt;
|Label=SelectInput&lt;br /&gt;
|Value=&amp;lt;select name=&amp;quot;SelectInput&amp;quot; class=&amp;quot;form-control&amp;quot; allowclear selected=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|SelectInput|_text}}&amp;quot; options=&amp;quot;Alpha,Bravo,Charlie&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Sidebar item&lt;br /&gt;
|Label=TokenMultipleInput&lt;br /&gt;
|Value=&amp;lt;_token id=&amp;quot;token-{{lc:{{anchorencode:TokenMultipleInput}} }}&amp;quot; name=&amp;quot;TokenMultipleInput[]&amp;quot; class=&amp;quot;form-control&amp;quot; multiple=&amp;quot;multiple&amp;quot; selected=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TokenMultipleInput|_text}}&amp;quot; options=&amp;quot;Alpha,Bravo,Charlie&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Sidebar item&lt;br /&gt;
|Label=TestNoDisplay&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;TestNoDisplay&amp;quot; class=&amp;quot;form-control&amp;quot; value=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TestNoDisplay|_text}}&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;div class=&amp;quot;text-right&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;label for=&amp;quot;sidebar-view&amp;quot; class=&amp;quot;btn btn-secondary&amp;quot;&amp;gt;Close&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Save&amp;quot; class=&amp;quot;btn btn-primary&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card-body --&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card --&amp;gt;&lt;br /&gt;
|}}&amp;lt;!-- end of #ifeq @allow sidebar edit == yes --&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_customization_options&amp;diff=3021</id>
		<title>DevOps:Doc/Open CSP/2.0/Class definition customization options</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=DevOps:Doc/Open_CSP/2.0/Class_definition_customization_options&amp;diff=3021"/>
		<updated>2023-10-05T08:24:19Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In &#039;&#039;&#039;Open CSP 2.0&#039;&#039;&#039; the default sidebar was added, this allows you to have sidebars without having to create custom sidebar templates for each class definition. There are some customization options built into the default sidebar as well. It is recommended to use these customization options when possible and to only create fully custom sidebar templates when absolutely necessary, as the fully custom sidebar templates require a lot more maintenance work when for example some parserfunctions get deprecated. This document describes the various customization options.&lt;br /&gt;
&lt;br /&gt;
== Parameters and formfield/display templates ==&lt;br /&gt;
* Edit parameters on a class definition page, to configure what will show up on your sidebar. &lt;br /&gt;
* Note that the parameter configuration is also used for setting properties, but you can use &amp;quot;(none)&amp;quot; as property name value if you don&#039;t want to set a property.&lt;br /&gt;
* Only the &amp;quot;parameter name&amp;quot; field is required. When you only fill this, you will get default text fields in the sidebars.&lt;br /&gt;
* Choose a displayTemplate to configure how a parameter is diaplayed in the view tab of the default sidebar.&lt;br /&gt;
* Choose a formfieldTemplate to coinfigure what type of form field is used in the edit tab of the default sidebar.&lt;br /&gt;
* DisplayTemplate and formfieldTemplate can both be set to &amp;quot;(none)&amp;quot; to not have a parameter show up in respectively the view and edit tabs of the default sidebar.&lt;br /&gt;
&lt;br /&gt;
== Custom formfield/display templates ==&lt;br /&gt;
* It is possible to add custom template names in the displayTemplate and formfieldTemplate fields.&lt;br /&gt;
* All fields that are filled for a parameter will be passed to the templates so they can be accessed through template parameters there. For example you can use &amp;lt;nowiki&amp;gt;{{{allowedValues|}}}&amp;lt;/nowiki&amp;gt; in a formfieldTemplate. It might be useful to look at the csp-data slot of the class definition to see all of the parameters.&lt;br /&gt;
* The values of parameters on a content page are also passed to the display/formfield templates as the &amp;quot;value&amp;quot; parameter.&lt;br /&gt;
* In a display/formfield templates you cannot access values of other parameters directly, but you can do this by using &amp;lt;nowiki&amp;gt;{{#invoke:CspFunctions|getParentArgs|$pageData}}&amp;lt;/nowiki&amp;gt;, which will return the $pageData parameter that is used in &#039;&#039;&#039;Template:Csp default sidebar&#039;&#039;&#039; (and contains an ArrayFunctions export with slotdata of the page).&lt;br /&gt;
* It is possible to add fields to the json data in the csp-data slot that cannot be filled through the parameters form. For example CSP 1.8.0 does not yet include the option to specify a placeholder for your formfields, but you can add placeholder to the json data and then use &amp;lt;nowiki&amp;gt;{{{placeholder|}}}&amp;lt;/nowiki&amp;gt; in a custom formfieldTemplate.&lt;br /&gt;
&lt;br /&gt;
== Custom sidebar template where you are adding to the default sidebar ==&lt;br /&gt;
In many cases you won&#039;t necessarily want to replace the default sidebar, but you may want to add another card above or below it with additional functionality. It is possible to use the default sidebar within a custom sidebar template. For example like the following code snippet:&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot;&amp;gt;&lt;br /&gt;
{{Csp default sidebar&lt;br /&gt;
|$pageData={{{$pageData|}}}&lt;br /&gt;
|$classData={{{$classData|}}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Csp sidebar tabs&lt;br /&gt;
|id=another-card&lt;br /&gt;
|canEdit=yes&lt;br /&gt;
|closeButton=&lt;br /&gt;
|title=Another card&lt;br /&gt;
|subTitle=Below the default sidebar&lt;br /&gt;
|view=&amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;viewtab content&amp;lt;/div&amp;gt;&lt;br /&gt;
|edit=&amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;edittab content&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fully custom sidebar template ==&lt;br /&gt;
In a fully custom sidebar template you can do anything you want. You will still get the $pageData and $classData parameters passed to this template so you can use those. The following is an example of custom sidebar code that will produce a sidebar similar to the default one, perhaps this will give you some ideas for what&#039;s possible:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;tab-content&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;input type=&amp;quot;radio&amp;quot; id=&amp;quot;sidebar-view&amp;quot; name=&amp;quot;toggle-sidebar&amp;quot; checked=&amp;quot;checked&amp;quot; class=&amp;quot;d-none sidebar-view&amp;quot; /&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;div class=&amp;quot;card sidebar-view-tab&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;{{#ifeq:{{#ifingroup:user |{{#if:{{#urlget:veaction}}{{#urlget:action}}||yes}} }}|yes |&amp;lt;span style=&amp;quot;float:right&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;sidebar-edit&amp;quot; class=&amp;quot;btn btn-secondary&amp;quot;&amp;gt;Edit&amp;lt;/label&amp;gt;&amp;lt;/span&amp;gt;}}&lt;br /&gt;
&amp;lt;b class=&amp;quot;d-block&amp;quot;&amp;gt;{{#af_get:{{{$pageData}}}|csp-base-props|Base properties|1|Class|_text}}&amp;lt;/b&amp;gt;&lt;br /&gt;
{{#af_get:{{{$pageData}}}|csp-base-props|Base properties|1|Title|_text}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card-header --&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
{{Sidebar item&lt;br /&gt;
|Label=Title&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-base-props|Base properties|1|Title |_text}}&lt;br /&gt;
}}{{Sidebar item&lt;br /&gt;
|Label=TextInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TextInput |_text}}&lt;br /&gt;
}}{{Sidebar item&lt;br /&gt;
|Label=TokenInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TokenInput |_text}}&lt;br /&gt;
}}{{Sidebar item&lt;br /&gt;
|Label=AskTokenInput&lt;br /&gt;
|Value={{#af_join:{{#af_map:{{#af_split:{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|AskTokenInput |_text}}|,}}|@@|[[{{{@@}}}|{{#show:{{{@@}}}|?Title}}]]}}|&amp;lt;br&amp;gt;}}&lt;br /&gt;
}}{{Test date display&lt;br /&gt;
|Name=DateInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|DateInput |_text}}&lt;br /&gt;
}}&lt;br /&gt;
{{Sidebar item&lt;br /&gt;
|Label=DateInputTwo&lt;br /&gt;
|Value={{#if:{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|DateInputTwo |_text}} |{{#time: j M Y H:i |{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|DateInputTwo |_text}} }} }}&lt;br /&gt;
}}{{Sidebar item&lt;br /&gt;
|Label=TextInputTwo&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TextInputTwo |_text}}&lt;br /&gt;
}}{{Sidebar item&lt;br /&gt;
|Label=CheckboxInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|CheckboxInput |_text}}&lt;br /&gt;
}}{{Sidebar item&lt;br /&gt;
|Label=TextAreaInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TextAreaInput |_text}}&lt;br /&gt;
}}{{Sidebar item&lt;br /&gt;
|Label=NumberInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|NumberInput |_text}}&lt;br /&gt;
}}{{Sidebar item&lt;br /&gt;
|Label=SelectInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|SelectInput |_text}}&lt;br /&gt;
}}{{Sidebar item&lt;br /&gt;
|Label=TokenMultipleInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TokenMultipleInput |_text}}&lt;br /&gt;
}}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card-body --&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card &lt;br /&gt;
&lt;br /&gt;
--&amp;gt;{{#ifeq:{{#ifingroup:user |{{#if:{{#urlget:veaction}}{{#urlget:action}}||yes}} }}|yes |&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;input type=&amp;quot;radio&amp;quot; id=&amp;quot;sidebar-edit&amp;quot; name=&amp;quot;toggle-sidebar&amp;quot; class=&amp;quot;d-none sidebar-edit&amp;quot; /&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;div class=&amp;quot;card sidebar-edit-tab&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;float:right&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;sidebar-view&amp;quot; class=&amp;quot;btn btn-secondary&amp;quot; &amp;gt;Close&amp;lt;/label&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;b class=&amp;quot;d-block&amp;quot;&amp;gt;{{#af_get:{{{$pageData}}}|csp-base-props|Base properties|1|Class|_text}}&amp;lt;/b&amp;gt;&lt;br /&gt;
{{#af_get:{{{$pageData}}}|csp-base-props|Base properties|1|Title|_text}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card-header --&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
// _edits: no edit when formfieldType is set to &amp;quot;(none)&amp;quot;&lt;br /&gt;
--&amp;gt;&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Base properties&amp;quot; formfield=&amp;quot;Title&amp;quot; mwslot=&amp;quot;csp-base-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;TextInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;TokenInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;AskTokenInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;DateInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;DateInputTwo&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;TextInputTwo&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;CheckboxInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;TextAreaInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;NumberInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;SelectInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;TokenMultipleInput&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;_edit target=&amp;quot;{{PAGEID}}&amp;quot; template=&amp;quot;Csp class properties&amp;quot; formfield=&amp;quot;TestNoDisplay&amp;quot; mwslot=&amp;quot;csp-class-props&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;!-- end of _edits&lt;br /&gt;
&lt;br /&gt;
// form fields&lt;br /&gt;
--&amp;gt;{{Sidebar item&lt;br /&gt;
|Label=Title&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;Title&amp;quot; class=&amp;quot;form-control&amp;quot; required=&amp;quot;required&amp;quot; value=&amp;quot;{{#af_get:{{{$pageData}}}|csp-base-props|Base properties|1|Title|_text}}&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Sidebar item&lt;br /&gt;
|Label=TextInput&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;TextInput&amp;quot; class=&amp;quot;form-control&amp;quot; required=&amp;quot;required&amp;quot; value=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TextInput|_text}}&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Sidebar item&lt;br /&gt;
|Label=TokenInput&lt;br /&gt;
|Value=&amp;lt;_token id=&amp;quot;token-{{lc:{{anchorencode:TokenInput}} }}&amp;quot; name=&amp;quot;TokenInput[]&amp;quot; class=&amp;quot;form-control&amp;quot; allowclear selected=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TokenInput|_text}}&amp;quot; options=&amp;quot;Ay,Bee,Cee&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Sidebar item&lt;br /&gt;
|Label=AskTokenInput&lt;br /&gt;
|Value=&amp;lt;_token id=&amp;quot;token-{{lc:{{anchorencode:AskTokenInput}} }}&amp;quot; name=&amp;quot;AskTokenInput[]&amp;quot; class=&amp;quot;form-control&amp;quot; required=&amp;quot;required&amp;quot; multiple=&amp;quot;multiple&amp;quot;  input-length-trigger=&amp;quot;1&amp;quot; query=&amp;quot;[[Class::+]][[Title::!!!]](limit=999)(returntext=Title)&amp;quot; &amp;gt;&lt;br /&gt;
{{#af_join:{{#af_map:{{#af_split:{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|AskTokenInput|_text}} }} |$value|&amp;lt;option value=&amp;quot;{{{$value}}}&amp;quot; selected=&amp;quot;selected&amp;quot;&amp;gt;{{#show:{{{$value}}}|?Title}}&amp;lt;/option&amp;gt;}}|\n}}&lt;br /&gt;
&amp;lt;/_token&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Test date formfield&lt;br /&gt;
|Name=DateInput&lt;br /&gt;
|Value={{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|DateInput|_text}} &lt;br /&gt;
}}{{Sidebar item&lt;br /&gt;
|Label=DateInputTwo&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;datetime-local&amp;quot; name=&amp;quot;DateInputTwo&amp;quot; class=&amp;quot;form-control&amp;quot; value=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|DateInputTwo|_text}}&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;div class=&#039;alert alert-danger&#039;&amp;gt;No template defined in parameter definitions&amp;lt;/div&amp;gt;{{Sidebar item&lt;br /&gt;
|Label=&amp;lt;label for=&amp;quot;checkbox-{{lc:{{anchorencode:CheckboxInput}} }}&amp;quot; &amp;gt;CheckboxInput&amp;lt;/label&amp;gt;&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;CheckboxInput&amp;quot; value=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;checkbox-{{lc:{{anchorencode:CheckboxInput}} }}&amp;quot; name=&amp;quot;CheckboxInput&amp;quot; value=&amp;quot;Yes&amp;quot; checked=&amp;quot;{{#ifeq:{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|CheckboxInput|_text}} |Yes|checked}}&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Sidebar item&lt;br /&gt;
|Label=TextAreaInput&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;textarea&amp;quot; name=&amp;quot;TextAreaInput&amp;quot; class=&amp;quot;form-control&amp;quot; &amp;gt;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TextAreaInput|_text}}&amp;lt;/input&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Sidebar item&lt;br /&gt;
|Label=NumberInput&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;number&amp;quot; name=&amp;quot;NumberInput&amp;quot; class=&amp;quot;form-control&amp;quot; value=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|NumberInput|_text}}&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Sidebar item&lt;br /&gt;
|Label=SelectInput&lt;br /&gt;
|Value=&amp;lt;select name=&amp;quot;SelectInput&amp;quot; class=&amp;quot;form-control&amp;quot; allowclear selected=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|SelectInput|_text}}&amp;quot; options=&amp;quot;Alpha,Bravo,Charlie&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Sidebar item&lt;br /&gt;
|Label=TokenMultipleInput&lt;br /&gt;
|Value=&amp;lt;_token id=&amp;quot;token-{{lc:{{anchorencode:TokenMultipleInput}} }}&amp;quot; name=&amp;quot;TokenMultipleInput[]&amp;quot; class=&amp;quot;form-control&amp;quot; multiple=&amp;quot;multiple&amp;quot; selected=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TokenMultipleInput|_text}}&amp;quot; options=&amp;quot;Alpha,Bravo,Charlie&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Sidebar item&lt;br /&gt;
|Label=TestNoDisplay&lt;br /&gt;
|Value=&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;TestNoDisplay&amp;quot; class=&amp;quot;form-control&amp;quot; value=&amp;quot;{{#af_get:{{{$pageData}}}|csp-class-props|Csp class properties|1|TestNoDisplay|_text}}&amp;quot; /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;div class=&amp;quot;text-right&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;label for=&amp;quot;sidebar-view&amp;quot; class=&amp;quot;btn btn-secondary&amp;quot;&amp;gt;Close&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Save&amp;quot; class=&amp;quot;btn btn-primary&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card-body --&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- end of .card --&amp;gt;&lt;br /&gt;
|}}&amp;lt;!-- end of #ifeq @allow sidebar edit == yes --&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=Property:Meeting_type&amp;diff=2901</id>
		<title>Property:Meeting type</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=Property:Meeting_type&amp;diff=2901"/>
		<updated>2023-09-14T07:42:49Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: Created page with &amp;quot;Has type::Text&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Has type::Text]]&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=Property:Meeting_chair&amp;diff=2900</id>
		<title>Property:Meeting chair</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=Property:Meeting_chair&amp;diff=2900"/>
		<updated>2023-09-14T07:42:44Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: Created page with &amp;quot;Has type::Text&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Has type::Text]]&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=Property:Attendees&amp;diff=2899</id>
		<title>Property:Attendees</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=Property:Attendees&amp;diff=2899"/>
		<updated>2023-09-14T07:42:39Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: Created page with &amp;quot;Has type::Text&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Has type::Text]]&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
	<entry>
		<id>https://open-csp.org/index.php?title=Property:Absentees&amp;diff=2898</id>
		<title>Property:Absentees</title>
		<link rel="alternate" type="text/html" href="https://open-csp.org/index.php?title=Property:Absentees&amp;diff=2898"/>
		<updated>2023-09-14T07:42:33Z</updated>

		<summary type="html">&lt;p&gt;Ebc16062-dd09-4928-8cf3-821f492b0c44: Created page with &amp;quot;Has type::Text&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Has type::Text]]&lt;/div&gt;</summary>
		<author><name>Ebc16062-dd09-4928-8cf3-821f492b0c44</name></author>
	</entry>
</feed>