PageRenderTime 55ms CodeModel.GetById 26ms RepoModel.GetById 1ms app.codeStats 0ms

/includes/Display/Render.php

https://github.com/amdrew/ninja-forms
PHP | 504 lines | 354 code | 116 blank | 34 comment | 75 complexity | 68b7ed0a46afaf1bee3b15e3dd3f93cc MD5 | raw file
  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. );
  25. protected static $use_test_values = FALSE;
  26. public static function localize( $form_id )
  27. {
  28. $capability = apply_filters( 'ninja_forms_display_test_values_capabilities', 'read' );
  29. if( isset( $_GET[ 'ninja_forms_test_values' ] ) && current_user_can( $capability ) ){
  30. self::$use_test_values = TRUE;
  31. }
  32. if( ! has_action( 'wp_footer', 'NF_Display_Render::output_templates', 9999 ) ){
  33. add_action( 'wp_footer', 'NF_Display_Render::output_templates', 9999 );
  34. }
  35. $form = Ninja_Forms()->form( $form_id )->get();
  36. if( $form->get_setting( 'lock' ) ){
  37. echo __( 'This form is not available.', 'ninja-forms' );
  38. return;
  39. }
  40. if( $form->get_setting( 'logged_in' ) && ! is_user_logged_in() ){
  41. echo $form->get_setting( 'not_logged_in_msg' );
  42. return;
  43. }
  44. if( $form->get_setting( 'sub_limit_number' ) ){
  45. $subs = Ninja_Forms()->form( $form_id )->get_subs();
  46. // TODO: Optimize Query
  47. global $wpdb;
  48. $count = 0;
  49. $subs = $wpdb->get_results( "SELECT post_id FROM wp_postmeta WHERE `meta_key` = '_form_id' AND `meta_value` = $form_id" );
  50. foreach( $subs as $sub ){
  51. if( 'publish' == get_post_status( $sub->post_id ) ) $count++;
  52. }
  53. if( $count >= $form->get_setting( 'sub_limit_number' ) ) {
  54. echo $form->get_setting( 'sub_limit_msg' );
  55. return;
  56. }
  57. }
  58. $before_form = apply_filters( 'ninja_forms_display_before_form', '', $form_id );
  59. $form->update_setting( 'beforeForm', $before_form );
  60. $before_fields = apply_filters( 'ninja_forms_display_before_fields', '', $form_id );
  61. $form->update_setting( 'beforeFields', $before_fields );
  62. $after_fields = apply_filters( 'ninja_forms_display_after_fields', '', $form_id );
  63. $form->update_setting( 'afterFields', $after_fields );
  64. $after_form = apply_filters( 'ninja_forms_display_after_form', '', $form_id );
  65. $form->update_setting( 'afterForm', $after_form );
  66. $form_fields = Ninja_Forms()->form( $form_id )->get_fields();
  67. $fields = array();
  68. if( empty( $form_fields ) ){
  69. echo __( 'No Fields Found.', 'ninja-forms' );
  70. } else {
  71. foreach ($form_fields as $field) {
  72. $field_type = $field->get_settings('type');
  73. if( ! isset( Ninja_Forms()->fields[ $field_type ] ) ) continue;
  74. if( ! apply_filters( 'ninja_forms_display_type_' . $field_type, TRUE ) ) continue;
  75. if( ! apply_filters( 'ninja_forms_display_field', $field ) ) continue;
  76. $field = apply_filters('ninja_forms_localize_fields', $field);
  77. $field = apply_filters('ninja_forms_localize_field_' . $field_type, $field);
  78. $field_class = Ninja_Forms()->fields[$field_type];
  79. if (self::$use_test_values) {
  80. $field->update_setting('value', $field_class->get_test_value());
  81. }
  82. $field->update_setting('id', $field->get_id());
  83. /*
  84. * 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.
  85. */
  86. $display_before = apply_filters( 'ninja_forms_display_before_field_type_' . $field->get_setting( 'type' ), '' );
  87. $display_before = apply_filters( 'ninja_forms_display_before_field_key_' . $field->get_setting( 'key' ), $display_before );
  88. $field->update_setting( 'beforeField', $display_before );
  89. $display_after = apply_filters( 'ninja_forms_display_after_field_type_' . $field->get_setting( 'type' ), '' );
  90. $display_after = apply_filters( 'ninja_forms_display_after_field_key_' . $field->get_setting( 'key' ), $display_after );
  91. $field->update_setting( 'afterField', $display_after );
  92. $templates = $field_class->get_templates();
  93. if (!array($templates)) {
  94. $templates = array($templates);
  95. }
  96. foreach ($templates as $template) {
  97. self::load_template('fields-' . $template);
  98. }
  99. $settings = $field->get_settings();
  100. foreach ($settings as $key => $setting) {
  101. if (is_numeric($setting)) $settings[$key] = floatval($setting);
  102. }
  103. if( ! isset( $settings[ 'label_pos' ] ) || 'default' == $settings[ 'label_pos' ] ){
  104. $settings[ 'label_pos' ] = $form->get_setting( 'default_label_pos' );
  105. }
  106. $settings[ 'parentType' ] = $field_class->get_parent_type();
  107. if( 'list' == $settings[ 'parentType' ] && isset( $settings[ 'options' ] ) && is_array( $settings[ 'options' ] ) ){
  108. $settings[ 'options' ] = apply_filters( 'ninja_forms_render_options', $settings[ 'options' ], $settings );
  109. $settings[ 'options' ] = apply_filters( 'ninja_forms_render_options_' . $field_type, $settings[ 'options' ], $settings );
  110. }
  111. if (isset($settings['default'])) {
  112. $default_value = apply_filters('ninja_forms_render_default_value', $settings['default'], $field_type, $settings);
  113. $default_value = preg_replace( '/{.*}/', '', $default_value );
  114. if ($default_value) {
  115. $settings['value'] = $default_value;
  116. ob_start();
  117. do_shortcode( $settings['value'] );
  118. $ob = ob_get_clean();
  119. if( $ob ){
  120. $settings['value'] = $ob;
  121. }
  122. }
  123. }
  124. // TODO: Find a better way to do this.
  125. if ('shipping' == $settings['type']) {
  126. // TODO: Does the currency marker need to stripped here?
  127. $settings['shipping_cost'] = str_replace( array( '$', '£', '€' ), '', $settings['shipping_cost']);
  128. $settings['shipping_cost'] = str_replace( Ninja_Forms()->get_setting( 'currency_symbol' ), '', $settings['shipping_cost']);
  129. $settings['shipping_cost'] = number_format($settings['shipping_cost'], 2);
  130. } elseif ('product' == $settings['type']) {
  131. // TODO: Does the currency marker need to stripped here?
  132. $settings['product_price'] = str_replace( array( '$', '£', '€' ), '', $settings['product_price']);
  133. $settings['product_price'] = str_replace( Ninja_Forms()->get_setting( 'currency_symbol' ), '', $settings['product_price']);
  134. $settings['product_price'] = number_format($settings['product_price'], 2);
  135. } elseif ('total' == $settings['type'] && isset($settings['value'])) {
  136. $settings['value'] = number_format($settings['value'], 2);
  137. }
  138. $settings['element_templates'] = $templates;
  139. $settings['old_classname'] = $field_class->get_old_classname();
  140. $settings['wrap_template'] = $field_class->get_wrap_template();
  141. $fields[] = apply_filters( 'ninja_forms_localize_field_settings_' . $field_type, $settings, $form );
  142. }
  143. }
  144. // Output Form Container
  145. do_action( 'ninja_forms_before_container', $form_id, $form->get_settings(), $form_fields );
  146. Ninja_Forms::template( 'display-form-container.html.php', compact( 'form_id' ) );
  147. ?>
  148. <!-- TODO: Move to Template File. -->
  149. <script>
  150. var formDisplay = 1;
  151. // Maybe initialize nfForms object
  152. var nfForms = nfForms || [];
  153. // Build Form Data
  154. var form = [];
  155. form.id = '<?php echo $form_id; ?>';
  156. form.settings = <?php echo wp_json_encode( $form->get_settings() ); ?>;
  157. form.fields = <?php echo wp_json_encode( $fields ); ?>;
  158. // Add Form Data to nfForms object
  159. nfForms.push( form );
  160. </script>
  161. <?php
  162. self::enqueue_scripts( $form_id );
  163. }
  164. public static function localize_preview( $form_id )
  165. {
  166. $capability = apply_filters( 'ninja_forms_display_test_values_capabilities', 'read' );
  167. if( isset( $_GET[ 'ninja_forms_test_values' ] ) && current_user_can( $capability ) ){
  168. self::$use_test_values = TRUE;
  169. }
  170. add_action( 'wp_footer', 'NF_Display_Render::output_templates', 9999 );
  171. $form = get_user_option( 'nf_form_preview_' . $form_id );
  172. if( ! $form ){
  173. self::localize( $form_id );
  174. return;
  175. }
  176. if( isset( $form[ 'settings' ][ 'logged_in' ] ) && $form[ 'settings' ][ 'logged_in' ] && ! is_user_logged_in() ){
  177. echo $form[ 'settings' ][ 'not_logged_in_msg' ];
  178. return;
  179. }
  180. $form[ 'settings' ][ 'is_preview' ] = TRUE;
  181. $before_form = apply_filters( 'ninja_forms_display_before_form', '', $form_id, TRUE );
  182. $form[ 'settings' ][ 'beforeForm'] = $before_form;
  183. $before_fields = apply_filters( 'ninja_forms_display_before_fields', '', $form_id, TRUE );
  184. $form[ 'settings' ][ 'beforeFields'] = $before_fields;
  185. $after_fields = apply_filters( 'ninja_forms_display_after_fields', '', $form_id, TRUE );
  186. $form[ 'settings' ][ 'afterFields'] = $after_fields;
  187. $after_form = apply_filters( 'ninja_forms_display_after_form', '', $form_id, TRUE );
  188. $form[ 'settings' ][ 'afterForm'] = $after_form;
  189. $fields = array();
  190. if( empty( $form['fields'] ) ){
  191. echo __( 'No Fields Found.', 'ninja-forms' );
  192. } else {
  193. foreach ($form['fields'] as $field_id => $field) {
  194. $field_type = $field['settings']['type'];
  195. if( ! isset( Ninja_Forms()->fields[ $field_type ] ) ) continue;
  196. if( ! apply_filters( 'ninja_forms_preview_display_type_' . $field_type, TRUE ) ) continue;
  197. if( ! apply_filters( 'ninja_forms_preview_display_field', $field ) ) continue;
  198. $field['settings']['id'] = $field_id;
  199. $field = apply_filters('ninja_forms_localize_fields_preview', $field);
  200. $field = apply_filters('ninja_forms_localize_field_' . $field_type . '_preview', $field);
  201. $display_before = apply_filters( 'ninja_forms_display_before_field_type_' . $field['settings'][ 'type' ], '' );
  202. $display_before = apply_filters( 'ninja_forms_display_before_field_key_' . $field['settings'][ 'key' ], $display_before );
  203. $field['settings'][ 'beforeField' ] = $display_before;
  204. $display_after = apply_filters( 'ninja_forms_display_after_field_type_' . $field['settings'][ 'type' ], '' );
  205. $display_after = apply_filters( 'ninja_forms_display_after_field_key_' . $field['settings'][ 'key' ], $display_after );
  206. $field['settings'][ 'afterField' ] = $display_after;
  207. foreach ($field['settings'] as $key => $setting) {
  208. if (is_numeric($setting)) $field['settings'][$key] = floatval($setting);
  209. }
  210. if( ! isset( $field['settings'][ 'label_pos' ] ) || 'default' == $field['settings'][ 'label_pos' ] ){
  211. if( isset( $form[ 'settings' ][ 'default_label_pos' ] ) ) {
  212. $field['settings'][ 'label_pos' ] = $form[ 'settings' ][ 'default_label_pos' ];
  213. }
  214. }
  215. $field_class = Ninja_Forms()->fields[$field_type];
  216. $templates = $field_class->get_templates();
  217. if (!array($templates)) {
  218. $templates = array($templates);
  219. }
  220. foreach ($templates as $template) {
  221. self::load_template('fields-' . $template);
  222. }
  223. if (self::$use_test_values) {
  224. $field['settings']['value'] = $field_class->get_test_value();
  225. }
  226. $field[ 'settings' ][ 'parentType' ] = $field_class->get_parent_type();
  227. if( 'list' == $field[ 'settings' ][ 'parentType' ] && isset( $field['settings'][ 'options' ] ) && is_array( $field['settings'][ 'options' ] ) ){
  228. $field['settings'][ 'options' ] = apply_filters( 'ninja_forms_render_options', $field['settings'][ 'options' ], $field['settings'] );
  229. }
  230. if (isset($field['settings']['default'])) {
  231. $default_value = apply_filters('ninja_forms_render_default_value', $field['settings']['default'], $field_type, $field['settings']);
  232. $default_value = preg_replace( '/{.*}/', '', $default_value );
  233. if ($default_value) {
  234. $field['settings']['value'] = $default_value;
  235. ob_start();
  236. do_shortcode( $field['settings']['value'] );
  237. $ob = ob_get_clean();
  238. if( $ob ){
  239. $field['settings']['value'] = $ob;
  240. }
  241. }
  242. }
  243. // TODO: Find a better way to do this.
  244. if ('shipping' == $field['settings']['type']) {
  245. $field['settings']['shipping_cost'] = str_replace( array( '$', '£', '€' ), '', $field['settings']['shipping_cost'] );
  246. $field['settings']['shipping_cost'] = str_replace( Ninja_Forms()->get_setting( 'currency_symbol' ), '', $field['settings']['shipping_cost'] );
  247. $field['settings']['shipping_cost'] = number_format($field['settings']['shipping_cost'], 2);
  248. } elseif ('product' == $field['settings']['type']) {
  249. // TODO: Does the currency marker need to stripped here?
  250. $field['settings']['product_price'] = str_replace( array( '$', '£', '€' ), '', $field['settings']['product_price'] );
  251. $field['settings']['product_price'] = str_replace( Ninja_Forms()->get_setting( 'currency_symbol' ), '', $field['settings']['product_price'] );
  252. $field['settings']['product_price'] = number_format($field['settings']['product_price'], 2);
  253. } elseif ('total' == $field['settings']['type']) {
  254. if( ! isset( $field[ 'settings' ][ 'value' ] ) ) $field[ 'settings' ][ 'value' ] = 0;
  255. $field['settings']['value'] = number_format($field['settings']['value'], 2);
  256. }
  257. $field['settings']['element_templates'] = $templates;
  258. $field['settings']['old_classname'] = $field_class->get_old_classname();
  259. $field['settings']['wrap_template'] = $field_class->get_wrap_template();
  260. $fields[] = apply_filters( 'ninja_forms_localize_field_settings_' . $field_type, $field['settings'], $form );
  261. }
  262. }
  263. // Output Form Container
  264. do_action( 'ninja_forms_before_container_preview', $form_id, $form[ 'settings' ], $fields );
  265. Ninja_Forms::template( 'display-form-container.html.php', compact( 'form_id' ) );
  266. ?>
  267. <!-- TODO: Move to Template File. -->
  268. <script>
  269. // Maybe initialize nfForms object
  270. var nfForms = nfForms || [];
  271. // Build Form Data
  272. var form = [];
  273. form.id = '<?php echo $form['id']; ?>';
  274. form.settings = JSON.parse( '<?php echo WPN_Helper::addslashes( wp_json_encode( $form['settings'] ) ); ?>' );
  275. form.fields = JSON.parse( '<?php echo WPN_Helper::addslashes( wp_json_encode( $fields ) ); ?>' );
  276. // Add Form Data to nfForms object
  277. nfForms.push( form );
  278. </script>
  279. <?php
  280. self::enqueue_scripts( $form_id );
  281. }
  282. public static function enqueue_scripts( $form_id )
  283. {
  284. wp_enqueue_media();
  285. wp_enqueue_style( 'jBox', Ninja_Forms::$url . 'assets/css/jBox.css' );
  286. wp_enqueue_style( 'summernote', Ninja_Forms::$url . 'assets/css/summernote.css' );
  287. wp_enqueue_style( 'codemirror', Ninja_Forms::$url . 'assets/css/codemirror.css' );
  288. wp_enqueue_style( 'codemirror-monokai', Ninja_Forms::$url . 'assets/css/monokai-theme.css' );
  289. wp_enqueue_style( 'rating', Ninja_Forms::$url . 'assets/css/rating.css' );
  290. if( Ninja_Forms()->get_setting( 'opinionated_styles' ) ) {
  291. if( 'light' == Ninja_Forms()->get_setting( 'opinionated_styles' ) ){
  292. wp_enqueue_style('nf-display', Ninja_Forms::$url . 'assets/css/display-opinions-light.css');
  293. wp_enqueue_style( 'nf-font-awesome', Ninja_Forms::$url . 'assets/css/font-awesome.min.css' );
  294. }
  295. if( 'dark' == Ninja_Forms()->get_setting( 'opinionated_styles' ) ){
  296. wp_enqueue_style('nf-display', Ninja_Forms::$url . 'assets/css/display-opinions-dark.css');
  297. wp_enqueue_style( 'nf-font-awesome', Ninja_Forms::$url . 'assets/css/font-awesome.min.css' );
  298. }
  299. } else {
  300. wp_enqueue_style( 'nf-display', Ninja_Forms::$url . 'assets/css/display-structure.css' );
  301. }
  302. wp_enqueue_style( 'pikaday-responsive', Ninja_Forms::$url . 'assets/css/pikaday-package.css' );
  303. wp_enqueue_script( 'backbone-marionette', Ninja_Forms::$url . 'assets/js/lib/backbone.marionette.min.js', array( 'jquery', 'backbone' ) );
  304. wp_enqueue_script( 'backbone-radio', Ninja_Forms::$url . 'assets/js/lib/backbone.radio.min.js', array( 'jquery', 'backbone' ) );
  305. wp_enqueue_script( 'math', Ninja_Forms::$url . 'assets/js/lib/math.min.js', array( 'jquery' ) );
  306. wp_enqueue_script( 'modernizr', Ninja_Forms::$url . 'assets/js/lib/modernizr.min.js', array( 'jquery' ) );
  307. wp_enqueue_script( 'moment', Ninja_Forms::$url . 'assets/js/lib/moment-with-locales.min.js', array( 'jquery' ) );
  308. wp_enqueue_script( 'pikaday', Ninja_Forms::$url . 'assets/js/lib/pikaday.min.js', array( 'jquery' ) );
  309. wp_enqueue_script( 'pikaday-responsive', Ninja_Forms::$url . 'assets/js/lib/pikaday-responsive.min.js', array( 'jquery' ) );
  310. $recaptcha_lang = Ninja_Forms()->get_setting( 'recaptcha_lang' );
  311. wp_enqueue_script( 'google-recaptcha', 'https://www.google.com/recaptcha/api.js?hl=' . $recaptcha_lang, array( 'jquery' ) );
  312. wp_enqueue_script( 'masked-input', Ninja_Forms::$url . 'assets/js/lib/jquery.maskedinput.min.js', array( 'jquery' ) );
  313. wp_enqueue_script( 'bootstrap', Ninja_Forms::$url . 'assets/js/lib/bootstrap.min.js', array( 'jquery' ) );
  314. wp_enqueue_script( 'codemirror', Ninja_Forms::$url . 'assets/js/lib/codemirror.min.js', array( 'jquery' ) );
  315. wp_enqueue_script( 'codemirror-xml', Ninja_Forms::$url . 'assets/js/lib/codemirror-xml.min.js', array( 'jquery' ) );
  316. wp_enqueue_script( 'codemirror-formatting', Ninja_Forms::$url . 'assets/js/lib/codemirror-formatting.min.js', array( 'jquery' ) );
  317. wp_enqueue_script( 'summernote', Ninja_Forms::$url . 'assets/js/lib/summernote.min.js', array( 'jquery' ) );
  318. wp_enqueue_script( 'jBox', Ninja_Forms::$url . 'assets/js/lib/jBox.min.js', array( 'jquery' ) );
  319. wp_enqueue_script( 'starrating', Ninja_Forms::$url . 'assets/js/lib/rating.min.js', array( 'jquery' ) );
  320. wp_enqueue_script( 'nf-global', Ninja_Forms::$url . 'assets/js/min/global.js', array( 'jquery' ) );
  321. wp_enqueue_script( 'nf-front-end', Ninja_Forms::$url . 'assets/js/min/front-end.js', array( 'jquery', 'backbone', 'backbone-radio', 'backbone-marionette', 'math' ) );
  322. $data = apply_filters( 'ninja_forms_render_localize_script_data', array(
  323. 'ajaxNonce' => wp_create_nonce( 'ninja_forms_display_nonce' ),
  324. 'adminAjax' => admin_url( 'admin-ajax.php' ),
  325. 'requireBaseUrl' => Ninja_Forms::$url . 'assets/js/',
  326. 'use_merge_tags' => array(),
  327. 'opinionated_styles' => Ninja_Forms()->get_setting( 'opinionated_styles' )
  328. ));
  329. foreach( Ninja_Forms()->fields as $field ){
  330. foreach( $field->use_merge_tags() as $merge_tag ){
  331. $data[ 'use_merge_tags' ][ $merge_tag ][ $field->get_type() ] = $field->get_type();
  332. }
  333. }
  334. wp_localize_script( 'nf-front-end', 'nfFrontEnd', $data );
  335. do_action( 'ninja_forms_enqueue_scripts', array( 'form_id' => $form_id ) );
  336. /*
  337. ?>
  338. <script type="text/javascript">
  339. function nf_recaptcha_set_field_value( inpval ) {
  340. console.log( inpval );
  341. jQuery( "#nf-field-<%= id %>" ).val( inpval );
  342. }
  343. </script>
  344. <?php
  345. */
  346. do_action( 'nf_display_enqueue_scripts' );
  347. }
  348. protected static function load_template( $file_name = '' )
  349. {
  350. if( ! $file_name ) return;
  351. if( self::is_template_loaded( $file_name ) ) return;
  352. self::$loaded_templates[] = $file_name;
  353. }
  354. public static function output_templates()
  355. {
  356. // Build File Path Hierarchy
  357. $file_paths = apply_filters( 'ninja_forms_field_template_file_paths', array(
  358. get_template_directory() . '/ninja-forms/templates/',
  359. ));
  360. $file_paths[] = Ninja_Forms::$dir . 'includes/Templates/';
  361. // Search for and Output File Templates
  362. foreach( self::$loaded_templates as $file_name ) {
  363. foreach( $file_paths as $path ){
  364. if( file_exists( $path . "$file_name.html" ) ){
  365. echo file_get_contents( $path . "$file_name.html" );
  366. break;
  367. }
  368. }
  369. }
  370. ?>
  371. <script>
  372. var post_max_size = '<?php echo WPN_Helper::string_to_bytes( ini_get('post_max_size') ); ?>';
  373. var upload_max_filesize = '<?php echo WPN_Helper::string_to_bytes( ini_get( 'upload_max_filesize' ) ); ?>';
  374. var wp_memory_limit = '<?php echo WPN_Helper::string_to_bytes( WP_MEMORY_LIMIT ); ?>';
  375. </script>
  376. <?php
  377. // Action to Output Custom Templates
  378. do_action( 'ninja_forms_output_templates' );
  379. }
  380. /*
  381. * UTILITY
  382. */
  383. protected static function is_template_loaded( $template_name )
  384. {
  385. return ( in_array( $template_name, self::$loaded_templates ) ) ? TRUE : FALSE ;
  386. }
  387. } // End Class NF_Display_Render