Docs & Support

Learn about all the Formidable features and get support from our amazing customer success team.

ViewsView Builder
Advanced View Concepts

Advanced View Concepts

There are many ways to display data in a Formidable View. This article explains several commonly used advanced View concepts that add more flexibility and functionality to your Views.

These concepts need the Visual Views add-on, which is available on the Plus, Business, and Elite licenses.

Set up a nested View

A View usually displays data from a single form. A nested View displays data from 2 forms inside a parent View.

To set up a nested View, you need a field in both forms that stores the same data. We'll call this field the "shared field". It can be a User ID field, a field that stores a unique ID number, a Dynamic field, or even a Text field.

These steps show one way to set up a nested View.

  1. Create 2 forms. In this example, the "Employee Profile" form (Form A) has the fields "Name", "Address", and "Employee ID Number". The "Additional Details" form (Form B) has the fields "Employee ID Number" and "Date Of Birth". The Number field titled Employee ID Number is the shared field.
  2. Create a new View that displays entries from Form A. We'll call this View A. It's the parent View that holds the nested View. Add some field IDs to the Content, as in a basic View.
  3. Create a new View that displays entries from Form B. We'll call this View B. Set the View type to Grid in most cases. A new Grid View opens with the Layout Builder: click the start adding content link to get a content box. In the content, add the field IDs for the data you want to nest in View A. In this example, it's the Date of Birth field.
  4. Above the content, click Filter entries.
    View Builder - Filter Entries Link

    Add a filter that uses Employee ID Number as your shared field. It looks something like this:
    • Employee ID Number equals [get param=pass_field]

    The pass_field part of the filter can be any name. It isn't linked to a field title or ID. If you change pass_field to something else, change it in the shortcode in the next step too. This part of the filter must match the shortcode exactly.

    Nested View Example Filter

    If you're using a User ID field as your shared field, your filter says:
    • User ID equals [get param=pass_field]
    Nested View User ID Filter
  5. Go back to View A. Add this shortcode for View B to View A's Listing Page or Detail Page Content:
    [display-frm-data id=x pass_field="[y]"]
    Replace x with the ID of View B. Replace y with the ID of the shared field in Form A. If your shared field is a User ID field, add show=ID to the shortcode:
    [display-frm-data id=x pass_field="[y show=ID]"]
    In this example, the ID of View B is 158 and the ID of the shared field (Employee ID Number) is 143. The get param value is pass_field, so the shortcode is:
    [display-frm-data id=158 pass_field="[143]"]
    Learn more about how to put a field value inside another shortcode.
    Nested View Example Content
  6. Publish View A on a page. Include filter=limited in the View shortcode you insert on the page. This tells the View to process the shortcode for View B. When you visit that page, you see entries from Form A alongside values from Form B.

Search a parent View and a nested View

A search form can filter a parent View and its nested View at the same time. Each View only filters entries from its own form, though. So a parent entry still shows when its nested View finds no match, with the nested View's No Entries Message (No Entries Found by default) where the nested values go.

To show only the rows that match both searches, let the nested View display the whole row, parent values included.

In this example, the "Members" form (Form A) has the fields "Member Name" (ID 139) and "City" (ID 140). The "Classes Taken" form (Form B) has a Dynamic field "Member" (ID 141) that links to Member Name. It also has "Class" (ID 142) and "Level" (ID 143).

