Hijri
3 years ago
Processors
1 month ago
QuranADay
2 months ago
StartTime
1 year ago
design
1 month ago
AdminMenu.php
2 years ago
AssetsLoader.php
1 year ago
CustomPluginSettings.php
4 years ago
DPTAjaxHandler.php
4 years ago
DPTHelper.php
1 month ago
DSTemplateLoader.php
2 years ago
DailyShortCode.php
2 months ago
DigitalScreen.php
1 month ago
HijriDate.php
3 years ago
Init.php
4 years ago
MonthlyShortCode.php
2 years ago
MonthlyTimeTable.php
3 years ago
Shortcodes.php
2 months ago
Translator.php
4 years ago
UpdateStyles.php
1 month ago
Validator.php
3 years ago
db.php
2 months ago
dptWidget.php
4 years ago
Validator.php
220 lines
| 1 | <?php |
| 2 | |
| 3 | class Validator |
| 4 | { |
| 5 | /** @var array */ |
| 6 | private $validData = array(); |
| 7 | |
| 8 | /** @var array */ |
| 9 | private $headers = array ( |
| 10 | 0 => 'd_date', |
| 11 | 1 => 'fajr_begins', |
| 12 | 2 => 'fajr_jamah', |
| 13 | 3 => 'sunrise', |
| 14 | 4 => 'zuhr_begins', |
| 15 | 5 => 'zuhr_jamah', |
| 16 | 6 => 'asr_mithl_1', |
| 17 | 7 => 'asr_mithl_2', |
| 18 | 8 => 'asr_jamah', |
| 19 | 9 => 'maghrib_begins', |
| 20 | 10 => 'maghrib_jamah', |
| 21 | 11 => 'isha_begins', |
| 22 | 12 => 'isha_jamah', |
| 23 | 13 => 'is_ramadan', |
| 24 | 14 => 'hijri_date', |
| 25 | ); |
| 26 | |
| 27 | /** |
| 28 | * @param $file |
| 29 | * @return bool |
| 30 | */ |
| 31 | public function isValidNumberOfRows($file) |
| 32 | { |
| 33 | $count = count($file); |
| 34 | $count -= 1; // Remove header count |
| 35 | |
| 36 | if ($count == 0 || $count > 366 ) { |
| 37 | echo "<h3 class='ui-state-error dptCenter'>Invalid number of rows. Found" . esc_html( $count ) . "days</h3>"; |
| 38 | return false; |
| 39 | } |
| 40 | |
| 41 | return true; |
| 42 | } |
| 43 | |
| 44 | /** |
| 45 | * @param array $data [rows, containing date and each prayer times] |
| 46 | * @return bool |
| 47 | */ |
| 48 | public function isValidData(array $data) |
| 49 | { |
| 50 | if (! $this->hasEmptyLines($data)) { |
| 51 | return false; |
| 52 | } |
| 53 | |
| 54 | if (! $this->is24Hours($data)) { |
| 55 | return false; |
| 56 | } |
| 57 | |
| 58 | $num = count($data); |
| 59 | |
| 60 | for ($c=0; $c < $num - 2; $c++) { // exclude the last two columns |
| 61 | if ($c == 0) { |
| 62 | $date = $this->getDateAfterValidation($data[$c]); |
| 63 | if(! $date) { |
| 64 | echo "<h3 class='ui-state-error dptCenter'>Invalid Date format (". esc_html( $data[$c]) .")Please use one of the following: |
| 65 | <ul class='green'> |
| 66 | <li> YYYY-MM-DD <i class='smallFont'>(2023-10-20)</i></li> |
| 67 | <li> YY-MM-DD <i class='smallFont'>(23-10-20)</i></li> |
| 68 | <li> MM/DD/YYYY <i class='smallFont'>(10/20/2021)</i></li> |
| 69 | <li> DD-MM-YYYY <i class='smallFont'>(20-10-2023)</i></li> |
| 70 | <li> DD.MM.YYYY <i class='smallFont'>(13.10.2034)</i></li> |
| 71 | </ul> |
| 72 | </h3>"; |
| 73 | return false; |
| 74 | } else { |
| 75 | $data[$c] = $date; |
| 76 | } |
| 77 | } else { |
| 78 | if(! $this->isValidateTimeFormat($data[$c])) { |
| 79 | echo "<h3 class='ui-state-error dptCenter'>Invalid Time format in " . esc_html( $data[$c] ) . " for " . esc_html($this->headers[$c]) . |
| 80 | " on ". esc_html($data[0]) .", valid time format is <span class='green'>HH:MM[24 hours]</span> </h3>"; |
| 81 | print_r('<pre>'); |
| 82 | print_r(array_combine($this->headers, $data)); |
| 83 | print_r('</pre>'); |
| 84 | return false; |
| 85 | } |
| 86 | } |
| 87 | } |
| 88 | |
| 89 | $data = $this->sanitizeHijridate($data); |
| 90 | $this->setValidData($data); |
| 91 | |
| 92 | return true; |
| 93 | } |
| 94 | |
| 95 | /** |
| 96 | * @return array |
| 97 | */ |
| 98 | private function sanitizeHijridate(array $data) |
| 99 | { |
| 100 | $unquote = addslashes($data[14]); // hijridate |
| 101 | $data[14] = $unquote; |
| 102 | return $data; |
| 103 | } |
| 104 | |
| 105 | /** |
| 106 | * @return array |
| 107 | */ |
| 108 | public function getValidData() |
| 109 | { |
| 110 | $data = array_combine($this->headers, $this->validData); |
| 111 | |
| 112 | return $data; |
| 113 | } |
| 114 | |
| 115 | /** |
| 116 | * @param array $header |
| 117 | * @return bool |
| 118 | */ |
| 119 | public function checkHeader(array $header) |
| 120 | { |
| 121 | |
| 122 | if ( count($header) != count($this->headers)) { |
| 123 | echo "<h3 class='dptCenter ui-state-error'>Do not remove any column header"; |
| 124 | return false; |
| 125 | } |
| 126 | return true; |
| 127 | } |
| 128 | |
| 129 | /** |
| 130 | * @param string $date |
| 131 | * @return string|bool |
| 132 | */ |
| 133 | private function getDateAfterValidation($date) |
| 134 | { |
| 135 | $date = trim($date); |
| 136 | if (preg_match("/^(\d{4})-(\d{1,2})-(\d{1,2})$/", $date, $matches)) { |
| 137 | if (checkdate($matches[2], $matches[3], $matches[1])) { |
| 138 | return $date; |
| 139 | } |
| 140 | } elseif (preg_match("/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/", $date, $matches)) { |
| 141 | if (checkdate($matches[1], $matches[2], $matches[3])) { |
| 142 | $mysqlDate = date('Y-m-d', strtotime($date)); |
| 143 | return $mysqlDate; |
| 144 | } |
| 145 | } elseif (preg_match("/^(\d{1,2})-(\d{1,2})-(\d{4})$/", $date, $matches)) { |
| 146 | if (checkdate($matches[2], $matches[1], $matches[3])) { |
| 147 | $mysqlDate = date('Y-m-d', strtotime($date)); |
| 148 | return $mysqlDate; |
| 149 | } |
| 150 | } elseif (preg_match("/^(\d{1,2}).(\d{1,2}).(\d{4})$/", $date, $matches)) { |
| 151 | if (checkdate($matches[2], $matches[1], $matches[3])) { |
| 152 | $mysqlDate = date('Y-m-d', strtotime($date)); |
| 153 | return $mysqlDate; |
| 154 | } |
| 155 | } elseif (preg_match("/^(\d{1,2})-(\d{1,2})-(\d{2})$/", $date, $matches)) { |
| 156 | if (checkdate($matches[2], $matches[1], $matches[3])) { |
| 157 | $mysqlDate = date('Y-m-d', strtotime($date)); |
| 158 | return $mysqlDate; |
| 159 | } |
| 160 | } |
| 161 | |
| 162 | return false; |
| 163 | } |
| 164 | |
| 165 | /** |
| 166 | * @param string $time |
| 167 | * @return bool |
| 168 | */ |
| 169 | private function isValidateTimeFormat($time) |
| 170 | { |
| 171 | $time = trim($time); |
| 172 | $pattern1 = "/^([0-9]|[01][0-9]|2[0-3]):[0-5][0-9]$/"; // HH:MM or H:MM |
| 173 | $pattern2 = "/^([0-9]|[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/"; // HH:MM or H:MM |
| 174 | |
| 175 | if ( preg_match($pattern1, $time, $matches) || preg_match($pattern2, $time, $matches) ) { |
| 176 | return true; |
| 177 | } |
| 178 | |
| 179 | return false; |
| 180 | } |
| 181 | |
| 182 | /** |
| 183 | * @param string $row |
| 184 | * @return bool |
| 185 | */ |
| 186 | private function is24Hours($row) |
| 187 | { |
| 188 | $afternoonPrayers = array($row[6], $row[7], $row[8], $row[9], $row[10], $row[11], $row[12]); |
| 189 | foreach($afternoonPrayers as $time) { |
| 190 | $firstPart = explode(':', $time); |
| 191 | if ($firstPart[0] !== '00' && (int)$firstPart[0] < 12) { |
| 192 | echo "<h3 class='dptCenter ui-state-error'>$time is not in 24 hour time format for date: ". esc_html( $row[0] ) ." |
| 193 | </br> You must follow 24 hours time format, valid time format is <span class='green'>HH:MM</span></h3>"; |
| 194 | return false; |
| 195 | } |
| 196 | } |
| 197 | |
| 198 | return true; |
| 199 | } |
| 200 | |
| 201 | /** |
| 202 | * @param array $data |
| 203 | */ |
| 204 | private function setValidData(array $data) |
| 205 | { |
| 206 | $this->validData = $data; |
| 207 | } |
| 208 | |
| 209 | private function hasEmptyLines(array $data) |
| 210 | { |
| 211 | $data = trim($data[0]); |
| 212 | if (empty($data)) { |
| 213 | echo "<h3 class='ui-state-error dptCenter'>Please remove the empty lines between rows</h3>"; |
| 214 | return false; |
| 215 | } |
| 216 | |
| 217 | return true; |
| 218 | } |
| 219 | } |
| 220 |