diff --git a/docs/_downloads/sample-atom.txt b/docs/_downloads/sample-atom.txt
index 28eb2c882..7539c8380 100755
--- a/docs/_downloads/sample-atom.txt
+++ b/docs/_downloads/sample-atom.txt
@@ -4,7 +4,7 @@
{exp:rss:feed channel="{master_channel_name}"}
-
+
@@ -39,4 +39,4 @@
-{/exp:rss:feed}
\ No newline at end of file
+{/exp:rss:feed}
diff --git a/docs/_images/cp-field-manager.png b/docs/_images/cp-field-manager.png
index eafc5c5f3..c75478945 100644
Binary files a/docs/_images/cp-field-manager.png and b/docs/_images/cp-field-manager.png differ
diff --git a/docs/_images/cp-template-generators.png b/docs/_images/cp-template-generators.png
new file mode 100644
index 000000000..cb3b33ee1
Binary files /dev/null and b/docs/_images/cp-template-generators.png differ
diff --git a/docs/_tips/form-validation.md b/docs/_tips/form-validation.md
new file mode 100644
index 000000000..b6936d17c
--- /dev/null
+++ b/docs/_tips/form-validation.md
@@ -0,0 +1 @@
+TIP: **Tip:** This form utilizes template [form validation and error handling](/templates/form-validation.md). Refer to the documentation for additional parameters and variables that are available to this tag.
\ No newline at end of file
diff --git a/docs/add-ons/email.md b/docs/add-ons/email.md
index 3afec336c..733afef84 100755
--- a/docs/add-ons/email.md
+++ b/docs/add-ons/email.md
@@ -52,6 +52,8 @@ The contact form is created similar to a standard web form, only you **do not**
{/exp:email:contact_form}
+{{embed:_tips/form-validation.md}}
+
## Parameters
[TOC=3]
@@ -64,6 +66,12 @@ The contact form is created similar to a standard web form, only you **do not**
This allows you to set the character set of the email being sent. Use this if your form's template is using a character set other than iso-8859-1.
+### `inline_errors=`
+
+ inline_errors="yes"
+
+This parameter is for use with [form validation and error handling](/templates/form-validation.md) and determines the type of error reporting: inline or error template.
+
### `name=`
name="myForm"
@@ -120,6 +128,12 @@ If used with the redirect="none" parameter, the link text can be specified by ad
If the `redirect` parameter was set to value of `return`, then the user will be redirected immediately after submission of the form.
+### `return_error=`
+
+ return_error="template_group/error"
+
+This parameter is for use with [form validation and error handling](/templates/form-validation.md) and determines the template to return to if validation errors are detected.
+
### `preview=`
preview="about/contact-preview"
@@ -330,7 +344,7 @@ In the above example, the Template "friend" contains the Tell-a-Friend form.
[TOC=3]
### `allow_attachments=`
-
+
allow_attachments="yes"
This allows you to add a file input field to your form, make sure to give your file input field the name of `attachment`. Adding this parameter automatically gives the form the `enctype='multipart/form-data'` attribute.
diff --git a/docs/add-ons/pro-search/examples.md b/docs/add-ons/pro-search/examples.md
index 330935542..e69362ea1 100644
--- a/docs/add-ons/pro-search/examples.md
+++ b/docs/add-ons/pro-search/examples.md
@@ -280,7 +280,7 @@ Below is a list of radio buttons, one for each letter of the alphabet. Selecting
Below is a list of checkboxes based on a custom channel field of the Checkboxes type. You can select multiple options from this list. Entries will be shown that have any of the selected options checked. Uses [Low Options](https://github.com/EEHarbor/low_options) to generate field options.
-Adding `contains_words="parameter_name"` to the Results tag will ensure that the selected items are not contained within other words, like appending `\W` to the values.
+Adding `contains_words="parameter_name"` to the Results tag will ensure that the selected items are not contained within other words, like appending `\W` to the values.
{exp:pro_search:form query="{segment_3}"}
{exp:low_options:service_options}
@@ -503,7 +503,7 @@ Below are two lists of tags. You can select multiple tags per list. Entries that
## Other & Native
-In addition to what all the [filters](/add-ons/pro-search/filters.md) bring to the party, you can also filter by native ExpressionEngine parameters, as well as some [little extras](/add-ons/pro-search/tags.md#results-tag).
+In addition to what all the [filters](/add-ons/pro-search/filters.md) bring to the party, you can also filter by native ExpressionEngine parameters, as well as some [little extras](/add-ons/pro-search/tags.md#exppro_searchresults).
### Orderby and sort in one go
diff --git a/docs/add-ons/pro-search/filters.md b/docs/add-ons/pro-search/filters.md
index a0dca61a9..9f806b694 100644
--- a/docs/add-ons/pro-search/filters.md
+++ b/docs/add-ons/pro-search/filters.md
@@ -95,7 +95,7 @@ The automatic `keywords:mode` uses operators in keywords for any/all/exact match
### Singulars & Plurals
-Pro Search supports singular and plural matching of keywords [inflections](http://en.wikipedia.org/wiki/Inflection). To enable this, both the `keywords:inflect` and the `keywords:lang` parameters must be set. Pro Search supports English inflections natively and you can add support for other languages by adding inflection rules to your [Config file](/general/system_configuration_overrides.md):
+Pro Search supports singular and plural matching of keywords [inflections](http://en.wikipedia.org/wiki/Inflection). To enable this, both the `keywords:inflect` and the `keywords:lang` parameters must be set. Pro Search supports English inflections natively and you can add support for other languages by adding inflection rules to your [Config file](/general/system-configuration-overrides.md):
```
$config['pro_search_inflection_rules'][lang] = array(
@@ -110,7 +110,7 @@ $config['pro_search_inflection_rules'][lang] = array(
### Stems
-Pro Search supports matching of keywords by their stem [stemming](http://en.wikipedia.org/wiki/Stemming). To enable this, both the `keywords:stem` and the `keywords:lang` parameters must be set. English stemming is supported natively, using a [Porter stemmer](http://tartarus.org/martin/PorterStemmer/) class, and you can add support for other languages by adding this to your [Config file](/general/system_configuration_overrides.md):
+Pro Search supports matching of keywords by their stem [stemming](http://en.wikipedia.org/wiki/Stemming). To enable this, both the `keywords:stem` and the `keywords:lang` parameters must be set. English stemming is supported natively, using a [Porter stemmer](http://tartarus.org/martin/PorterStemmer/) class, and you can add support for other languages by adding this to your [Config file](/general/system-configuration-overrides.md):
```
$config['pro_search_stemmers'][lang] = array(
@@ -154,7 +154,7 @@ You can use the Distance filter to limit results by a given maximum distance. Th
NOTE: **Note:** Use two separate fields instead of a single one for better performance.
### Variables
-The Distance filter also makes this variable available in the [Results tag](/add-ons/pro-search/tags#results-tag):
+The Distance filter also makes this variable available in the [Results tag](/add-ons/pro-search/tags.md#exppro_searchresults):
#### `{pro_search_distance}`
The calculated distance in the given unit for this entry.
@@ -163,7 +163,7 @@ NOTE: **Note:** Using the Distance filter will return the search results ordered
## Field Search
-You can use the native `search:field_name` parameter to target specific fields. Additionally, Pro Search can target the entry’s ***title***, ***url_title***, ***status***, target [Grid](/fieldtypes/grid.md) columns, use multiple values for [numeric matching](/channel/channel_entries.md#numeric-matching) (in combination with the `gt`, `gte`, `lt` and `lte` params), and use ***starts / ends with*** matching.
+You can use the native `search:field_name` parameter to target specific fields. Additionally, Pro Search can target the entry’s ***title***, ***url_title***, ***status***, target [Grid](/fieldtypes/grid.md) columns, use multiple values for [numeric matching](/channels/entries.md#numeric-matching) (in combination with the `gt`, `gte`, `lt` and `lte` params), and use ***starts / ends with*** matching.
### Parameters
diff --git a/docs/add-ons/pro-search/tags.md b/docs/add-ons/pro-search/tags.md
index d77a64782..9d111072b 100644
--- a/docs/add-ons/pro-search/tags.md
+++ b/docs/add-ons/pro-search/tags.md
@@ -10,18 +10,19 @@
[TOC]
-**These terms are used throughout the documentation:**
+**These terms are used throughout the documentation:**
```
-required: This parameter/field is required for this tag to function.
-form only: This can only be set as a field in the form and not as a parameter in the tag.
-param only: This parameter can only be set in the tag and not as a field in the form.
-fixed value: This field cannot be edited and is set with a fixed value.
-recurring only: This parameter/field only applies to recurring charges.
-one-time only: This parameter/field only applies to one-time charges.
-added in X.X.X: This parameter/field is only available from this version forward.
-logged in: This tag is only available if the user is logged in.
+required: This parameter/field is required for this tag to function.
+form only: This can only be set as a field in the form and not as a parameter in the tag.
+param only: This parameter can only be set in the tag and not as a field in the form.
+fixed value: This field cannot be edited and is set with a fixed value.
+recurring only: This parameter/field only applies to recurring charges.
+one-time only: This parameter/field only applies to one-time charges.
+added in X.X.X: This parameter/field is only available from this version forward.
+logged in: This tag is only available if the user is logged in.
```
+NOTE: **Note:** See the [template generator](templates/generators.md) for the keyword search in ExpressionEngine 7.5+. Pro Search must be installed and a Collection created.
## {exp:pro_search:form}
@@ -156,7 +157,7 @@ Short syntax for the URL tag. When used, it will automatically inherit the query
## {exp:pro_search:filters}
The Filters tag works identically to the Form tag, without generating a search form. Use it to show specific search filters anywhere on your page, or to create a list of URL tags in short syntax. The following example shows a list of one-click filters based on the current search that could be used to modify the results display with javascript:
-
+
{exp:pro_search:filters query="{segment_3}"}
{exp:channel:categories channel="entries" style="linear"}
{if count == 1}
{/if}
@@ -316,7 +317,7 @@ Alternative syntax for the native {if no_results}{/if} conditional.
#### `group_id=`
Limit shortcuts by given group ID
-
+
{exp:pro_search:shortcuts group_id="1"}
{if count == 1}
@@ -402,7 +403,7 @@ Group ID the shortcut needs to be saved to. **Required**.
{/exp:pro_search:save}
-
+
#### `form_attribute=`
Specifies any html attribute you want the form to have. For example: `form_id="search"` will add `id="search"` to the form tag, while `form_class="searchform"` will add `class="searchform"` to the tag.
@@ -437,7 +438,7 @@ The encoded search query to inherit. Not needed when [not encoding queries](http
#### `reset=`
-Set to "yes" to stop this tag from inheriting the current query.
+Set to "yes" to stop this tag from inheriting the current query.
{exp:pro_search:url reset="yes"}
@@ -464,7 +465,7 @@ Use this single tag to output a single given parameter value outside of the Form
{exp:pro_search:param get="item_size"}
You can also use it as a paired loop to output multi-valued parameters.
-
+
{exp:pro_search:param:loop get="category" as="cat_id" query="{segment_3}"}
{cat_id}
{/exp:pro_search:param:loop}
@@ -500,7 +501,7 @@ Use this tag to display a list of popular keywords. The Search Log must be enabl
#### `limit=`
Maximum number of keywords to display. Defaults to 10.
-
+
{exp:pro_search:popular limit="10"}
{if count == 1}
{/if}
{keywords}: {search_count}
@@ -624,7 +625,7 @@ Maximum number of suggestions to return. Defaults to 5.
The method used for getting the suggestions, either `levenshtein` or `soundex`. Defaults to Levenshtein.
{exp:pro_search:suggestions method="soundex"}
-
+
NOTE: **Note:** Using Soundex for generating suggestions is only effective for languages with a latin-based alphabet. The Levenshtein method works regardless of alphabet type.
#### `query=`
diff --git a/docs/add-ons/structure/overview.md b/docs/add-ons/structure/overview.md
index 333aebeb7..5e9335c89 100644
--- a/docs/add-ons/structure/overview.md
+++ b/docs/add-ons/structure/overview.md
@@ -13,4 +13,6 @@ Structure is a powerful add-on that lets you create pages, generate navigation,
It forgoes the default template_group/template setup and creates “static” and “listing” pages that are all editable through a tree sitemap view. With Structure enabled, traditional page style content and multiple entry pages can live within the same area.
+Structure provides a [Template Generator](templates/generators.md) that demonstrates how to integrate Structure template tags with your site.
+
NOTE:**Note:** Documentation for Structure is still being migrated. Until this is complete, please reference the [Structure documentation on EEHarbor's website](https://eeharbor.com/structure/documentation).
\ No newline at end of file
diff --git a/docs/channels/channel-form/overview.md b/docs/channels/channel-form/overview.md
index 4a866b93d..14ec1d38e 100755
--- a/docs/channels/channel-form/overview.md
+++ b/docs/channels/channel-form/overview.md
@@ -26,7 +26,8 @@ The Channel Form makes it possible to add and edit channel entries from outside
## Basic Usage
-TIP: Please visit the [Examples](channels/channel-form/examples.md) page to see a variety of implementations.
+TIP: You can view the [Examples](channels/channel-form/examples.md) page to see a variety of implementations.
+ The Channel Form [Template Generator](templates/generators.md) can also help create a functional template that demonstrates the parameters and variables documented below.
The first thing you will need is a `{exp:channel:form}` tag pair, along with a few [parameters](#parameters) to determine where to submit the entry:
diff --git a/docs/channels/entries.md b/docs/channels/entries.md
index 4a02a4585..fc5cdf8bc 100755
--- a/docs/channels/entries.md
+++ b/docs/channels/entries.md
@@ -33,6 +33,8 @@ The directives that tell the tag how to behave are **parameters**:
Within the opening and closing ExpressionEngine Tags are **variables**. `{title}` is replaced with the Title of each entry, and `{body}` is replaced with the content from the "Body" field of each entry.
+The Channel Entries module provides a [Template Generator](templates/generators.md) that creates functional templates while demonstrating the parameters and variables documented below.
+
## Parameters
[TOC=3 hide]
@@ -893,7 +895,7 @@ The "count" out of the current entries being displayed. If five entries are bein
Edit Entry
{/if}
-The URL of the entry form in the control panel where this entry can be edited. It is recommended you wrap this variable in an `{if logged_in}` conditional to hide your control panel's URL from regular site visitors. If you are running a membership-based site, hide it behind an appropriate `logged_in_primary_role_id` conditional or use [exp:member:has_role](/member/member-roles-tags.html#expmemberhas_role). For example, to hide this link from everyone but Super Admins:
+The URL of the entry form in the control panel where this entry can be edited. It is recommended you wrap this variable in an `{if logged_in}` conditional to hide your control panel's URL from regular site visitors. If you are running a membership-based site, hide it behind an appropriate `logged_in_primary_role_id` conditional or use [exp:member:has_role](/member/member-roles-tags.md#expmemberhas_role). For example, to hide this link from everyone but Super Admins:
{if logged_in_primary_role_id == 1}
Edit Entry
diff --git a/docs/channels/fields.md b/docs/channels/fields.md
new file mode 100644
index 000000000..8849d0417
--- /dev/null
+++ b/docs/channels/fields.md
@@ -0,0 +1,80 @@
+
+
+# Channel Field Tag
+
+[TOC]
+
+## Overview
+
+`{exp:channel:field}` tag allows displaying properties of [channel field](control-panel/field-manager/edit-field.md) irrespective of the context.
+
+ {exp:channel:field field_name="department"}
+
+
Choose {field_label}:
+ {field_options}
+
{value}: {label}
+ {/field_options}
+
+ {/exp:channel:field}
+
+## Parameters
+
+### `field_id=`
+
+ field_id="2"
+
+Specify field ID. It is required to have either field_id or field_name parameter. If both are specified, field_id will be used.
+
+### `field_name=`
+
+ field_name="body"
+
+Specify field name. It is required to have either field_id or field_name parameter.
+
+### `site_id=`
+
+ site_id="2"
+
+By default, the tag is looking for fields that are set up for current MSM site. If you need to display properties of field that belongs to other MSM site, you need to specify site_id parameter.
+
+
+## Variables
+
+[TOC=3]
+
+### `{field_id}`
+
+Field ID
+
+### `{field_name}`
+
+Field name
+
+### `{field_label}`
+
+Field label
+
+### `{field_instructions}`
+
+Field instructions for the CP
+
+### `{field_type}`
+
+Field type
+
+### `{field_options}`
+
+Tag pair that contains possible field options. It is used for fields like Radio Buttons, Checkboxes, Select Dropdown, etc.
+
+Inside the tag pair you can use `{value}` and `{label}` variables:
+
+ {field_options}
+ {value} / {label}
+ {/field_options}
\ No newline at end of file
diff --git a/docs/comment/form.md b/docs/comment/form.md
index 6b7c13751..73b8d11c8 100755
--- a/docs/comment/form.md
+++ b/docs/comment/form.md
@@ -35,7 +35,7 @@ The comment submission form is created very similar to a standard web form, only
-
+
{!-- required to prevent EE from outputting form if commenting is disabled or expired --}
{if comments_disabled}Comments on this entry are currently disabled.{/if}
{if comments_expired}Commenting on this entry has expired.{/if}
@@ -46,6 +46,8 @@ This form should be placed on a "single-entry" type page such as a comments page
TIP: **Tip:** Notice the variables in the "value" form fields? These allow us to show the user's information in the form automatically if they click the "remember personal info" option.
+{{embed:_tips/form-validation.md}}
+
## Comment Form Tag
### Parameters
@@ -54,28 +56,6 @@ TIP: **Tip:** Notice the variables in the "value" form fields? These allow us to
{{embed:_tips/form-attributes.md}}
-#### `entry_id=`
-
- entry_id="24"
-
-You can hard code the comment form tag to display a comment form for a specific channel entry by its entry ID.
-
-NOTE: **Note:** This parameter takes precedence over any entry specified dynamically in the URL, so when using this parameter you will want to make sure it is clear to the user which entry the displayed comment form belongs to.
-
-#### `preview=`
-
- preview="channel/preview"
-
-This is a **required** parameter if you are using comment previews indicating which template should be used for comment previews. Like other "path" variables in ExpressionEngine you will use the Template Group/Template name. More on previewing can be found in the [Comment Previewing](#comment-previewing) section.
-
-#### `url_title=`
-
- url_title="my_wedding"
-
-You can hard code the comment for tag to display a comment form for a specific channel entry by its URL title.
-
-NOTE: **Note:** This parameter takes precedence over any entry specified dynamically in the URL, so when using this parameter you will want to make sure it is clear to the user which entry the displayed comment form belongs to.
-
#### `channel=`
channel="news"
@@ -86,6 +66,14 @@ If you link to your comment form page using the entry's URL Title, then you are
Because you can have the same URL Title in different channels, using this parameter will ensure that the comment submitted will be associated with the correct entry. Without this parameter, it is possible that the comment could be associated with an entry in a different channel that happens to have the same URL Title.
+#### `entry_id=`
+
+ entry_id="24"
+
+You can hard code the comment form tag to display a comment form for a specific channel entry by its entry ID.
+
+NOTE: **Note:** This parameter takes precedence over any entry specified dynamically in the URL, so when using this parameter you will want to make sure it is clear to the user which entry the displayed comment form belongs to.
+
#### `form_class=`
form_class="news_comment_form"
@@ -98,6 +86,19 @@ With this parameter, you can specify the css class you want the form to have, en
With this parameter, you can specify the css id you want the form to have. The default value is 'comment_form'
+
+#### `inline_errors=`
+
+ inline_errors="yes"
+
+This parameter is for use with [form validation and error handling](/templates/form-validation.md) and determines the type of error reporting: inline or error template.
+
+#### `preview=`
+
+ preview="channel/preview"
+
+This is a **required** parameter if you are using comment previews indicating which template should be used for comment previews. Like other "path" variables in ExpressionEngine you will use the Template Group/Template name. More on previewing can be found in the [Comment Previewing](#comment-previewing) section.
+
#### `return=`
return="template_group/template/url_title"
@@ -109,6 +110,20 @@ This parameter allows you to define where the user will be returned after submit
If this parameter is not defined, they will be returned to the form page.
+#### `return_error=`
+
+ return_error="template_group/error"
+
+This parameter is for use with [form validation and error handling](/templates/form-validation.md) and determines the template to return to if validation errors are detected.
+
+#### `url_title=`
+
+ url_title="my_wedding"
+
+You can hard code the comment for tag to display a comment form for a specific channel entry by its URL title.
+
+NOTE: **Note:** This parameter takes precedence over any entry specified dynamically in the URL, so when using this parameter you will want to make sure it is clear to the user which entry the displayed comment form belongs to.
+
### Conditionals
[TOC=4]
@@ -227,11 +242,11 @@ A request for an edit will return a response array. In the case of an error, an
### Editing Permissions
-By using the [{if editable}](/comment/entries.html#if-editable) conditional in the Comment Entries tag, you can output a link, instructions or a form if the viewing member has permission to edit the comment, and by using the {if can_moderate_comment} you can display whatever is appropriate if the viewing member has permission to moderate (close) the comment.
+By using the [{if editable}](/comment/entries.md#if-editable) conditional in the Comment Entries tag, you can output a link, instructions or a form if the viewing member has permission to edit the comment, and by using the {if can_moderate_comment} you can display whatever is appropriate if the viewing member has permission to moderate (close) the comment.
For members without administrative access, in order to edit a comment they must be logged in, the author of the comment, and the editing time limit must not have expired. If a member has a role with permission to edit the comments of any entry, that member will have edit permissions regardless of the editing time limit.
-Comment moderators may close the comment. The edit time limit does not apply to moderators.
+Comment moderators may close the comment. The edit time limit does not apply to moderators.
Superadmins will always have {editable} and {can_moderate_comment} permissions on any comment.
diff --git a/docs/control-panel/channels.md b/docs/control-panel/channels.md
index 902c9443e..4b499d8bb 100755
--- a/docs/control-panel/channels.md
+++ b/docs/control-panel/channels.md
@@ -13,6 +13,11 @@
This section of the Control Panel is where channels are created, edited and deleted.
+The channel shortname on the main display supports quick copying the full template tag for the channel, including all fields assigned to the channel. The copied code is ready to use on your [templates](templates/overview.md). Displaying the short name can be toggled on or off in the [Role](control-panel/member-manager.md) settings.
+
+NOTE:
+Due to security restrictions in modern browsers quick copying code via the shortname is only supported when on HTTPS.
+
[TOC]

diff --git a/docs/control-panel/create.md b/docs/control-panel/create.md
index ff7c01ba9..4f0c4e2b5 100755
--- a/docs/control-panel/create.md
+++ b/docs/control-panel/create.md
@@ -39,7 +39,7 @@ NOTE: **Note:** If you let the system create your URL Title for you it will conv
### Entry Fields
-The names and types of entry custom fields displayed will be determined by what [Fields](/fieldtypes/overview.md) you have defined for this channel.
+The names and types of entry custom fields displayed will be determined by what [Fields](/fieldtypes/overview.md) you have defined for this channel.
If an entry field is set to be "hidden" by default, it will have to be expanded by clicking on the field name before content can be entered.
@@ -51,7 +51,10 @@ This can be done in two ways:
- assign custom field to a [Field Group](/control-panel/field-manager/field-manager-settings.md#createedit-field-group) which is associated to the Channel
- assign field directly to channel by editing [Channel preferences](control-panel/channels.md#fields-tab)
-When working with [templates](templates/overview.md) you will be referencing the field by its short name. For convenience the short name can be displayed next to the field's name in the publish form () and will be copied to the clipboard when clicked. Displaying the short name can be toggled on or off in the [Role](control-panel/member-manager.md) settings.
+When working with [templates](templates/overview.md) you will be referencing the field by its short name or tag pair. For convenience the short name can be displayed next to the field's name in the publish form () and the variable(s) required to display the content will be copied to the clipboard when clicked. Displaying the short name can be toggled on or off in the [Role](control-panel/member-manager.md) settings.
+
+NOTE:
+Due to security restrictions in modern browsers quick copying code via the shortname is only supported when on HTTPS.
Note that some fields can be displayed with just single tags while others would require a tag pair with extra variables. More information can be found in the documentation for the field's specific [field type](fieldtypes/overview.md).
@@ -189,6 +192,6 @@ A live preview of the entry is available if the `channel_prefs_preview_url` is s
If neither is set, the preview button will have an exclamation mark (!) and will link to channel preferences page where Preview URL can be set.
-The preview will open a split screen that allows a live preview of edits. The template used to display the preview is based on the Page fields if set and the channel preview URL otherwise.
+The preview will open a split screen that allows a live preview of edits. The template used to display the preview is based on the Page fields if set and the channel preview URL otherwise.
When the preview is triggered, it is being displayed side-by-side with edit screen. The size of preview container can be adjusted with mouse dragging its border. The preview is dynamically being updated as you change the fields.
diff --git a/docs/control-panel/field-manager/field-manager-settings.md b/docs/control-panel/field-manager/field-manager-settings.md
index ea247afba..2815fde8b 100644
--- a/docs/control-panel/field-manager/field-manager-settings.md
+++ b/docs/control-panel/field-manager/field-manager-settings.md
@@ -17,6 +17,8 @@ This section of the Control Panel is where custom fields are created, edited and

+The field shortname supports quick copying the full tag needed to display the field. The copied can is ready to use on your [templates](templates/overview.md). Displaying the short name can be toggled on or off in the [Role](control-panel/member-manager.md) settings. Due to security restrictions in modern browsers quick copying code via the shortname is only supported when on HTTPS.
+
Tip: How to Find Where a Field Is Used
diff --git a/docs/control-panel/member-manager.md b/docs/control-panel/member-manager.md
index 9858222ed..86eac6474 100755
--- a/docs/control-panel/member-manager.md
+++ b/docs/control-panel/member-manager.md
@@ -82,13 +82,13 @@ This tab contains the generic settings for the role. You can also assign the rol
- **Include members in: author/member lists.**
-- Roles included in the author list are available in the author select field on the entry publish/edit page for any channel the role has permission to publish in.
--- Roles included in the member lists are available to display in the [member list tag](member/memberlist.md).
+-- Roles included in the member lists are available to display in the [member list tag](member/memberlist.md).
- **Security Lock** -- If enabled, only Super Admin users can add or remove members to the role.
- **Role Groups** -- Assign the role to [role groups](control-panel/member-manager.md#role-groups).
-- **Show field names on Publish** -- Enables the display of the field tags on the entry publish/edit page. This option is only available to the Super Admin role.
+- **Show field names on Publish** -- Enables the display of field short names on the entry publish/edit page.
Tip: Hide and Show Field Short Names in the Publish Area
diff --git a/docs/control-panel/settings/menu-manager.md b/docs/control-panel/settings/menu-manager.md
index c27ea16c2..30c6070b5 100755
--- a/docs/control-panel/settings/menu-manager.md
+++ b/docs/control-panel/settings/menu-manager.md
@@ -19,7 +19,7 @@ You may create multiple menu sets and assign them to show for specific member ro
**Control Panel Location: `Settings > Menu Sets`**
-This section of the Control Panel allows you to define your menu sets and assign them to member roles.
+This section of the Control Panel allows you to define your menu sets and assign them to member roles. Existing menus can be duplicated by choosing "Clone to New Menu Set" from an existing menu's "Save" dropdown.
### Fields
diff --git a/docs/control-panel/template-manager.md b/docs/control-panel/template-manager.md
index 19474caf2..3cadca503 100755
--- a/docs/control-panel/template-manager.md
+++ b/docs/control-panel/template-manager.md
@@ -239,8 +239,14 @@ Tip: Custom Ordering Template Groups
This section of the Control Panel allows you to create or edit a template group.
+## Template Generators
+
+**Control Panel Location: `Developer > Templates > Template Generator`**
+
+This section of the Control Panel allows you to automatically create the basic tag framework for a variety of modules, including channels, navigation, member tags, etc. using [Template Generators](templates/generators.md).
+
## Export Templates
**Control Panel Location: `Developer > Templates > Export`**
- Clicking the Export All Templates Icon will download all templates, partials, and variables as a compressed *.zip archive.
+ Clicking the Export All Templates Icon will download all templates, partials, and variables as a compressed *.zip archive.
diff --git a/docs/control-panel/utilities/data-operations.md b/docs/control-panel/utilities/data-operations.md
index 16428d4e4..00fb88fac 100644
--- a/docs/control-panel/utilities/data-operations.md
+++ b/docs/control-panel/utilities/data-operations.md
@@ -59,7 +59,7 @@ Run this utility to convert all files stored in the database from sites previous
It is recommended that you make sure all installed add-ons are compatible with ExpressionEngine 7 and newer, and that you have made a backup of your database before running the utility.
-After the update operation is completed, visit `Content & Design Settings` to disable [Compatibility Mode](control-panel/file-manager/file-manager.html#compatibility-mode) for File Manager.
+After the update operation is completed, visit `Content & Design Settings` to disable [Compatibility Mode](control-panel/file-manager/file-manager.md#compatibility-mode) for File Manager.
## Manage Statistics
diff --git a/docs/development/addon-development-overview.md b/docs/development/addon-development-overview.md
index 88746112f..376b6e413 100644
--- a/docs/development/addon-development-overview.md
+++ b/docs/development/addon-development-overview.md
@@ -11,7 +11,7 @@
With custom add-ons you can add new fieldtypes, features, template tags, and much more to ExpressionEngine. Here we are going to look at different parts of an add-on, and how to define just what our add-on is going to do.
-TIP: In this section, we're explaining the parts of an add-on. No need to memorize everything though, the [CLI](cli/intro.html) will generate all the pieces we need based on what functions we want our add-on to have.
+TIP: In this section, we're explaining the parts of an add-on. No need to memorize everything though, the [CLI](cli/intro.md) will generate all the pieces we need based on what functions we want our add-on to have.
[TOC]
@@ -32,7 +32,7 @@ Here are some ideas of what you can accomplish with a custom add-on:
These are just a few ideas of what you can do with custom add-ons. The possibilities are almost endless.
## Getting Started
-Getting started making an add-on is incredibly easy with the CLI. To begin making an add-on, simply use the [`make:addon` command](/cli/built-in-commands/make-addon.md) from the [CLI](/cli/intro.html).
+Getting started making an add-on is incredibly easy with the CLI. To begin making an add-on, simply use the [`make:addon` command](/cli/built-in-commands/make-addon.md) from the [CLI](/cli/intro.md).
TIP: If you are working with an existing add-on, we recommend you start with [Modernizing add-ons](development/modernizing-existing-add-ons.md)
diff --git a/docs/development/legacy/libraries/email.md b/docs/development/legacy/libraries/email.md
index 5cac2e05c..4916ce120 100755
--- a/docs/development/legacy/libraries/email.md
+++ b/docs/development/legacy/libraries/email.md
@@ -30,8 +30,9 @@ The Email class will automatically create all email headers and will process the
ee()->load->library('email');
ee()->load->helper('text');
- ee()->email->wordwrap = true;
- ee()->email->mailtype = 'text';
+ ee()->email->set_wordwrap(TRUE);
+ ee()->email->set_mailtype('html');
+
ee()->email->from($from);
ee()->email->to($recipient);
ee()->email->subject($email_subject);
@@ -212,7 +213,7 @@ Returns a string containing any server messages, the email headers, and the emai
| \$clear_attachments | `Boolean` | If set to `TRUE` attachments will be cleared out, otherwise they're left alone. |
| Returns | `Object` | Email class object |
-Clears out all parameters set either by property or method:
+Clears out all the message-specific parameters set either by property or method (text, recipient, subject, etc.), but not including the overall parameters like the charset, wordwrap, mailtype, and the sending method (smtp, etc.):
ee()->email->clear();
@@ -223,8 +224,8 @@ If you are sending multiple emails in a method either for notifications or becau
ee()->load->library('email');
ee()->load->helper('text');
- ee()->email->wordwrap = true;
- ee()->email->mailtype = 'text';
+ ee()->email->set_wordwrap(TRUE);
+ ee()->email->set_mailtype('html');
$errors = array();
foreach($member_emails as $username => $from)
diff --git a/docs/development/legacy/libraries/output.md b/docs/development/legacy/libraries/output.md
index b34f7f88c..f2b5e5aac 100755
--- a/docs/development/legacy/libraries/output.md
+++ b/docs/development/legacy/libraries/output.md
@@ -195,3 +195,78 @@ $output = array(
'message' => 'not allowed',
);
ee()->output->send_ajax_response($output, true);
+
+### `show_message($data, $xhtml = true, $redirect_url = false, $template_name = 'generic')`
+
+| Parameter | Type | Description |
+| --------------- | -------- | ------------------------------------------------------------------------------------------ |
+| \$data | `Array` | Data to be sent to the view. Explained below |
+| \$xhtml | `Bool` | Parse the content as HTML |
+| \$redirect_url | `String` | URL to redirect to instead of showing the message |
+| \$template_name | `String` | Specialty template to use. Defaults to `generic` which is equivalent of `message_template` |
+| Returns | `Void` | void |
+
+Show user message using [system message template](control-panel/template-manager.md#system-message-templates) or [custom template](control-panel/template-manager.md#custom-system-messages). This is used on front-end, for instance, when we need to inform the user about successful form submission.
+
+When `$redirect_url` is provided, the user will be redirected to that URL instead of showing the message.
+
+The `$data` parameter is an associative array with the following keys:
+ - `title` - HTML titles of message page
+ - `heading` - heading text
+ - `content` - main content
+ - `redirect` - URL to automatically redirect to after showing message
+ - `rate` - time in seconds after which the redirect happens
+ - `link` - the link to include in the message. Should be in the format of `array($link_url, $link_text)`
+
+Example:
+
+ $data = array(
+ 'title' => 'Title',
+ 'heading' => 'Heading',
+ 'content' => 'Content',
+ 'redirect' => 'http://example.com',
+ 'rate' => 5,
+ 'link' => array('http://example.com', 'Link Text')
+ );
+ ee()->output->show_message($data);
+
+### `show_user_error($type = 'submission', $errors = '', $heading = '', $redirect_url = '')`
+
+| Parameter | Type | Description |
+| --------------- | -------- | ------------------------------------------------------------------------------------------ |
+| \$type | `String` | Type of error. Defaults to `submission`, can also be `general` or `off` |
+| \$errors | `Mixed` | Error message or array of messages to display. |
+| \$heading | `String` | Heading text. Legacy, not used, set automatically based on type. |
+| \$redirect_url | `String` | URL to redirect to instead of showing the message |
+| Returns | `Void` | void |
+
+Show user an error message using [system message template](control-panel/template-manager.md#system-message-templates) or [custom template](control-panel/template-manager.md#custom-system-messages). This is used on front-end, for instance, when a form is submitted without the required info.
+
+When `$redirect_url` is provided, the user will be redirected to that URL instead of showing the message. Useful when the form is set to [handle errors inline](templates/globals/single-variables.md#error-variables).
+
+ $return_error_link = ee()->functions->determine_error_return();
+ ee()->output->show_user_error('submission', $errors, '', $return_error_link);
+
+### `show_form_error($errors, $type = 'general')`
+
+| Parameter | Type | Description |
+| --------------- | -------- | ------------------------------------------------------------------------------------------ |
+| \$errors | `Mixed` | Array of error messages or instance of \ExpressionEngine\Service\Validation\Result |
+| \$type | `String` | Type of error. Defaults to `general`, can also be `submission` or `off` |
+| Returns | `Void` | void |
+
+Handle displaying errors for a form either passed as a Validation Result or an array of errors. If the form is using
+inline error handling the errors and old input will be flashed to the session otherwise they will be displayed with the
+appropriate template.
+
+### `show_form_error_aliases($errors = '', $aliases = [], $type = 'general')`
+
+| Parameter | Type | Description |
+| --------------- | -------- | --------------------------------------------------------------------------------------------- |
+| \$errors | `Mixed` | Array of error messages or instance of \ExpressionEngine\Service\Validation\Result |
+| \$aliases | `Array` | Array of aliases to use, i.e. ['input_id_1' => ['field' => 'input_name', 'label' => 'Input']] |
+| \$type | `String` | Type of error. Defaults to `general`, can also be `submission` or `off` |
+| Returns | `Void` | void |
+
+This function builds upon `show_form_error()` with the additional ability to provide aliases for input names so
+that variable names used in inline error handling can be more meaningful i.e. `field_name` instead of `field_id_1`.
\ No newline at end of file
diff --git a/docs/development/services/cookie-registry.md b/docs/development/services/cookie-registry.md
index fd0c095c0..becea2312 100644
--- a/docs/development/services/cookie-registry.md
+++ b/docs/development/services/cookie-registry.md
@@ -15,7 +15,7 @@ For the cookies set in ExpressionEngine, site owners can set the cookie lifetime
`CookieRegistry` is the underlying service that makes saving and using those settings possible.
-NOTE: Normally, the add-ons that have their cookies properly [registered](development/addon-setup-php-file.html#cookies) do not need to call this service directly.
+NOTE: Normally, the add-ons that have their cookies properly [registered](development/addon-setup-php-file.md#cookies) do not need to call this service directly.
## Cookie Registry Constants
diff --git a/docs/development/services/template-generator.md b/docs/development/services/template-generator.md
new file mode 100644
index 000000000..5eab6d4cb
--- /dev/null
+++ b/docs/development/services/template-generator.md
@@ -0,0 +1,230 @@
+
+
+# Template Generator Service
+
+The Template Generators feature automates the creation of structured templates for rapid development. The `TemplateGenerator` Service is responsible for registering and creating template generators.
+
+[TOC]
+
+## Template Generator Anatomy
+
+Template Generators were created to help users accelerate the process of building templates. If you have an Add-on that provides template tags or fieldtypes, it may also be beneficial to include a template generator.
+
+In its simplest form, a template generator is a PHP class file that extends
+`ExpressionEngine\Service\TemplateGenerator\AbstractTemplateGenerator`. This file must be placed in a `TemplateGenerators` folder within your add-ons. The name you give your generator should also be used as the class name and the file name.
+
+Template generators need to be registered in your `addon.setup.php` file, under a
+`templateGenerators` array that should contain a list of your generator names e.g.
+
+```php
+ 'ExpressionEngine',
+ 'author_url' => 'https://expressionengine.com/',
+ 'name' => 'Channel',
+ 'description' => '',
+ 'version' => '2.1.0',
+ 'namespace' => 'ExpressionEngine\Addons\Channel',
+ 'settings_exist' => true,
+ 'templateGenerators' => array(
+ 'Entries',
+ )
+);
+```
+
+When properly defined, your template generator will be available to select as long as your add-on is currently installed. We do not display generators for uninstalled add-ons to avoid confusion.
+
+The generator can be accessed through a dropdown when using the Control Panel or by its key when using the CLI. The generator key consists of the add-on name and generator name separated with a colon. For example, the Entries Generator provided by our Channel add-on has a key of `channel:entries`.
+
+Each generator is required to have a `$name` protected property which is the name of the generator that will be displayed to the user.
+
+The generator needs to provide a list of templates that it can generate. This is done by declaring a `$templates` protected property that is an associative array of template names and their description (saved as template notes). E.g.
+
+```php
+protected $templates = [
+ 'index' => 'Listing for all entries',
+ 'entry' => 'Entry detail page',
+];
+```
+
+If you would like to specify a template type other than HTML you can do so with a more verbose syntax where an array is passed as the value with a `description` and `type` for each template:
+
+```php
+protected $templates = [
+ 'feed' => ['name' => 'RSS feed for all entries', 'type' => 'feed'],
+ 'sitemap' => ['name' => 'XML sitemap for all entries', 'type' => 'xml'],
+];
+```
+
+Every template name in your list of templates must correspond to a [Template Stub](#template-stubs) file.
+
+A generator can define a list of options that it supports. For instance, we require a channel name in the Channel Entries generator, so we declare the following:
+
+```php
+ protected $options = [
+ 'channel' => [
+ 'title' => 'channel',
+ 'desc' => 'channel_desc',
+ 'type' => 'checkbox',
+ 'required' => true,
+ 'choices' => 'getChannels',
+ ],
+ ];
+```
+The syntax of this array is similar to the one used by Shared Form View. The only difference is that for options of type 'checkbox', 'select' or 'radio' you can populate the `choices` array dynamically by providing a method name or callback that returns an array.
+
+Each of the options can be validated using the [Validation service](https://docs.expressionengine.com/latest/development/services/validation.html). Specify the validation rules and define any necessary validation functions in the same class.
+
+```php
+ protected $_validation_rules = [
+ 'channel' => 'validateChannelExists'
+ ];
+```
+
+A template generator must have a `getVariables()` method that returns an associative array of variables. These will be passed to the View service when rendering the stubs. Here is a simple example of how this method might look:
+
+```php
+ public function getVariables(): array
+ {
+ return [
+ 'channel' = implode('|', $this->input->get('channel'))
+ ];
+ }
+```
+
+## Template Stubs
+
+Templates are generated from a "stub" file, which is a PHP file parsed through the [View service](https://docs.expressionengine.com/latest/development/services/view.html).
+
+Add-ons must store their stubs inside a `stubs` directory within the add-on's own folder. Within the `stubs`, the files are stored in a folder that should match the generator name. The stub file name needs to match the template name that will be created.
+
+So for an `index` template to be created by the Channel Entries generator, the stub file must exist in `Addons/channel/stubs/entries/index.php`.
+
+The Template Generator Service will search several directories in priority order until it finds a match for the specified stub.
+
+- `system/user/stubs/{addon_name}/{generator_name}` - User override for specific generator stub
+- `system/ee/ExpressionEngine/Addons/{addon_name}/stubs/{generator_name}` - (Core/First-Party) Addon's path for specific generator stub
+- `system/user/addons/{addon_name}/stubs/{generator_name}` - (Third-Party) Addon's path for specific generator stub
+- `system/user/stubs` - User override for generic stub
+- `system/ee/templates/stubs` - System fallback for generic stub
+
+This example illustrates the concrete paths that the Template Generator will search when looking for the Channel Module's Entries Generator:
+
+- `system/user/stubs/channel/entries`
+- `system/ee/ExpressionEngine/Addons/channel/stubs/entries`
+- `system/user/stubs`
+- `system/ee/templates/stubs`
+
+In addition to searching these directories for a match, the Template Generator will also search for a stub file that matches the generated template's type and engine. This will work in a manner of most specific to least specific. For example, if a user requests to generate an XML template called `sitemap` then the Template Generator will search through the paths in order looking for a `sitemap.xml.php` stub and then a `sitemap.php` stub within each path until a match is found. This allows you to customize the output for different template types.
+
+When running in an environment that introduces additional template engines, this search is extended further to include variations for those engines. We can continue the example above and request a Twig XML template called `sitemap`. Again the Template Generator will look through each path for the following file names until a match is found `sitemap.xml.twig.php`, `sitemap.twig.php`, `sitemap.xml.php`, `sitemap.php`.
+
+### Includes
+
+A generator stub differs from traditional View files in the way it handles embedding other stubs. Usually with a view file, you would only need to prefix your included file with the add-on name (e.g. `channel:`). But with generator stubs, you must use a combination of the add-on name and generator name (e.g. `channel:entries`) - something like `embed('channel:entries:_field_metadata', $vars)`. Embedding a stub for a fieldtype would still only require the add-on name as a prefix though since there is no generator involved (e.g. `$this->embed('grid:field', $vars)`).
+
+The variables passed to a stub file include the options passed to the generator along with any variables created by the generator, so use the generator documentation and files for reference.
+
+
+## Fieldtype Stubs
+
+If the generator is utilizing fieldtypes, the template code is built from the stubs that are specific to the fieldtypes.
+
+The stubs are required to be placed in `stubs` directory within fieldtype's own folder. Remember that they need to have `.php` extension and will be utilizing the View service.
+
+The default name of the field stub is `field`. This can be overridden by setting `$stub` property in the fieldtype file, e.g.
+
+```
+class Example_ft extends EE_Fieldtype
+{
+ public $stub = 'example';
+}
+```
+
+Fieldtype stubs for form inputs that will be used with `channel:form` generator need to follow the same naming rules but be placed in a `form` subdirectory (e.g. `system/user/addons/my_field/stubs/form/field.php`).
+
+The approach for finding a Fieldtype stub is similar to how Template Generator stubs are discovered. Directories are searched in priority order until a matching stub is found. An example directory lookup order for the Grid fieldtype might look like this:
+
+- `system/user/stubs/grid/field.php`
+- `system/ee/ExpressionEngine/Addons/grid/stubs/field.php`
+- `system/user/stubs/field.php`
+- `system/ee/templates/stubs/field.php`
+
+If the fieldtype does not provide any stubs, a generic `field.php` fallback is used. It is capable of determining whether the fieldtype is designed to work as a single tag or tag pair, but it cannot provide any specific variables to use within the tag pair.
+
+## Fieldtype Generators
+
+Some fieldtypes will return different variables depending on their settings. An example of this is the Grid fieldtype which supports different fieldtypes as columns. In order to build a useful template the fieldtype stub will need a list of the field's columns. To get this list of columns and their properties we will need to create a fieldtype generator.
+
+A fieldtype generator is a PHP class file that extends `ExpressionEngine\Service\TemplateGenerator\AbstractFieldTemplateGenerator`.
+The file needs to be placed in `TemplateGenerators` folder within the add-on folder. The file name is arbitrary, but it needs to match the class name declared in the file.
+
+Fieldtype generators need to be registered by assigning the generator class name to the `templateGenerator` key in the `addon.setup.php` file within the `fieldtypes` array, e.g.
+
+```php
+ [
+ 'grid' => [
+ 'name' => 'Grid',
+ 'templateGenerator' => 'Grid',
+ 'compatibility' => 'grid'
+ ]
+ ],
+ ...
+];
+```
+### Fieldtype Generator Methods
+
+**class `ExpressionEngine\Service\TemplateGenerator\AbstractFieldTemplateGenerator`**
+
+The only method that the fieldtypes generator is required to have is `getVariables()`. Is is required to return the associative array of variables that will be passed to the View service when rendering the fieldtype stub.
+
+The example fieldtype generator for the Grid fieldtype that provides a `$columns` variable to the stub file might look like this:
+
+```php
+ []
+ ];
+
+ //get the list of columns for this field
+ foreach ($this->field->GridColumns as $column) {
+ $fieldtypeGenerator = ee('TemplateGenerator')->getFieldtype($column->col_type);
+
+ $vars['columns']['grid_col_' . $column->col_id] = [
+ 'col_type' => $column->col_type,
+ 'col_name' => $column->col_name,
+ 'col_label' => $column->col_label,
+ 'field_type' => $column->col_type,
+ 'field_name' => $prefix . ':' . $column->col_name,
+ 'field_label' => $column->col_label,
+ 'stub' => $fieldtypeGenerator['stub'],
+ 'docs_url' => $fieldtypeGenerator['docs_url'],
+ 'is_tag_pair' => $fieldtypeGenerator['is_tag_pair'],
+ ];
+ }
+
+ return $vars;
+ }
+}
+```
diff --git a/docs/fieldtypes/fluid.md b/docs/fieldtypes/fluid.md
index e6d7c885b..d03d72c83 100755
--- a/docs/fieldtypes/fluid.md
+++ b/docs/fieldtypes/fluid.md
@@ -61,8 +61,8 @@ For example, if you have a Fluid field `fluid_content` with a text field `fluid_
The prefixed tag pair is a looping tag pair. You can have more than one `fluid_text` field for the entry, it's entirely at the entry author's discretion. The author also determines the order of the field output.
-Displaying field groups from within Fluid field is slightly different, as it requires additions `{fields}` tag pair.
-So given that `blog` is the short name of custom field group and `fluid_header` and `fluid_text` are fields in that group, the template might look like:
+Displaying field groups from within Fluid field is slightly different, as it uses a `{fields}` tag pair to loop through fields within the field group. The order of fields within the loop defaults to the same order of the fields within the field group. You may reverse this order by using `{fields order="desc"}` or specify a different order with `{fields fixed_order="field_2|field_1"}`.
+So given that `blog` is the short name of our custom field group and `fluid_header` and `fluid_text` are fields in that group, the template might look like:
{fluid_content}
@@ -79,6 +79,18 @@ So given that `blog` is the short name of custom field group and `fluid_header`
{/fluid_content}
+ExpressionEngine 7.5 introduces the ability to access fields from a field group without the use of a `{fields}` loop.
+The field name must be prefixed by the group's short_name and placed within the group tag like this:
+
+ {fluid_content}
+
+ {fluid_content:blog}
+
{blog:fluid_header}
+
{blog:fluid_text}
+ {/fluid_content:blog}
+
+ {/fluid_content}
+
## Variables
TIP: **Tip:** When using any of these [tags with a parameter in a conditional](templates/conditionals.md#embedding-tags) you will have to wrap them in braces (`{}`), like so: `{if {fluid_content:first name="text_body"}}`
@@ -181,13 +193,13 @@ Additionally, the following variable are available **when using custom field gro
{fluid_content:count_in_group}
-The "count" out of the fields being displayed in a field group. If five fields are in a group, then for the fourth field the `count` variable would have a value of "4".
+The "count" out of the fields being displayed in a field group. If five fields are in a group, then for the fourth field the `count` variable would have a value of "4".
### `first_in_group`
{fluid_content:first_in_group}
-True, if the current field is the first one in the current field group.
+True, if the current field is the first one in the current field group.
### `index_in_group`
@@ -441,7 +453,7 @@ Radio and single select fields use single variables:
{/my_fluid_field:my_relationship}
{/my_fluid_field}
-### RTF Text and Textare Fields
+### RTF Text and Textarea Fields
{my_fluid_field}
{my_fluid_field:my_textarea}
diff --git a/docs/fieldtypes/notes.md b/docs/fieldtypes/notes.md
index 854c9eaad..2ea306550 100644
--- a/docs/fieldtypes/notes.md
+++ b/docs/fieldtypes/notes.md
@@ -9,7 +9,7 @@
# Notes Fieldtype
-Notes is a fieldtype that contains text used to give context to content editors. It cannot be edited in a channel entry and is only there for informational purposes.
+Notes is a fieldtype that contains text used to give context to content editors. It cannot be edited in a channel entry and is only there for informational purposes.

@@ -28,4 +28,5 @@ This is the content that will appear as a note on the publish form. Markdown for
## Template Tag
-Usage of notes is not supported in templates.
+The note contents can be displayed in a `{channel:entries}` loop using a single variable.
+
diff --git a/docs/installation/changelog.md b/docs/installation/changelog.md
index 741862653..da0ec17f4 100755
--- a/docs/installation/changelog.md
+++ b/docs/installation/changelog.md
@@ -8,6 +8,47 @@
-->
# ExpressionEngine v7 Change Log
+# Version 7.5.0
+(Release: October 14, 2024)
+
+- **Contributors** 🙌
+
+
+**Enhancements** 🚀
+
+- Introducing [Template Generators](https://expressionengine.com/blog/7.5-code-generators)
+- Expanded copy shortname functionality to the Channel and Field Manager making it possible to copy full template code for channels, field groups, and fields.
+- Show errors in Control Panel using default layout with sidebar [#3536](https://github.com/ExpressionEngine/ExpressionEngine/issues/3536)
+- Update specialty message templates if the site is using outdated EE2 versions
+- Fluid Field Group Improvements: Allow field group parsing outside of `{fields}` loop, Add new fixed_order and order parameters to `{fields}` tag, Update order of fields within `{fields}` tag to default to Field Group order
+- Enable cloning of Menu Sets [#4214](https://github.com/ExpressionEngine/ExpressionEngine/issues/4214)
+- Add support for inline_errors in form submissions [#2871](https://github.com/ExpressionEngine/ExpressionEngine/issues/2871)
+- Added `{exp:channel:field}` tag to display field properties [#2870](https://github.com/ExpressionEngine/ExpressionEngine/issues/2870)
+- Update License Validation banners and improve messaging for users without ability to manage licenses
+- Added new config variable for setting the default template engine `$config['default_template_engine']`
+- Added Channel filter to the Field Manager
+- Updated Note Fieldtype so it can be used in templates to display its content
+
+**Bug Fixes** 💃🐛
+
+- Fixed [#4087](https://github.com/ExpressionEngine/ExpressionEngine/issues/4087), [#4055](https://github.com/ExpressionEngine/ExpressionEngine/issues/4055) where there were problems with copying short name of a field in the publish form
+- Resolved [#3556](https://github.com/ExpressionEngine/ExpressionEngine/issues/3556) where date fields could not accommodate dates past year 2038
+- Resolved [#3865](https://github.com/ExpressionEngine/ExpressionEngine/issues/3865) where cloning a fluid field could break existing field groups
+- Fix Live Preview bugs with Fluid field group [#4388](https://github.com/ExpressionEngine/ExpressionEngine/issues/4388)
+- Fix bug where adding new fields to field group in fluid would not allow existing entries to accept content for that field [#3741](https://github.com/ExpressionEngine/ExpressionEngine/issues/3741)
+- Fixed possible PHP warnings in Pro Search keyword handling
+
# Version 7.4.11
(Release: June 13, 2024)
@@ -1825,6 +1866,6 @@ NOTE:**Note:** If multiple members are needed, an ExpressionEngine Pro license i
- Simple Commerce Add-on has now been removed from ExpressionEngine and made a downloadable add-on from the ExpressionEngine Store. On upgrades which use the Simple Commerce Add-on, the add-on will be moved from the `ee/addons` folder to `user/addons` and considered a user installed add-on.
- Ip to Nation Add-on has now been removed from ExpressionEngine and made a downloadable add-on from the ExpressionEngine Store. On upgrades which use the Ip to Nation Add-on, the add-on will be moved from the `ee/addons` folder to `user/addons` and considered a user installed add-on.
- The included version of jQuery used in the Control Panel has been updated to v3.6.0
- - Added the option to [globally cache](/channels/entries.html#cache-refresh-cache_prefix) Channel Entries tag results
+ - Added the option to [globally cache](/channels/entries.md#cache-refresh-cache_prefix) Channel Entries tag results
- Added [ENV File Support](/advanced-usage/env-support.md)
- Added new Shared Form View
diff --git a/docs/member/edit-profile.md b/docs/member/edit-profile.md
index 194018434..81689ee59 100644
--- a/docs/member/edit-profile.md
+++ b/docs/member/edit-profile.md
@@ -17,29 +17,44 @@
This template tag allows editing a member's profile using the form that is similar to [Channel Form](channels/channel-form/overview.md). Please note however that not all Channel Form parameters and template tags are available in the Member Profile form, so make sure to consult the documentation below. The form can only be used to update profile of the member that is currently logged in.
+{{embed:_tips/form-validation.md}}
+
## Parameters
{{embed:_tips/form-attributes.md}}
+
### `datepicker=`
-Include the datepicker javascript. This should be set to ``yes`` if there is a date type member custom field in order to output the calendar.
+ datepicker="no"
- datepicker="yes"
+Adds the datepicker to your date fields. Defaults to "yes".
-### `include_assets=`
+NOTE: **Note:** If you are manually constructing a date field, in order to apply the date picker you must include `rel="date-picker"`.
- include_assets="yes"
+### `form_class=`
-Adds the Javascript and CSS that is required by custom member fields to your form. By default, these are **not** included
+ form_class="login"
-### `datepicker=`
+This parameter allows you to specify the class attribute for the <form> tag.
- datepicker="no"
+### `form_id=`
-Adds the datepicker to your date fields. Defaults to "yes".
+ form_id="login"
-NOTE: **Note:** If you are manually constructing a date field, in order to apply the date picker you must include `rel="date-picker"`.
+This parameter allows you to specify the id attribute for the <form> tag.
+
+### `form_name=`
+
+ form_name="login"
+
+This parameter allows you to specify a name attribute for the <form> tag.
+
+### `include_assets=`
+
+ include_assets="yes"
+
+Adds the Javascript and CSS that is required by custom member fields to your form. By default, these are **not** included
### `include_css=`
@@ -55,27 +70,23 @@ Includes jQuery automatically. Defaults to "yes".
NOTE: **Note:** If you are using your own copy of jQuery you will need to load it **before** the form.
-### `return=`
-
- return="member/registration/success"
-
-### `form_class=`
+### `inline_errors=`
- form_class="login"
+ inline_errors="yes"
-This parameter allows you to specify the class attribute for the <form> tag.
+This parameter is for use with [form validation and error handling](/templates/form-validation.md) and determines the type of error reporting: inline or error template.
-### `form_id=`
+### `return=`
- form_id="login"
+ return="member/registration/success"
+
+### `return_error=`
-This parameter allows you to specify the id attribute for the <form> tag.
+ return_error="template_group/error"
-### `form_name=`
+This parameter is for use with [form validation and error handling](/templates/form-validation.md) and determines the template to return to if validation errors are detected.
- form_name="login"
-This parameter allows you to specify a name attribute for the <form> tag.
## Form Inputs
NOTE: Be sure to include the required Javascript and CSS to use the native [Password Validation](member/password-validation.md).
@@ -194,6 +205,7 @@ Short name of the fieldtype used for field
{exp:member:edit_profile
return="member/registration/success"
include_assets="yes"
+ inline_errors="yes"
datepicker="yes"
}
@@ -204,27 +216,42 @@ Short name of the fieldtype used for field
You must enter your current password to change your password, username or email.
+ {if error:current_password}
+ {error:current_password}
+ {/if}
@@ -235,6 +262,9 @@ Short name of the fieldtype used for field
{form:custom_profile_field}
+ {if has_error}
+ {error}
+ {/if}
{/custom_profile_fields}
diff --git a/docs/member/forgot-password.md b/docs/member/forgot-password.md
index be0bfe65e..c457c88f2 100644
--- a/docs/member/forgot-password.md
+++ b/docs/member/forgot-password.md
@@ -24,19 +24,27 @@ Output a forgotten password form that sends an email with instructions for reset
{/exp:member:forgot_password_form}
-
+
NOTE: **Note:** This form will only email the user if the user requesting the password reset is not currently logged in.
+{{embed:_tips/form-validation.md}}
+
## Parameters
### `email_template=`
email_template="member/email-password-reset"
-Template to use for email which is sent to user.
+Template to use for email which is sent to user.
NOTE: **Note:** If no template is defined, the default [Member Profile Template](control-panel/template-manager.md#member-profile-templates) for a forgotten password will be used.
+### `inline_errors=`
+
+ inline_errors="yes"
+
+This parameter is for use with [form validation and error handling](/templates/form-validation.md) and determines the type of error reporting: inline or error template.
+
### `password_reset_url=`
password_reset_url="member/reset-password"
@@ -55,6 +63,12 @@ This parameter allows you to define where the user will be returned after succes
1. Use the standard Template_Group/Template syntax to specify where to return the user. For instance, if you want the user to be returned to the "local" Template in the "news" Template Group, you would use: return="member/forgot-password/sent"
2. Use a full URL. For example: return=""
+### `return_error=`
+
+ return_error="template_group/error"
+
+This parameter is for use with [form validation and error handling](/templates/form-validation.md) and determines the template to return to if validation errors are detected.
+
## Form Inputs
NOTE: Be sure to include the required Javascript and CSS to use the native [Password Validation](member/password-validation.md).
@@ -66,47 +80,27 @@ Member email address. This is a **required** field:
-
-
-## Variable Pairs
-
-### `{errors}`
-
-Form submission errors are displayed using a "looping pair" as there can be more than 1 error in a form submission.
-
- {errors}
-
{error}
- {/errors}
-
-#### Error Tag Pair Parameters
-
-##### `backspace=`
-
- backspace="3"
-
-The `backspace=` parameter will remove characters, including spaces and line breaks, from the last iteration of the tag pair.
-
-#### Error Tag Pair Variables
-
-##### `{error}`
-
- {error}
-
-The error text.
-
-
-
## Example
{exp:member:forgot_password_form
return="member/forgot-password/sent"
+ inline_errors="yes"
password_reset_url="member/reset-password"
email_template="member/email-password-reset"
}
+ {if errors}
+
+ {/if}
+
-
+
diff --git a/docs/member/forgot-username.md b/docs/member/forgot-username.md
index 7da35a676..16a695561 100644
--- a/docs/member/forgot-username.md
+++ b/docs/member/forgot-username.md
@@ -24,6 +24,8 @@ Output a forgotten username form that sends an email with instructions for addre
{/exp:member:forgot_username_form}
+{{embed:_tips/form-validation.md}}
+
## Parameters
### `email_subject=`
@@ -37,10 +39,16 @@ Subject of email sent to user.
email_template="member/email-forgot-username"
-Template to use for email which is sent to user.
+Template to use for email which is sent to user.
If no template is defined or if the template defined does not exist, the default [Member Profile Template](control-panel/template-manager.md#member-profile-templates) for a forgotten username will be used.
+### `inline_errors=`
+
+ inline_errors="yes"
+
+This parameter is for use with [form validation and error handling](/templates/form-validation.md) and determines the type of error reporting: inline or error template.
+
### `return=`
return="member/login/forgot-username"
@@ -50,6 +58,12 @@ This parameter allows you to define where the user will be returned after succes
1. Use the standard Template_Group/Template syntax to specify where to return the user. For instance, if you want the user to be returned to the "local" Template in the "news" Template Group, you would use: return="member/login/forgot-username"
2. Use a full URL. For example: return=""
+### `return_error=`
+
+ return_error="template_group/error"
+
+This parameter is for use with [form validation and error handling](/templates/form-validation.md) and determines the template to return to if validation errors are detected.
+
## Form Inputs
### Email
@@ -59,46 +73,27 @@ Member email address. This is a **required** field:
-
-
-## Variable Pairs
-
-### `{errors}`
-
-Form submission errors are displayed using a "looping pair" as there can be more than 1 error in a form submission.
-
- {errors}
-
{error}
- {/errors}
-
-#### Error Tag Pair Parameters
-
-##### `backspace=`
-
- backspace="3"
-
-The `backspace=` parameter will remove characters, including spaces and line breaks, from the last iteration of the tag pair.
-
-#### Error Tag Pair Variables
-
-##### `{error}`
-
- {error}
-
-The error text.
-
-
## Example
{exp:member:forgot_username_form
return="member/login/forgot-username"
+ inline_errors="yes"
email_subject="Your Username"
email_template="member/email-forgot-username"
}
+ {if errors}
+
+ {/if}
+
-
+
diff --git a/docs/member/index.md b/docs/member/index.md
index 5ddb9317a..6e13c2519 100755
--- a/docs/member/index.md
+++ b/docs/member/index.md
@@ -14,7 +14,7 @@ You'll find many member management options available at:
- The [Members](control-panel/member-manager.md) section, which hosts a comprehensive suite of member management utilities including the [Membership Preferences](control-panel/settings/members.md) page.
- The My Account Page, accessible from the Control Panel's sidebar. It can also display information for any member if you choose a particular member from `Members`.
- Member [global template variables](templates/globals/single-variables.md#member-variables), which allow you to output information on the current user.
-- Member tags can be used to build a robust frontend member area, enabling your site members to manage their personal profile information without having access to your Control Panel.
+- Member tags can be used to build a robust frontend member area, enabling your site members to manage their personal profile information without having access to your Control Panel. The Member Management [Template Generator](templates/generators.md) can create a set of functional templates that demonstrate how to use these tags along with their available parameters and variables.
NOTE: **Note:** A member account's Username and Screen Name can be identical, but the Username must be unique system-wide.
diff --git a/docs/member/login.md b/docs/member/login.md
index 6d99cde80..b170ac170 100644
--- a/docs/member/login.md
+++ b/docs/member/login.md
@@ -26,6 +26,8 @@ Output a login form.
{/exp:member:login_form}
+{{embed:_tips/form-validation.md}}
+
## Parameters
{{embed:_tips/form-attributes.md}}
@@ -54,6 +56,13 @@ This parameter allows you to specify the id attribute for the <form> tag.
This parameter allows you to specify a name attribute for the <form> tag.
+### `inline_errors=`
+
+ inline_errors="yes"
+
+This parameter is for use with [form validation and error handling](/templates/form-validation.md) and determines the type of error reporting: inline or error template.
+
+
### `return=`
return="site/index"
@@ -63,7 +72,11 @@ This parameter allows you to define where the user will be returned after succes
1. Use the standard Template_Group/Template syntax to specify where to return the user. For instance, if you want the user to be returned to the "local" Template in the "news" Template Group, you would use: return="news/local"
2. Use a full URL. For example: return=""
+### `return_error=`
+
+ return_error="template_group/error"
+This parameter is for use with [form validation and error handling](/templates/form-validation.md) and determines the template to return to if validation errors are detected.
## Form Inputs
@@ -114,14 +127,36 @@ It is recommended that you use this variable as indicated in the example code at
## Example
- {exp:member:login_form return="member/index"}
+ {exp:member:login_form return="member/index" inline_errors="yes"}
+ {!-- You can display all errors at the top of the page or use the individual field {error:} tags shown later --}
+ {!--
+ {if errors}
+
+ {/if}
+ --}
+
+ {if error:general}
+ {error:general}
+ {/if}
+
diff --git a/docs/member/memberlist.md b/docs/member/memberlist.md
index b80ce2140..5d73aa98a 100644
--- a/docs/member/memberlist.md
+++ b/docs/member/memberlist.md
@@ -15,17 +15,48 @@
Outputs a searchable list of members, including form filters to sort and limit the members.
+{{embed:_tips/form-validation.md}}
+
## Parameters
{{embed:_tips/form-attributes.md}}
-### `role_id=`
+### `backspace=`
- role_id="5"
+ backspace="3"
-Restrict the output to members that belong to certain [role](control-panel/member-manager.md#member-roles).
+The `backspace=` parameter will remove the specified number of characters, including spaces and line breaks, from the last iteration of the tag pair.
+
+### `error_handling="inline"`
+ error_handling="inline"
+
+This parameter allows you to use inline errors in your registration form. The errors can be displayed using the `{error:field_name}` tag where `field_name` would need to be replaced with the name of the field that has an error, as used to compose the form.
+
+### `form_class=`
+
+ form_class="login"
+
+This parameter allows you to specify the class attribute for the search <form> tag.
+
+### `form_id=`
+
+ form_id="login"
+
+This parameter allows you to specify the id attribute for the search <form> tag.
+
+### `form_name=`
+
+ form_name="login"
+
+This parameter allows you to specify a name attribute for the search <form> tag.
+
+### `limit=`
+
+ limit="30"
+
+Allows you to limit the number of members displayed.
+When not set, defaults to [Member List - Rows](control-panel/settings/members.md#total-results) setting or [`memberlist_row_limit` configuration override](general/system-configuration-overrides.md#memberlist_row_limit)
-NOTE: This parameter replaces `group_id` which is functionally identical and currently still supported.
### `orderby=`
@@ -47,6 +78,15 @@ The "orderby" parameter sets the display order of members. The possible options
When not set, defaults to [Member List - Order](control-panel/settings/members.md#order-by)
setting or [`memberlist_order_by` configuration override](general/system-configuration-overrides.md#memberlist_order_by)
+### `role_id=`
+
+ role_id="5"
+
+Restrict the output to members that belong to certain [role](control-panel/member-manager.md#member-roles).
+
+NOTE: This parameter replaces `group_id` which is functionally identical and currently still supported.
+
+
### `sort=`
sort="asc"
@@ -55,41 +95,16 @@ setting or [`memberlist_order_by` configuration override](general/system-configu
Set the order in which members are displayed.
When not set, defaults to [Member List - Sort By](control-panel/settings/members.md#sort-by) setting or [`memberlist_sort_order` configuration override](general/system-configuration-overrides.md#memberlist_sort_order)
-### `limit=`
-
- limit="30"
-
-Allows you to limit the number of members displayed.
-When not set, defaults to [Member List - Rows](control-panel/settings/members.md#total-results) setting or [`memberlist_row_limit` configuration override](general/system-configuration-overrides.md#memberlist_row_limit)
-
### `return=`
return="member/memberlist"
+
+### `return_error=`
-### `form_class=`
-
- form_class="login"
-
-This parameter allows you to specify the class attribute for the search <form> tag.
-
-### `form_id=`
-
- form_id="login"
-
-This parameter allows you to specify the id attribute for the search <form> tag.
-
-### `form_name=`
-
- form_name="login"
-
-This parameter allows you to specify a name attribute for the search <form> tag.
-
-### `backspace=`
-
- backspace="3"
-
-The `backspace=` parameter will remove the specified number of characters, including spaces and line breaks, from the last iteration of the tag pair.
+ return_error="template_group/error"
+This parameter is for use with [form validation and error handling](/templates/form-validation.md) and determines the template to return to if validation errors are detected.
+
## Form Variables
### `{form_declaration}`
@@ -98,7 +113,7 @@ This is a **required** variable in order to use the search form. It creates the
### `{role_options}`
-Form submission errors are displayed using a "looping pair" as there can be more than 1 error in a form submission.
+A list of options for filtering by member role
{/custom_fields}
@@ -211,7 +222,7 @@ Displays the custom field input form for the given field (substitute `field_name
{exp:member:registration_form
return="member/registration/success"
- error_handling="inline"
+ inline_errors="yes"
}
* Required fields
@@ -259,6 +270,9 @@ Displays the custom field input form for the given field (substitute `field_name
{captcha}
+ {if error:captcha}
+ {error:captcha}
+ {/if}
{/if}
diff --git a/docs/member/reset-password.md b/docs/member/reset-password.md
index e19e702d5..6eb3c3745 100644
--- a/docs/member/reset-password.md
+++ b/docs/member/reset-password.md
@@ -28,8 +28,16 @@ Output a reset password form that allows members accessing it via a link from a
{/exp:member:reset_password_form}
+{{embed:_tips/form-validation.md}}
+
## Parameters
+### `inline_errors=`
+
+ inline_errors="yes"
+
+This parameter is for use with [form validation and error handling](/templates/form-validation.md) and determines the type of error reporting: inline or error template.
+
### `return=`
return="member/login/success"
@@ -39,6 +47,12 @@ This parameter allows you to define where the user will be returned after succes
1. Use the standard Template_Group/Template syntax to specify where to return the user. For instance, if you want the user to be returned to the "local" Template in the "news" Template Group, you would use: return="news/local"
2. Use a full URL. For example: return=""
+### `return_error=`
+
+ return_error="template_group/error"
+
+This parameter is for use with [form validation and error handling](/templates/form-validation.md) and determines the template to return to if validation errors are detected.
+
## Form Inputs
NOTE: Be sure to include the required Javascript and CSS to use the native [Password Validation](member/password-validation.md).
@@ -47,7 +61,7 @@ NOTE: Be sure to include the required Javascript and CSS to use the native [Pass
-The new password to set.
+The new password to set.
### Password Confirmation
@@ -57,49 +71,36 @@ The new password to set.
Duplicate of the new password set in the password form input.
-
-## Variable Pairs
-
-### `{errors}`
-
-Form submission errors are displayed using a "looping pair" as there can be more than 1 error in a form submission.
-
- {errors}
-
{error}
- {/errors}
-
-#### Error Tag Pair Parameters
-
-##### `backspace=`
-
- backspace="3"
-
-The `backspace=` parameter will remove characters, including spaces and line breaks, from the last iteration of the tag pair.
-
-#### Error Tag Pair Variables
-
-##### `{error}`
-
- {error}
-
-The error text.
-
-
-
## Example
{exp:member:reset_password_form
return="member/login/success"
+ inline_errors="yes"
}
+ {if errors}
+
+ {/if}
+
diff --git a/docs/templates/date-variable-formatting.md b/docs/templates/date-variable-formatting.md
index ea6acf29d..9f1308a1d 100755
--- a/docs/templates/date-variable-formatting.md
+++ b/docs/templates/date-variable-formatting.md
@@ -228,7 +228,7 @@ Would be rendered like this:
#### singular=
-The `singular=` parameter determines what text to display when the value of a given unit is 1. The default is "one". For example, assuming a date 1 day in the past this:
+The `singular=` parameter determines what text to display when the value of a given unit is 1. The default is "one", as in, "one hour ago", and notice that all singular units have the plural "s" removed automatically. For example, assuming a date 1 day in the past this:
{entry_date:relative singular="1"}
@@ -248,7 +248,7 @@ Or perhaps you would rather show relative dates until midnight:
{entry_date:relative stop="tomorrow" format="%F %d %Y" timezone="Pacific/Tahiti"}
-If an invalid value is used for `stop=` a relative date will be displayed.
+If an invalid value is used for `stop=` a relative date will be displayed in all cases.
#### units=
@@ -270,6 +270,8 @@ Would be rendered like this:
one week ago
+Note that the plural "s" is automatically removed because it's a single week.
+
But this:
{entry_date:relative units="days"}
diff --git a/docs/templates/form-validation.md b/docs/templates/form-validation.md
new file mode 100644
index 000000000..8163a12ac
--- /dev/null
+++ b/docs/templates/form-validation.md
@@ -0,0 +1,96 @@
+
+
+# Form Validation
+
+[TOC]
+
+ExpressionEngine provides several template tags that produce interactive forms. When a user submits a form the input is validated and any errors are then shown to the user. The two methods for presenting these errors to your users are through a system error template or by using inline errors in your own custom templates.
+
+## Error Template
+
+By default ExpressionEngine will show validation errors to your users with a system template. You can configure the look and feel of this page by using [Custom System Messages](control-panel/template-manager.md#custom-system-messages).
+
+## Inline Errors
+
+Alternatively you can show users any validation errors on the same page where they are providing input with inline errors. The following template tags support inline errors and can make use of the following parameters and variables.
+
+*Supported Template Tags:*
+
+- [Comment Submission Form](/comment/form.md) `{exp:comment:form}`
+- [Email Contact Form](/add-ons/email.md#email-contact-form) `{exp:email:contact_form}`
+- [Member Edit Profile](/member/edit-profile.md) `{exp:member:edit_profile}`
+- [Member Forgot Password](/member/forgot-password.md) `{exp:member:forgot_password_form}`
+- [Member Forgot Username](/member/forgot-username.md) `{exp:member:forgot_username_form}`
+- [Member Login](/member/login.md) `{exp:member:login_form}`
+- [Member Registration](/member/registration.md) `{exp:member:registration_form}`
+- [Member Reset Password](/member/reset-password.md) `{exp:member:reset_password_form}`
+
+### Parameters
+
+[TOC=4]
+
+#### `inline_errors=`
+
+ inline_errors="yes"
+
+This parameter allows you to use inline errors in your form. The errors can be displayed using the `{errors}` variable pair or individually using the `{error:field_name}` tag (where `field_name` would be replaced with the name of your field).
+
+#### `return_error=`
+
+ return_error="template_group/error"
+
+When inline errors are enabled, this parameter allows you to specify the template to return to if there are errors in the form. The default is the same template that the form is on.
+
+### Variables
+
+[TOC=4]
+
+#### Errors Pair
+
+ {errors}...{error}...{/errors}
+
+When inline errors enabled, this tag pair will display all errors in a loop. Each individual error message is available as an `{error}` variable within the loop.
+
+This is useful for displaying all errors at once, for example, in a fieldset at the top of the form. It can also be used as a conditional to check if there are any errors at all: `{if errors}`.
+
+ {if errors}
+
Please correct the following errors:
+
+ {errors}
+
{error}
+ {/errors}
+
+ {/if}
+
+#### Field Error Single
+
+ {error:field_name}
+
+You can also access an error for a specific field. This can be desirable if you want to show the error next to the input element that was invalid.
+
+#### Field Value Single
+
+ {old:field_name}
+
+Retrieve a value for a specific field that was sent during the invalid submission.
+
+NOTE: **Note:** These values are only flashed to the session for a single request and fields with sensitive names like "password" will not be stored
+
+### Example Usage
+
+```
+
+```
diff --git a/docs/templates/generators.md b/docs/templates/generators.md
new file mode 100644
index 000000000..609283c4f
--- /dev/null
+++ b/docs/templates/generators.md
@@ -0,0 +1,96 @@
+
+
+# Template Generators
+
+[TOC]
+
+ExpressionEngine provides a set of template generators that allow you to quickly scaffold templates based on your existing data structures (channels, custom fields, etc.). The template generators are available through both the Control Panel and the Command Line Interface (CLI). The generated templates will demonstrate the most common ways of accessing the data. Additionally, the templates have a settings option to also include comments and links to the field's documentation.
+
+## Control Panel Usage
+
+Before you can use the template generators you will need to set up your channels and custom fields. Once this is done you can navigate to `Developer > Templates > Template Generator`.
+
+
+
+Select the generator that you want along with any available options and then type in a name for the template group that will be created.
+
+Upon successful generation of new templates, you will be brought to the Template Group page so that you may view and modify any of the generated files.
+
+## Command Line Usage
+
+You can also generate templates using [ExpressionEngine's Command Line Interface (CLI)](/cli/usage.md). The main CLI command to access all template generators in the system is: `php system/ee/eecli.php generate:templates`.
+
+To get the list of available template generators, pass the `--list` option to the command:
+
+```bash
+php system/ee/eecli.php generate:templates --list
+```
+
+To run a specific template generator, pass its full name as the first argument to the command:
+
+```bash
+php system/ee/eecli.php generate:templates channel:entries
+```
+
+Each template generator can be configured with the following options while some may offer additional input.
+
+`--template_group="blog"` - The name of the template group which will contain the new templates. Required
+
+`--template_engine=twig` - When using [Coilpack](https://expressionengine.github.io/coilpack-docs/) multiple template engines are available. This option lets you specify which template engine to use for template generation. The default is native.
+
+`--site_id=1` - With MSM you may generate templates for a specific site by referencing the Site ID. If your installation has only one site this can be omitted.
+
+`--templates="all"` - Specify "all" (default) to generate all templates provided by the generator, or specify a comma-separated list of template names that you want. For example: `--templates="index,single"` will only generate the `index` and `single` templates.
+
+`--show` - When this parameter is specified the template content will be displayed but no templates will be created.
+
+## Available Template Generators
+
+### Channel Entries
+
+The Channel Entries generator creates several templates to list and render entries for the specified channels.
+
+**Options**:
+
+- Channel (Required): Select one or more channels that you want to use in templates
+
+**CLI Usage**:
+
+```bash
+php system/ee/eecli.php generate:templates channel:entries --template_group=news --templates=all --channel=news
+```
+
+### Channel Form
+
+The Channel Form generator creates a template utilizing Channel Form tags for a customizable publishing experience.
+
+**Options**:
+
+- Channel (Required): Select the channel that you want to use in templates
+
+**CLI Usage**:
+
+```bash
+php system/ee/eecli.php generate:templates channel:form --template_group=artists --channel=artists
+```
+
+### Member Management
+
+The Member Management generator creates a series of templates to help you get started building a custom member experience.
+
+**CLI Usage**:
+
+```bash
+php system/ee/eecli.php generate:templates member:profile --template_group=members
+```
+
+## Developer Documentation
+
+To learn more about having an Add-on integrate with Template Generators check out the [Template Generator Service](development/services/template-generator.md).
diff --git a/docs/templates/globals/single-variables.md b/docs/templates/globals/single-variables.md
index 47660fc0f..1b7592136 100755
--- a/docs/templates/globals/single-variables.md
+++ b/docs/templates/globals/single-variables.md
@@ -7,13 +7,13 @@
@license https://expressionengine.com/license Licensed under Apache License, Version 2.0
-->
-# Single Global Variables
+# Global Variables
[TOC]
These Global Variables can be used anywhere within your Templates. Note that they are subject to ExpressionEngine's [parsing order](templates/engine.md), which can affect their availability when used inside other tags.
-## Variables
+## Single Variables
[TOC=3 hide]
@@ -39,7 +39,7 @@ The active session id for the control panel. This is the value needed in the "S=
• CP Link
{/if}
-NOTE: **Note:** To check non-primary roles, use [exp:member:has_role](/member/member-roles-tags.html#expmemberhas_role)
+NOTE: **Note:** To check non-primary roles, use [exp:member:has_role](/member/member-roles-tags.md#expmemberhas_role)
### `{cp_url}`
@@ -315,7 +315,7 @@ The Member ID for the currently logged-in user.
The Primary Role ID number for the currently logged-in user.
-NOTE: **Note:** To check and display non-primary roles, use [exp:member:has_role](/member/member-roles-tags.html#expmemberhas_role)
+NOTE: **Note:** To check and display non-primary roles, use [exp:member:has_role](/member/member-roles-tags.md#expmemberhas_role)
### `{logged_in_primary_role_name}`
@@ -360,3 +360,26 @@ The total number of forum topics made by the currently logged-in user.
### `{logged_in_username}`
The username for the currently logged-in user.
+
+## Error Variables
+
+ExpressionEngine makes several variables available for handling [Form Validation](/templates/form-validation.md) errors.
+
+### `{if errors}`
+
+Conditionally check if error messages are present.
+
+### `{errors}...{error}...{/errors}`
+
+This variable pair is useful for displaying all errors at once, for example, in a fieldset at the top of the form. Inside the pair, each individual error message is available as `{error}` variable.
+
+ {if errors}
+