Using GRAV Group-Based Permissions

Upon login, we wanted to present users with just the directories and pages they had access to.
In order to do this, we used GRAV group-based permissions.

First we must modify sidebar.html.twig to display the folders/pages only if the user’s group matches the client in the folder/page header.

Using GRAV admin panel Editor plugin, navigate to sidebar.html.twig and insert the boxed line below:


The next step is to create a group and assign permissions to the group. Once this group is made, users can be assigned to the group and will inherit the permissions. This will make the pages only viewable to users with this custom permission. This prevents random users from going to the URL to view the page.

Add a user/config/groups.yaml file with something like this:


  readableName: ‘CDA’

  description: ‘The group of premium members’



      login: true

      cda: true

The user given access must be given group assignment and have site.login set to YES:


Once this is done, we can make pages/folders just for this group by creating new folder/page and going to “Expert” section.

For folder/directories, place this in the Expert Frontmatter:



        – CDA

For pages, place this in the Expert Frontmatter:



        – CDA


    site.cda: true

Tips for Formatting Excel CSV File from Infor Process Designer

When using IPDesigner to create a .csv file, we ran into four issues with the file output:

  1. Problem: Certain dates appear as ######## and certain numbers convert to scientific notation.
    Solution: Select entire page (ctrl + a) and click Home tab -> Format -> AutoFit Column Width

  2. Problem: Some numbers remain in scientific notation (ex: 1E+12) even after AutoFit Column Width
    Solution: In the FileAccess node, wrap the SQL query variable with quotation marks and put a “=” before it.
    (For example, <!SQLQuery2650_USER_FIELD1> would become =“<!SQLQuery2650_USER_FIELD1>”)

  3. Problem: Strings with commas get split at the comma in a csv file.
    Example in file: The value “Anchin, Block, & Anchin” is getting split into 3 columns as the flow is interpreting the commas as separators.

    Solution: In the FileAccess node, wrap the SQL query variable with quotation marks to include the commas as part of the string.

  4. Problem: Certain number values lose their zeroes at the front when written to csv format.
    Example in file: The values in column C should be 001, 002, etc. instead of 1,2.

    Solution: In the FileAccess node, wrap the SQL query variable with quotation marks and put a “=” before it.
    (For example, <!SQLQuery2650_USER_FIELD3> would become =“<!SQLQuery2650_USER_FIELD3>”)




Infor Lawson Query Wizard Troubleshooting

We had trouble with the Infor Lawson Query Wizard either timing out or returning a “No Data Found” message when loading in a .dme query.

This is a compiled list of troubleshooting suggestions for the Query Wizard found on Nogalis presentations/Infor documentation/Lawsonguru forums.

1. Limitations of the Query Wizard

  1. “No Data Found” Message

  1. Try increasing Data Response Timeout value to 9999 (min 30 max 9999) in Set User Preferences (green/yellow arrows)

If this fails, try experimenting with the different options for When encountering error messages

  1. On the Criteria tab, try changing Maximum Primary Records to Return to 0 (default 600, max 65520, 0 defaults to max 65520) and Maximum OTM Values to Return (max 600) fields

  1. Troubleshooting tips from Nogalis LawsonMSAddins PowerPoint

Creating an Email Contact Form in Grav/Docr

Here is a step-by-step guide for creating an email contact form in Grav/Docr


  1. Install “Email” Plugin if not already installed. The simplest way to do this is through the admin panel:

  1. Rename the Markdown file to (instead of for example) and include this code snippet (or similar) in the YAML portion at the top of the page below “title”:



name: contact


–   name: name

label: Name

placeholder: Enter your name

autocomplete: on

type: text


required: true


–   name: email

label: Email

placeholder: Enter your email address

type: email


rule: email

required: true


–   name: message

label: Message

size: long

placeholder: Enter your message

type: textarea


required: true



–   type: submit

value: Submit

–   type: reset

value: Reset



–   email:

from: “{{ }}”

to: “{{ }}”

subject: “[Healthcheck Contact Form] {{|e }}”

body: “{% include ‘forms/data.html.twig’ %}”

–   save:

fileprefix: contact-

dateformat: Ymd-His-u

extension: txt

body: “{% include ‘forms/data.txt.twig’ %}”

–   message: Thank you for getting in touch regarding your healthcheck report!

–   display: thankyou


















Full example of YAML:

We can place any page content below this YAML portion. Our contact form will show up on the bottom of the page after all page content.

  1. Inside the page folder (in which the is placed), create a subfolder named “thankyou” with a file named “” with this snippet:

title: Email sent

cache_enable: false


twig: true


## Email sent successfully!

