ProcessMaker has made a number of its PHP functions available be used in triggers and conditions. These functions are defined in the file workflow/engine/classes/class.pmFunctions.php. Many of these functions are wrappers for internal class methods used by ProcessMaker or in Gulliver, which is the development framework used by ProcessMaker.
formatDate() formats a date string according to a given date format and given language. Note that ProcessMaker stores the input in date fields in DynaForms as strings.
Parameters:
'yyyy-mm-dd' or 'yyyy-mm-dd h:i:s', such as '2015-12-31' or '1998-02-07 22:50:08'. This is the same format used to store dates and datetimes by the MySQL database and datetime fields in DynaForms.yyyy - shows the year with four numbers (e.g. it shows the year 2008 as 2008)
yy - shows the year with two numbers (e.g. it shows the year 2008 as 08)
mm - shows the month with two numbers (e.g. it shows June as 06)
m - shows the month with a simple number (e.g. it shows June as 6)
M - shows the word for the month in the selected language (e.g. if the month is June, it shows June in English and junio in Spanish)
dd - shows the month with two numbers (e.g. the first day of the month is 01)
d - shows the month with a simple number (e.g. the first day of the month is 1)
h - shows the hours with two numbers in a 24 hour clock (e.g. 2pm is 14)
i - shows the minutes with two numbers (e.g. first minute is 01)
s - shows the seconds with two numbers (e.g. first second is 01)
'en' (English), 'es' (Spanish) or 'fa' (Persian). If not included, English is set as a default language.Return value:
Note: For other languages, use PHP's strftime() function. See Formatting Dates in Other Locales.
Examples:
The value of @@textBox will be 'June 11, 2008':
The value of @@textBox will be '7 de Junio del 2008':
The value of @@textBox will be '07/06/08 06:45:04':
(in this example, the language parameter is omitted and English is used by default)
getCurrentDate() retrieves the current date in the format "yyyy-mm-dd", with leading zeros in the month and day if less than 10. This function is equivalent to PHP's date("Y-m-d").
Parameters:
Return value:
Example:
If the current date is December 16, 2009:
The value of @@mytextBox will be '2009-12-16'.
getCurrentTime() returns a string with the current time in the format "hh:mm:ss" with leading zeros when the hours, minutes or seconds are less than 10. The hour is expressed in the 24 hour format (military time) and is a number between 00 and 23. This function is equivalent to PHP's date('H:i:s').
Parameters:
Return value:
Example:
If the current time is 9:13 am, then:
The value of the @@curTime will be '09:13:23'.
literalDate() returns a specified date written out in a given language, (e.g, English: "2008-06-11" returns "June 11, 2008", Spanish: "2008-06-11" returns "11 de Junio de 2008").
Parameters:
Return value:
The literal date is returned as a string.
Note: For other languages, use PHP's strftime() function. See Formatting Dates in Other Locales.
Example:
The returned value stored in @@textBox will be 'December 17, 2009'.
capitalize() converts the first letter in each word into an uppercase letter. Subsequent letters in each word are changed into lowercase letters.
Parameters:
Return value:
Example:
Both @@phrase1 and @@phrase2 will be set to "Hello World".
lowerCase() returns a string with all the letters converted into lower case letters.
Parameters:
string textToConvert: A string to convert to lower case letters.Return value:
Example:
Both @@phrase1 and @@phrase2 will be set to "hello world".
upperCase() returns a string converted into all UPPERCASE letters.
Parameters:
Return value:
A string converted into UPPERCASE letters.
Example:
Both @@phrase1 and @@phrase2 will be set to "HELLO WORLD".
userInfo() returns an array with the information about a particular registered user in ProcessMaker. This information is stored in the wf_<WORKFLOW>.USERS table.
Parameters:
@@USER_LOGGED system variable or $_SESSION['USER_LOGGED'].Return Value:
An associative array with the following keys:
| array( | |
| "username", | The user's username, which is used to login to ProcessMaker. |
| "firstname", | The user's first name. |
| "lastname", | The user's last name. |
| "mail", | The user's email address. |
| "status", | The user's status, which can be 'ACTIVE', 'INACTIVE', or 'VACATION'. Only users with 'ACTIVE' status are allowed to login. |
| "address", | The user's address. If more than one line long, this will contain "\n" (new line characters). |
| "phone", | The user's telephone number. |
| "fax", | The user's fax number. |
| "cellular", | The user's cellular telephone number. |
| "birthday", | The user's birthdate in "YYYY-MM-DD" format. |
| "country", | The user's country. |
| "city" | The user's city. |
| ) |
Note: It is recommended to use the PMFInformationUser() function which returns more complete information than the userInfo() function.
Examples:
1. Look up the phone number of the currently logged in user and assign it to a case variable named @@Phone which will be displayed in a subsequent DynaForm field:
2. Look up the address and city of user whose username is "jdoe":
Note: The userInfo() function does not return information about the user's region, photo, resume, role, calendar, replacedby, supervisor or department. This information can be looked up by querying the wf_<WORKSPACE>.USERS table with the executeQuery() function, as shown in the example below:
executeQuery() executes a SQL statement in a database connection or in one of ProcessMaker's internal databases.
Parameters:
string SqlStatement: The SQL statement to be executed, which must begin with SELECT, INSERT, UPDATE, DELETE, EXECUTE, EXEC, SHOW, DESCRIBE, EXPLAIN or BEGIN. To learn basic SQL syntax, see this tutorial."SELECT * FROM USERS", instead of "SELECT * FROM wf_workflow.USERS". SQL key words such are "SELECT" and "WHERE" are case insensitive and can be written as "select" and "Where". If ProcessMaker is installed in Windows, the table and field names in its MySQL databases are also case insensitive by default, but in UNIX/Linux they are case sensitive by default (although this can be changed with the lower_case_table_names setting). If consulting ProcessMaker databases, it is recommended that all table and field names be in UPPERCASE in the SQL statement, so the processes will be exportable between Windows and UNIX/Linux.string DBConnectionUID: Optional. The unique ID of the database connection where the SQL statement will be executed. The unique ID is a string of 32 hexadecimal numbers to uniquely identify database connections, which can be found by opening a process, going to DATABASE CONNECTIONS, and clicking on its Show ID button in the list.'workflow' for the wf_<WORKSPACE> database.
'rbac' for the rb_<WORKSPACE> database.
'rp' for the rp_<WORKSPACE> database.
Return value:
If executing a SELECT, EXECUTE, EXEC, SHOW, DESCRIBE, EXPLAIN or BEGIN statement, it returns an associative array of associative arrays in the format:
The counting of the outer array starts from 1 (not 0 like a normal PHP array). All field values returned by SELECT statements will be strings, regardless of their original type in the database. In most cases, it is not necessary to explicitly convert the values with type casting, because PHP will gracefully convert integers and floating point numbers automatically if a field value is used in a mathematical operation. Datetime controls in DynaForms treat dates as strings, so date values generally do not need to be converted either.
For INSERT statements, the function returns 1 if the operation was successful; otherwise it returns 0.
For UPDATE and DELETE statements, will return the number of affected rows.
If an error occurs in the database query, it returns a string containing the error message. If an error occurs, subsequent executeQuery() function calls to the same database in the same trigger will not execute correctly.
If the SQL statement starts with unrecognized SQL command, then executeQuery() will return FALSE.
Note: If an error occurred in the SQL query, ProcessMaker will add an @@__ERROR__ variable to the case with the contents "It is not possible to execute the query. Please contact your system administrator", which can be viewed when Debug Mode is enabled.
MySQL's error message will be placed in the @@__ERROR__ variable. Do NOT enable debug_sql in the env.ini file, since it will suppress MySQL error messages.
Example 1:
Lookup information about the logged-in ProcessMaker user:
Note 1:
ProcessMaker system and case variables can NOT be inserted in double quoted strings, like this:
Instead, ProcessMaker system and case variables need to be first assigned to normal PHP variables in order to be inserted inside a double quoted string, like this:
Also note that single quoted strings are treated as literal strings, so PHP variables can NOT be inserted in a single quoted string like this:
Note 2:
String, date and datetime values in SQL queries should be enclosed within single quoted strings, while integer and floating-point values should NOT be enclosed within single quotes. If needing to insert an apostrophe in a string, escape it with a backslash. For example:
Some databases like MySQL will accept double quotation marks in place of single quotation marks around strings and dates, but they are not recommended because it is not part of the SQL standard.
Example 2:
Lookup all the users in a ProcessMaker group named "accounting":
Example 3:
The Unique ID for the database connection is different in each process. If planning to reuse the same same code in multiple processes, this code shows how to look up the unique ID for a database connection external database named "company_data" with the table "clients" at 192.168.2.100. This example also shows how to insert, update and delete records in the database:
Example 4:
In this example, executeQuery() is used to look up the next available case to which the logged in user is assigned. If a case is found, then the web browser will automatically be redirected to that case with the G::header() function, otherwise the browser will be redirected to the Case List page. Before redirecting the browser, the current task is automatically routed to the next task in the process with PMFDerivateCase(). This trigger code can be added after the last step in the task, to avoid the user having to see the screen which displays the next assigned user and clicking "Continue".
Other examples:
For an example using executeQuery() to access information about DynaForm file objects and write files to a database, see Accessing Files with PHP. For an example using executeQuery() to populate a grid, see Accessing Grids with PHP.
orderGrid() sorts a grid according to a specified field in ascending or descending order.
Parameters:
Note: The result of this function has to be saved in a Grid in order to see the sorted information, it can be in the same grid or in another grid.
Example:
If your grid is like this:
Then sort the grid by the 'firstname' field:
The result will be the following grid:
evaluateFunction() executes a function on each row in a grid, using the grid fields in operations such as + (addition), - (subtraction), * (multiplication), / (division), and % (remainder). The formula can also use ( ) to group together operations.
Parameters:
grid gridName: The input grid.string Expression: The input expression for the operation among grid fields. The expression always must be enclosed within double quotes, otherwise a fatal error will occur.Return Value:
This function returns an associative array of associative arrays, which is how grids are internally stored in ProcessMaker.
Example:
The following function is executed, which subtracts the 'salary' field from the 'discount' field in each row and assigns the result to the 'total' field:
The result will be the following grid:
These ProcessMaker Functions are generally named PMF...() and are designed to control ProcessMaker from inside a trigger. These functions are executed with the permissions of the currently logged-in user who is running the case.
If needing to execute these functions as a different user, use the corresponding WSDL Web Services or REST endpoints.
PMFTaskCase() returns all the tasks for the specified case which have open delegations.
Parameters:
Return Value:
A list of tasks, with the following structure:
Where:
Example:
PMFTaskList() returns a list of tasks which the specified user has initiated.
Parameters:
Return value:
An array of tasks, with the following structure:
Where:
Example:
PMFUserList() returns a list of users whose status is set to "ACTIVE" for the current workspace.
Parameters:
None.
Return Value:
An array of users, with the following structure:
Where:
Example:
PMFGroupList() returns a list of groups in the current workspace.
Parameters:
None.
Return Value:
An array of groups, with the following structure:
Where:
PMFRoleList() returns a list of all the roles in the current workspace.
Parameters:
Return Value:
Where:
Example:
PMFCaseList() returns a list of the pending cases (i.e., cases which have a status of "To Do" or "Draft") for a specified user. Note that the specified user must be designated to work on the current task for these cases.
Parameters:
Return Value:
A list of cases, with the following structure:
Where:
Example:
PMFProcessList() returns a list of processes for the current workspace.
Parameters:
None.
Return Value:
An array of associative arrays which contain the unique ID and title of processes. The array has the following structure:
Where:
Example:
PMFSendVariables() sends an array of case variables to a specified case. These variables are stored in the wf_<WORKSPACE>.APPLICATION.APP_DATA field and can be displayed by any subsequent DynaForm which has a field name which is the same as the case variable name.
Parameters:
@@APPLICATION.Return Value:
Returns 1 if the variables were sent successfully to the case; otherwise, returns 0 if an error occurred.
Example:
| Warning: Please, take into consideration that this function is NOT supported in ProcessMaker Mobile. It will be available in future versions. |
PMFDerivateCase() derivates (routes) a case to the next task in the process.
Parameters:
@@APPLICATION.@%INDEX. Note that the delegation index changes with each new task in the case, so lookup the index before calling this function.false. If set to true, any triggers which are set to be fired before the case is assigned to the next user will be fired before routing the case. It is not recommended to set the value as true otherwise the function will generate an infinite loop. On the other hand, if this value is set as false the trigger will be executed before assignment .delIndex number, which should be an open task. If not included or set to null, then it will be set to the unique ID of the current logged-in user.Return Value:
Returns 1 if new case was routed successfully; otherwise, returns 0 if an error occurred.
Note 1:
If this function is called for the current task when running a case, then the case to be routed twice--once by PMFDerivateCase() and the second time by the interface running the case. To work around this problem, call the die() function after PMFDerivateCase() to stop the processing and prevent the second derivation (routing). However, if die() is called after a DynaForm step, then it will stop the DynaForm data from getting committed to the database. In this case, use PMFSendVariables() to save the data to the database before calling PMFDerivateCase and die(). See the example below.
Note 2:
This function only works if the currently logged in user is assigned to the task indicated by the delegation parameter. If needing to route/derivate a task which is assigned to another user, login as that user with web services and use routeCase() instead of PMFDerivateCase(). See this code example for routing past the next task in the current case.
Note 3:
The PMFDerivateCase() function can only route tasks which exist in the wf_<WORKSPACE>.APP_DELEGATION table and whose status is 'OPEN'. In other words, this function can't be called on past tasks which are already closed and future tasks which don't yet exist. To route the next task in the case, which doesn't yet exist, see Skipping the Next Task in a Case.
Example 1:
Route the current case onto the next task in the process and redirect the web browser back to Home > Inbox to see the cases list:
Example 2:
To route on a case immediately after a DynaForm step, the data from the DynaForm variables needs to be stored in the database with PMFSendVariables() before calling die(). For example, the DynaForm contains the variables "firstName", "lastName", "address" and "telephone" which need to be saved.
Note: If the trigger is set before the next step (or before assignment if the last step in the task), then it is not necessary to call PMFSendVariables() because the variables from the DynaForm will have already been saved to the database.
Example 3:
To avoid having to click on the Continue button at the end of a task, create the following trigger which is set before assignment:
If the next task is assigned to the same user as the current task, then it can be opened directly without going to the Inbox. Create the following trigger and set it to execute after routing:
PMFNewCaseImpersonate() creates a new case with a user who can impersonate a user with the proper privileges. This function allows any user to create a new case and assign it to another user.
Parameters:
Return Value:
Returns 1 if new case was created successfully; otherwise, returns 0 if an error occurred.
Example:
PMFNewCase() creates a new case starting in the specified task.
Parameters:
@@PROCESS system variable to get the unique ID of the current process.@@TASK system variable for the unique ID of the current task.Return Value:
If an error occurred, it returns zero. Otherwise, it returns a string with the case UID of the new case.
Note:
The status of the new case will automatically be set to "DRAFT". To change the status so the new case will appear in the user's inbox (instead of the draft box), set the value of the wf_<WORKSPACE>.APPLICATION.APP_STATUS field to "TO_DO". See Example 1 below.
Example 1:
Create a new case in the current process, designating the current user to work on the new case. The starting task ID is hard coded in the trigger code and no case variables are set in the new case. After creating the new case, change its status from "DRAFT" to "TO_DO".
Example 2:
Look up the ID of a process named "Expense Report Process" and its starting task. Then, lookup all the users who are assigned to that starting task and randomly choose one to assign to the new case. Set the values of case variables named "Model", "Price" and "OrderDate" in the new case.
Example 3:
Start a new case, setting a grid case variable named "clientsGrid" which has the fields "firstName", "lastName" and "telephone" and has 3 rows of data:
PMFPauseCase() pauses a specified case.
Parameters:
@@APPLICATION system variable to get the unique ID of the current case.@%INDEX.@@USER_LOGGED system variable or $_SESSION['USER_LOGGED']."YYYY-MM-DD" indicating when the case will be unpaused. Ex: "2015-12-31"Return Value:
Returns 1 if the case is paused successfully; otherwise, returns 0 if an error occurred.
PMFunpauseCase() unpauses a specified case.
Parameters:
@@APPLICATION system variable to get the unique ID of the current case.@%INDEX.@@USER_LOGGED system variable or $_SESSION['USER_LOGGED'].Return Value:
Returns 1 if the case is unpaused successfully; otherwise, returns 0 if an error occurred.
PMFAssignUserToGroup() assigns a user to a group. Note that the logged-in user must have the PM_USERS permission in his/her role to be able to assign a user to a group.
Parameters:
Return Value:
Returns 1 if the user was successfully assigned to the group; otherwise, returns 0 if an error occurred.
Example:
Where:
$GroupUID: It is the ID of the employee group.@@USER_LOGGED: This is the user logged ID.$var: As this function returns 1 if it was successfully assigned and 0 if not, this variable store this return value to confirm the assignation.PMFCreateUser() creates a new user with the given data.
Parameters:
'PROCESSMAKER_ADMIN', 'PROCESSMAKER_OPERATOR' or 'PROCESSMAKER_MANAGER'.Return Value:
Example:
PMFUpdateUser() updates a specified user’s information.
Parameters:
'ACTIVE', 'INACTIVE' or 'VACATION'.'PROCESSMAKER_ADMIN', 'PROCESSMAKER_OPERATOR' or 'PROCESSMAKER_MANAGER'.Note: All fields must be filled.
Return Value:
Example:
generateCode() creates a random string of letters and/or numbers of a specified length, which can be used as the PINs (public identification numbers) and codes for cases. For more info, see setCaseTrackerCode().
Parameters:
Return Value:
The generated string of random characters.
Note: There is no checking whether the string returned by generateCode() is unique, so do not use this function to uniquely identify any object in ProcessMaker.
Example:
To create a random string like "4NJQEWPT89AH":
getEmailConfiguration() returns information about the current email configuration.
Return Value:
Returns an associative array with the following information about the email configuration:
| array( | |
| "MESS_PASSWORD", | Encrypted password to login to the email server, such as: "vKbAqYO+urusxc6+xbp+eIF9" |
| "MESS_PASSWORD_HIDDEN", | Always set to "" (empty string. |
| "MESS_ENABLED", | Set to "1" if email notifications are enabled. If not enabled, set to "0". |
| "MESS_ENGINE"], | The email engine which can be "PHPMAILER" to use the PHPMailer program which supports SMTP or "MAIL" to use PHP's mail() function to send the email via the mail transfer agent configured for the ProcessMaker server. |
| "MESS_SERVER", | The IP number or domain name of the email server, such as: "smtp.mail.yahoo.com" |
| "MESS_RAUTH", | Set to true if login needed to send out messages; otherwise set to false. |
| "MESS_PORT", | Port number of the email server, such as "25", "465" or "587". |
| "MESS_ACCOUNT", | The username of the email account. For some email servers, such as gmail, the account name included the full email address, such as:"joedoe@gmail.com" |
| "MESS_BACKGROUND", | HTML code for the background to the email message. Generally set to "" (no background). |
| "MESS_EXECUTE_EVERY", | Time between attempts to send message. If set to "", then uses the default. |
| "MESS_SEND_MAX", | Maximum number of attempts to send the message. If set to "", then uses the default. |
| "SMTPSecure", | The type of secure connection to the email server: "ssl", "tls" or "" (empty string for no secure connection) |
| "MAIL_TO", | Email address to whom the test email will be sent. |
| "MESS_FROM_NAME", | Name of the sender, such as: "ProcessMaker Admin" |
| "MESS_TRY_SEND_INMEDIATLY", | Set to "1" to send out a test email after configuring email server or "false" to not send it. |
| "MESS_FROM_MAIL", | Email address of the sender of emails. In most cases this will be the same as the email account. |
| ) |
Example:
Check whether email notifications are enabled before sending out an email with PMFSendMessage():
setCaseTrackerCode() sets the code and PIN for a case, which are used when an unregistered user logs into the Case Tracker to view the details of a particular case. By default, the code for a case is its case number and its PIN (public identification number) is a semi-random string of 4 characters (numbers and letters) which is autogenerated by ProcessMaker, however, setCaseTrackerCode() can set the case code and PIN to any desired values.
Parameters:
@@APPLICATION. Other cases UIDs can be found with PMFCaseList(), WSCaseList(), caseList() or by querying the field wf_<WORKSPACE>.APPLICATION.APP_UID.@@PIN for the current case.Return Value until version 2.0.45:
If successful, returns zero, otherwise a non-zero error number.
Return Value from version 2.5.1 on:
If successful, returns one, otherwise zero or error number.
Example:
jumping() routes (derivates) a case to the next task in the process (or terminates the case if the last task in the process) and then displays the case list.
Parameters:
@@APPLICATION. For other cases, use PMFCaseList() to obtain the case UID or do a database query to look up the case's unique ID in the field wf_<WORKSPACE>.APPLICATION.APP_UID. Note that the case's UID changes with each new task.@%INDEX. For other cases, use PMFCase() to obtain the delegation index or do a database search in the field wf_<WORKSPACE>.APP_DELEGATION.DEL_INDEX.Return Value:
None.
Example:
Warning: The PMFRedirectToStep function is not supported in the Mobile Version of Processmaker.
PMFRedirectToStep() redirects a case to any step in the current task. In order for the step to be executed, the specified step much exist and if it contains a condition, it must evaluate to true.
Parameters:
@@APPLICATION. For other cases, lookup it up using the PMFCaseList() function or by doing a database query for the field wf_<WORKSPACE>.APPLICATION.APP_UID.@%INDEX.'DYNAFORM', 'INPUT_DOCUMENT', 'OUTPUT_DOCUMENT', or 'EXTERNAL'.Return Value:
None.
Example:
In the following code, the unique ID of the third step object is obtained with the executeQuery function to after redirect the task directly to the 3rd step with the PMFRedirectToStep function:
The PMFSendMessage() function sends out customized email notifications using a template. For more information, see Trigger Messages.
Parameters:
@@APPLICATION. Other case UIDs can be found with the PMFCaseList() function, the WSCaseList() function, the caseList() web service, or by using the executeQuery() function to query the wf_<WORKSPACE>.APPLICATION.APP_UID field in the database.< >. The name may be enclosed inside double quotations, but it isn't necessary:'Liliana Iriarte <liliana@example.com>' or '"Liliana Iriarte" <liliana@example.com>'from parameter to the same email address found in the Email Configuration.< > as shown above. Use the userInfo() function to get a user's email address.For example: "negativeResponse.html" or "caseStatus.txt"
The template file must be located in the mailTemplates directory of the Process Files Manager for the current process (which is stored in the shared/sites/<WORKSPACE>/mailTemplates/<PROCESS-UID>/ directory in the server's file system). The template file can contain system variables, case variables (which weren't defined in the same trigger), or any variables which are passed in the fields parameter. See Notifications for how to insert variables in an email template.
PMFSendMessage() should be passed to the email template using the fields array. See the example below for how to set the values in the fields array.array('/home/foobar/clients/client_03452342.xls', '/var/www/public/profile.pdf', 'http://www.example.com/finances.doc')
By default, files are attached using their original file names, which means that Input Documents, Output Documents and attached files are sent with filenames containing their unique ID and version number. In version 2.0.38 and later, it is possible to rename file attachments by setting the new filename as the array key. For example:
If sending files stored by ProcessMaker, it is recommended to use ProcessMaker's predefined system constants, such as PATH_DATA_PUBLIC, PATH_DATA_MAILTEMPLATES, PATH_DOCUMENT and PATH_SEP, to construct the paths:
PATH_DATA_PUBLIC . "<PROCESS-UID>" . PATH_SEP . "<FILENAME>"PATH_DATA_PUBLIC . @@PROCESS . PATH_SEP . "letterheadLogo.png"PATH_DATA_MAILTEMPLATES . "<PROCESS-UID>" . PATH_SEP . "<FILENAME>"PATH_DATA_MAILTEMPLATES . @@PROCESS . PATH_SEP . "companyProfile.html"PATH_DOCUMENT . "<CASE-UID>" . PATH_SEP . "<CASE-DOC-UID>_<VERSION>.<EXTENSION>"PATH_DOCUMENT . @@APPLICATION . PATH_SEP . "9743702654e6925b52e1e34098864192_1.png"PATH_DOCUMENT . "<CASE-UID>" . PATH_SEP . "outdocs" . PATH_SEP . "<CASE-DOC-UID>_<VERSION>.<EXTENSION>"PATH_DOCUMENT . @@APPLICATION . PATH_SEP . "outdocs" . PATH_SEP . "6960198894e6927e0a40b14004833875_2.pdf"true, which is the default, the the email message will be displayed in the message history. If set to false, then the email message will not be displayed in the message history, although a record of the email will still be stored in the APP_MESSAGE table.@%INDEX. Note that the delegation index changes with each new task in the case, so lookup the index in the APPLICATION.DEL_INDEX field before calling this function.Return Value:
Returns 1 if email was sent to the configured email server; otherwise, returns 0 if an error occurred. In ProcessMaker version 2.X, emails are sent to the email server by cron.php, so the return value only indicates that the email was added to the queue of pending actions for the next execution of cron.php.
When the trigger should be set to fire
Before version 2.0.43, DynaForms did not save the values in their fields as case variables before firing triggers after the DynaForm. It wasn't possible to include variables from a DynaForm, if the trigger was fired after the DynaForm step. Furthermore, if the DynaForm wasn't submitted, then the triggers set to fire after the DynaForm wouldn't execute. For these reasons, it was recommended to set triggers containing the PMFSendMessage() function to fire before the next step or after derivation if the last step in the task. From version 2.0.43 on, these problems have been fixed and the PMFSendMessage() function can be used in triggers which are set to fire after a DynaForm steps.
Example Sending Variables to a Template:
The following trigger code is used to send an email template named "LeaveRequestTemplate.html" to the user working on the current case. An array of variables is passed to PMFSendMessage(), so the @#reqUserName, @#reqSup, @#fromReq, @#toReq and @#daysReq fields will be filled in the template:
Example Emailing Attachments from the Process Files Manager:
The following trigger sends to two files named "companyLogo.png" and "companyProfile.pdf" which are stored in the "public" directory of the Process Files Manager:
Example Emailing Input Document Files:
This trigger emails all the uploaded files for an Input Document whose definition has the ID "8935316924e692b256860c4075654232".
AND AD.APP_DOC_STATUS='ACTIVE'AND AD.DOC_UID='$inDocDef'Example Emailing a File Uploaded to a DynaForm's File Field:
This trigger emails all the files uploaded to file fields for the current case:
Example Emailing Generated Output Document Files:
This trigger emails the PDF and DOC files of the latest version of an Output Document whose definition has the ID "9172068094e6928c34e60f4091788777".
Available Version: From 2.5.2 on.
The PMFAddAttachmentToArray() function is used to add an additional file to an array of files, which can be passed to the PMFSendMessage() function to send out emails with attached files. If a file with the same filename already exists in the array, it will add the file to the array, but rename its index key from "filename.ext" to "filename Copy(X).ext" where X is incremented so the original file doesn't get replaced.
Parameters:
aAttachments parameter of the PMFSendMessage() function..doc, .pdf, etc.index if the filename already exists in the array. Its default value is " Copy({i})", where {i} will be replaced by an auto-incremented number.Return Value:
The modified associative array of files, with the new file added to it. This return value can be used as the aAttachments parameter in the PMFSendMessage() function.
Example:
In this example, the paths to 4 different files named "expenseReport.doc", "accountingGuide.pdf", "expenseReport.doc" and "expenseReport.doc" are in an array. Each file from the array is added as file attachments to an email. The PMFAddAttachmentToArray() function is used avoid overwriting the existing files in the array of file attachments. Then PMFSendMessage() is used to send out the email with the file attachments.
The above trigger code will send an email to manager@acme.com with the attached files named "expenseReport.doc", "accountingGuide.pdf", "expenseReport Copy(2).doc" and "expenseReport Copy(3).doc".
PMFgetLabelOption() returns the label of a specified option from a dropdown box, listbox, checkgroup or radiogroup. Available in version 1-2.2467 and later.
Parameters:
@@PROCESS.fieldName.Return Value:
A string holding the label of the specified option or NULL if the specified option does not exist.
Example:
Where “6962405664a55ed3b36b168077366134” is the UID of the DynaForm which holds the dropdown box and “countries” is the name of the field whose values are displayed as options in the dropdown box. “@@countries” is a variable which holds the ID of the option which has been selected in the dropdown box.
If just trying to find the label from the selected option in a dropdown box, it is not necessary to use PMFgetLabelOption(). From version 1.2-2552 on, dropdown boxes have a new attribute called “saveLabel”. When set to “1”, it permits the value of a label for a selected option to be saved automatically in a variable with the same name as the original variable, but with “_label” added to the end of the variable name. For instance, if trying to find the label of the selected option in the "countries" dropdown box, it can be found in the "@@countries_label" variable.
PMFGenerateOutputDocument() generates a specified Output Document, merging the variables from the current case into the Output Document's template. This function creates the Output Document files in the server file system and adds a new record to the wf_<WORKSPACE>.APP_DOCUMENT table. For more information, see Output Document Storage. If the Output Document has already been generated for the current case, this function will overwrite the existing Output Document files (or add a new version of the files, if the versioning option is enabled.)
Parameters:
UID variable in the URLs with Time Logging.Return Value:
None.
PMFGenerateOutputDocument() can be called at any point in a case, but if a variable which is used in the Output Document template does not yet exist, then the variable name will be inserted in the generated file, not a value for that variable.Examples:
1. If the template file for the Output Document contains a case variable which is set in the same trigger which calls PMFGenerateOutputDocument(), then the case variable will have to first be saved to the database using the PMFSendVariables() function.
For example, the template contains the variables @#ClientName and @#AccountNumber. Those variables will be saved to the database with PMFSendVariables() before calling PMFGenerateOutputDocument().
2. Generate an Output Document for the current case, then open the HTML file which was generated for it and insert it into an email template named "outDocMail.html" which has the inserted variable @#mailBody:
To send a generated Output Document file as an attachment in an email, see this example.
3. Generate an Output Document for the current case and then lookup the generated Output Document files in the APP_DOCUMENT table. Copy the generated DOC and PDF files to another directory in the same server using the copy() function and to a remote server using the ssh2_scp_send() function.
PMFGetUserEmailAddress() returns the email addresses for the specified user(s).
Parameters:
CON_CATEGORY='GRP_TITLE'. This list can either be an array with each recipient in a separate element or a string with each recipient separated by commas ",". If the recipients are all the same type, then set that type in the $prefix parameter. If the list contains a mix of different types, then prepend "usr|", "grp|", "dyn|" or "ext|" before each recipient. For the currently assigned user to a case, use "-1" or "usr|-1".NULL."usr": All the recipients are users, so the $id is a list of unique IDs for users. This is the default value if the parameter is not included."grp": All the recipients are groups, so the $id is a list of unique IDs for groups."dyn": All the recipients are variables, so the $id is a list of case variable names from the case specified in the $APP_UID parameter."ext": All the recipients are external email addresses, so the $id is a list of email addresses.If the $id has mixed types of recipients, then do not include this parameter and specify the type in the $id, separated by vertical bars "|".
Return Value:
A list of email addresses. If the $id is a string, then a string will be returned with each email address separated by commas. If the $id was an array, then an array will be returned of email addresses. If there were no valid recipients in the $id, then the function returns false.
Examples:
Send an email to the currently assigned user for the current case:
To send an email to the currently assigned user and two users with the IDs "79498307748c8645cbed0d2037379255" and "6187429034914a77c452de6051925565" for the current case:
To do the same thing with an array of recipients:
Send out an email to the user IDs found in the case variables @@StoreManager, @@RegionalManager, @@CEO for the current case:
Send out the same email as above, but use the case variables for a case with the ID "1014502514e4556596e2e29033579043" and send the email in that case:
Send an email to users, groups, variables and email addresses. In this example, the email is sent to the currently assigned user to the current case, all the members of a group with the UID of "6538387794e45573cdaa563079341214", a user whose UID is specified in the field "selectedManager" in a DynaForm, and to the email address "john_doe@example.com":
To do the same thing, using an array:
PMFGetNextAssignedUser() returns an array of information about the user designated (i.e., chosen out of the assignment pool) to work on the next task for a specified case.
Parameters:
@@APPLICATION. For other cases, use the PMFCaseList() function or caseList() web service. Alternatively, query the wf_<WORKSPACE>.APPLICATION.APP_UID or wf_<WORKSPACE>.APP_DELEGATION.APP_UID fields in the databaseReturn Value:
An associative array of information about the user to be designated to work on the next task in the specified case, with the following elements:
This function should only be used for tasks which have cyclical assignment, since this function checks who was the last user designated to work on the task (which is stored in the wf_<WORKSPACE>.TASK.TAS_LAST_ASSIGNED field in the database) and then returns the next user in the list. That next user will be assigned to the next case that routes to the task, however, the next case may not be the case specified by the $application parameter. Therefore, it is recommended to use this function in processes which do NOT have multiple cases being executed at the same time. If the process might execute multiple simultaneous cases, then only call this function in a trigger which fires before assignment of the next task.
Example:
Send an email to the designated user for the next task in the current case, warning him/her about an upcoming case to work on. Send the first and last names of the next user as the variables @#firstname and @#lastname to insert in the email template:
PMFDeleteCase() deletes a specified case. Note that a case can only be deleted when it is in its initial task (i.e., when its delegation index is 1). Once the case moves to subsequent tasks in the process, it can only be canceled, so use PMFCancelCase() instead of PMFDeleteCase().
Parameters:
@@APPLICATION. Other cases UIDs can be found with PMFCaseList(), WSCaseList(), caseList() or by querying the field wf_<WORKSPACE>.APPLICATION.APP_UID.Return value:
Example:
Note: In this case, use PMFDerivateCase() to go back to the list of cases.
PMFCancelCase() cancels a specified case
Parameters:
@@APPLICATION system variable to get the unique ID of the current case.@%INDEX system variable.@@USER_LOGGED system variable.Return value:
Example:
The following trigger code cancels the current case and uses the die() function to prevent the next step from be executed:
If wishing to inform the user that the current case was cancelled, instead of using G::header() to redirect to the Inbox, print a message on screen:
print "Current case cancelled.";
Available Version: From 2.5.0 on.
PMFAddInputDocument() adds an Input Document file to a specified case.
Parameters:
SELECT CON_ID FROM CONTENT WHERE CON_CATEGORY='INP_DOC_TITLE' AND CON_VALUE='INPUT-DOC-TITLE'null or "" (empty string) if adding a new file.null or "" for add, "R" for replace or "NV" for new version.@@APPLICATION system variable to get the unique ID of the current case.@%INDEX for the current case.WHERE DEL_THREAD_STATUS='OPEN'."file"Return value:
Example:
Create an Input Document in ProcessMaker. Look up its current ID and assign it to the variable named inputDocumentUid. Set the values to ‘null’ of the application document Id and to ‘Add’ of the Document Action if it is the first time you are running the process.
Set the following trigger to execute before the Input Document files will be displayed:
If the same document needs to be uploaded as a new version, copy the Document Id previously added with the following parameters:
Note: Don’t forget to enable versioning when defining the Input Document. Otherwise, it won’t be possible to upload another version of the same Input Document file.
Available Version: From 2.5.0 on.
PMFAddCaseNotes() returns a string of information about the case notes added during a process. This function is available from version 2.5 on.
Parameters:
@@APPLICATION system variable to get the unique ID of the current case.@@PROCESS system variable.@@TASK system variable for the unique ID of the current task.$userUid: (Required) The unique ID of the user who will add the case note. Note that it is NOT possible to include the UID of more than one user.$note: (Required) Note of the case.$sendMail: (Optional) If set to 1, will send an email to all participants in the case.Return Value:
Returns 1 if the note has been successfully added to the case, otherwise returns 0 if an error has occurred.
Example:
Note: It is possible to use System or Process Variables when the description of the case note is defined. For instance if you want to add the resolution number which will be a value extracted from a Dynaform field, define the parameter as follows:
As you can see in the above example, the process variable is concatenated with the description using the following syntaxis ' . variablename'
PMFGetCaseNotes() returns a list of the cases notes posted for a specified case. This function is available from version 2.0.41 on.
Parameters:
@@APPLICATION.'array' if the result will be displayed in a grid. Set to 'string' to return a string, which can be displayed in a textarea field. The default value is 'array'.@@USER_LOGGED system variable.Note: It's not possible to define more than one user ID on the last parameter.
Return Value:
If the $type is set to 'array', then this function returns an array of associative arrays with the following structure:
YYYY-MM-DD HH:MM:SS format.
)
...
Note that the counting of the array starts from 1, not 0.
If the $type is set to 'string', then this function returns a string which includes the name and username of the user who posted the case note, the content of the case note, and the date-time when posted:
Create a grid with the return values to show:
Then create a DynaForm and inside it add the grid previously created and name it gridPMFunction:
Then create a trigger with the following parameters:
Where:
@@gridPMFunction: name of the grid added inside the DynaForm and where results will be shown.
@@APPLICATION: UID of the current process.
array: results to show, in the case of the example, results will be shown in a grid.
Note: The last parameter is empty so it will display case notes of all users who have created one.
Assign the trigger before the DynaForm created and the results will be as the image below:

