: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
$filePath = $export->getFilePath();
'downloadUrl'=>$downloadUrl,
* Delete a file when provided valid file path
* @param WP_REST_Request $request Object with `file_path` property
public function delete_download_file(WP_REST_Request $request)
//Gather data from the request
$data = json_decode($request->get_body());
if(!empty($data->file_path)){
$filePath = (string)$data->file_path;
$deleteFile = (new DeleteBatchFile())->delete($filePath);
return new WP_Error('malformed_request', __('This request is missing data for method delete_download_file', 'ninja-forms'));
* Trigger Email Action endpoint callback
* @return bool|int depending on the value returned by wp_mail
public function trigger_email_action(WP_REST_Request $request) {
$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') );
$formSettings = Ninja_Forms()->form($data->formID)->get_settings();
'settings'=>$formSettings,
foreach($field_values as $index => $field_value){
$id = str_replace('_field_', '', $index);
$model = Ninja_Forms()->form($data->formID)->get_field( $id );
$settings = $model->get_settings();
$data_send['fields_by_key'][$id] = $settings;
$data_send['fields_by_key'][$id]['settings'] = $settings;
$data_send['fields_by_key'][$id]['value'] = $field_value;
$data_send['fields_by_key'][$id]['settings']['value'] = $field_value;
$data_send['fields'][$id] = $settings;
$data_send['fields'][$id]['settings'] = $settings;
$data_send['fields'][$id]['value'] = $field_value;
$data_send['fields'][$id]['settings']['value'] = $field_value;
$action_settings = $this->process_merge_tags( $data->action_settings, $data->formID, $sub );
$email_action = new NF_Actions_Email();
$result = $email_action->process( (array) $action_settings, $data->formID, $data_send );
//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();
* Process Merge tags for a given Value
* @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 ){
$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 ){
$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) ){
$data->$ind = apply_filters( 'ninja_forms_merge_tags', $value );
* @return array of submissions for a Form
public function get_submissions(WP_REST_Request $request) {
//Gather data from the request
if( empty( $_GET["type"] ) || empty( $_GET["form_ids"] )){
return new WP_Error( 'malformed_request', __('This request is missing data', 'ninja-forms') );
$form_ids = $_GET["form_ids"];
$page_size = !empty( $_GET["page_size"] ) ? $_GET["page_size"] : "10";
$current_page = !empty( $_GET["current_page"] ) ? $_GET["current_page"] : "1";
$start_date = $_GET["start_date"] != 0 ? $_GET["start_date"] : 378687600;
// If no end date is specified, then use current time plus one day
// to ensure it goes beyond all time zones
$end_date = $_GET["end_date"] != 0 ? $_GET["end_date"] : time()+(60*60*24);
$search_term = !empty($_GET["search_term"]) ? $_GET["search_term"] : null;
$status = !empty($_GET["status"]) && $_GET["status"] === "trash" ? ["trash"] : ['active', 'publish'];
//Get aggregated submissions
$params = (new SubmissionFilterFactory())->maybeLimitByLoggedInUser()->setNfFormIds([$form_ids]);
if(!empty($start_date) && !empty($end_date)){
$params->setStartDate($start_date);
$params->setEndDate($end_date);
$params->setSearchString( $search_term );
$params->setStatus( $status );
$submissionAggregate = (new SubmissionAggregateFactory())->submissionAggregate();
$filteredSubmissions = $submissionAggregate->filterSubmissions( $params );
//Get values of needed submissions
if( $type === "columns" ){
$response = $submissionAggregate->getFieldDefinitionCollection();
} else if( $type === "data" ){
$aggregatedSubmissions = $submissionAggregate->getAggregatedSubmissions();
$offset = ($current_page - 1) * $page_size;
$submissions_needed = array_slice( $aggregatedSubmissions, $offset, $page_size );
foreach( $submissions_needed as $key => $params ){
$response['data'][$key] = $submissionAggregate->getSubmissionValuesByAggregatedKey( $key );
$response['count'] = $submissionAggregate->getSubmissionCount();
// Return submissions data from request
return rest_ensure_response( $response );
* Save submissions interface settings
* Data passes a json string
* @param WP_REST_Request $request
public function set_submissions_settings(WP_REST_Request $request){
$data = $request->get_json_params();
$setting = $data['settingName'];
$new_data = $data['data'];
$form_id = $data['formID'];
//Get data stored and create the new value for the correct setting
$option = get_option( 'ninja_forms_submissions_settings' );
$current_setting_value = $option[$form_id][$setting];
$updated_option = $option;
$updated_option[$form_id][$setting] = $new_data;
if ( false !== $option ) {
if ( $current_setting_value === $new_data ) {
$response->message = "unchanged";
$response->status = false;
$response->message = "update_option";
$response->status = update_option( 'ninja_forms_submissions_settings', $updated_option );
$response->message = "add_option";
$response->status = add_option( 'ninja_forms_submissions_settings', $updated_option );
return rest_ensure_response( json_encode( $response ) );
* Get submissions interface settings
* @param WP_REST_Request $request
* @return array of settings
public function get_submissions_settings(WP_REST_Request $request){
$settings = get_option( 'ninja_forms_submissions_settings' );
return rest_ensure_response( json_encode( $settings ) );
* Request deletion of a collection of submissions
* Data passes as a collection of single submission entities keyed
* {"submissions": SingleSubmission[]}
* @param WP_REST_Request $request
public function delete_submissions(WP_REST_Request $request){
$data = json_decode($request->get_body());
$submissions = $data->submissions;
$submissionAggregate = (new SubmissionAggregateFactory())->submissionAggregate();
foreach($submissions as $obj){
$singleSubmission = SingleSubmission::fromArray((array)$obj);
$submissionAggregate->deleteSingleSubmission($singleSubmission);
* Request restoration of a collection of submissions
* Data passes as a collection of single submission entities keyed
* {"submissions": SingleSubmission[]}
* @param WP_REST_Request $request
public function restore_submissions(WP_REST_Request $request){
$data = json_decode($request->get_body());
$submissions = $data->submissions;
$submissionAggregate = (new SubmissionAggregateFactory())->submissionAggregate();
foreach($submissions as $obj){
$singleSubmission = SingleSubmission::fromArray((array)$obj);
$submissionAggregate->restoreSingleSubmission($singleSubmission);
* Request update of a single submission
* Data passes as a single submission entity keyed under submission
* {"submission": SingleSubmission}
* @param WP_REST_Request $request
public function update_submission(WP_REST_Request $request){
$data = json_decode($request->get_body(),true);
$singleSubmissionArray = $data['singleSubmission'];
$singleSubmission = SingleSubmission::fromArray($singleSubmissionArray);
$submissionAggregate = (new SubmissionAggregateFactory())->submissionAggregate();
$submissionAggregate->updateSingleSubmission($singleSubmission);
* Handle extra request for submissions
* This is a starting proof of concept that triggers a download for the PDF submissions add-on
* Data passes as a single submission entity keyed under submission and a Class to call the handler under handleExtra key
* "submission": SingleSubmission,
* "handleExtra": HandleExtraClassName
* @param WP_REST_Request $request
* @return object with string of responseType, blob of PDF download and string of blobType
public function handle_extra_submission(WP_REST_Request $request){
$data = json_decode($request->get_body(),true);
$singleSubmissionArray = $data['singleSubmission'];
$singleSubmission = SingleSubmission::fromArray($singleSubmissionArray);
$submissionAggregate = (new SubmissionAggregateFactory())->submissionAggregate();
$populatedSubmission = $submissionAggregate->requestSingleSubmission($singleSubmission);
$extraHandler = $data['handleExtra'];
/** @var SubmissionHandler $object */
if(class_exists($extraHandler)){
$object = new $extraHandler;
$response = $object->handle($populatedSubmission);
// Handlers using NinjaForms\Includes\Abstracts\SubmissionHandler
// already pass through entity, but it is not guaranteed that all
// handlers will use the abstract
$arrayFromEntity = (SubmissionExtraHandlerResponse::fromArray($response))->toArray();