ImportExport.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. <?php if ( ! defined( 'ABSPATH' ) ) exit;
  2. final class NF_Admin_Menus_ImportExport extends NF_Abstracts_Submenu
  3. {
  4. public $parent_slug = 'ninja-forms';
  5. public $menu_slug = 'nf-import-export';
  6. public function __construct()
  7. {
  8. add_action( 'init', array( $this, 'import_form_listener' ), 0 );
  9. add_action( 'init', array( $this, 'export_form_listener' ), 0 );
  10. add_action( 'init', array( $this, 'import_fields_listener' ), 0 );
  11. add_action( 'init', array( $this, 'export_fields_listener' ), 0 );
  12. add_filter( 'ninja_forms_before_import_fields', array( $this, 'import_fields_backwards_compatibility' ) );
  13. parent::__construct();
  14. }
  15. public function get_page_title()
  16. {
  17. return __( 'Import / Export', 'ninja-forms' );
  18. }
  19. public function import_form_listener()
  20. {
  21. $capability = apply_filters( 'ninja_forms_admin_import_export_capabilities', 'manage_options' );
  22. $capability = apply_filters( 'ninja_forms_admin_import_form_capabilities', $capability );
  23. if( ! current_user_can( $capability ) ) return;
  24. if( ! isset( $_REQUEST['nf_import_security'] )
  25. || ! wp_verify_nonce( $_REQUEST[ 'nf_import_security' ], 'ninja_forms_import_form_nonce' ) ) return;
  26. if( ! isset( $_FILES[ 'nf_import_form' ] ) || ! $_FILES[ 'nf_import_form' ] ) return;
  27. $this->upload_error_check( $_FILES[ 'nf_import_form' ] );
  28. $data = file_get_contents( $_FILES[ 'nf_import_form' ][ 'tmp_name' ] );
  29. // Check to see if the user turned off UTF-8 encoding
  30. $decode_utf8 = TRUE;
  31. if( isset( $_REQUEST[ 'nf_import_form_turn_off_encoding' ] ) &&
  32. $_REQUEST[ 'nf_import_form_turn_off_encoding' ] ) {
  33. $decode_utf8 = FALSE;
  34. }
  35. $import = Ninja_Forms()->form()->import_form( $data, $decode_utf8 );
  36. if( ! $import ){
  37. $err_msg = '';
  38. if ( function_exists( 'json_last_error_msg' ) ) {
  39. $err_msg = json_last_error_msg();
  40. }
  41. wp_die(
  42. __( 'There uploaded file is not a valid format.', 'ninja-forms' ) . ' ' . $err_msg,
  43. __( 'Invalid Form Upload.', 'ninja-forms' )
  44. );
  45. }
  46. }
  47. public function export_form_listener()
  48. {
  49. $capability = apply_filters( 'ninja_forms_admin_import_export_capabilities', 'manage_options' );
  50. $capability = apply_filters( 'ninja_forms_admin_export_form_capabilities', $capability );
  51. if( ! current_user_can( $capability ) ) return;
  52. if( isset( $_REQUEST[ 'nf_export_form' ] ) && $_REQUEST[ 'nf_export_form' ] ){
  53. $form_id = $_REQUEST[ 'nf_export_form' ];
  54. Ninja_Forms()->form( $form_id )->export_form();
  55. }
  56. }
  57. public function import_fields_listener()
  58. {
  59. if( ! current_user_can( apply_filters( 'ninja_forms_admin_import_fields_capabilities', 'manage_options' ) ) ) return;
  60. if( ! isset( $_FILES[ 'nf_import_fields' ] ) || ! $_FILES[ 'nf_import_fields' ] ) return;
  61. $this->upload_error_check( $_FILES[ 'nf_import_fields' ] );
  62. $import = file_get_contents( $_FILES[ 'nf_import_fields' ][ 'tmp_name' ] );
  63. $fields = unserialize( $import );
  64. foreach( $fields as $settings ){
  65. Ninja_Forms()->form()->import_field( $settings );
  66. }
  67. }
  68. public function export_fields_listener()
  69. {
  70. if( ! current_user_can( apply_filters( 'ninja_forms_admin_export_fields_capabilities', 'manage_options' ) ) ) return;
  71. if( isset( $_REQUEST[ 'nf_export_fields' ] ) && $_REQUEST[ 'nf_export_fields' ] ){
  72. $field_ids = $_REQUEST[ 'nf_export_fields' ];
  73. $fields = array();
  74. foreach( $field_ids as $field_id ){
  75. $field = Ninja_Forms()->form()->field( $field_id )->get();
  76. $fields[] = $field->get_settings();
  77. }
  78. header("Content-type: application/csv");
  79. header("Content-Disposition: attachment; filename=favorites-" . time() . ".nff");
  80. header("Pragma: no-cache");
  81. header("Expires: 0");
  82. echo serialize( $fields );
  83. die();
  84. }
  85. }
  86. public function display()
  87. {
  88. $tabs = apply_filters( 'ninja_forms_import_export_tabs', array(
  89. 'forms' => __( 'Form', 'ninja-forms' ),
  90. 'favorite_fields' => __( 'Favorite Fields', 'ninja-forms' )
  91. )
  92. );
  93. $tab_keys = array_keys( $tabs );
  94. $active_tab = ( isset( $_GET[ 'tab' ] ) ) ? $_GET[ 'tab' ] : reset( $tab_keys );
  95. $this->add_meta_boxes();
  96. wp_enqueue_script('postbox');
  97. wp_enqueue_script('jquery-ui-draggable');
  98. wp_enqueue_style( 'nf-admin-settings', Ninja_Forms::$url . 'assets/css/admin-settings.css' );
  99. wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );
  100. wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false );
  101. wp_register_script( 'ninja_forms_admin_import_export',
  102. Ninja_Forms::$url . 'assets/js/admin-import-export.js', array( 'jquery' ), FALSE, TRUE );
  103. wp_enqueue_script( 'ninja_forms_admin_import_export' );
  104. Ninja_Forms::template( 'admin-menu-import-export.html.php', compact( 'tabs', 'active_tab' ) );
  105. }
  106. public function add_meta_boxes()
  107. {
  108. /*
  109. * Forms
  110. */
  111. add_meta_box(
  112. 'nf_import_export_forms_import',
  113. __( 'Import Forms', 'ninja-forms' ),
  114. array( $this, 'template_import_forms' ),
  115. 'nf_import_export_forms'
  116. );
  117. add_meta_box(
  118. 'nf_import_export_forms_export',
  119. __( 'Export Forms', 'ninja-forms' ),
  120. array( $this, 'template_export_forms' ),
  121. 'nf_import_export_forms'
  122. );
  123. /*
  124. * FAVORITE FIELDS
  125. */
  126. add_meta_box(
  127. 'nf_import_export_favorite_fields_import',
  128. __( 'Import Favorite Fields', 'ninja-forms' ),
  129. array( $this, 'template_import_favorite_fields' ),
  130. 'nf_import_export_favorite_fields'
  131. );
  132. add_meta_box(
  133. 'nf_import_export_favorite_fields_export',
  134. __( 'Export Favorite Fields', 'ninja-forms' ),
  135. array( $this, 'template_export_favorite_fields' ),
  136. 'nf_import_export_favorite_fields'
  137. );
  138. }
  139. public function template_import_forms()
  140. {
  141. Ninja_Forms::template( 'admin-metabox-import-export-forms-import.html.php' );
  142. }
  143. public function template_export_forms()
  144. {
  145. /**
  146. * we're gonna create a new array so that we can select a form in the
  147. * export drop down based on a url parameter
  148. **/
  149. $formObjs = Ninja_Forms()->form()->get_forms();
  150. $forms = array();
  151. foreach( $formObjs as $form ) {
  152. $selected = '';
  153. if( isset( $_REQUEST[ 'exportFormId' ] )
  154. && $form->get_id() == $_REQUEST[ 'exportFormId' ] ) {
  155. $selected = 'selected';
  156. }
  157. $forms[] = array(
  158. 'id' => $form->get_id(),
  159. 'title' => $form->get_setting( 'title' ),
  160. 'selected' => $selected,
  161. );
  162. }
  163. Ninja_Forms::template( 'admin-metabox-import-export-forms-export.html.php', compact( 'forms' ) );
  164. }
  165. public function template_import_favorite_fields()
  166. {
  167. Ninja_Forms::template( 'admin-metabox-import-export-favorite-fields-import.html.php' );
  168. }
  169. public function template_export_favorite_fields()
  170. {
  171. $fields = Ninja_Forms()->form()->get_fields( array( 'saved' => 1) );
  172. Ninja_Forms::template( 'admin-metabox-import-export-favorite-fields-export.html.php', compact( 'fields' ) );
  173. }
  174. /*
  175. |--------------------------------------------------------------------------
  176. | Backwards Compatibility
  177. |--------------------------------------------------------------------------
  178. */
  179. public function import_fields_backwards_compatibility( $field )
  180. {
  181. //TODO: This was copied over. Instead need to abstract backwards compatibility for re-use.
  182. // Flatten field settings array
  183. if( isset( $field[ 'data' ] ) ){
  184. $field = array_merge( $field, $field[ 'data' ] );
  185. unset( $field[ 'data' ] );
  186. }
  187. // Drop form_id in favor of parent_id, which is set by the form.
  188. if( isset( $field[ 'form_id' ] ) ){
  189. unset( $field[ 'form_id' ] );
  190. }
  191. // Remove `_` prefix from type setting
  192. $field[ 'type' ] = ltrim( $field[ 'type' ], '_' );
  193. // Type: `text` -> `textbox`
  194. if( 'text' == $field[ 'type' ] ){
  195. $field[ 'type' ] = 'textbox';
  196. }
  197. if( 'submit' == $field[ 'type' ] ){
  198. $field[ 'processing_label' ] = 'Processing';
  199. }
  200. if( 'calc' == $field[ 'type' ] ){
  201. $field[ 'type' ] = 'note';
  202. if( isset( $field[ 'calc_method' ] ) ) {
  203. switch( $field[ 'calc_method' ] ){
  204. case 'eq':
  205. $method = __( 'Equation (Advanced)', 'ninja-forms' );
  206. break;
  207. case 'fields':
  208. $method = __( 'Operations and Fields (Advanced)', 'ninja-forms' );
  209. break;
  210. case 'auto':
  211. $method = __( 'Auto-Total Fields', 'ninja-forms' );
  212. break;
  213. default:
  214. $method = '';
  215. }
  216. $field['default'] = $method . "\r\n";
  217. if ('eq' == $field['calc_method'] && isset( $field['calc_eq'] ) ) {
  218. $field['default'] .= $field['calc_eq'];
  219. }
  220. if ('fields' == $field['calc_method'] && isset( $field['calc'] ) ) {
  221. // TODO: Support 'operations and fields (advanced)' calculations.
  222. }
  223. if ('auto' == $field['calc_method'] && isset( $field['calc'] ) ) {
  224. // TODO: Support 'auto-totaling' calculations.
  225. }
  226. }
  227. unset( $field[ 'calc' ] );
  228. unset( $field[ 'calc_eq' ] );
  229. unset( $field[ 'calc_method' ] );
  230. }
  231. if( isset( $field[ 'email' ] ) ){
  232. if( 'textbox' == $field[ 'type' ] && $field[ 'email' ] ) {
  233. $field['type'] = 'email';
  234. }
  235. unset( $field[ 'email' ] );
  236. }
  237. if( isset( $field[ 'class' ] ) ){
  238. $field[ 'element_class' ] = $field[ 'class' ];
  239. unset( $field[ 'class' ] );
  240. }
  241. if( isset( $field[ 'req' ] ) ){
  242. $field[ 'required' ] = $field[ 'req' ];
  243. unset( $field[ 'req' ] );
  244. }
  245. if( isset( $field[ 'default_value_type' ] ) ){
  246. /* User Data */
  247. if( '_user_id' == $field[ 'default_value_type' ] ) $field[ 'default' ] = '{user:id}';
  248. if( '_user_email' == $field[ 'default_value_type' ] ) $field[ 'default' ] = '{user:email}';
  249. if( '_user_lastname' == $field[ 'default_value_type' ] ) $field[ 'default' ] = '{user:last_name}';
  250. if( '_user_firstname' == $field[ 'default_value_type' ] ) $field[ 'default' ] = '{user:first_name}';
  251. if( '_user_display_name' == $field[ 'default_value_type' ] ) $field[ 'default' ] = '{user:display_name}';
  252. /* Post Data */
  253. if( 'post_id' == $field[ 'default_value_type' ] ) $field[ 'default' ] = '{post:id}';
  254. if( 'post_url' == $field[ 'default_value_type' ] ) $field[ 'default' ] = '{post:url}';
  255. if( 'post_title' == $field[ 'default_value_type' ] ) $field[ 'default' ] = '{post:title}';
  256. /* System Data */
  257. if( 'today' == $field[ 'default_value_type' ] ) $field[ 'default' ] = '{system:date}';
  258. /* Miscellaneous */
  259. if( '_custom' == $field[ 'default_value_type' ] && isset( $field[ 'default_value' ] ) ){
  260. $field[ 'default' ] = $field[ 'default_value' ];
  261. }
  262. if( 'querystring' == $field[ 'default_value_type' ] && isset( $field[ 'default_value' ] ) ){
  263. $field[ 'default' ] = '{' . $field[ 'default_value' ] . '}';
  264. }
  265. unset( $field[ 'default_value' ] );
  266. unset( $field[ 'default_value_type' ] );
  267. }
  268. if( 'list' == $field[ 'type' ] ) {
  269. if ( isset( $field[ 'list_type' ] ) ) {
  270. if ('dropdown' == $field['list_type']) {
  271. $field['type'] = 'listselect';
  272. }
  273. if ('radio' == $field['list_type']) {
  274. $field['type'] = 'listradio';
  275. }
  276. if ('checkbox' == $field['list_type']) {
  277. $field['type'] = 'listcheckbox';
  278. }
  279. if ('multi' == $field['list_type']) {
  280. $field['type'] = 'listmultiselect';
  281. }
  282. }
  283. if( isset( $field[ 'list' ][ 'options' ] ) ) {
  284. $field[ 'options' ] = $field[ 'list' ][ 'options' ];
  285. unset( $field[ 'list' ][ 'options' ] );
  286. }
  287. }
  288. // Convert `textbox` to other field types
  289. foreach( array( 'fist_name', 'last_name', 'user_zip', 'user_city', 'user_phone', 'user_email', 'user_address_1', 'user_address_2', 'datepicker' ) as $item ) {
  290. if ( isset( $field[ $item ] ) && $field[ $item ] ) {
  291. $field[ 'type' ] = str_replace( array( '_', 'user', '1', '2', 'picker' ), '', $item );
  292. unset( $field[ $item ] );
  293. }
  294. }
  295. if( 'timed_submit' == $field[ 'type' ] ) {
  296. $field[ 'type' ] = 'submit';
  297. }
  298. return $field;
  299. }
  300. private function upload_error_check( $file )
  301. {
  302. if( ! $file[ 'error' ] ) return;
  303. switch ( $file[ 'error' ] ) {
  304. case UPLOAD_ERR_INI_SIZE:
  305. $error_message = __( 'The uploaded file exceeds the upload_max_filesize directive in php.ini.', 'ninja-forms' );
  306. break;
  307. case UPLOAD_ERR_FORM_SIZE:
  308. $error_message = __( 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.', 'ninja-forms' );
  309. break;
  310. case UPLOAD_ERR_PARTIAL:
  311. $error_message = __( 'The uploaded file was only partially uploaded.', 'ninja-forms' );
  312. break;
  313. case UPLOAD_ERR_NO_FILE:
  314. $error_message = __( 'No file was uploaded.', 'ninja-forms' );
  315. break;
  316. case UPLOAD_ERR_NO_TMP_DIR:
  317. $error_message = __( 'Missing a temporary folder.', 'ninja-forms' );
  318. break;
  319. case UPLOAD_ERR_CANT_WRITE:
  320. $error_message = __( 'Failed to write file to disk.', 'ninja-forms' );
  321. break;
  322. case UPLOAD_ERR_EXTENSION:
  323. $error_message = __( 'File upload stopped by extension.', 'ninja-forms' );
  324. break;
  325. default:
  326. $error_message = __( 'Unknown upload error.', 'ninja-forms' );
  327. break;
  328. }
  329. $args = array(
  330. 'title' => __( 'File Upload Error', 'ninja-forms' ),
  331. 'message' => $error_message,
  332. 'debug' => $file,
  333. );
  334. $message = Ninja_Forms()->template( 'admin-wp-die.html.php', $args );
  335. wp_die( $message, $args[ 'title' ], array( 'back_link' => TRUE ) );
  336. }
  337. public function get_capability()
  338. {
  339. return apply_filters( 'ninja_forms_admin_import_export_capabilities', $this->capability );
  340. }
  341. }