In the example the trigger was assigned in the second task, so all case notes added on the first task and even on the second task will be displayed on the grid.
Create a Dynaform with a textarea called textAreaPMFunction,
Then create a trigger as follows:
Where:
@@textAreaPMFuntion : name of the textarea added in the DynaForm and where results will be shown.
@@APPLICATION: UID of the current process.
string: results to show, in the case of the example they will be shown in a textarea.
Note: The last parameter is empty so it will display case notes of all users who have created one.
Assign the trigger before the DynaForm, the result will be:

PMFInformationUser() retrieves more information about a specified user than the userInfo() function. The PMFInformationUser() function is available in version 2.0.46 and later and is not compatible with previous versions of ProcessMaker. In contrast, the userInfo() function can be used with any version of ProcessMaker.
Parameters:
@@USER_LOGGED system variable or $_SESSION['USER_LOGGED'].Return Value:
An associative array with the following keys:
"YYYY-MM-DD" format. Ex: "1970-11-24"INACTIVE or VACATION. Use the PMFInformationUser() function a second time to get his/her name.'YYYY-MM-DD' format. Ex: "2020-12-31"ACTIVE, INACTIVE or VACATION.CON_ID='<DEPARTMENT-UID>' AND CON_CATEGORY='DEPO_TITLE'PMFInformationUser() function a second time to get his/her name.NORMAL, SINGLE (for a single application), SIMPLIFIED (for mobile interfaces), or SWITCHABLE (to be able to change between the normal and the simplified interfaces).<INSTALL-DIRECTORY>/shared/sites/<WORKSPACE>/usersPhotographies/<USER-UID>.gif/opt/processmaker/shared/sites/workflow/usersPhotographies/9108004215481b57a6e38b3002299563.gifhttp://<IP-ADDRESS>/sys<WORKSPACE/<LANG>/<SKIN>/users/users_ViewPhotoGrid?pUID=<USER-UID>http://example.com/sysworkflow/en/neoclassic/users/users_ViewPhotoGrid?pUID=9108004215481b57a6e38b3002299563Example showing user information in a grid:
First, create a grid form which has the following fields:
Second, create a DynaForm with a grid field which is named "UserInformation", which holds the grid form defined above.
Third, create a trigger with the following code:
Where: @@UserInformation[1]: Name of the grid where information will be displayed. Moreover, the grid name is defined as [1] because the return value is a grid and it has to start on 1 to display information on the corresponding fields.
Set the above trigger to fire before the DynaForm.
Running a case, the user's information will be displayed in the grid:

