Render.php 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670
  1. <?php if ( ! defined( 'ABSPATH' ) ) exit;
  2. final class NF_Display_Render
  3. {
  4. protected static $loaded_templates = array(
  5. 'app-layout',
  6. 'app-before-form',
  7. 'app-after-form',
  8. 'app-before-fields',
  9. 'app-after-fields',
  10. 'app-before-field',
  11. 'app-after-field',
  12. 'form-layout',
  13. 'form-hp',
  14. 'field-layout',
  15. 'field-before',
  16. 'field-after',
  17. 'fields-wrap',
  18. 'fields-wrap-no-label',
  19. 'fields-wrap-no-container',
  20. 'fields-label',
  21. 'fields-error',
  22. 'form-error',
  23. 'field-input-limit',
  24. 'field-null'
  25. );
  26. protected static $use_test_values = FALSE;
  27. protected static $form_uses_recaptcha = array();
  28. protected static $form_uses_datepicker = array();
  29. protected static $form_uses_inputmask = array();
  30. protected static $form_uses_currencymask = array();
  31. protected static $form_uses_rte = array();
  32. protected static $form_uses_textarea_media = array();
  33. protected static $form_uses_helptext = array();
  34. protected static $form_uses_starrating = array();
  35. public static function localize( $form_id )
  36. {
  37. global $wp_locale;
  38. $form_id = absint( $form_id );
  39. /**
  40. * Action that passes the form ID as a parameter.
  41. * @since 3.2.2
  42. */
  43. do_action( 'nf_get_form_id', $form_id );
  44. $capability = apply_filters( 'ninja_forms_display_test_values_capabilities', 'read' );
  45. if( isset( $_GET[ 'ninja_forms_test_values' ] ) && current_user_can( $capability ) ){
  46. self::$use_test_values = TRUE;
  47. }
  48. if( ! has_action( 'wp_footer', 'NF_Display_Render::output_templates', 9999 ) ){
  49. add_action( 'wp_footer', 'NF_Display_Render::output_templates', 9999 );
  50. }
  51. $form = Ninja_Forms()->form( $form_id )->get();
  52. $settings = $form->get_settings();
  53. foreach( $settings as $name => $value ){
  54. if( ! in_array(
  55. $name,
  56. array(
  57. 'changeEmailErrorMsg',
  58. 'changeDateErrorMsg',
  59. 'confirmFieldErrorMsg',
  60. 'fieldNumberNumMinError',
  61. 'fieldNumberNumMaxError',
  62. 'fieldNumberIncrementBy',
  63. 'formErrorsCorrectErrors',
  64. 'validateRequiredField',
  65. 'honeypotHoneypotError',
  66. 'fieldsMarkedRequired',
  67. )
  68. ) ) continue;
  69. if( $value ) continue;
  70. unset( $settings[ $name ] );
  71. }
  72. $settings = array_merge( Ninja_Forms::config( 'i18nFrontEnd' ), $settings );
  73. $settings = apply_filters( 'ninja_forms_display_form_settings', $settings, $form_id );
  74. $form->update_settings( $settings );
  75. if( $form->get_setting( 'logged_in' ) && ! is_user_logged_in() ){
  76. echo do_shortcode( $form->get_setting( 'not_logged_in_msg' ));
  77. return;
  78. }
  79. if( $form->get_setting( 'sub_limit_number' ) ){
  80. $subs = Ninja_Forms()->form( $form_id )->get_subs();
  81. // TODO: Optimize Query
  82. global $wpdb;
  83. $count = 0;
  84. $subs = $wpdb->get_results( "SELECT post_id FROM " . $wpdb->postmeta . " WHERE `meta_key` = '_form_id' AND `meta_value` = $form_id" );
  85. foreach( $subs as $sub ){
  86. if( 'publish' == get_post_status( $sub->post_id ) ) $count++;
  87. }
  88. if( $count >= $form->get_setting( 'sub_limit_number' ) ) {
  89. echo do_shortcode( apply_filters( 'nf_sub_limit_reached_msg', $form->get_setting( 'sub_limit_msg' ), $form_id ));
  90. return;
  91. }
  92. }
  93. if( ! apply_filters( 'ninja_forms_display_show_form', true, $form_id, $form ) ) return;
  94. $currency = $form->get_setting( 'currency', Ninja_Forms()->get_setting( 'currency' ) );
  95. $currency_symbol = Ninja_Forms::config( 'CurrencySymbol' );
  96. $form->update_setting( 'currency_symbol', ( isset( $currency_symbol[ $currency ] ) ) ? $currency_symbol[ $currency ] : '' );
  97. $title = apply_filters( 'ninja_forms_form_title', $form->get_setting( 'title' ), $form_id );
  98. $form->update_setting( 'title', $title );
  99. $before_form = apply_filters( 'ninja_forms_display_before_form', '', $form_id );
  100. $form->update_setting( 'beforeForm', $before_form );
  101. $before_fields = apply_filters( 'ninja_forms_display_before_fields', '', $form_id );
  102. $form->update_setting( 'beforeFields', $before_fields );
  103. $after_fields = apply_filters( 'ninja_forms_display_after_fields', '', $form_id );
  104. $form->update_setting( 'afterFields', $after_fields );
  105. $after_form = apply_filters( 'ninja_forms_display_after_form', '', $form_id );
  106. $form->update_setting( 'afterForm', $after_form );
  107. $form_fields = Ninja_Forms()->form( $form_id )->get_fields();
  108. $fields = array();
  109. if( empty( $form_fields ) ){
  110. echo __( 'No Fields Found.', 'ninja-forms' );
  111. } else {
  112. // TODO: Replace unique field key checks with a refactored model/factory.
  113. $unique_field_keys = array();
  114. $cache_updated = false;
  115. foreach ($form_fields as $field) {
  116. if( is_object( $field ) ) {
  117. $field = array(
  118. 'id' => $field->get_id(),
  119. 'settings' => $field->get_settings()
  120. );
  121. }
  122. $field_id = $field[ 'id' ];
  123. /*
  124. * Duplicate field check.
  125. * TODO: Replace unique field key checks with a refactored model/factory.
  126. */
  127. $field_key = $field[ 'settings' ][ 'key' ];
  128. if( in_array( $field_key, $unique_field_keys ) || '' == $field_key ){
  129. // Delete the field.
  130. Ninja_Forms()->request( 'delete-field' )->data( array( 'field_id' => $field_id ) )->dispatch();
  131. // Remove the field from cache.
  132. if( $form_cache ) {
  133. if( isset( $form_cache[ 'fields' ] ) ){
  134. foreach( $form_cache[ 'fields' ] as $cached_field_key => $cached_field ){
  135. if( ! isset( $cached_field[ 'id' ] ) ) continue;
  136. if( $field_id != $cached_field[ 'id' ] ) continue;
  137. // Flag cache to update.
  138. $cache_updated = true;
  139. unset( $form_cache[ 'fields' ][ $cached_field_key ] ); // Remove the field.
  140. }
  141. }
  142. }
  143. continue; // Skip the duplicate field.
  144. }
  145. array_push( $unique_field_keys, $field_key ); // Log unique key.
  146. /* END Duplicate field check. */
  147. $field_type = $field[ 'settings' ][ 'type' ];
  148. if( ! is_string( $field_type ) ) continue;
  149. if( ! isset( Ninja_Forms()->fields[ $field_type ] ) ) {
  150. $unknown_field = NF_Fields_Unknown::create( $field );
  151. $field = array(
  152. 'settings' => $unknown_field->get_settings(),
  153. 'id' => $unknown_field->get_id()
  154. );
  155. $field_type = $field[ 'settings' ][ 'type' ];
  156. }
  157. $field = apply_filters('ninja_forms_localize_fields', $field);
  158. $field = apply_filters('ninja_forms_localize_field_' . $field_type, $field);
  159. $field_class = Ninja_Forms()->fields[$field_type];
  160. if (self::$use_test_values) {
  161. $field[ 'value' ] = $field_class->get_test_value();
  162. }
  163. // Hide the label on invisible reCAPTCHA fields
  164. if ( 'recaptcha' === $field[ 'settings' ][ 'type' ] && 'invisible' === $field[ 'settings' ][ 'size' ] ) {
  165. $field[ 'settings' ][ 'label_pos' ] = 'hidden';
  166. }
  167. // Copy field ID into the field settings array for use in localized data.
  168. $field[ 'settings' ][ 'id' ] = $field[ 'id' ];
  169. /*
  170. * TODO: For backwards compatibility, run the original action, get contents from the output buffer, and return the contents through the filter. Also display a PHP Notice for a deprecate filter.
  171. */
  172. $display_before = apply_filters( 'ninja_forms_display_before_field_type_' . $field[ 'settings' ][ 'type' ], '' );
  173. $display_before = apply_filters( 'ninja_forms_display_before_field_key_' . $field[ 'settings' ][ 'key' ], $display_before );
  174. $field[ 'settings' ][ 'beforeField' ] = $display_before;
  175. $display_after = apply_filters( 'ninja_forms_display_after_field_type_' . $field[ 'settings' ][ 'type' ], '' );
  176. $display_after = apply_filters( 'ninja_forms_display_after_field_key_' . $field[ 'settings' ][ 'key' ], $display_after );
  177. $field[ 'settings' ][ 'afterField' ] = $display_after;
  178. $templates = $field_class->get_templates();
  179. if (!array($templates)) {
  180. $templates = array($templates);
  181. }
  182. foreach ($templates as $template) {
  183. self::load_template('fields-' . $template);
  184. }
  185. $settings = $field[ 'settings' ];
  186. foreach ($settings as $key => $setting) {
  187. if (is_numeric($setting) && 'custom_mask' != $key )
  188. $settings[$key] =
  189. floatval($setting);
  190. }
  191. if( ! isset( $settings[ 'label_pos' ] ) || 'default' == $settings[ 'label_pos' ] ){
  192. $settings[ 'label_pos' ] = $form->get_setting( 'default_label_pos' );
  193. }
  194. $settings[ 'parentType' ] = $field_class->get_parent_type();
  195. if( 'list' == $settings[ 'parentType' ] && isset( $settings[ 'options' ] ) && is_array( $settings[ 'options' ] ) ){
  196. $settings[ 'options' ] = apply_filters( 'ninja_forms_render_options', $settings[ 'options' ], $settings );
  197. $settings[ 'options' ] = apply_filters( 'ninja_forms_render_options_' . $field_type, $settings[ 'options' ], $settings );
  198. }
  199. $default_value = ( isset( $settings[ 'default' ] ) ) ? $settings[ 'default' ] : null;
  200. $default_value = apply_filters('ninja_forms_render_default_value', $default_value, $field_type, $settings);
  201. if ( $default_value ) {
  202. $default_value = preg_replace( '/{[^}]}/', '', $default_value );
  203. if ($default_value) {
  204. $settings['value'] = $default_value;
  205. ob_start();
  206. do_shortcode( $settings['value'] );
  207. $ob = ob_get_clean();
  208. if( ! $ob ) {
  209. $settings['value'] = do_shortcode( $settings['value'] );
  210. }
  211. }
  212. }
  213. $thousands_sep = $wp_locale->number_format[ 'thousands_sep'];
  214. $decimal_point = $wp_locale->number_format[ 'decimal_point' ];
  215. // TODO: Find a better way to do this.
  216. if ('shipping' == $settings['type']) {
  217. $settings[ 'shipping_cost' ] = preg_replace ('/[^\d,\.]/', '', $settings[ 'shipping_cost' ] );
  218. $settings[ 'shipping_cost' ] = str_replace( Ninja_Forms()->get_setting( 'currency_symbol' ), '', $settings[ 'shipping_cost' ] );
  219. $settings[ 'shipping_cost' ] = str_replace( $decimal_point, '||', $settings[ 'shipping_cost' ] );
  220. $settings[ 'shipping_cost' ] = str_replace( $thousands_sep, '', $settings[ 'shipping_cost' ] );
  221. $settings[ 'shipping_cost' ] = str_replace( '||', '.', $settings[ 'shipping_cost' ] );
  222. } elseif ('product' == $settings['type']) {
  223. $settings['product_price'] = preg_replace ('/[^\d,\.]/', '', $settings[ 'product_price' ] );
  224. $settings['product_price'] = str_replace( Ninja_Forms()->get_setting( 'currency_symbol' ), '', $settings['product_price']);
  225. $settings[ 'product_price' ] = str_replace( $decimal_point, '||', $settings[ 'product_price' ] );
  226. $settings[ 'product_price' ] = str_replace( $thousands_sep, '', $settings[ 'product_price' ] );
  227. $settings[ 'product_price' ] = str_replace( '||', '.', $settings[ 'product_price' ] );
  228. } elseif ('total' == $settings['type'] && isset($settings['value'])) {
  229. $settings['value'] = number_format($settings['value'], 2);
  230. }
  231. $settings['element_templates'] = $templates;
  232. $settings['old_classname'] = $field_class->get_old_classname();
  233. $settings['wrap_template'] = $field_class->get_wrap_template();
  234. $fields[] = apply_filters( 'ninja_forms_localize_field_settings_' . $field_type, $settings, $form );
  235. if( 'recaptcha' == $field[ 'settings' ][ 'type' ] ){
  236. array_push( self::$form_uses_recaptcha, $form_id );
  237. }
  238. if( 'date' == $field[ 'settings' ][ 'type' ] ){
  239. array_push( self::$form_uses_datepicker, $form_id );
  240. }
  241. if( 'starrating' == $field[ 'settings' ][ 'type' ] ){
  242. array_push( self::$form_uses_starrating, $form_id );
  243. }
  244. if( isset( $field[ 'settings' ][ 'mask' ] ) && $field[ 'settings' ][ 'mask' ] ){
  245. array_push( self::$form_uses_inputmask, $form_id );
  246. }
  247. if( isset( $field[ 'settings' ][ 'mask' ] ) && 'currency' == $field[ 'settings' ][ 'mask' ] ){
  248. array_push( self::$form_uses_currencymask, $form_id );
  249. }
  250. if( isset( $field[ 'settings' ][ 'textarea_rte' ] ) && $field[ 'settings' ][ 'textarea_rte' ] ){
  251. array_push( self::$form_uses_rte, $form_id );
  252. }
  253. if( isset( $field[ 'settings' ][ 'textarea_media' ] ) && $field[ 'settings' ][ 'textarea_media' ] ){
  254. array_push( self::$form_uses_textarea_media, $form_id );
  255. }
  256. // strip all tags except image tags
  257. if( isset( $field[ 'settings' ][ 'help_text' ] ) &&
  258. strip_tags( $field[ 'settings' ][ 'help_text' ], '<img>'
  259. ) ){
  260. array_push( self::$form_uses_helptext, $form_id );
  261. }
  262. }
  263. if( $cache_updated ) {
  264. WPN_Helper::update_nf_cache( $form_id, $form_cache ); // Update form cache without duplicate fields.
  265. }
  266. }
  267. $fields = apply_filters( 'ninja_forms_display_fields', $fields );
  268. // Output Form Container
  269. do_action( 'ninja_forms_before_container', $form_id, $form->get_settings(), $form_fields );
  270. Ninja_Forms::template( 'display-form-container.html.php', compact( 'form_id' ) );
  271. $form_id = "$form_id";
  272. ?>
  273. <!-- TODO: Move to Template File. -->
  274. <script>var formDisplay=1;var nfForms=nfForms||[];var form=[];form.id='<?php echo $form_id; ?>';form.settings=<?php echo wp_json_encode( $form->get_settings() ); ?>;form.fields=<?php echo wp_json_encode( $fields ); ?>;nfForms.push(form);</script>
  275. <?php
  276. self::enqueue_scripts( $form_id );
  277. }
  278. public static function localize_preview( $form_id )
  279. {
  280. $capability = apply_filters( 'ninja_forms_display_test_values_capabilities', 'read' );
  281. if( isset( $_GET[ 'ninja_forms_test_values' ] ) && current_user_can( $capability ) ){
  282. self::$use_test_values = TRUE;
  283. }
  284. add_action( 'wp_footer', 'NF_Display_Render::output_templates', 9999 );
  285. $form = get_user_option( 'nf_form_preview_' . $form_id );
  286. if( ! $form ){
  287. self::localize( $form_id );
  288. return;
  289. }
  290. if( isset( $form[ 'settings' ][ 'logged_in' ] ) && $form[ 'settings' ][ 'logged_in' ] && ! is_user_logged_in() ){
  291. echo do_shortcode( $form[ 'settings' ][ 'not_logged_in_msg' ]);
  292. return;
  293. }
  294. $form[ 'settings' ] = array_merge( Ninja_Forms::config( 'i18nFrontEnd' ), $form[ 'settings' ] );
  295. $form[ 'settings' ] = apply_filters( 'ninja_forms_display_form_settings', $form[ 'settings' ], $form_id );
  296. $form[ 'settings' ][ 'is_preview' ] = TRUE;
  297. $currency = ( isset( $form[ 'settings' ][ 'currency' ] ) && $form[ 'settings' ][ 'currency' ] ) ? $form[ 'settings' ][ 'currency' ] : Ninja_Forms()->get_setting( 'currency' ) ;
  298. $currency_symbol = Ninja_Forms::config( 'CurrencySymbol' );
  299. $form[ 'settings' ][ 'currency_symbol' ] = ( isset( $currency_symbol[ $currency ] ) ) ? $currency_symbol[ $currency ] : '';
  300. $before_form = apply_filters( 'ninja_forms_display_before_form', '', $form_id, TRUE );
  301. $form[ 'settings' ][ 'beforeForm'] = $before_form;
  302. $before_fields = apply_filters( 'ninja_forms_display_before_fields', '', $form_id, TRUE );
  303. $form[ 'settings' ][ 'beforeFields'] = $before_fields;
  304. $after_fields = apply_filters( 'ninja_forms_display_after_fields', '', $form_id, TRUE );
  305. $form[ 'settings' ][ 'afterFields'] = $after_fields;
  306. $after_form = apply_filters( 'ninja_forms_display_after_form', '', $form_id, TRUE );
  307. $form[ 'settings' ][ 'afterForm'] = $after_form;
  308. $fields = array();
  309. if( empty( $form['fields'] ) ){
  310. echo __( 'No Fields Found.', 'ninja-forms' );
  311. } else {
  312. foreach ($form['fields'] as $field_id => $field) {
  313. $field_type = $field['settings']['type'];
  314. if( ! isset( Ninja_Forms()->fields[ $field_type ] ) ) continue;
  315. if( ! apply_filters( 'ninja_forms_preview_display_type_' . $field_type, TRUE ) ) continue;
  316. if( ! apply_filters( 'ninja_forms_preview_display_field', $field ) ) continue;
  317. $field['settings']['id'] = $field_id;
  318. $field = apply_filters('ninja_forms_localize_fields_preview', $field);
  319. $field = apply_filters('ninja_forms_localize_field_' . $field_type . '_preview', $field);
  320. $display_before = apply_filters( 'ninja_forms_display_before_field_type_' . $field['settings'][ 'type' ], '' );
  321. $display_before = apply_filters( 'ninja_forms_display_before_field_key_' . $field['settings'][ 'key' ], $display_before );
  322. $field['settings'][ 'beforeField' ] = $display_before;
  323. $display_after = apply_filters( 'ninja_forms_display_after_field_type_' . $field['settings'][ 'type' ], '' );
  324. $display_after = apply_filters( 'ninja_forms_display_after_field_key_' . $field['settings'][ 'key' ], $display_after );
  325. $field['settings'][ 'afterField' ] = $display_after;
  326. foreach ($field['settings'] as $key => $setting) {
  327. if (is_numeric($setting)) $field['settings'][$key] = floatval($setting);
  328. }
  329. if( ! isset( $field['settings'][ 'label_pos' ] ) || 'default' == $field['settings'][ 'label_pos' ] ){
  330. if( isset( $form[ 'settings' ][ 'default_label_pos' ] ) ) {
  331. $field['settings'][ 'label_pos' ] = $form[ 'settings' ][ 'default_label_pos' ];
  332. }
  333. }
  334. $field_class = Ninja_Forms()->fields[$field_type];
  335. $templates = $field_class->get_templates();
  336. if (!array($templates)) {
  337. $templates = array($templates);
  338. }
  339. foreach ($templates as $template) {
  340. self::load_template('fields-' . $template);
  341. }
  342. if (self::$use_test_values) {
  343. $field['settings']['value'] = $field_class->get_test_value();
  344. }
  345. $field[ 'settings' ][ 'parentType' ] = $field_class->get_parent_type();
  346. if( 'list' == $field[ 'settings' ][ 'parentType' ] && isset( $field['settings'][ 'options' ] ) && is_array( $field['settings'][ 'options' ] ) ){
  347. $field['settings'][ 'options' ] = apply_filters( 'ninja_forms_render_options', $field['settings'][ 'options' ], $field['settings'] );
  348. $field['settings'][ 'options' ] = apply_filters( 'ninja_forms_render_options_' . $field['settings'][ 'type' ], $field['settings'][ 'options' ], $field['settings'] );
  349. }
  350. $default_value = ( isset( $field[ 'settings' ][ 'default' ] ) ) ? $field[ 'settings' ][ 'default' ] : null;
  351. $default_value = apply_filters( 'ninja_forms_render_default_value', $default_value, $field_type, $field[ 'settings' ]);
  352. if( $default_value ){
  353. $default_value = preg_replace( '/{.*}/', '', $default_value );
  354. if ($default_value) {
  355. $field['settings']['value'] = $default_value;
  356. ob_start();
  357. do_shortcode( $field['settings']['value'] );
  358. $ob = ob_get_clean();
  359. if( ! $ob ) {
  360. $field['settings']['value'] = do_shortcode( $field['settings']['value'] );
  361. }
  362. }
  363. }
  364. // TODO: Find a better way to do this.
  365. if ('shipping' == $field['settings']['type']) {
  366. $field['settings']['shipping_cost'] = preg_replace ('/[^\d,\.]/', '', $field['settings']['shipping_cost'] );
  367. $field['settings']['shipping_cost'] = str_replace( Ninja_Forms()->get_setting( 'currency_symbol' ), '', $field['settings']['shipping_cost'] );
  368. $field['settings']['shipping_cost'] = number_format($field['settings']['shipping_cost'], 2);
  369. } elseif ('product' == $field['settings']['type']) {
  370. // TODO: Does the currency marker need to stripped here?
  371. $field['settings']['product_price'] = preg_replace ('/[^\d,\.]/', '', $field['settings']['product_price'] );
  372. $field['settings']['product_price'] = str_replace( Ninja_Forms()->get_setting( 'currency_symbol' ), '', $field['settings']['product_price'] );
  373. $field['settings']['product_price'] = number_format($field['settings']['product_price'], 2);
  374. } elseif ('total' == $field['settings']['type']) {
  375. if( ! isset( $field[ 'settings' ][ 'value' ] ) ) $field[ 'settings' ][ 'value' ] = 0;
  376. $field['settings']['value'] = number_format($field['settings']['value'], 2);
  377. }
  378. $field['settings']['element_templates'] = $templates;
  379. $field['settings']['old_classname'] = $field_class->get_old_classname();
  380. $field['settings']['wrap_template'] = $field_class->get_wrap_template();
  381. $fields[] = apply_filters( 'ninja_forms_localize_field_settings_' . $field_type, $field['settings'], $form );
  382. }
  383. }
  384. // Output Form Container
  385. do_action( 'ninja_forms_before_container_preview', $form_id, $form[ 'settings' ], $fields );
  386. Ninja_Forms::template( 'display-form-container.html.php', compact( 'form_id' ) );
  387. ?>
  388. <!-- TODO: Move to Template File. -->
  389. <script>
  390. // Maybe initialize nfForms object
  391. var nfForms = nfForms || [];
  392. // Build Form Data
  393. var form = [];
  394. form.id = '<?php echo $form['id']; ?>';
  395. form.settings = JSON.parse( '<?php echo WPN_Helper::addslashes( wp_json_encode( $form['settings'] ) ); ?>' );
  396. form.fields = JSON.parse( '<?php echo WPN_Helper::addslashes( wp_json_encode( $fields ) ); ?>' );
  397. // Add Form Data to nfForms object
  398. nfForms.push( form );
  399. </script>
  400. <?php
  401. self::enqueue_scripts( $form_id, true );
  402. }
  403. public static function enqueue_scripts( $form_id, $is_preview = false )
  404. {
  405. global $wp_locale;
  406. $form = Ninja_Forms()->form( $form_id )->get();
  407. $ver = Ninja_Forms::VERSION;
  408. $js_dir = Ninja_Forms::$url . 'assets/js/min/';
  409. $css_dir = Ninja_Forms::$url . 'assets/css/';
  410. self::enqueue_styles_display( $css_dir );
  411. if( $is_preview || in_array( $form_id, self::$form_uses_recaptcha ) ) {
  412. $recaptcha_lang = Ninja_Forms()->get_setting('recaptcha_lang');
  413. wp_enqueue_script('nf-google-recaptcha', 'https://www.google.com/recaptcha/api.js?hl=' . $recaptcha_lang . '&onload=nfRenderRecaptcha&render=explicit', array( 'jquery', 'nf-front-end-deps' ), $ver, TRUE );
  414. }
  415. if( $is_preview || in_array( $form_id, self::$form_uses_datepicker ) ) {
  416. wp_enqueue_style( 'pikaday-responsive', $css_dir . 'pikaday-package.css', $ver );
  417. wp_enqueue_script('nf-front-end--datepicker', $js_dir . 'front-end--datepicker.min.js', array( 'jquery', 'nf-front-end' ), $ver );
  418. }
  419. if( $is_preview || in_array( $form_id, self::$form_uses_inputmask ) ) {
  420. wp_enqueue_script('nf-front-end--inputmask', $js_dir . 'front-end--inputmask.min.js', array( 'jquery' ), $ver );
  421. }
  422. if( $is_preview || in_array( $form_id, self::$form_uses_currencymask ) ) {
  423. wp_enqueue_script('nf-front-end--currencymask', $js_dir . 'front-end--autonumeric.min.js', array( 'jquery' ), $ver );
  424. }
  425. if( $is_preview || in_array( $form_id, self::$form_uses_rte ) ) {
  426. if( $is_preview || in_array( $form_id, self::$form_uses_textarea_media ) ) {
  427. wp_enqueue_media();
  428. }
  429. wp_enqueue_style( 'summernote', $css_dir . 'summernote.css' , $ver );
  430. wp_enqueue_style( 'codemirror', $css_dir . 'codemirror.css' , $ver );
  431. wp_enqueue_style( 'codemirror-monokai', $css_dir . 'monokai-theme.css', $ver );
  432. wp_enqueue_script('nf-front-end--rte', $js_dir . 'front-end--rte.min.js', array( 'jquery' ), $ver );
  433. }
  434. if( $is_preview || in_array( $form_id, self::$form_uses_helptext ) ) {
  435. wp_enqueue_style( 'jBox', $css_dir . 'jBox.css', $ver );
  436. wp_enqueue_script('nf-front-end--helptext', $js_dir . 'front-end--helptext.min.js', array( 'jquery' ), $ver );
  437. }
  438. if( $is_preview || in_array( $form_id, self::$form_uses_starrating ) ) {
  439. wp_enqueue_style( 'rating', $css_dir . 'rating.css', Ninja_Forms::VERSION );
  440. wp_enqueue_script('nf-front-end--starrating', $js_dir . 'front-end--starrating.min.js', array( 'jquery' ), $ver );
  441. }
  442. wp_enqueue_script( 'nf-front-end-deps', $js_dir . 'front-end-deps.js', array( 'jquery', 'backbone' ), $ver );
  443. wp_enqueue_script( 'nf-front-end', $js_dir . 'front-end.js', array( 'nf-front-end-deps' ), $ver );
  444. wp_localize_script( 'nf-front-end', 'nfi18n', Ninja_Forms::config( 'i18nFrontEnd' ) );
  445. $data = apply_filters( 'ninja_forms_render_localize_script_data', array(
  446. 'adminAjax' => admin_url( 'admin-ajax.php' ),
  447. 'ajaxNonce' => wp_create_nonce( 'ninja_forms_display_nonce' ),
  448. 'requireBaseUrl' => Ninja_Forms::$url . 'assets/js/',
  449. 'use_merge_tags' => array(),
  450. 'opinionated_styles' => Ninja_Forms()->get_setting( 'opinionated_styles' )
  451. ));
  452. foreach( Ninja_Forms()->fields as $field ){
  453. foreach( $field->use_merge_tags() as $merge_tag ){
  454. $data[ 'use_merge_tags' ][ $merge_tag ][ $field->get_type() ] = $field->get_type();
  455. }
  456. }
  457. wp_localize_script( 'nf-front-end', 'nfFrontEnd', $data );
  458. do_action( 'ninja_forms_enqueue_scripts', array( 'form_id' => $form_id ) );
  459. do_action( 'nf_display_enqueue_scripts' );
  460. }
  461. /**
  462. * Enqueue NF frontend basic display styles.
  463. *
  464. * @param string $css_dir
  465. */
  466. public static function enqueue_styles_display( $css_dir ) {
  467. switch( Ninja_Forms()->get_setting( 'opinionated_styles' ) ) {
  468. case 'light':
  469. wp_enqueue_style( 'nf-display', $css_dir . 'display-opinions-light.css', array( 'dashicons' ) );
  470. wp_enqueue_style( 'nf-font-awesome', $css_dir . 'font-awesome.min.css' );
  471. break;
  472. case 'dark':
  473. wp_enqueue_style( 'nf-display', $css_dir . 'display-opinions-dark.css', array( 'dashicons' ) );
  474. wp_enqueue_style( 'nf-font-awesome', $css_dir . 'font-awesome.min.css' );
  475. break;
  476. default:
  477. wp_enqueue_style( 'nf-display', $css_dir . 'display-structure.css', array( 'dashicons' ) );
  478. }
  479. }
  480. protected static function load_template( $file_name = '' )
  481. {
  482. if( ! $file_name ) return;
  483. if( self::is_template_loaded( $file_name ) ) return;
  484. self::$loaded_templates[] = $file_name;
  485. }
  486. public static function output_templates()
  487. {
  488. // Build File Path Hierarchy
  489. $file_paths = apply_filters( 'ninja_forms_field_template_file_paths', array(
  490. get_stylesheet_directory() . '/ninja-forms/templates/',
  491. ));
  492. $file_paths[] = Ninja_Forms::$dir . 'includes/Templates/';
  493. // Search for and Output File Templates
  494. foreach( self::$loaded_templates as $file_name ) {
  495. foreach( $file_paths as $path ){
  496. if( file_exists( $path . "$file_name.html" ) ){
  497. echo file_get_contents( $path . "$file_name.html" );
  498. break;
  499. }
  500. }
  501. }
  502. ?>
  503. <script>
  504. var post_max_size = '<?php echo WPN_Helper::string_to_bytes( ini_get('post_max_size') ); ?>';
  505. var upload_max_filesize = '<?php echo WPN_Helper::string_to_bytes( ini_get( 'upload_max_filesize' ) ); ?>';
  506. var wp_memory_limit = '<?php echo WPN_Helper::string_to_bytes( WP_MEMORY_LIMIT ); ?>';
  507. </script>
  508. <?php
  509. // Action to Output Custom Templates
  510. do_action( 'ninja_forms_output_templates' );
  511. }
  512. /*
  513. * UTILITY
  514. */
  515. protected static function is_template_loaded( $template_name )
  516. {
  517. return ( in_array( $template_name, self::$loaded_templates ) ) ? TRUE : FALSE ;
  518. }
  519. } // End Class NF_Display_Render