$notification ) {
if ( $id == $notification_id ) {
return $notification;
}
}
return array();
}
/**
* Displays the Notification page.
*
* If the notification ID is passed, the Notification Edit page is displayed.
* Otherwise, the Notification List page is displayed.
*
* @since Unknown
* @access public
*
* @uses GFNotification::notification_edit_page()
* @uses GFNotification::notification_list_page()
*
* @return void
*/
public static function notification_page() {
$form_id = rgget( 'id' );
$notification_id = rgget( 'nid' );
if ( ! rgblank( $notification_id ) ) {
self::notification_edit_page( $form_id, $notification_id );
} else {
self::notification_list_page( $form_id );
}
}
/**
* Builds the Notification Edit page.
*
* @access public
*
* @used-by GFNotification::notification_page()
* @uses GFFormsModel::get_form_meta()
* @uses GFNotification::get_notification()
* @uses GFNotification::validate_notification
* @uses GFFormsModel::sanitize_conditional_logic()
* @uses GFFormsModel::trim_conditional_logic_values_from_element()
* @uses GFFormsModel::save_form_notifications()
* @uses GFCommon::add_message()
* @uses GFCommon::json_decode()
* @uses GFCommon::add_error_message()
* @uses GFFormSettings::page_header()
* @uses GFNotification::get_notification_ui_settings()
* @uses SCRIPT_DEBUG
* @uses GFFormsModel::get_entry_meta()
* @uses GFFormSettings::output_field_scripts()
* @uses GFFormSettings::page_footer()
*
* @param int $form_id The ID of the form that the notification belongs to
* @param int $notification_id The ID of the notification being edited
*
* @return void
*/
public static function notification_edit_page( $form_id, $notification_id ) {
GFFormSettings::page_header( esc_html__( 'Notifications', 'gravityforms' ) );
if ( ! self::get_settings_renderer() ) {
self::initialize_settings_renderer();
}
// Render settings.
self::get_settings_renderer()->render();
GFFormSettings::page_footer();
}
/**
* Get Notification settings fields.
*
* @since 2.5
*
* @param array $notification Notificationbeing edited.
* @param array $form The Form object.
*
* @return array
*/
private static function settings_fields( $notification, $form ) {
// Get notification events.
$events = self::get_notification_events( $form );
// Prepare notification events as choices.
$events_choices = array();
foreach ( $events as $name => $label ) {
$events_choices[] = array(
'label' => $label,
'value' => $name,
);
}
// Get notification services.
$services = self::get_notification_services();
// Prepare notification services as choices.
$services_choices = array();
foreach ( $services as $name => $service_meta ) {
$services_choices[] = array(
'label' => rgar( $service_meta, 'label' ),
'value' => $name,
'icon' => rgar( $service_meta, 'image' ),
'onclick' => "jQuery(this).parents('form').submit();",
);
}
/**
* Disable the From Email warning.
*
* @since 2.4.13
*
* @param bool $disable_from_warning Should the From Email warning be disabled?
*/
$disable_from_warning = gf_apply_filters( array( 'gform_notification_disable_from_warning', $form['id'], rgar( $notification, 'id' ) ), false );
$from_email_warning = '';
// Prepare From Email warning.
if ( ! $disable_from_warning && self::get_settings_renderer()->get_value( 'service' ) === 'wordpress' ) {
// Get From Email address.
$from_address = self::get_settings_renderer()->get_value( 'from' );
// Determine if From Email is invalid
$is_invalid_from_email = ! empty( $from_address ) && ! self::is_valid_notification_email( $from_address );
// Display warning message if not using an email address containing the site domain or {admin_email}.
if ( ! $is_invalid_from_email && ! self::is_site_domain_in_from( $from_address ) ) {
$from_email_warning = sprintf(
'
%s
',
sprintf(
esc_html__( 'Warning! Using a third-party email in the From Email field may prevent your notification from being delivered. It is best to use an email with the same domain as your website. %sMore details in our documentation.%s', 'gravityforms' ),
'',
''
)
);
}
}
// Prepare To Type field.
if ( 'hidden' === rgar( $notification, 'toType' ) ) {
$to_type = array(
'name' => 'toType',
'type' => 'hidden',
'default_value' => 'hidden',
);
} else {
$to_type = array(
'name' => 'toType',
'label' => esc_html__( 'Send To', 'gravityforms' ),
'tooltip' => gform_tooltip( 'notification_send_to_email', null, true ),
'type' => 'radio',
'horizontal' => true,
'choices' => array(
array(
'label' => esc_html__( 'Enter Email', 'gravityforms' ),
'value' => 'email',
),
array(
'label' => esc_html__( 'Select a Field', 'gravityforms' ),
'value' => 'field',
),
array(
'label' => esc_html__( 'Configure Routing', 'gravityforms' ),
'value' => 'routing',
'tooltip' => gform_tooltip( 'notification_send_to_routing', null, true ),
),
),
'default_value' => 'email',
);
}
$fields = array(
array(
'title' => esc_html__( 'Notifications', 'gravityforms' ),
'fields' => array(
array(
'name' => 'name',
'label' => esc_html__( 'Name', 'gravityforms' ),
'type' => 'text',
'required' => true,
),
array(
'name' => 'service',
'label' => esc_html__( 'Email Service', 'gravityforms' ),
'type' => 'radio',
'choices' => $services_choices,
'default_value' => $services_choices[0]['value'],
'hidden' => count( $services_choices ) === 1,
),
array(
'name' => 'event',
'label' => esc_html__( 'Event', 'gravityforms' ),
'tooltip' => gform_tooltip( 'notification_event', null, true ),
'type' => 'select',
'choices' => $events_choices,
'hidden' => count( $events_choices ) === 1,
),
$to_type,
array(
'name' => 'toEmail',
'label' => esc_html__( 'Send To Email', 'gravityforms' ),
'type' => 'text',
'required' => true,
'default_value' => '{admin_email}',
'dependency' => array(
'live' => true,
'fields' => array(
array(
'field' => 'toType',
'values' => array( 'email' ),
),
),
),
'validation_callback' => function( $field, $value ) {
// Determine if valid.
$is_valid = GFNotification::is_valid_notification_email( $value );
// Get filter parameters.
$to_type = GFNotification::get_settings_renderer()->get_value( 'toType' );
$to_field = GFNotification::get_settings_renderer()->get_value( 'toField' );
/**
* Allows overriding of the notification destination validation
*
* @since Unknown
*
* @param bool $is_valid True if valid. False, otherwise.
* @param string $gform_notification_to_type The type of destination.
* @param string $gform_notification_to_email The destination email address, if available.
* @param string $gform_notification_to_field The field that is being used for the notification, if available.
*/
$is_valid = apply_filters( 'gform_is_valid_notification_to', $is_valid, $to_type, $value, $to_field );
if ( ! $is_valid ) {
$field->set_error( __( 'Please enter a valid email address.', 'gravityforms' ) );
}
},
),
array(
'name' => 'toField',
'label' => esc_html__( 'Send To Field', 'gravityforms' ),
'type' => 'field_select',
'required' => true,
'args' => array( 'input_types' => array( 'email' ) ),
'no_choices' => esc_html__( 'Your form does not have an email field. Add an email field to your form and try again.', 'gravityforms' ),
'fields_callback' => array( self::class, 'append_filtered_notification_email_fields' ),
'dependency' => array(
'live' => true,
'fields' => array(
array(
'field' => 'toType',
'values' => array( 'field' ),
),
),
),
'validation_callback' => function ( $field, $value ) {
// Get filter parameters.
$to_type = GFNotification::get_settings_renderer()->get_value( 'toType' );
$to_email = GFNotification::get_settings_renderer()->get_value( 'toEmail' );
/**
* Allows overriding of the notification destination validation
*
* @since Unknown
*
* @param bool $is_valid True if valid. False, otherwise.
* @param string $gform_notification_to_type The type of destination.
* @param string $gform_notification_to_email The destination email address, if available.
* @param string $gform_notification_to_field The field that is being used for the notification, if available.
*/
$is_valid = apply_filters( 'gform_is_valid_notification_to', ! empty( $value ), $to_type, $to_email, $value );
if ( ! $is_valid ) {
$field->set_error( __( 'Please select an Email Address field.', 'gravityforms' ) );
}
},
),
array(
'name' => 'routing',
'type' => 'notification_routing',
'dependency' => array(
'live' => true,
'fields' => array(
array(
'field' => 'toType',
'values' => array( 'routing' ),
),
),
),
),
array(
'name' => 'fromName',
'label' => esc_html__( 'From Name', 'gravityforms' ),
'tooltip' => gform_tooltip( 'notification_from_name', null, true ),
'type' => 'text',
'class' => 'merge-tag-support mt-position-right mt-hide_all_fields',
),
array(
'name' => 'from',
'label' => esc_html__( 'From Email', 'gravityforms' ),
'tooltip' => gform_tooltip( 'notification_from_email', null, true ),
'type' => 'text',
'class' => 'merge-tag-support mt-position-right mt-hide_all_fields',
'default_value' => '{admin_email}',
'after_input' => $from_email_warning,
'validation_callback' => function( $field, $value ) {
if ( ! empty( $value ) && ! GFNotification::is_valid_notification_email( $value ) ) {
$field->set_error( __( 'Please enter a valid email address or merge tag in the From Email field.', 'gravityforms' ) );
}
},
),
array(
'name' => 'replyTo',
'label' => esc_html__( 'Reply To', 'gravityforms' ),
'tooltip' => gform_tooltip( 'notification_reply_to', null, true ),
'type' => 'text',
'class' => 'merge-tag-support mt-position-right mt-hide_all_fields',
'validation_callback' => function( $field, $value ) {
if ( ! empty( $value ) && ! GFNotification::is_valid_notification_email( $value ) ) {
$field->set_error( __( 'Please enter a valid email address or merge tag in the Reply To field.', 'gravityforms' ) );
}
},
),
array(
'name' => 'cc',
'label' => esc_html__( 'CC', 'gravityforms' ),
'tooltip' => gform_tooltip( 'notification_cc', null, true ),
'type' => 'text',
'class' => 'merge-tag-support mt-position-right mt-hide_all_fields',
'dependency' => function() use ( $form, $notification ) {
/**
* Enable the CC Notification field.
*
* @since 2.3
*
* @param bool $enable_cc Should the CC field be enabled?
* @param array $notification The current notification object.
* @param array $from The current form object.
*/
return gf_apply_filters( array( 'gform_notification_enable_cc', $form['id'], rgar( $notification, 'id' ) ), false, $notification, $form );
},
'validation_callback' => function( $field, $value ) {
if ( ! empty( $value ) && ! GFNotification::is_valid_notification_email( $value ) ) {
$field->set_error( __( 'Please enter a valid email address or merge tag in the CC field.', 'gravityforms' ) );
}
},
),
array(
'name' => 'bcc',
'label' => esc_html__( 'BCC', 'gravityforms' ),
'tooltip' => gform_tooltip( 'notification_bcc', null, true ),
'type' => 'text',
'class' => 'merge-tag-support mt-position-right mt-hide_all_fields',
'validation_callback' => function( $field, $value ) {
if ( ! empty( $value ) && ! GFNotification::is_valid_notification_email( $value ) ) {
$field->set_error( __( 'Please enter a valid email address or merge tag in the BCC field.', 'gravityforms' ) );
}
},
),
array(
'name' => 'subject',
'label' => esc_html__( 'Subject', 'gravityforms' ),
'type' => 'text',
'class' => 'merge-tag-support mt-position-right mt-hide_all_fields',
'required' => true,
),
array(
'name' => 'message',
'label' => esc_html__( 'Message', 'gravityforms' ),
'type' => 'textarea',
'use_editor' => true,
'required' => true,
),
array(
'name' => 'disableAutoformat',
'label' => esc_html__( 'Auto-formatting', 'gravityforms' ),
'tooltip' => gform_tooltip( 'notification_autoformat', null, true ),
'type' => 'checkbox',
'choices' => array(
array(
'name' => 'disableAutoformat',
'label' => esc_html__( 'Disable auto-formatting', 'gravityforms' ),
),
),
),
array(
'name' => 'enableAttachments',
'label' => esc_html__( 'Attachments', 'gravityforms' ),
'tooltip' => gform_tooltip( 'notification_attachments', null, true ),
'type' => 'checkbox',
'choices' => array(
array(
'name' => 'enableAttachments',
'label' => esc_html__( 'Attach uploaded fields to notification', 'gravityforms' ),
),
),
'dependency' => function() use ( $form ) {
$upload_fields = GFCommon::get_fields_by_type( $form, array( 'fileupload' ) );
return ! empty( $upload_fields );
}
),
array(
'name' => 'conditionalLogic',
'label' => esc_html__( 'Conditional Logic', 'gravityforms ' ),
'type' => 'conditional_logic',
'object_type' => 'notification',
'checkbox' => array(
'label' => esc_html__( 'Enable conditional logic', 'gravityforms' ),
'hidden' => false,
),
),
array(
'type' => 'save',
'value' => esc_html__( 'Update Notification', 'gravityforms' ),
),
),
),
);
// Append registered legacy settings to the fields array.
$fields = self::append_legacy_settings_fields( $fields, $notification, $form );
/**
* Filters the Notification settings fields before they are displayed.
*
* @since 2.5
*
* @param array $fields Form settings fields.
* @param array $form Form Object.
*/
$fields = gf_apply_filters( array( 'gform_notification_settings_fields', $form['id'] ), $fields, $notification, $form );
return $fields;
}
/**
* Pass the field choices for the select field through the gform_email_fields_notification_admin filter to allow
* third-parties to add or remove arbitrary fields.
*
* @since 2.5.7
*
* @param array $fields The form fields to be used as choices.
* @param array $form The form belonging to the notification being configured.
*
* @return array
*/
public static function append_filtered_notification_email_fields( $fields, $form ) {
return gf_apply_filters( array( 'gform_email_fields_notification_admin', $form['id'] ), $fields, $form );
}
/**
* Appends any legacy settings fields to the fields array, if they exist.
*
* @since 2.5.6
*
* @param array $fields Array of settings fields.
* @param array $notification The notification being edited.
* @param array $form The form being edited.
*
* @return array
*/
private static function append_legacy_settings_fields( $fields, $notification, $form ) {
/**
* Add new or modify existing notification settings that display on the Notification Edit screen.
*
* @deprecated
* @since 1.7
*
* @param array $ui_settings An array of settings for the notification UI.
* @param array $notification The current notification object being edited.
* @param array $form The current form object to which the notification being edited belongs.
* @param null $is_valid Whether or not the current notification has passed validation. (Deprecated.)
*/
$legacy_settings = apply_filters( 'gform_notification_ui_settings', array(), $notification, $form, null );
if ( empty( $legacy_settings ) ) {
return $fields;
}
// Add the Legacy Settings section.
$fields[] = array(
'title' => esc_html__( 'Legacy Settings', 'gravityforms' ),
'class' => 'gform-settings-panel--full',
'fields' => array(
array(
'name' => 'legacy',
'type' => 'html',
'html' => function() use ( $legacy_settings ) {
$html = '';
},
),
),
);
return $fields;
}
// # SETTINGS RENDERER ---------------------------------------------------------------------------------------------
/**
* Initialize Plugin Settings fields renderer.
*
* @since 2.5
*/
public static function initialize_settings_renderer() {
if ( ! class_exists( 'GFFormSettings' ) ) {
require_once( GFCommon::get_base_path() . '/form_settings.php' );
}
$form_id = rgget( 'id' );
$notification_id = rgget( 'nid' );
if ( ! rgempty( 'gform_notification_id' ) ) {
$notification_id = rgpost( 'gform_notification_id' );
}
$form = GFFormsModel::get_form_meta( $form_id );
/**
* Filters the form to be used in the notification page
*
* @since 1.8.6
*
* @param array $form The Form Object
* @param int $notification_id The notification ID
*/
$form = gf_apply_filters( array( 'gform_form_notification_page', $form_id ), $form, $notification_id );
$notification = ! $notification_id ? array() : self::get_notification( $form, $notification_id );
// Prepare initial values.
$initial_notification = $notification;
$initial_notification['toEmail'] = rgar( $notification, 'toType' ) === 'email' ? rgar( $notification, 'to' ) : '';
$initial_notification['toField'] = rgar( $notification, 'toType' ) === 'field' ? rgar( $notification, 'to' ) : '';
$initial_notification['notification_conditional_logic'] = is_array( rgar( $notification, 'conditionalLogic' ) );
$initial_notification['notification_conditional_logic_object'] = rgar( $notification, 'conditionalLogic' );
// Initialize new settings renderer.
$renderer = new Settings(
array(
'initial_values' => $initial_notification,
'save_callback' => function( $values ) use ( &$notification, &$form, &$notification_id ) {
// Determine if new notification.
$is_new_notification = empty( $notification ) || empty( $notification_id );
// Set notification ID.
if ( $is_new_notification ) {
$notification_id = $notification['id'] = uniqid();
}
// Save values to the confirmation object in advance so non-custom values will be rewritten when we apply values below.
$notification = GFFormSettings::save_changed_form_settings_fields( $notification, $values );
$notification['name'] = rgar( $values, 'name' );
$notification['service'] = rgar( $values, 'service' );
$notification['event'] = rgar( $values, 'event' );
$notification['toType'] = rgar( $values, 'toType' );
$notification['to'] = rgar( $values, 'toType' ) === 'email' ? rgar( $values, 'toEmail' ) : ( rgar( $values, 'toType' ) === 'field' ? rgar( $values, 'toField' ) : '' );
$notification['from'] = rgar( $values, 'from' );
$notification['fromName'] = rgar( $values, 'fromName' );
$notification['replyTo'] = rgar( $values, 'replyTo' );
$notification['cc'] = rgar( $values, 'cc' );
$notification['bcc'] = rgar( $values, 'bcc' );
$notification['subject'] = rgar( $values, 'subject' );
$notification['message'] = rgar( $values, 'message' );
$notification['disableAutoformat'] = (bool) rgar( $values, 'disableAutoformat' );
$notification['enableAttachments'] = (bool) rgar( $values, 'enableAttachments' );
// Set the conditional logic object, and clear it if conditional logic is disabled
$conditionalLogicObject = rgar( $values, 'notification_conditional_logic_object' );
$notification['conditionalLogic'] = rgar( $values, 'notification_conditional_logic' ) && is_array( $conditionalLogicObject ) ? GFFormsModel::sanitize_conditional_logic( $conditionalLogicObject ) : null;
if ( isset( $values['routing'] ) && ! empty( $values['routing'] ) ) {
$routing_logic = array( 'rules' => $values['routing'] );
$routing_logic = GFFormsModel::sanitize_conditional_logic( $routing_logic );
$notification['routing'] = $routing_logic['rules'];
}
/**
* Filters the notification before it is saved
*
* @since 1.7
*
* @param array $form The Form Object.
* @param bool $is_new_notification True if it is a new notification. False otherwise.
*
* @param array $notification The Notification Object.
*/
$notification = gf_apply_filters( array(
'gform_pre_notification_save',
$form['id'],
), $notification, $form, $is_new_notification );
// Save notification.
$notification = GFFormsModel::trim_conditional_logic_values_from_element( $notification, $form );
$form['notifications'][ $notification_id ] = $notification;
RGFormsModel::save_form_notifications( $form['id'], $form['notifications'] );
self::$_saved_item_id = $notification_id;
},
'before_fields' => function() use ( &$form, $form_id, &$notification, $notification_id ) {
?>
function() use ( &$notification_id ) {
printf( '', esc_attr( $notification_id ) );
}
)
);
// Save renderer to class.
self::set_settings_renderer( $renderer );
// Define settings fields.
self::get_settings_renderer()->set_fields( self::settings_fields( $notification, $form ) );
if ( self::is_save_redirect( 'nid' ) ) {
self::get_settings_renderer()->set_save_message_after_redirect();
}
// Process save callback.
if ( self::get_settings_renderer()->is_save_postback() ) {
self::get_settings_renderer()->process_postback();
self::redirect_after_valid_save( 'nid' );
}
}
/**
* Gets the current instance of Settings handling settings rendering.
*
* @since 2.5
*
* @return false|Settings
*/
public static function get_settings_renderer() {
return self::$_settings_renderer;
}
/**
* Sets the current instance of Settings handling settings rendering.
*
* @since 2.5
*
* @param Settings $renderer Settings renderer.
*
* @return bool|WP_Error
*/
private static function set_settings_renderer( $renderer ) {
// Ensure renderer is an instance of Settings
if ( ! is_a( $renderer, 'Gravity_Forms\Gravity_Forms\Settings\Settings' ) ) {
return new WP_Error( 'Renderer must be an instance of Gravity_Forms\Gravity_Forms\Settings\Settings.' );
}
self::$_settings_renderer = $renderer;
return true;
}
// # NOTIFICATION LIST ---------------------------------------------------------------------------------------------
/**
* Displays the notification list page
*
* @since Unknown
* @access public
*
* @used-by GFNotification::notification_page()
* @uses GFNotification::maybe_process_notification_list_action()
* @uses GFFormsModel::get_form_meta()
* @uses GFFormSettings::page_header()
* @uses GFNotificationTable::__construct()
* @uses GFNotificationTable::prepare_items()
* @uses GFNotificationTable::display()
* @uses GFFormSettings::page_footer()
*
* @param int $form_id The form ID to list notifications on.
*
* @return void
*/
public static function notification_list_page( $form_id ) {
// Handle form actions
self::maybe_process_notification_list_action();
$form = RGFormsModel::get_form_meta( $form_id );
$notification_table = new GFNotificationTable( $form );
$notification_table->prepare_items();
GFFormSettings::page_header();
?>
array(
'label' => esc_html__( 'WordPress', 'gravityforms' ),
'image' => admin_url( 'images/wordpress-logo.svg' )
)
);
/**
* Filters the list of notification services.
*
* @since 1.9.16
*
* @param array $services The services available.
*/
return gf_apply_filters( array( 'gform_notification_services' ), $services );
}
/**
* Get the notification events for the current form.
*
* @since Unknown
* @access public
*
* @param array $form The current Form Object.
*
* @return array Notification events available within the form.
*/
public static function get_notification_events( $form ) {
$notification_events = array( 'form_submission' => esc_html__( 'Form is submitted', 'gravityforms' ) );
if ( rgars( $form, 'save/enabled' ) ) {
$notification_events['form_saved'] = esc_html__( 'Form is saved', 'gravityforms' );
$notification_events['form_save_email_requested'] = esc_html__( 'Save and continue email is requested', 'gravityforms' );
}
/**
* Allow custom notification events to be added.
*
* @since Unknown
*
* @param array $notification_events The notification events.
* @param array $form The current form.
*/
return apply_filters( 'gform_notification_events', $notification_events, $form );
}
/**
* Validates email addresses within notifications.
*
* @since Unknown
* @access private
*
* @uses GFCommon::is_invalid_or_empty_email()
*
* @param $text String containing comma-separated email addresses.
*
* @return bool True if valid. Otherwise, false.
*/
public static function is_valid_notification_email( $text ) {
if ( empty( $text ) ) {
return false;
}
$emails = explode( ',', $text );
foreach ( $emails as $email ) {
$email = trim( $email );
$invalid_email = GFCommon::is_invalid_or_empty_email( $email );
// this used to be more strict; updated to match any merge-tag-like string
$invalid_variable = ! preg_match( '/^{.+}$/', $email );
if ( $invalid_email && $invalid_variable ) {
return false;
}
}
return true;
}
/**
* Checks if notification from email is using the site domain.
*
* @since 2.4.12
*
* @param string $from_email Email address to check.
*
* @return bool
*/
private static function is_site_domain_in_from( $from_email ) {
// If {admin_email} is used check email from WP settings.
if ( strpos( $from_email, '{admin_email}' ) !== false ) {
$from_email = get_bloginfo( 'admin_email' );
}
return GFCommon::email_domain_matches( $from_email );
}
/**
* Gets supported routing field types.
*
* @since Unknown
* @access public
*
* @uses GFNotification::$supported_fields()
*
* @return array $field_types Supported field types.
*/
public static function get_routing_field_types() {
/**
* Filters the field types supported by notification routing
*
* @since 1.9.6
*
* @param array GFNotification::$supported_fields Currently supported field types.
*/
$field_types = apply_filters( 'gform_routing_field_types', self::$supported_fields );
return $field_types;
}
/**
* Gets a dropdown list of available post categories
*
* @since Unknown
* @access public
*/
public static function get_post_category_values() {
$id = 'routing_value_' . rgpost( 'ruleIndex' );
$selected = rgempty( 'selectedValue' ) ? 0 : rgpost( 'selectedValue' );
$dropdown = wp_dropdown_categories( array( 'class' => 'gfield_routing_select gfield_routing_value_dropdown gfield_category_dropdown', 'orderby' => 'name', 'id' => $id, 'selected' => $selected, 'hierarchical' => true, 'hide_empty' => 0, 'echo' => false ) );
die( $dropdown );
}
/**
* Delete a form notification
*
* @since Unknown
* @access public
*
* @uses GFFormsModel::get_form_meta()
* @uses GFFormsModel::flush_current_forms()
* @uses GFFormsModel::save_form_notifications()
*
* @param int $notification_id The notification ID to delete
* @param int|array $form_id Can pass a form ID or a form object
*
* @return int|false The result from $wpdb->query deletion
*/
public static function delete_notification( $notification_id, $form_id ) {
if ( ! $form_id ) {
return false;
}
$form = ! is_array( $form_id ) ? RGFormsModel::get_form_meta( $form_id ) : $form_id;
/**
* Fires before a notification is deleted.
*
* @since Unknown
*
* @param array $form['notifications'][$notification_id] The notification being deleted.
* @param array $form The Form Object that the notification is being deleted from.
*/
do_action( 'gform_pre_notification_deleted', $form['notifications'][ $notification_id ], $form );
unset( $form['notifications'][ $notification_id ] );
// Clear Form cache so next retrieval of form meta will reflect deleted notification
RGFormsModel::flush_current_forms();
return RGFormsModel::save_form_notifications( $form['id'], $form['notifications'] );
}
/**
* Duplicates a form notification.
*
* @since Unknown
* @access public
*
* @uses GFFormsModel::get_form_meta()
* @uses GFNotification::is_unique_name()
* @uses GFFormsModel::flush_current_forms()
* @uses GFFormsModel::save_form_notifications()
*
* @param int $notification_id The notification ID to duplicate.
* @param int|array $form_id The ID of the form or Form Object that contains the notification.
*
* @return int|false The result from $wpdb->query after duplication
*/
public static function duplicate_notification( $notification_id, $form_id ) {
if ( ! $form_id ) {
return false;
}
$form = ! is_array( $form_id ) ? RGFormsModel::get_form_meta( $form_id ) : $form_id;
$new_notification = $form['notifications'][ $notification_id ];
$name = rgar( $new_notification, 'name' );
$new_id = uniqid();
$count = 2;
$new_name = $name . ' - Copy 1';
while ( ! self::is_unique_name( $new_name, $form['notifications'] ) ) {
$new_name = $name . " - Copy $count";
$count ++;
}
$new_notification['name'] = $new_name;
$new_notification['id'] = $new_id;
unset( $new_notification['isDefault'] );
if ( $new_notification['toType'] == 'hidden' ) {
$new_notification['toType'] = 'email';
}
$form['notifications'][ $new_id ] = $new_notification;
// Clear form cache so next retrieval of form meta will return duplicated notification
RGFormsModel::flush_current_forms();
return RGFormsModel::save_form_notifications( $form['id'], $form['notifications'] );
}
/**
* Checks if a notification name is unique.
*
* @since Unknown
* @access public
*
* @param string $name The name to check.
* @param array $notifications The notifications to check against.
*
* @return bool Returns true if unique. Otherwise, false.
*/
public static function is_unique_name( $name, $notifications ) {
foreach ( $notifications as $notification ) {
if ( strtolower( rgar( $notification, 'name' ) ) == strtolower( $name ) ) {
return false;
}
}
return true;
}
}
// Include WP_List_Table.
require_once( ABSPATH . '/wp-admin/includes/class-wp-list-table.php' );
/**
* Class GFNotificationTable.
*
* Extends WP_List_Table to display the notifications list.
*
* @uses WP_List_Table
*/
class GFNotificationTable extends WP_List_Table {
/**
* Contains the Form Object.
*
* Passed when calling the class.
*
* @since Unknown
* @access public
*
* @var array
*/
public $form;
/**
* Contains the notification events for the form.
*
* Generated in the constructor based on the passed Form Object.
*
* @since Unknown
* @access public
*
* @var array
*/
public $notification_events;
/**
* Contains the notification services for the form.
*
* Generated in the constructor.
*
* @since Unknown
* @access public
*
* @var array
*/
public $notification_services;
/**
* GFNotificationTable constructor.
*
* Sets required class properties and defines the list table columns.
*
* @since Unknown
* @access public
*
* @uses GFNotification::get_notification_events()
* @uses GFNotification::get_notification_services()
* @uses GFNotificationTable::$form
* @uses GFNotificationTable::$notification_events
* @uses GFNotificationTable::$notification_services
* @uses WP_List_Table::__construct()
*
* @param array $form The Form Object to use.
*/
function __construct( $form ) {
$this->form = $form;
$this->notification_events = GFNotification::get_notification_events( $form );
$this->notification_services = GFNotification::get_notification_services();
$columns = array(
'cb' => '',
'name' => esc_html__( 'Name', 'gravityforms' ),
'subject' => esc_html__( 'Subject', 'gravityforms' ),
);
if ( count( $this->notification_events ) > 1 ) {
$columns['event'] = esc_html__( 'Event', 'gravityforms' );
}
if ( count( $this->notification_services ) > 1 ) {
$columns['service'] = esc_html__( 'Service', 'gravityforms' );
}
$this->_column_headers = array(
$columns,
array(),
array( 'name' => array( 'name', false ) ),
'name',
);
parent::__construct();
}
/**
* Prepares the list items for displaying.
*
* @since Unknown
* @access public
*
* @uses WP_List_Table::$items
* @uses GFNotificationTable::$form
*
* @return void
*/
function prepare_items() {
$this->items = $this->form['notifications'];
switch ( rgget( 'orderby' ) ) {
case 'name':
// Sort notifications alphabetically.
usort( $this->items, array( $this, 'sort_notifications' ) );
// Reverse sort.
if ( 'desc' === rgget( 'order' ) ) {
$this->items = array_reverse( $this->items );
}
break;
default:
break;
}
}
/**
* Sort notifications alphabetically.
*
* @since 2.4
* @access public
*
* @param array $a First notification to compare.
* @param array $b Second notification to compare.
*
* @return int
*/
function sort_notifications( $a = array(), $b = array() ) {
return strcasecmp( $a['name'], $b['name'] );
}
/**
* Displays the list table.
*
* @since Unknown
* @access public
*
* @uses \WP_List_Table::get_table_classes()
* @uses \WP_List_Table::print_column_headers()
* @uses \WP_List_Table::display_rows_or_placeholder()
*
* @return void
*/
function display() {
$singular = rgar( $this->_args, 'singular' );
$this->display_tablenav( 'top' );
?>
print_column_headers(); ?>
print_column_headers( false ); ?>
>
display_rows_or_placeholder(); ?>
';
echo $this->single_row_columns( $item );
echo '';
}
/**
* Gets the column headers.
*
* @since Unknown
* @access public
*
* @used-by Filter: manage_{$this->screen->id}_columns
* @uses WP_List_Table::$_column_headers
*
* @return array The column headers.
*/
function get_columns() {
return $this->_column_headers[0];
}
/**
* Defines the default values in a column.
*
* @since Unknown
* @access public
*
* @param object $item The content to display.
* @param string $column The column to apply to.
*
* @return void
*/
function column_default( $item, $column ) {
echo rgar( $item, $column );
}
/**
* Defines a checkbox column.
*
* @since Unknown
* @access public
*
* @uses GFCommon::get_base_url()
*
* @param array $item The column data.
*
* @return void
*/
function column_cb( $item ) {
if ( rgar( $item, 'isDefault' ) ) {
return;
}
$active = rgar( $item, 'isActive' ) !== false;
if ( $active ) {
$class = 'gform-status--active';
$text = esc_html__( 'Active', 'gravityforms' );
} else {
$class = 'gform-status--inactive';
$text = esc_html__( 'Inactive', 'gravityforms' );
}
?>
$item['id'] ) );
/**
* Filters the row action links.
*
* @since Unknown
*
* @param array $actions The action links.
*/
$actions = apply_filters(
'gform_notification_actions', array(
'edit' => '' . esc_html__( 'Edit', 'gravityforms' ) . '',
'duplicate' => '' . esc_html__( 'Duplicate', 'gravityforms' ) . '',
'delete' => '' . esc_html__( 'Delete', 'gravityforms' ) . ''
)
);
if ( isset( $item['isDefault'] ) && $item['isDefault'] ) {
unset( $actions['delete'] );
}
?>
$html ) {
$divider = $key == $last_key ? '' : ' | ';
?>
notification_services;
if ( ! rgar( $notification, 'service' ) ) {
esc_html_e( 'WordPress', 'gravityforms' );
} else if ( rgar( $services, $notification['service'] ) ) {
$service = rgar( $services, $notification['service'] );
echo rgar( $service, 'label' );
} else {
esc_html_e( 'Undefined Service', 'gravityforms' );
}
}
/**
* Displays the content of the Event column.
*
* @since Unknown
* @access public
*
* @uses GFNotificationTable::$notification_events()
*
* @param array $notification The Notification Object.
*
* @return void
*/
function column_event( $notification ) {
echo rgar( $this->notification_events, rgar( $notification, 'event' ) );
}
/**
* Content to display if the form does not have any notifications.
*
* @since Unknown
* @access public
*
* @return void
*/
function no_items() {
$url = add_query_arg( array( 'nid' => 0 ) );
printf( esc_html__( "This form doesn't have any notifications. Let's go %screate one%s.", 'gravityforms' ), "", '' );
}
/**
* Extra controls to be displayed between bulk actions and pagination
*
* @since 2.5
*
* @param string $which
*/
protected function extra_tablenav( $which ) {
if ( $which !== 'top' ) {
return;
}
printf(
'',
esc_url( add_query_arg( array( 'nid' => 0 ) ) ),
esc_html__( 'Add New', 'gravityforms' )
);
}
}