A custom search form redirects to the results page with ?city=[x]&level=[y], where x and y are the IDs of its City and Level fields. Your IDs will be different, so replace the IDs in this example with your own.

  1. Create a View for Form B and select Classic. This is the nested View. Click Filter entries and add 2 filters joined with And:
    • Member equals [get param=pass_entry]
    • Level equals [get param=level]
    Nested View Search - nested View filters
  2. In the nested View's Listing Page Content (the content box between Add Before Content and Add After Content), add the whole table row. The parent values come from parameters that the parent View passes in the next step:
    <tr>
    <td>[get param=pass_name]</td>
    <td>[get param=pass_city]</td>
    <td>[142]</td>
    <td>[143]</td>
    </tr>
    Nested View Search - whole row in the nested View content
  3. In the nested View's left settings panel, open No Entries Message and remove the default message. A member with no matching class then adds nothing to the table. If you keep the message, it prints inside the table, and browsers show it above the table. Click Update to save the nested View.
  4. Create a View for Form A and select Classic. This is the parent View. Click Filter entries and add the filter City equals [get param=city].
  5. In the parent View, click Add Before Content and add the start of the table:
    <table><thead><tr><th>Member</th><th>City</th><th>Class</th><th>Level</th></tr></thead><tbody>
    Then click Add After Content and add </tbody></table>.
  6. In the parent View's Listing Page Content, add only the nested View shortcode. It passes the parent entry's ID and values to the nested View:
    [display-frm-data id=160 pass_entry=[id] pass_name="[139]" pass_city="[140]"]
    Replace 160 with the ID of the nested View, and 139 and 140 with the IDs of the fields in Form A. Then click Update to save the parent View.
    Nested View Search - parent View content
  7. Publish the parent View on the results page with filter=limited in its shortcode. The search form can go on the same page, above the View.

Now a search for a city and a level shows only the classes at that level taken by members in that city. A search that leaves a box empty ignores that filter. A member with no classes at all never shows, even when both boxes are empty.

Notes:
  • Because Form B links to Form A with a Dynamic field, the nested View can also show a parent value with the Dynamic field's show option, such as [141 show=140].
  • Don't use [frm-field-value … entry=pass_entry] for the parent values on a public page. Since Formidable Forms 7.0, it shows those values only to the person who submitted the entry. It also shows them to users who can view entries in the admin area (administrators by default). Other visitors see empty cells. Learn more about the frm_field_value_requires_ownership hook.
  • When members match the city but none has a matching class, the table header shows with no rows. When no member matches the city, the parent View shows its own No Entries Message and no table.

Formidable Forms makes advanced site building simple. Launch forms, directories, dashboards, and custom WordPress apps faster than ever before.

You can link to the detail page of one View (View B) from another View (View A). For example, you have a list of applications submitted for a job. View A lists the applicants' names, and View B shows all the details of one application.

Here's how to link to View B from View A.

  1. Create a new View (View B) and add some content to it.
  2. In View B, click Filter entries and add a filter that says Entry ID equals [get param=id default=0]. With default=0, the page shows no entry when its URL has no id. Without it, the page shows every entry. Then click Update to save your View.
    Dynamic View Filter
  3. Publish View B on a page. Note the URL of that page, because you need it in step 5.
  4. Create a new View (View A) and add some content to it.
  5. In the content box of View A, add a link to View B. Your link looks something like this:
    <a href="https://yoursite.com/application-details/?id=[id]">View Application Details</a>
    Replace https://yoursite.com/application-details/ with the URL of the page with View B. Leave [id] as it is.

Duplicate entries on the front end

To let users duplicate an entry from the front end of your site, add a Duplicate link to a View. The link opens your form with its fields filled in from the entry.

