Form.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <?php if ( ! defined( 'ABSPATH' ) ) exit;
  2. class NF_AJAX_Controllers_Form extends NF_Abstracts_Controller
  3. {
  4. private $publish_processing;
  5. public function __construct()
  6. {
  7. add_action( 'plugins_loaded', array( $this, 'plugins_loaded' ) );
  8. add_action( 'wp_ajax_nf_ajax_get_new_nonce', array( $this, 'get_new_nonce' ) );
  9. add_action( 'wp_ajax_nopriv_nf_ajax_get_new_nonce', array( $this, 'get_new_nonce' ) );
  10. add_action( 'wp_ajax_nf_save_form', array( $this, 'save' ) );
  11. add_action( 'wp_ajax_nf_delete_form', array( $this, 'delete' ) );
  12. }
  13. public function plugins_loaded()
  14. {
  15. $this->publish_processing = new NF_Database_PublishProcessing();
  16. }
  17. public function save()
  18. {
  19. check_ajax_referer( 'ninja_forms_builder_nonce', 'security' );
  20. if( ! isset( $_POST[ 'form' ] ) ){
  21. $this->_errors[] = __( 'Form Not Found', 'ninja-forms' );
  22. $this->_respond();
  23. }
  24. $form_data = json_decode( stripslashes( $_POST['form'] ), ARRAY_A );
  25. if( is_string( $form_data[ 'id' ] ) ) {
  26. $tmp_id = $form_data[ 'id' ];
  27. $form = Ninja_Forms()->form()->get();
  28. $form->save();
  29. $form_data[ 'id' ] = $form->get_id();
  30. $this->_data[ 'new_ids' ][ 'forms' ][ $tmp_id ] = $form_data[ 'id' ];
  31. } else {
  32. $form = Ninja_Forms()->form($form_data['id'])->get();
  33. }
  34. unset( $form_data[ 'settings' ][ '_seq_num' ] );
  35. $form->update_settings( $form_data[ 'settings' ] )->save();
  36. if( isset( $form_data[ 'fields' ] ) ) {
  37. $db_fields_controller = new NF_Database_FieldsController( $form_data[ 'id' ], $form_data[ 'fields' ] );
  38. $db_fields_controller->run();
  39. $form_data[ 'fields' ] = $db_fields_controller->get_updated_fields_data();
  40. $this->_data['new_ids']['fields'] = $db_fields_controller->get_new_field_ids();
  41. }
  42. if( isset( $form_data[ 'deleted_fields' ] ) ){
  43. foreach( $form_data[ 'deleted_fields' ] as $deleted_field_id ){
  44. $field = Ninja_Forms()->form( $form_data[ 'id' ])->get_field( $deleted_field_id );
  45. $field->delete();
  46. }
  47. }
  48. if( isset( $form_data[ 'actions' ] ) ) {
  49. /*
  50. * Loop Actions and fire Save() hooks.
  51. */
  52. foreach ($form_data['actions'] as &$action_data) {
  53. $id = $action_data['id'];
  54. $action = Ninja_Forms()->form( $form_data[ 'id' ] )->get_action( $id );
  55. $action->update_settings($action_data['settings'])->save();
  56. $action_type = $action->get_setting( 'type' );
  57. if( isset( Ninja_Forms()->actions[ $action_type ] ) ) {
  58. $action_class = Ninja_Forms()->actions[ $action_type ];
  59. $action_settings = $action_class->save( $action_data['settings'] );
  60. if( $action_settings ){
  61. $action_data['settings'] = $action_settings;
  62. $action->update_settings( $action_settings )->save();
  63. }
  64. }
  65. if ($action->get_tmp_id()) {
  66. $tmp_id = $action->get_tmp_id();
  67. $this->_data['new_ids']['actions'][$tmp_id] = $action->get_id();
  68. $action_data[ 'id' ] = $action->get_id();
  69. }
  70. $this->_data[ 'actions' ][ $action->get_id() ] = $action->get_settings();
  71. }
  72. }
  73. /*
  74. * Loop Actions and fire Publish() hooks.
  75. */
  76. foreach ($form_data['actions'] as &$action_data) {
  77. $action = Ninja_Forms()->form( $form_data[ 'id' ] )->get_action( $action_data['id'] );
  78. $action_type = $action->get_setting( 'type' );
  79. if( isset( Ninja_Forms()->actions[ $action_type ] ) ) {
  80. $action_class = Ninja_Forms()->actions[ $action_type ];
  81. if( $action->get_setting( 'active' ) && method_exists( $action_class, 'publish' ) ) {
  82. $data = $action_class->publish( $this->_data );
  83. if ($data) {
  84. $this->_data = $data;
  85. }
  86. }
  87. }
  88. }
  89. if( isset( $form_data[ 'deleted_actions' ] ) ){
  90. foreach( $form_data[ 'deleted_actions' ] as $deleted_action_id ){
  91. $action = Ninja_Forms()->form()->get_action( $deleted_action_id );
  92. $action->delete();
  93. }
  94. }
  95. delete_user_option( get_current_user_id(), 'nf_form_preview_' . $form_data['id'] );
  96. WPN_Helper::update_nf_cache( $form_data[ 'id' ], $form_data );
  97. do_action( 'ninja_forms_save_form', $form->get_id() );
  98. $this->_respond();
  99. }
  100. public function delete()
  101. {
  102. check_ajax_referer( 'ninja_forms_builder_nonce', 'security' );
  103. $this->_respond();
  104. }
  105. /**
  106. * Let's generate a unique nonce for each form render so that we don't get
  107. * caught with an expiring nonce accidentally and fail to allow a submission
  108. * @since 3.2
  109. */
  110. public function get_new_nonce() {
  111. // get a timestamp to append to nonce name
  112. $current_time_stamp = time();
  113. // Let's generate a unique nonce
  114. $new_nonce_name = 'ninja_forms_display_nonce_' . $current_time_stamp;
  115. $res = array(
  116. 'new_nonce' => wp_create_nonce( $new_nonce_name ),
  117. 'nonce_ts' => $current_time_stamp );
  118. $this->_respond( $res );
  119. }
  120. }