class-simple-job-board-meta-box-job-application.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. <?php if (!defined('ABSPATH')) { exit; } // Exit if accessed directly
  2. /**
  3. * Simple_Job_Board_Meta_Box_Job_Application Class
  4. *
  5. * This meta box is designed to create user defined application form that is
  6. * for indvidual job post.
  7. *
  8. * @link https://wordpress.org/plugins/simple-job-board
  9. * @since 2.2.3
  10. * @since 2.3.2 Added Application Form Labels' Editing Feature.
  11. * @since 2.4.0 Select Application Name Column on SJB Form Builder & Improved Sanitization & Escaping of Form Fields' Inputs & Outputs
  12. * @since 2.4.5 Fixed the job application form builder issue with multilingual characters.
  13. *
  14. * @package Simple_Job_Board
  15. * @subpackage Simple_Job_Board/admin/partials/meta-boxes
  16. * @author PressTigers <support@presstigers.com>
  17. */
  18. class Simple_Job_Board_Meta_Box_Job_Application {
  19. /**
  20. * Meta box for Job Application Form.
  21. *
  22. * @since 2.2.3
  23. */
  24. public static function sjb_meta_box_output($post) {
  25. global $jobfields;
  26. // Add a nonce field so we can check for it later.
  27. wp_nonce_field('sjb_jobpost_meta_box', 'jobpost_meta_box_nonce');
  28. /**
  29. * Use get_post_meta() to retrieve an existing value
  30. */
  31. ?>
  32. <div class="meta_option_panel jobpost_fields">
  33. <ul id="app_form_fields">
  34. <?php
  35. // Form Field Types
  36. $field_types = array(
  37. 'text' => esc_html__('Text Field', 'simple-job-board'),
  38. 'text_area' => esc_html__('Text Area', 'simple-job-board'),
  39. 'email' => esc_html__('Email', 'simple-job-board'),
  40. 'phone' => esc_html__('Phone', 'simple-job-board'),
  41. 'date' => esc_html__('Date', 'simple-job-board'),
  42. 'checkbox' => esc_html__('Check Box', 'simple-job-board'),
  43. 'dropdown' => esc_html__('Drop Down', 'simple-job-board'),
  44. 'radio' => esc_html__('Radio', 'simple-job-board'),
  45. );
  46. /**
  47. * Filter -> Modify Form Field Types
  48. *
  49. * @since 2.3.0
  50. */
  51. $field_types = apply_filters( 'sjb_form_field_types', $field_types );
  52. $keys = get_post_custom_keys($post->ID);
  53. // Getting setting page saved options
  54. $jobapp_settings_options = unserialize(get_option('jobapp_settings_options'));
  55. //check Array differnce when $keys is not NULL
  56. if (NULL == $keys) {
  57. // "Add New" job Check
  58. $jobapp_removed_options = $jobapp_settings_options;
  59. } elseif (NULL == $jobapp_settings_options) {
  60. $jobapp_removed_options = '';
  61. } else {
  62. // Remove the same option from post meta and options
  63. $jobapp_removed_options = array_diff_key($jobapp_settings_options, get_post_meta($post->ID));
  64. }
  65. // Display Job Application Meta
  66. if (NULL != $keys):
  67. foreach ($keys as $key):
  68. if ( substr($key, 0, 7 ) == 'jobapp_' ):
  69. $val = get_post_meta($post->ID, $key, TRUE);
  70. $val = unserialize( $val );
  71. $val = ( is_array( $val ) )? array_map('esc_attr', $val ) : esc_attr( $val );
  72. $key = preg_replace('/[^\p{L} 0-9]/u', '_', $key);
  73. $fields = NULL;
  74. foreach ( $field_types as $field_key => $field_val ) {
  75. if ($val['type'] == $field_key)
  76. $fields .= '<option value="' .sanitize_key( $field_key ) . '" selected>' . esc_attr( $field_val ) . '</option>';
  77. else
  78. $fields .= '<option value="' . sanitize_key( $field_key ) . '" >' . esc_attr( $field_val ). '</option>';
  79. }
  80. /**
  81. * New Label Index Insertion:
  82. *
  83. * - Addition of new index "label"
  84. * - Data Legacy Checking
  85. */
  86. $label = isset( $val['label'] ) ? $val['label'] : esc_html__( ucwords(str_replace('_', ' ', substr($key, 7))), 'simple-job-board' );
  87. echo '<li class="' . $key . '">'
  88. . '<label class="sjb-editable-label" for="">' . $label . '</label>'
  89. . '<input type="hidden" name="' . $key . '[label]" value="' . $label . '"/>'
  90. . '<select class="jobapp_field_type" name="' . $key . '[type]">'
  91. . $fields
  92. . '</select>';
  93. // Show Options for Dropdown, Checkbox & Radio Buttons
  94. if ( 'checkbox' === $val['type'] || 'dropdown' === $val['type'] || 'radio' === $val['type'] ):
  95. echo '<input type="text" name="' . $key . '[options]" class="jobapp-field-options" value="' . $val['options'] . '" placeholder="Option1, option2, option3" />';
  96. else:
  97. echo '<input type="text" name="' . $key . '[options]" class="jobapp-field-options" placeholder="Option1, option2, option3" style="display:none;" />&nbsp;';
  98. endif;
  99. // Set Fields as Optional or Required
  100. $is_required = isset( $val['optional'] ) ? $val['optional'] : 'checked';
  101. echo '<input type="checkbox" class="jobapp-required-field" ' . $is_required . ' />' . esc_html__('Required', 'simple-job-board') . ' &nbsp; ';
  102. echo '<input type="hidden" class="jobapp-optional-field" name="' . $key . '[optional]" value="' . $is_required . '"/>';
  103. // Delete Button
  104. $button = '<div class="button removeField">' . esc_html__('Delete', 'simple-job-board') . '</div>';
  105. echo $button . ' &nbsp; ';
  106. /**
  107. * Set Applicant Name Field
  108. *
  109. * Select field to show column under Applicant section
  110. *
  111. * @since 2.4.0
  112. */
  113. $is_applicant_column = isset( $val['applicant_column'] ) ? $val['applicant_column']: 'unchecked';
  114. echo '<input type="radio" class="applicant-columns" name="[applicant_column]" '. $is_applicant_column . '/>' . esc_html__( 'Expose in Applicant Listing', 'simple-job-board' ) . ' &nbsp; ';
  115. echo '<input type="hidden" class="jobapp-applicant-column" name="' . $key . '[applicant_column]" value="' . $is_applicant_column . '"/>';
  116. echo '</li>';
  117. endif;
  118. endforeach;
  119. endif;
  120. /**
  121. * Settings Job Application Form
  122. */
  123. if ( NULL != $jobapp_removed_options ):
  124. if ( !isset( $_GET['action'] ) ):
  125. foreach ($jobapp_removed_options as $jobapp_field_name => $val):
  126. if (isset($val['type']) && isset($val['option'])):
  127. if (substr($jobapp_field_name, 0, 7) == 'jobapp_'):
  128. $val = ( is_array( $val ) )? array_map( 'esc_attr', $val ) : esc_attr( $val );
  129. $jobapp_field_name = preg_replace('/[^\p{L} 0-9]/u', '_', $jobapp_field_name);
  130. $fields = NULL;
  131. foreach ($field_types as $field_key => $field_val) {
  132. // Sanitize Key
  133. $field_key = preg_replace('/[^\p{L} 0-9]/u', '_', $field_key);
  134. if ($val['type'] == $field_key)
  135. $fields .= '<option value="' . $field_key . '" selected>' . esc_attr( $field_val ) . '</option>';
  136. else
  137. $fields .= '<option value="' . $field_key . '" >' . esc_attr( $field_val ) . '</option>';
  138. }
  139. /**
  140. * Label Insertion:
  141. *
  142. * - Addition of new Field Labels
  143. * - Data Legacy Checking
  144. */
  145. $label = isset( $val['label'] ) ? $val['label'] : ucwords(str_replace('_', ' ', substr($key, 7)));
  146. echo '<li class="' . $jobapp_field_name . '"><label class="sjb-editable-label" for="">' . $label . '</label>'
  147. . '<input type="hidden" name="' . $jobapp_field_name . '[label]" value="' . $label . '"/>'
  148. . '<select class="jobapp_field_type" name="' . $jobapp_field_name . '[type]">' . $fields . '</select>';
  149. // Show Options for Dropdown, Checkbox & Radio Buttons
  150. if ( 'checkbox' === $val['type'] || 'dropdown' === $val['type'] || 'radio' === $val['type'] ):
  151. echo '<input type="text" name="' . $jobapp_field_name . '[options]" class="jobapp-field-options" value="' . $val['option'] . '" placeholder="Option1, option2, option3" />';
  152. else:
  153. echo '<input type="text" name="' . $jobapp_field_name . '[options]" class="jobapp-field-options" placeholder="Option1, option2, option3" style="display:none;" />';
  154. endif;
  155. // Set Fields as Optional or Required
  156. $is_required = isset( $val['optional'] ) ? $val['optional'] : 'checked';
  157. echo '<input type="checkbox" class="jobapp-required-field" ' . $is_required . ' />' . esc_html__('Required', 'simple-job-board') . '&nbsp; ';
  158. echo '<input type="hidden" class="jobapp-optional-field" name="' . $jobapp_field_name . '[optional]" value="' . $is_required . '"/> &nbsp;';
  159. echo '<div class="button removeField">' . esc_html__('Delete', 'simple-job-board') . '</div> &nbsp;';
  160. /**
  161. * Set Applicant Name Field
  162. *
  163. * Select field to show column under Applicant section
  164. *
  165. * @since 2.4.0
  166. */
  167. $is_applicant_column = isset( $val['applicant_column'] ) ? $val['applicant_column']: 'unchecked';
  168. echo '<input type="radio" class="applicant-columns" name="[applicant_column]" '. $is_applicant_column . ' />' . esc_html__( 'Expose in Applicant Listing', 'simple-job-board' ) . ' &nbsp; ';
  169. echo '<input type="hidden" class="jobapp-applicant-column" name="' . $jobapp_field_name . '[applicant_column]" value="' . $is_applicant_column . '" /><li>';
  170. endif;
  171. endif;
  172. endforeach;
  173. endif;
  174. endif;
  175. ?>
  176. </ul>
  177. </div>
  178. <div class="clearfix clear"></div>
  179. <!-- Add Job Application Form -->
  180. <table id="jobapp_form_fields" class="alignleft">
  181. <thead>
  182. <tr>
  183. <th><label for="metakeyselect"><?php esc_html_e('Field', 'simple-job-board'); ?></label></th>
  184. <th><label for="metavalue"><?php esc_html_e('Type', 'simple-job-board'); ?></label></th>
  185. <th></th>
  186. <th></th>
  187. </tr>
  188. </thead>
  189. <tbody>
  190. <tr>
  191. <td class="left" id="newmetaleft"><input type="text" id="jobapp_name" /></td>
  192. <td>
  193. <select id="jobapp_field_type">
  194. <?php
  195. foreach ($field_types as $key => $val):
  196. $key = preg_replace('/[^\p{L} 0-9]/u', '_', $key);
  197. echo '<option value="' . $key . '" class="' . sanitize_html_class( $key ) . '">' . esc_attr( $val ) . '</option>';
  198. endforeach;
  199. ?>
  200. </select>
  201. <input id="jobapp_field_options" class="jobapp_field_type" type="text" style="display: none;" placeholder="Option1, Option2, Option3" />
  202. </td>
  203. <td><input type="checkbox" id="jobapp_required_field" checked="checked" /><?php esc_html_e('Required', 'simple-job-board'); ?></td>
  204. <td><input type="radio" id="jobapp-applicant-columns" /><?php esc_html_e('Expose in Applicant Listing', 'simple-job-board'); ?></td>
  205. <td><div class="button" id="addField"><?php esc_html_e('Add Field', 'simple-job-board'); ?></div></td>
  206. </tr>
  207. </tbody>
  208. </table>
  209. <div class="clearfix clear"></div>
  210. <?php
  211. }
  212. /**
  213. * Save job application meta box.
  214. *
  215. * @since 2.2.3
  216. *
  217. * @param int $post_id Post id
  218. * @return void
  219. */
  220. public static function sjb_save_jobpost_meta( $post_id ) {
  221. // Delete previous stored fields
  222. $old_keys = get_post_custom_keys($post_id);
  223. if( $old_keys ) {
  224. foreach( $old_keys as $key => $val ):
  225. if ( substr($val, 0, 7) == 'jobapp_' ) {
  226. delete_post_meta( $post_id, $val ); //Remove meta from the db.
  227. }
  228. endforeach;
  229. }
  230. // Sanitize $_POST Data Array
  231. $POST_data = filter_input_array( INPUT_POST );
  232. // Add new Value
  233. foreach ( $POST_data as $key => $val ):
  234. if ( substr($key, 0, 7 ) == 'jobapp_' ) {
  235. $key = preg_replace('/[^\p{L} 0-9]/u', '_', $key);
  236. $data = serialize( $val );
  237. update_post_meta( $post_id, $key, $data ); // Add new value.
  238. }
  239. endforeach;
  240. }
  241. }