Since Formidable Forms 7.0, the fields fill in only for users who can view entries in the admin area (administrators by default) and for the person who submitted the entry. Since 7.0.1, that includes a logged-out visitor, in the same browser, for 1 hour after they submit the entry. Everyone else gets a blank form. For users who duplicate their own entries, nothing else is needed. To let anyone duplicate entries whose values are meant to be public, add the frm_field_value_requires_ownership code for those fields.
  1. Create a View that displays the entries your users can duplicate.
  2. Add a Duplicate link to the content of the View, using the URL of the page that contains your form. The easiest way to duplicate entries is to use the same form for the original and duplicate entries. Add an entry key parameter to the end of this URL. Your HTML link looks like this:
    <a href="https://mysite.com/mypage/?pass_entry=[key]">Duplicate</a>
    Leave [key] as it is. The View fills in each entry's key.
  3. If your form has an Embed Form field, add the entry ID to the URL too:
    https://mysite.com/mypage/?pass_entry=[key]&emb_entry=[id]
    Leave [id] as it is. The View fills in each entry's ID.
  4. Go to Formidable → Forms and edit your form. In each field, add [frm-field-value field_id=x entry=pass_entry] and replace x with the ID of that field.
    • Click the field, open the Advanced section of its field options, and add this shortcode in the Default Value box.
      Duplicate Other Field
    • For a Dynamic field, get the ID of the linked entry with this shortcode:
      [frm-field-value field_id=x entry=pass_entry show=id]
      Replace x with the ID of your Dynamic field.
      Duplicate Dynamic Field
    • For a field in an embedded form, add the default value in the embedded form. Use entry=emb_entry instead of entry=pass_entry:
      [frm-field-value field_id=x entry=emb_entry]
      Replace x with the ID of your field.
      Duplicate Embed Field
    • For a Paragraph field, add wpautop=0 to the shortcode, so the value doesn't contain any <p> and <br> tags:
      [frm-field-value field_id=x entry=pass_entry wpautop=0]
      Replace x with the ID of your Paragraph field.
      Duplicate Paragraph Field
  5. Click the Duplicate link in your View. The form opens with its fields filled in with the entry's data. Multiple rows in a Repeater field aren't filled in automatically.

Organize View by a field

When displaying entry information, it helps to organize it by category. For example, you can show all upcoming events grouped by date.
Organize View by Field

Here's how to group the entries in your View by a field in your form.

  1. Your form needs at least a Date field and a field for Events.
  2. Create a View for your form, and select Classic or Grid. This is the View for the Events. Add the ID of the Events field to display the submitted entries.
  3. In the View builder, click Filter entries and add a filter where the Date field equals [get param="header"]. You can change header to any text you like.
    Organize View by Field
  4. Create a second View for your form and select Classic or Grid. This is the View for the Upcoming Events. Add the ID of the Date field and the shortcode of the first View with the header filter:
    [102]
    [display-frm-data id=100 header="[102]"]
    Replace 100 with the ID of the first View created for Events. Replace 102 with the ID of your header field, which is the Date field.
  5. In the View builder, click Filter entries. Under Uniqueness Rules, click Add unique rule. Then select the Date field, and choose get newest entries. This shows each date only once.
    Organize View by Field - Unique Date
  6. Publish the second View on a page. When you visit that page, you see the upcoming Events entries grouped by date.

Organize View by a Dynamic field

In this example, Form B has a Dynamic field that pulls entries from Form A. Nested Views group the entries by category, with the Dynamic field as the category. Here's how to group the entries in your View by a Dynamic field in your form.

  1. Create a View for the form (Form B) that contains the Dynamic field, and add any content you like. A new View lists all entries.
  2. Click Filter entries and add a filter where your Dynamic field equals [get param=data_id].
    Organize View by Dynamic Field
  3. Create a View for the form that your Dynamic field pulls entries from (Form A).
  4. Add something like this to the Content:
    [x]
    [display-frm-data id=y data_id=[id]]
    Replace x with the ID of a field in Form A. Replace y with the ID of the View created in step 1. Leave [id] as it is. The View fills in each entry's ID.
  5. Publish the second View on a page. When you visit that page, you see entries grouped by category, with the Dynamic field as the category.

Filtering entries

You can filter Views based on parameters in the URL, the current user, date ranges, and more. Find more information on filtering entries.

Link child entry to parent

If the child form includes a Dynamic field to select the parent entry, this links the child entry to the parent entry. There are different ways to set this up.

Show form based on another form

