/** * Get array for an id * @param integer $id Menu Id * @return array Menu */ public function getArrayData($id) { $id = intval($id); # Test id if (empty($id)) { $error = new ReceiverError(); return $error->define('Bad request', 400); } $request = $this->client->get('/rss-menu-' . $id . '.htm'); $resource = $request->getResource(); # Test Code if (!$resource->code(200)) { $error = new ReceiverError(); return $error->define('Impossible to contact distant website', 500); } # Get XML $content = $resource->getContent(); $content = mb_convert_encoding($content, mb_internal_encoding(), 'CP1252'); $rss = simplexml_load_string($content, 'SimpleXMLElement', LIBXML_NOCDATA); libxml_use_internal_errors(true); # Get all menu $items = $rss->channel[0]->item; $menus = array(); foreach ($items as $item) { $description = trim((string) $item->description); if ($description != 'Restaurant fermé') { $menu = array(); $menu['meals'] = array_values(array_filter(array_map('trim', explode('<br />', $description)), 'strlen')); $title = trim((string) $item->title); # Date Calcul $dateArray = explode(' ', $title); $dateTime = new \DateTime(); $date = array_map('trim', explode('/', $dateArray[2])); $dateTime->setDate($date[2], $date[1], $date[0]); $start = clone $dateTime; $end = clone $dateTime; if ($dateArray[1] == 'midi') { $start->setTime(11, 30); $end->setTime(13, 15); } else { $start->setTime(18, 30); $end->setTime(19, 45); } $menu['start'] = $start->getTimestamp(); $menu['end'] = $end->getTimestamp(); $menu['rss'] = array('title' => $title, 'link' => trim((string) $item->link), 'pubDate' => trim((string) $item->pubDate)); $menus[] = $menu; } } return $menus; }
/** * Parse to array * @return array */ protected function parsing() { # Get the page $page = $this->page->getContent(); $oldPage = $page; if (empty($page)) { $error = new ReceiverError(); return $error->define('Not found', 404); } # Clean the page $page = preg_replace('#(.+)\\<table\\>(.+)\\<\\/table\\>(.+)#s', '<table>$2</table>', $page); $page = preg_replace('#\\<tr class\\=\\"subHeader1\\"\\>(.+)\\<\\/tr\\>#sU', '', $page); $page = preg_replace('#\\<a href\\=\\"javascript\\:ev\\(([0-9]+)\\)\\"\\>([^\\<\\/a\\>]+)\\<\\/a\\>#sU', '$2', $page); if ($page === $oldPage) { $error = new ReceiverError(); return $error->define('Bad group ID', 400); } # Put in Dom $dom = new \DOMDocument(); libxml_use_internal_errors(true); $dom->loadHTML($page); # Get values $raws = $dom->getElementsByTagName('tr'); $matieres = array(); foreach ($raws as $raw) { $cells = $raw->getElementsByTagName('td'); $cellData = array(); # Get cells values foreach ($cells as $cell) { $cellData[] = $cell->nodeValue; } # Transform to timestamp $dayMonthYear = explode('/', $cellData[0]); $hourMin = explode('h', $cellData[4]); $duration = str_replace('min', '', $cellData[5]); $duration = explode('h', $duration); if (preg_match('#min#', $cellData[5])) { # There is minutes if (!isset($duration[1])) { $duration[1] = $duration[0]; $duration[0] = 0; } } else { if (preg_match('#h#', $cellData[5])) { # There is hours but no mintes if (!isset($duration[1])) { $duration[1] = 0; } } else { # No specification about time format $duration[0] = isset($duration[0]) ? $duration[0] : 0; $duration[1] = isset($duration[1]) ? $duration[1] : 0; } } # Save Data $matiere = array(); $matiere['code'] = trim($cellData[1]); $matiere['week'] = intval($cellData[2]); $matiere['start'] = mktime($hourMin[0], $hourMin[1], 0, $dayMonthYear[1], $dayMonthYear[0], $dayMonthYear[2]); $matiere['duration'] = $duration[0] * 60 * 60 + $duration[1] * 60; $matiere['end'] = $matiere['start'] + $matiere['duration']; $matiere['type'] = strtolower(trim($cellData[7])); $matiere['name'] = trim($cellData[12]); $matiere['teacher'] = trim($cellData[19]); $placeExtract = array(); $placeExtract = explode('(', $cellData[20]); $matiere['place'] = trim($placeExtract[0]); $matiere['projector'] = false; $name = empty($matiere['name']) ? $matiere['code'] : $matiere['name']; $avec = empty($matiere['teacher']) ? '' : ' avec ' . $matiere['teacher']; $matiere['summary'] = $name . $avec; if (isset($placeExtract[1])) { # Seats calcul $capacityExtract = array(); $capacityExtract = explode(')', $placeExtract[1]); if (preg_match('#([0-9]+)places#', $capacityExtract[0], $seats)) { $matiere['seats'] = intval($seats[1]); } # There is a projector ? if (isset($capacityExtract[1])) { if (preg_match('#vidéo\\.proj#', $capacityExtract[1])) { $matiere['projector'] = true; } } } $matieres[] = $matiere; } return $matieres; }