//to add checkboxes add_filter( 'gravityflow_step_settings_fields', 'add_workflow_checkboxs', 10, 2 ); function add_workflow_checkboxs( $settings, $current_step_id ): array { $step = gravity_flow()->get_step( $current_step_id ); if ( $step ) { $stepType = $step->get_type(); //need step to check step type to show checkbox only on start step if ( $stepType == 'workflow_start' ) { $settings[0]['fields'][] = array( //drilling down to right part of array and adding GV approval checkbox 'label' => esc_html__( 'Delay Workflow', 'gravityflow' ), 'type' => 'checkbox', 'name' => 'delay_workflow_checkbox', 'tooltip' => 'Check this box if you want the workflow to start on Gravity View approval INSTEAD of form submission.', 'choices' => array( array( 'label' => esc_html__( 'Delay the workflow until Gravity View approval', 'gravityflow' ), 'name' => 'delay_workflow_checkbox', ), ), ); $settings[0]['fields'][] = array( //drilling down to right part of array and adding restart on subscription payment checkbox 'label' => esc_html__( 'Restart Workflow', 'gravityflow' ), 'type' => 'checkbox', 'name' => 'restart_workflow_checkbox', 'tooltip' => 'Check this box if you want the workflow to restart on each subscription payment made through this form.', 'choices' => array( array( 'label' => esc_html__( 'Restart the workflow on subscription payment', 'gravityflow' ), 'name' => 'restart_workflow_checkbox', ), ), ); $form = gravity_flow()->get_current_form(); $date_fields = GFCommon::get_fields_by_type( $form, [ 'date' ] ); if ( ! empty( $date_fields ) ) { $date_field_choices = []; foreach ( $date_fields as $date_field ) { $date_field_choices[] = [ 'label' => $date_field['label'], 'value' => $date_field['id'], ]; } } if ( ! empty( $date_field_choices ) ) { array_unshift( $date_field_choices , array( 'label' => 'Select a date field', 'value' => '' ) ); $settings[0]['fields'][] = [ 'name' => 'update_date_field', 'label' => 'Update Date Field', 'type' => 'select', 'choices' => $date_field_choices, 'tooltip' => 'Select the date field to update with the current date on subscription payment workflow restarts.', 'style' => 'width: auto;', 'fields' => [ [ 'name' => 'also_for_gv', 'label' => 'Also update the date field on Gravity View Approval', 'type' => 'checkbox', 'choices' => [ [ 'label' => '', 'name' => 'also_for_gv', ] ] ] ] ]; } } } return $settings; } add_action( 'gravityflow_step_start', 'start_workflow_conditional_control', 10, 5 ); function start_workflow_conditional_control( $step_id, $entry_id, $form_id, $step_status, $step ): void { $delay_view_approval = $step->__get( 'delay_workflow_checkbox' ); if ( $delay_view_approval ) { $entry = GFAPI::get_entry( $entry_id ); $api = new Gravity_Flow_API( $form_id ); $status = $api->cancel_workflow( $entry ); if ( $status ) { gravity_flow()->add_timeline_note( $entry_id, 'Initial workflow cancelled. Set to start on View approval.' ); } } } //to start workflow on approval add_action( 'gravityview/approve_entries/approved', 'restart_workflow_on_approval', 10, 1 ); function restart_workflow_on_approval( $entry_id ): void { $entry = GFAPI::get_entry( $entry_id ); manual_start_workflow( $entry, 'delay_workflow_checkbox' ); } //to restart workflow on subscription payment add_action( 'gform_post_add_subscription_payment', 'restart_workflow_on_subscription_payment', 10, 2 ); function restart_workflow_on_subscription_payment( $entry, $action ): void { if ( $action['type'] == 'add_subscription_payment' ) { //check right action happened manual_start_workflow( $entry, 'restart_workflow_checkbox' ); } } function manual_start_workflow( $entry, $checkbox_name ): void { $form_id = $entry['form_id']; $api = new Gravity_Flow_API( $form_id ); $workflow_status = $api->get_status( $entry ); $start_step = gravity_flow()->get_workflow_start_step( $form_id, $entry ); $is_checkbox_checked = $start_step->__get( $checkbox_name ); //check checkbox is currently checked if ( $checkbox_name === 'restart_workflow_checkbox' || $start_step->__get( 'also_for_gv' ) ) { $field_id = $start_step->__get( 'update_date_field' ); if ( $entry[$field_id] ) { $original_date = $entry[ $field_id ]; GFAPI::update_entry_field( $entry['id'], $field_id, date( 'Y-m-d' ) ); } } if ( ('cancelled' === $workflow_status || 'complete' === $workflow_status ) && $is_checkbox_checked ) { $steps = $api->get_steps(); array_shift( $steps ); $first_step = $steps[0]; if ( $first_step ) { $restart_reason = $checkbox_name === 'restart_workflow_checkbox' ? 'subscription payment' : 'Gravity View Approval'; gravity_flow()->add_timeline_note( $entry['id'], "Workflow started because of $restart_reason." ); if ( isset( $original_date ) ) { add_action( 'gravityflow_post_process_workflow', function() use ( $entry, $field_id, $original_date ) { GFAPI::update_entry_field( $entry['id'], $field_id, $original_date ); } ); } $api->send_to_step( $entry, $first_step->get_id() ); } } } add_action( 'gform_entry_detail_sidebar_middle', function ( $form, $entry ) { $start_step = gravity_flow()->get_workflow_start_step( $form['id'], $entry ); if ( $start_step ) { $delay_view_approval = $start_step->__get( 'delay_workflow_checkbox' ); $restart_workflow_checkbox = $start_step->__get( 'restart_workflow_checkbox' ); if ( ! $delay_view_approval && ! $restart_workflow_checkbox ) { return; } $nonce = wp_create_nonce( 'restart_workflow_nonce' ); if (isset( $_POST['restart_workflow_nonce'] ) && wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['restart_workflow_nonce'] ) ), 'restart_workflow_nonce' ) && isset( $_POST['restart-workflow-button'] ) && ( $_POST['restart-workflow-button'] === 'restart_workflow_checkbox' || $_POST['restart-workflow-button'] === 'delay_workflow_checkbox') ) { manual_start_workflow( $entry, $_POST['restart-workflow-button'] ); } ob_start(); ?>