ldc-sbv/wp-content/plugins/ninja-forms/includes/Routes/Submissions.php
2021-09-21 15:01:08 +02:00

227 lines
No EOL
8.2 KiB
PHP

<?php if ( ! defined( 'ABSPATH' ) ) exit;
/**
* Class NF_Routes_SubmissionsActions
*/
final class NF_Routes_Submissions extends NF_Abstracts_Routes
{
/**
* Set the API routes for submissions
*
* @since 3.4.33
*/
public function __construct(){
add_action('rest_api_init', [ $this, 'register_routes'] );
}
/**
* Register REST API routes related to submissions actions
*
* @since 3.4.33
*
* @route "ninja-forms-submissions/export"
* @route 'ninja-forms-submissions/email-action"
*/
function register_routes() {
register_rest_route('ninja-forms-submissions', 'export', array(
'methods' => 'POST',
'args' => [
'form_ids' => [
'required' => true,
'description' => esc_attr__('Array of Form IDs we want to get the submissions from.', 'ninja-forms'),
'type' => 'JSON encoded array',
'validate_callback' => 'rest_validate_request_arg',
],
'start_date' => [
'required' => true,
'description' => esc_attr__('strtotime($date) that represents the start date we will retrieve submssions at.', 'ninja-forms'),
'type' => 'string',
'validate_callback' => 'rest_validate_request_arg',
],
'end_date' => [
'required' => true,
'description' => esc_attr__('strtotime($date) that represents the end date we will retrieve submssions at.', 'ninja-forms'),
'type' => 'string',
'validate_callback' => 'rest_validate_request_arg',
],
],
'callback' => [ $this, 'bulk_export_submissions' ],
'permission_callback' => [ $this, 'permission_callback' ],
));
register_rest_route('ninja-forms-submissions', 'email-action', array(
'methods' => 'POST',
'args' => [
'submission' => [
'required' => true,
'description' => esc_attr__('Submission ID', 'ninja-forms'),
'type' => 'int',
'validate_callback' => 'rest_validate_request_arg',
],
'action_settings' => [
'required' => true,
'description' => esc_attr__('Email Action Settings', 'ninja-forms'),
'type' => 'object',
'validate_callback' => 'rest_validate_request_arg',
],
],
'callback' => [ $this, 'trigger_email_action' ],
'permission_callback' => [ $this, 'permission_callback' ],
));
}
/**
* Secure endpoint to allowed users
*
* Security disclosure regarding <=3.5.7 showed that any logged in user
* could export form data, possibly exposing personally identifiable
* information. Permissions changed such that only admin can export
* submission data; a filter enables one to override that permission if
* desired.
*
* @since 3.4.33
*
* Already passed Nonce validation via wp_rest and x_wp_nonce header checked
* against rest_cookie_check_errors()
*/
public function permission_callback(WP_REST_Request $request) {
//Set default to false
$allowed = false;
// Allow only admin to export personally identifiable data
$permissionLevel = 'manage_options';
$allowed= \current_user_can($permissionLevel);
/**
* Filter permissions for Triggering Email Actions
*
* @param bool $allowed Is request authorized?
* @param WP_REST_Request $request The current request
*/
return apply_filters( 'ninja_forms_api_allow_email_action', $allowed, $request );
}
/**
* Bulk_export_submissions
*
* @since 3.4.33
*
* @return array of CSVs by form
*/
public function bulk_export_submissions(WP_REST_Request $request) {
//Gather data from the request
$data = json_decode($request->get_body());
if( !empty( $data->form_ids ) && !empty( $data->start_date ) && !empty( $data->end_date ) ){
$form_ids = explode( ",", $data->form_ids);
$start_date = $data->start_date;
$end_date = $data->end_date;
} else if( !empty( $_GET['form_ids'] ) && !empty( $_GET['start_date'] ) && !empty( $_GET['end_date'] ) ) {
$form_ids = explode( ",", $_GET['form_ids'] );
$start_date = $_GET['start_date'];
$end_date = $_GET['end_date'];
} else {
return new WP_Error( 'malformed_request', __('This request is missing data', 'ninja-forms') );
}
//Set params to perform query
$params = (new NF_Exports_SubmissionCollectionFilterParameters())
->setStartDate($start_date)
->setEndDate($end_date)
->setHiddenFieldTypes(['submit', 'html', 'divider'])
->setUseAdminLabels(true)
;
// Construct a collection with provided parameters
foreach ($form_ids as $formId) {
$submissionsCollection = (new NF_Exports_SubmissionCollectionCPT($formId))
->filterByParameters($params);
$csvObject = (new NF_Exports_SubmissionCsvExport())
->setSubmissionCollection($submissionsCollection);
$csv[$formId] = $csvObject->handle(true);
}
// Return CSV objects
return $csv;
}
/**
* Trigger Email Action endpoint callback
*
* @since 3.4.33
*
* @return bool|int depending on the value returned by wp_mail
*/
public function trigger_email_action(WP_REST_Request $request) {
//Extract required data
$data = json_decode($request->get_body());
$form = Ninja_Forms()->form( $data->formID );
$sub = $form->get_sub( $data->submission );
$field_values = $sub->get_field_values();
//Throw error if we're missing data
if( !isset($data) || empty($form) || empty($sub) ) {
return new WP_Error( 'malformed_request', __('This request is missing data', 'ninja-forms') );
}
//Process Merge tags
$action_settings = $this->process_merge_tags( $data->action_settings, $data->formID, $sub );
//Process Email Action
$email_action = new NF_Actions_Email();
$result = $email_action->process( (array) $action_settings, $data->formID, (array) $field_values );
//Return true if wp_mail returned true or the submission ID if it failed.
$return = !empty($result['actions']['email']['sent']) && true === $result['actions']['email']['sent'] ? $result['actions']['email']['sent'] : $sub->get_seq_num();
return $return;
}
/**
* Process Merge tags for a given Value
*
* @since 3.4.33
*
* @return object of Email Action Model with merge tags settingsprocessed
*
*/
public function process_merge_tags( $data, $form_id, $sub) {
// Init Field Merge Tags.
$fields_merge_tag_object = Ninja_Forms()->merge_tags[ 'fields' ];
$fields_merge_tag_object->set_form_id($form_id);
//Process Fields Merge Tags
$fields = Ninja_Forms()->form( $form_id )->get_fields();
$fields = new NF_Adapters_SubmissionsSubmission( $fields, $form_id, $sub );
foreach( $fields as $field_id => $field){
$fields_merge_tag_object->add_field( $field );
}
//Add All Fields merge tags
$fields_merge_tag_object->include_all_fields_merge_tags();
//include fields to the {all_fields_table} and {fields_table} mrerge tags
foreach( $fields as $field_id => $field){
$fields_merge_tag_object->add_field( $field );
}
//Loop through Action settings and apply merge tags
$array_data = (array) $data;
foreach( $array_data as $ind => $value ){
if( !empty($value) && is_string($value) ){
//Merge tag
$data->$ind = apply_filters( 'ninja_forms_merge_tags', $value );
}
}
return $data;
}
}