You can show a form only after an entry is submitted in another form. For example, a user verifies their email address before the main form is available to them. Here's how to show Form B only when the email address is verified in Form A.

  1. Create Form A with an Email field, and publish the form on a page.
  2. Create Form B and add some content to it. Only users who verified their email address through Form A see it.
  3. Create a single entry View with entries from Form A. To show a single entry, set the Limit to 1 in Advanced Settings.
  4. In the Listing Page Content box, insert the [formidable id=x] shortcode for Form B.
    Views - Conditionally Show Form
  5. Click Filter entries and set up the View filters like this:
    • Entry key equals [get param=pass_entry default=1]
    • Email equals [get param=email default=1]
    Add default=1 to both filters. A View ignores a filter when its URL parameter is missing. Without a default value, the View shows an entry to anyone who removes the parameters from the URL.
    Views - Conditionally Show Form Filter
  6. In the left settings panel, open No Entries Message. Insert the shortcode for Form A or a link to the published form.
    Views - Conditionally Show Form No Entries
  7. In Form A, go to Settings → Actions & Notifications and open the Send Email action. If the form has none, add a Send Email action. In the To box, insert the shortcode of your Email field, such as [12639], so the email goes to the address the user entered. Then add a verification link to the email message, such as:
    <a href="https://examplesite.com/verified?pass_entry=[key]&email=[12639]">verify your email address by clicking here</a>
    Replace 12639 with the ID of your Email field.
    Views - Conditionally Show Form Email
  8. Publish the View on a page. The View looks for an entry in Form A that matches the data in the URL. It shows its content, the Form B shortcode, only when both the entry key and the email address match an entry in Form A.

Create a unique View URL

You can create a unique View for users who aren't logged in to your site. To set this up, a new form collects an email address and sends that address a link to the matching entry in your main form.

The link to the entry comes from the Single Entry View page, which finds the entry by the email address in its URL. So anyone who knows an email address in your main form can open that page with it and see the link.

Use this setup for entries that aren't private. To keep entries private, ask users to log in and show each user only their own entry.

  1. If you haven't yet, create a View and call it Main Entry View. It displays all the data you want to show your user.
  2. In the View builder, click Filter entries and add a filter that says:
    Entry key equals [get param=pass_entry default="not a valid key"].
    Views - Unique Main Entry View Filter
  3. Publish the Main Entry View.
  4. Create another View and set it up as a Single Entry View: in Advanced Settings, set the Limit to 1.
  5. In the View builder, click Filter entries and add a filter that says:
    Email field equals [get param=pass_email default=none].
    Views - Unique Single Entry View Filter
  6. In the Listing Page Content box, insert a link to the Main Entry View and add [key] to the end as a parameter, for example https://yoursite.com/main-entry-view/?pass_entry=[key].
    Views - Unique Single Entry View Content
  7. Publish your Single Entry View.
  8. Create a form with an Email field.
  9. Go to the form's Settings → General, and set up the form to not store submitted entries.
  10. Go to Settings → Actions & Notifications and add a Send Email action. In the To box, insert the shortcode of the Email field, such as [100]. In the message, include the link to the Single Entry View and add the Email field ID to the end as a parameter, for example https://yoursite.com/single-entry-view/?pass_email=[100]. Replace 100 with the ID or key of the Email field in this new form.

Create a next/previous button on a detail page

You can add Next and Previous buttons to a detail page. The setup uses 3 Views: the main View with a detail page, the Next button View, and the Previous button View.