Also, this function can be created by using the Trigger Wizard:

Example showing a group of users in a grid:
This example shows a grid in a DynaForm which lists information about the users in a group named "Managers".
First, create a grid form which has the following fields:
Second, create a DynaForm with a grid field which is named "ListGroup", which holds the grid form defined above.
Third, create the following trigger which will use the executeQuery() function to look up the members of a group named "Managers". It then loops through the list of users and looks up information about each user and adds it to an array name "ListGroup" which will be displayed in the grid. Remember that grids are stored as an associative array of associative arrays, where the outer array is numbered, starting from 1 for each row in the array and the keys in the inner array are the fields in the grid:
Example looking up information about the Supervisor:
The following trigger code retrieves information about the current logged-in user and then looks up information about the user's supervisor, whose unique ID is listed in the 'reportsto' key of the array. It also uses the executeQuery() function to look up the name of the department in the CONTENT table. The trigger then uses the G:SendMessageText() function to display a message in the next screen telling the user to contact his/her supervisor:
Note that the PHP variables which are inserted in the $msg string are enclosed in {...} (curly brackets) so that they can access the array's key correctly.
Available Version: 2.8.0 or later (or in Hotfix 2.5.2.4)
The PMFRemoveMask() function removes the mask of a currency field, by deleting the thousands separator (which is a "." (period) or "," (comma) and the currency symbol, such as "$", "€", "£" or "¥". Call this function before using a currency field in a mathematical calculation which requires a number rather than a string.
Parameters:
"." (period). In most European and Latin American countries, the thousands separator is "," (comma).Return Value
A string with the the currency and thousands separator removed.
Note: PMFRemoveMask() returns a string. In most cases this is not a problem, because PHP will automatically convert the string into a number if it is used with a mathematical operator (+, -, *, /, %, etc.) or compared (==, !=, >, >=, < or <=) with a number. Nonetheless, it may be a good idea to convert the string into a real number using the floatval() or into an integer using the intval() functions, in order to avoid potential problems.
Example in a trigger:
Use the PMFRemoveMask() function to delete the mask of a value introduced in a currency field named "Amount". Then use the is_numeric() function to check whether it can be converted into a number. If so, then convert it to a real number and then subtract 10% from the amount for a discount. If not a valid number, then use the G:SendMessageText() function to display a warning message to the user on the next screen:
For instance, if the value of @=Amount is "$5,000.00", then it will be converted into "5000.00" and floatval() will convert it into 5000.00 (a real number). Notice that the coma (,) and the dollar sign ($) were removed from the string.
Note: Case variables which are passed as the first parameter of PMFRemoveMask() should be referenced as @@field-name or @=field-name, so that they are maintained as text. Do NOT use @#field-name or @%field-name, since PHP will try to convert the value to a number, which probably will not work correctly, depending on the mask.
Example in a condition:
Depending on a value introduced in a field, the following condition is used to decide whether the workflow moves to subsequent task(s):
This condition can be used inside an evaluation routing rule:

Automate your Workflow with Business Process Management
Privacy Statement
© Copyright 2000-2026 Decisions All rights reserved.

