Validation.php
234 lines
| 1 | <?php |
| 2 | namespace NestedPages\Form\Validation; |
| 3 | |
| 4 | use NestedPages\Config\SettingsRepository; |
| 5 | |
| 6 | /** |
| 7 | * Nested Pages Form Validation |
| 8 | */ |
| 9 | class Validation |
| 10 | { |
| 11 | /** |
| 12 | * Settings Repository |
| 13 | */ |
| 14 | private $settings; |
| 15 | |
| 16 | public function __construct() |
| 17 | { |
| 18 | $this->settings = new SettingsRepository; |
| 19 | } |
| 20 | |
| 21 | /** |
| 22 | * Validate Post IDs in an array of posts |
| 23 | */ |
| 24 | public function validatePostIDs($posts) |
| 25 | { |
| 26 | foreach ($posts as $post) |
| 27 | { |
| 28 | if ( !is_numeric($post['id']) ){ |
| 29 | return wp_send_json(['status'=>'error', 'message'=>'Incorrect Form Field']); |
| 30 | } |
| 31 | } |
| 32 | } |
| 33 | |
| 34 | /** |
| 35 | * Validate IDs in an array (tax ids) |
| 36 | */ |
| 37 | public function validateIntegerArray($items) |
| 38 | { |
| 39 | foreach ( $items as $item ) |
| 40 | { |
| 41 | if ( !is_numeric($item) ){ |
| 42 | return wp_send_json(['status'=>'error', 'message'=>'Incorrect Form Field']); |
| 43 | } |
| 44 | } |
| 45 | } |
| 46 | |
| 47 | /** |
| 48 | * Validate Date Input whether default WP or NP Datepicker |
| 49 | */ |
| 50 | public function validateDate($data) |
| 51 | { |
| 52 | if ( $this->settings->datepickerEnabled() ) return $this->validateDatepicker($data); |
| 53 | return $this->validateWPDate($data); |
| 54 | } |
| 55 | |
| 56 | /** |
| 57 | * Validate Datepicker date and time |
| 58 | * @since 1.3.1 |
| 59 | * @return string - formatted date |
| 60 | */ |
| 61 | private function validateDatepicker($data) |
| 62 | { |
| 63 | // Make sure fields are filled out |
| 64 | if ( $data['np_date'] == "" || $data['np_time'] == "" ) return $this->sendDateError(); |
| 65 | |
| 66 | $time_format = get_option('time_format'); |
| 67 | if ( $time_format == 'H:i' ){ |
| 68 | $this->checkValidTime($data['np_time']); |
| 69 | } else { |
| 70 | $this->checkValidFormattedTime($data['np_time']); |
| 71 | } |
| 72 | |
| 73 | $date = date('Y-m-d H:i:s', strtotime($data['np_date'] . ' ' . $data['np_time'] . ' ' . $data['np_ampm'])); |
| 74 | if ( $date == '1970-01-01 00:00:00' ) return $this->sendDateError(); |
| 75 | return $date; |
| 76 | } |
| 77 | |
| 78 | /** |
| 79 | * Validate Default WP Date Fields |
| 80 | * @since 1.3.1 |
| 81 | * @return string - formatted date |
| 82 | */ |
| 83 | private function validateWPDate($data) |
| 84 | { |
| 85 | $this->checkValidDate($data['mm'], $data['jj'], $data['aa']); |
| 86 | $this->checkValidTime($data['hh'] . ':' . $data['mn']); |
| 87 | |
| 88 | // Validate all the fields are there |
| 89 | if ( ($data['aa'] !== "") |
| 90 | && ( $data['mm'] !== "" ) |
| 91 | && ( $data['jj'] !== "" ) |
| 92 | && ( $data['hh'] !== "" ) |
| 93 | && ( $data['mm'] !== "" ) |
| 94 | && ( $data['ss'] !== "" ) ) |
| 95 | { |
| 96 | $date = strtotime($data['aa'] . '-' . $data['mm'] . '-' . $data['jj'] . ' ' . $data['hh'] . ':' . $data['mn'] . ':' . $data['ss']); |
| 97 | return date('Y-m-d H:i:s', $date); |
| 98 | } |
| 99 | |
| 100 | return $this->sendDateError(); |
| 101 | |
| 102 | } |
| 103 | |
| 104 | /** |
| 105 | * Check valid date |
| 106 | */ |
| 107 | private function checkValidDate($month, $day, $year) |
| 108 | { |
| 109 | if ( !wp_checkdate(intval($month), intval($day), intval($year), $year . '-' . $month . '-' . $day)) return $this->sendDateError(); |
| 110 | } |
| 111 | |
| 112 | /** |
| 113 | * Check for Valid 24 hour Time |
| 114 | */ |
| 115 | private function checkValidTime($time) |
| 116 | { |
| 117 | if (!preg_match("/(2[0-3]|[01][0-9]):[0-5][0-9]/", $time)) return $this->sendDateError(); |
| 118 | } |
| 119 | |
| 120 | /** |
| 121 | * Check for Valid 12 hour Time |
| 122 | */ |
| 123 | private function checkValidFormattedTime($time) |
| 124 | { |
| 125 | if (!preg_match("/^(1[0-2]|0?[1-9]):[0-5][0-9]/", $time)) return $this->sendDateError(); |
| 126 | } |
| 127 | |
| 128 | /** |
| 129 | * Send Date Error |
| 130 | * @return response |
| 131 | */ |
| 132 | private function sendDateError() |
| 133 | { |
| 134 | wp_send_json([ |
| 135 | 'status' => 'error', |
| 136 | 'message' => __('Please provide a valid date.', 'wp-nested-pages') |
| 137 | ]); |
| 138 | die(); |
| 139 | } |
| 140 | |
| 141 | /** |
| 142 | * Validate new redirect/link fields |
| 143 | */ |
| 144 | public function validateRedirect($data) |
| 145 | { |
| 146 | if ( (!isset($data['np_link_title'])) || ($data['np_link_title'] == "") ){ |
| 147 | return wp_send_json(array('status' => 'error', 'message' => __('Please provide a menu title.', 'wp-nested-pages') )); |
| 148 | } |
| 149 | if ( (!isset($data['np_link_content'])) || ($data['np_link_content'] == "") ){ |
| 150 | return wp_send_json(array('status' => 'error', 'message' => __('Please provide a valid URL.', 'wp-nested-pages') )); |
| 151 | } |
| 152 | } |
| 153 | |
| 154 | /** |
| 155 | * Validate a string isn't empty |
| 156 | */ |
| 157 | public function checkEmpty($var, $title) |
| 158 | { |
| 159 | if ( $var == "" ){ |
| 160 | $message = __('Please provide a ', 'wp-nested-pages') . $title; |
| 161 | return wp_send_json(['status' => 'error', 'message' => $message]); |
| 162 | die(); |
| 163 | } |
| 164 | } |
| 165 | |
| 166 | /** |
| 167 | * Validate New Pages |
| 168 | */ |
| 169 | public function validateNewPages($data) |
| 170 | { |
| 171 | // Check for Parent ID or Before/After IDs |
| 172 | if ( !isset($data['before_id']) && !isset($data['after_id']) ){ |
| 173 | if ( (!isset($data['parent_id'])) || (!is_numeric($data['parent_id'])) ){ |
| 174 | $message = __('A valid parent page was not provided.', 'wp-nested-pages'); |
| 175 | return wp_send_json(['status' => 'error', 'message' => $message]); |
| 176 | die(); |
| 177 | } |
| 178 | } |
| 179 | |
| 180 | if ( isset($data['before_id']) && $data['before_id'] !== '' && !is_numeric($data['before_id']) ){ |
| 181 | $message = __('A valid parent page was not provided to insert before.', 'wp-nested-pages'); |
| 182 | return wp_send_json(['status' => 'error', 'message' => $message, 'data' => $data]); |
| 183 | die(); |
| 184 | } |
| 185 | |
| 186 | if ( isset($data['after_id']) && $data['after_id'] !== '' && !is_numeric($data['after_id']) ){ |
| 187 | $message = __('A valid parent page was not provided to insert after.', 'wp-nested-pages'); |
| 188 | return wp_send_json(['status' => 'error', 'message' => $message, 'data' => $data]); |
| 189 | die(); |
| 190 | } |
| 191 | |
| 192 | // Make sure there's at least one page |
| 193 | if ( !isset($data['post_title']) ){ |
| 194 | $message = __('Please provide at least one page title.', 'wp-nested-pages'); |
| 195 | return wp_send_json(['status' => 'error', 'message' => $message]); |
| 196 | die(); |
| 197 | } |
| 198 | |
| 199 | // Page fields cannot be blank |
| 200 | foreach ( $data['post_title'] as $title ){ |
| 201 | if ( $title == "" ){ |
| 202 | $message = __('Page titles cannot be blank.', 'wp-nested-pages'); |
| 203 | return wp_send_json(['status' => 'error', 'message' => $message, 'data' => $data]); |
| 204 | die(); |
| 205 | } |
| 206 | } |
| 207 | |
| 208 | return true; |
| 209 | } |
| 210 | |
| 211 | /** |
| 212 | * Validate Custom Fields |
| 213 | */ |
| 214 | public function validateCustomFields($data) |
| 215 | { |
| 216 | $post_type = get_post_type_object($data['post_type']); |
| 217 | $fields_left = apply_filters('nestedpages_quickedit_custom_fields', [], $post_type, 'left'); |
| 218 | $fields_right = apply_filters('nestedpages_quickedit_custom_fields', [], $post_type, 'right'); |
| 219 | $fields = array_merge($fields_left, $fields_right); |
| 220 | if ( empty($fields) ) return true; |
| 221 | foreach ( $fields as $field ){ |
| 222 | if ( !isset($field['required']) || !$field['required'] ) continue; |
| 223 | $field_name = 'np_custom_' . $field['key']; |
| 224 | if ( !isset($data[$field_name]) || $data[$field_name] == '' ){ |
| 225 | $message = ( isset($field['validation_message']) && $field['validation_message'] !== '' ) |
| 226 | ? $field['validation_message'] |
| 227 | : sprintf(__('%s is required.', 'wp-nested-pages'), $field['label']); |
| 228 | return wp_send_json(['status' => 'error', 'message' => $message, 'data' => $data]); |
| 229 | die(); |
| 230 | } |
| 231 | } |
| 232 | return true; |
| 233 | } |
| 234 | } |