This will result in a “Email sent” success screen when the user clicks submit on the contact form:

  1. Final Step – Configuring Email Plugin settings. Full email configuration documentation can be found here (


Set-up for Google SMTP (Gmail)

  1. Enable IMAP in your Gmail by going to Settings -> Forwarding and POP/IMAP -> IMAP Access

  1. Enable “Less secure apps” in your user account settings (

  1. From Admin dashboard, go to Plugin -> Email to configure settings:

Fill out configuration:





IIS Manager “Web Platform Installer” Troubleshooting

IIS Manager “Web Platform Installer” Troubleshooting

Nearly all guides regarding installing PHP in IIS recommend using the Web Platform Installer as it will take care of all the additional installs/configurations associated with PHP.

The Error:
When attempting to install PHP through Web PI, this RunPHP Helper error occurs, which stops all of the following installs as well:

This occurs because IIS attempts to download RunPHP Helper from using Internet Explorer (IE). Unfortunately, Internet Explorer has issues accessing that site even if it will work perfectly fine in Chrome or other browsers.

The Solution:
Open IE and click the gear icon in the upper right and go to “Internet Options”:

Click on the “Advanced” tab:

Enable all the TLS options and click OK:

Test it out by visiting using IE. If the page loads, the Web Platform Installer in the IIS Manager should now be able to install RunPHP Helper.

Grav – A Modern Flat-File CMS

09Grav is an open source flat-file CMS that we have started experimenting with for client documentation. Since it requires no database, it is a simple and great alternative to providing documentation without using separate .doc files. The search feature is especially nice for when you want to search through all documentation.

Demo site for GRAV rtfm skeleton:


Here are some things we’ve learned along the way:

Installing Plugins:

Admin Panel and Editor are very important plugins to have.

Admin Panel creates an admin dashboard at URL sitename/admin. From here, you can install other plugins, edit pages, manage users, and change configuration settings.

Install by going to your GRAV root folder in a terminal and calling your php.exe with “bin/gpm install admin”

In our case, the php.exe used was within my xampp folder.

Editor is a very useful plugin that provides a “Edit” section in the admin sidebar that allows any authorized users to modify any PHP, Javascript, CSS, Twig, Markdown, and YAML files. This allows for easy editing of any file directly from the admin dashboard!


Install by going to your GRAV root folder in a terminal and calling your php.exe with “bin/gpm install editor”


To modify the css, access user/themes/learn2/css-compiled/theme.css

In this case, we modified the file to left align all my elements by changing the #chapter ID since my page files are This can be achieved by changing these four “center” properties to “left”

(Before) Center aligned:

(After) Left aligned:

Another case is when we modified sidebar font-size by modifying #sidebar ul.topics > li > a in css-compiled/theme.css

Sidebar Logo (top left):
To change the sidebar logo from default GRAV image, access user/themes/learn2/templates/partials/logo.html.twig

To change the admin sidebar logo from default GRAV image, access: user/plugins/admin/themes/grav/templates/partials/logo.html.twig

Replace what is in the file with the SVG code of the image. This was done by converting a PNG to SVG using

Example of what SVG looks like:


To modify the sidebar on the left, access user\themes\learn2\templates\partials\sidebar.html.twig
In this case, we wanted to remove the check marks indicating that we had visited that page along with the “Clear History” button on the bottom of the sidebar.

This can be done by removing the relevant lines in the file.

Where to keep your images
We ran into an issue where the images in the images folder would disappear upon caching. This was due to the images folder being in the wrong place. Even though there is a default “images” folder in the root folder, this is not the place to store your images.

Per the official Grav documentation, the images folder should be placed within user/pages:

Do not put images in here:

Instead put them in user/pages/images as depicted here:

On the pages themselves (.md files), link to the images by going up one folder and accessing the images folder with the format (..\images\imagename.png):


Be careful when using underscores (“_”) in the .md file
In markdown, surrounding a word with underscores will result in italicizing that word. This could become an issue since many files we deal with use underscores to separate timestamps from the file name.

Take this line for example:

Based on that code, we want the page to look like this:

Instead we get an unwanted italicized word and the removal of an underscore between CODE and RELATION:

The problem can be fixed by “escaping” the underscore by putting a backslash in front of it. Keep in mind that even if we were to escape the underscore between CODE and RELATION, the Markdown language would then try to find the next underscore and would italicize all words in between the underscores (marked in green).

This code:

Will use the underscores boxed in green to italicize all in between them (and removes the underscore in front of “configuration”):

To resolve this, make sure to escape all underscores:

Grav File Uploads

In admin panel, we can add users with these 2 permissions (admin.login and admin.pages):

This creates a user who can log into the admin panel and can edit pages.

When these users go to edit the pages, there is a section that allows media uploads.

“Edit page” page:

These users can also access the “edit page” page through the edit links on the site itself:

These are the files types supported by Grav:

(Although csv is not listed here, it was able to be added as a xml media type and verified to be working)

Once you upload the file and save the page, anyone who has access to this “edit page” page can download/view the file by clicking on the eye “View” icon:

The uploaded files go into the same directory as the markdown page itself.

Clicking the + “Insert” icon will insert the file in the page like so:

Which looks like this on the page:

Clicking it displays the file on the page for .txt, .pdf, .json and .csv. Downloads it immediately for .docx files (these are the 5 I tested):

Issue: When clicking the “View” eye icon for .txt files, there is an error regarding permissions. (It works fine when actually inserted into the page and clicked on from there)

Clearing Cache

CLI commands:
cd ~/webroot/my-grav-project

bin/grav clear-cache

IP Designer Error

When trying to open IPDesigner, we ran into this error:


Opening the log reveals a java.lang.StackOverflowError:


This error was fixed by going to (C:\IPDesigner\ADTALEMPRD\workspace\.metadata\.plugins\org.eclipse.ui.workbench)
And removing workbench.xml. We opted to rename it to workbench_old.xml and when we restarted IPDesigner, it generated a new workbench.xml and started working correctly.