Preview.php 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. <?php if ( ! defined( 'ABSPATH' ) ) exit;
  2. class NF_AJAX_Controllers_Preview extends NF_Abstracts_Controller
  3. {
  4. private static $transient_prefix = 'nf_form_preview_';
  5. public function __construct()
  6. {
  7. add_action( 'wp_ajax_nf_preview_update', array( $this, 'update' ) );
  8. add_filter( 'ninja_forms_run_action_settings', array( $this, 'filter_action_settings' ), 10, 4 );
  9. }
  10. public function update()
  11. {
  12. check_ajax_referer( 'ninja_forms_builder_nonce', 'security' );
  13. $form = json_decode( stripslashes( $_POST['form'] ), ARRAY_A );
  14. $form_id = $form[ 'id' ];
  15. $form_data = $this->get_form_data( $form_id );
  16. /*
  17. * Form Settings
  18. */
  19. if( isset( $form[ 'settings' ] ) && is_array( $form[ 'settings' ] ) ) {
  20. $old_settings = $form_data[ 'settings' ];
  21. $form_data[ 'settings' ] = array_merge( $old_settings, $form[ 'settings' ] );
  22. }
  23. /*
  24. * Fields and Field Settings
  25. */
  26. if( isset( $form[ 'fields' ] ) && is_array( $form[ 'fields' ] ) ) {
  27. foreach( $form[ 'fields' ] as $field ){
  28. $id = $field[ 'id' ];
  29. $old_settings = ( isset( $form_data[ 'fields' ][ $id ][ 'settings' ] ) ) ? $form_data[ 'fields' ][ $id ][ 'settings' ] : array();
  30. $new_settings = array_merge( $old_settings, $field[ 'settings' ] );
  31. $form_data[ 'fields' ][ $id ][ 'settings' ] = $new_settings;
  32. }
  33. }
  34. if( isset( $form[ 'deleted_fields' ] ) ) {
  35. foreach( $form[ 'deleted_fields' ] as $deleted_field ){
  36. unset( $form_data[ 'fields' ][ $deleted_field ] );
  37. }
  38. }
  39. /*
  40. * Actions and Action Settings
  41. */
  42. if( isset( $form[ 'actions' ] ) && is_array( $form[ 'actions' ] ) ) {
  43. foreach( $form[ 'actions' ] as $action ){
  44. $id = $action[ 'id' ];
  45. if( isset( $form[ 'deleted_actions' ][ $id ] ) ) {
  46. unset( $form_data[ 'actions' ][ $id ] );
  47. continue;
  48. }
  49. $old_settings = ( isset ( $form_data[ 'actions' ][ $id ][ 'settings' ] ) ) ? $form_data[ 'actions' ][ $id ][ 'settings' ]: array();
  50. $new_settings = array_merge( $old_settings, $action[ 'settings' ] );
  51. $form_data[ 'actions' ][ $id ][ 'settings' ] = $new_settings;
  52. }
  53. }
  54. if( isset( $form[ 'deleted_actions' ] ) ) {
  55. foreach( $form[ 'deleted_actions' ] as $deleted_action ){
  56. unset( $form_data[ 'actions' ][ $deleted_action ] );
  57. }
  58. }
  59. $this->update_form_data( $form_data );
  60. $this->_data['form'] = $form_data;
  61. do_action( 'ninja_forms_save_form_preview', $form_id );
  62. $this->_respond();
  63. }
  64. public function filter_action_settings( $action_settings, $form_id, $action_id, $form_settings )
  65. {
  66. if( ! isset( $form_settings[ 'is_preview' ] ) ) return $action_settings;
  67. $form_data = $this->get_form_data( $form_id );
  68. if( isset( $form_data[ 'actions' ][ $action_id ] ) ){
  69. $settings = $form_data['actions'][$action_id]['settings'];
  70. $action_settings = array_merge( $action_settings, $settings );
  71. }
  72. return $action_settings;
  73. }
  74. private function get_form_data( $form_id )
  75. {
  76. $form_data = get_user_option( self::$transient_prefix . $form_id, FALSE );
  77. if( ! $form_data ){
  78. if( is_string( $form_id ) ){
  79. $form = Ninja_Forms()->form()->get();
  80. $form_data['id'] = $form_id;
  81. $form_data[ 'settings' ] = array();
  82. $form_data[ 'fields' ] = array();
  83. $form_data[ 'actions' ] = array();
  84. } else {
  85. $form = Ninja_Forms()->form($form_id)->get();
  86. $form_data['id'] = $form_id;
  87. $form_data[ 'settings' ] = $form->get_settings();
  88. $fields = Ninja_Forms()->form( $form_id )->get_fields();
  89. foreach( $fields as $field ){
  90. $field_id = $field->get_id();
  91. $form_data[ 'fields' ][ $field_id ][ 'settings' ] = $field->get_settings();
  92. }
  93. $actions = Ninja_Forms()->form( $form_id )->get_actions();
  94. foreach( $actions as $action ){
  95. $action_id = $action->get_id();
  96. $form_data[ 'actions' ][ $action_id ][ 'settings' ] = $action->get_settings();
  97. }
  98. }
  99. }
  100. return $form_data;
  101. }
  102. private function update_form_data( $form_data )
  103. {
  104. $update = update_user_option( get_current_user_id(), self::$transient_prefix . $form_data['id'], $form_data );
  105. $this->_data[ 'updated' ] = $update;
  106. if( ! $update ){
  107. $this->_errors[ 'Form Preview Not Updated' ] = $form_data;
  108. $this->_errors[ 'Current User' ] = get_current_user_id();
  109. $this->_errors[ 'Option' ] = self::$transient_prefix . $form_data['id'];
  110. }
  111. }
  112. }