The main View stays the same. Its detail page is where you add the buttons that move through the previous and next entries.

  1. If you haven't yet, publish your main View with a detail page on a page or post. If you still need a detail page, see how to create a basic detail page.
  2. In the main View, click Sort entries and add a sort: Entry ID → Descending. The main View then lists the newest entries first, and the Previous and Next buttons follow that order.
  3. Click the link for the detail page and copy the URL. Replace the entry ID at the end of the URL with [id]. It looks like this:
    https://yoursite.com/search-results/entry/[id]
    Replace https://yoursite.com/search-results with your detail page URL.
  4. Create a Single Entry View called Previous button View, and set its Limit to 1 in Advanced Settings. This View holds the Previous button to embed in the main View.
  5. In the Listing Page Content box, create a button with the detail page URL you copied. It looks something like this:
    <a href="https://yoursite.com/search-results/entry/[id]" class="frm_button">Previous</a>
    Replace https://yoursite.com/search-results with your detail page URL.
    Previous Button in Detail Page
  6. In the View builder, click Filter entries and add a filter: Entry ID is greater than [get param=pass_entry].
    Previous Button in Detail Page - Filter Entries
  7. Click Sort entries and add a sort: Entry ID → Ascending.
    Previous Button in Detail Page - Sort Entries
  8. In the left settings panel, open No Entries Message and remove the default message. When there's no previous entry, the button area then stays empty instead of showing "No Entries Found".
  9. Create another Single Entry View called Next button View, and set its Limit to 1 in Advanced Settings. This View holds the Next button to embed in the main View.
  10. In the Listing Page Content box, create a button with the detail page URL you copied. It looks something like this:
    <a href="https://yoursite.com/search-results/entry/[id]" class="frm_button">Next</a>
    Replace https://yoursite.com/search-results with your detail page URL.
    Next Button in Detail Page
  11. In the View builder, click Filter entries and add a filter: Entry ID is less than [get param=pass_entry].
    Next Button in Detail Page - Filter Entries
  12. Click Sort entries and add a sort: Entry ID → Descending.
    Next Button in Detail Page - Sort Entries
  13. In the left settings panel, open No Entries Message and remove the default message. When there's no next entry, the button area then stays empty instead of showing "No Entries Found".
  14. Go back to your main View. In the Detail Page Content, embed the View shortcodes of the Previous button View and the Next button View. Add pass_entry=[id] to each shortcode:
    [display-frm-data id=4310 pass_entry=[id]]
    [display-frm-data id=4314 pass_entry=[id]]
    Replace 4310 and 4314 with the IDs of your Previous button View and Next button View, in the order you want the buttons to show.
    Detail Page Previous Next button link
  15. (Optional) To display the Previous and Next links in a single row, use the built-in View class frm_full_row. See View classes for more information. Your content looks something like this:
    <div class="with_frm_style frm_full_row">
    [display-frm-data id=4310 pass_entry=[id]]
    [display-frm-data id=4314 pass_entry=[id]]
    </div>
    Detail Page Previous Next button link row
  16. Click Update to save your changes.

Canonical URL

Formidable filters the canonical URLs of Views to make detail pages and pages with get param filters easier to share. This applies only to the URLs of Views, not to the pages where a View is nested. Read more about canonical URLs.

When a View is nested in a page, some sharing tools link to the View listing page. They don't link to the active detail page or the URL with filters. Some sharing tools, including Facebook and the Safari share option on iOS, always share the URL of the listing page without filters.

To filter the canonical URL for a specific View on a target page, use the get_canonical_url hook.

Troubleshooting

Nested View on a detail page returns no entries

Every View with a detail page watches a URL parameter named after its Detail Page Slug, set in Advanced Settings. That slug defaults to entry.

When View B is nested inside View A's Detail Page Content, both Views share the default entry slug. On a URL like yoursite.com/your-view/entry/30/, View A shows its detail page for entry 30.

View B reads the same parameter and tries to show its detail page for entry 30. Entry 30 belongs to Form A, not Form B, so View B shows "No Entries Found".

View B isn't failing to filter. It's showing the wrong page type.

There are 2 ways to fix this.

Blank the parameter on the nested shortcode. This tells View B to show its listing page:

[display-frm-data id=x entry=""]

Replace x with the ID of View B.

Give View B a unique Detail Page Slug. Use this option when View B needs a working detail page of its own.

Go to View B's Advanced Settings and change the Detail Page Slug to something other than entry. The 2 Views then watch different URL parameters and stop colliding.

Was this article helpful? *

This article may contain affiliate links. Once in a while, we earn commissions from those links. But we only recommend products we like, with or without commissions.

In this article

    We have a small, but amazing team of dedicated people who are committed to helping you achieve your goals and project requirements.


    Copyright © 2026 Strategy11, LLC. Formidable Forms® is a registered trademark Strategy11, LLC.

    Complete your purchase
    Don't forget your purchase!
    Complete Purchase
    Join 400,000+ using Formidable Forms to create form-focused solutions fast. Get Formidable Forms