/** * Fetches all events in a date range * * @param \DateTime $startDate * @param \DateTime $endDate * * @return Event array */ public function fetchEvents(\DateTime $startDate, \DateTime $endDate) { $events = array(); $client = $this->client->getClient(); $uri = self::IS_URL . '/eplug/agenda/agenda.asp'; $body = array('NumDat' => null, 'TypVis' => 'Vis-Tab.xsl'); for ($date = new \DateTime($startDate->format('Y-m')); $date < $endDate; $date->modify("+1 month")) { $body['NumDat'] = $date->format('Ym'); $request = $client->post($uri, null, $body); foreach ($this->client->getCookieJar()->allRawValues($uri) as $name => $value) { $request->addCookie($name, $value); } $requests[] = $request; } $responses = $client->send($requests); foreach ($responses as $response) { $crawler = new Crawler(null, $uri); $crawler->addContent($response->getBody(true), $response->getHeader('Content-Type')); $events = array_merge(self::extractEvents($crawler), $events); } // Filter out events that are not in the date range $events = array_filter($events, function ($event) use($startDate, $endDate) { return $event->startDate > $startDate && $event->startDate < $endDate; }); return $events; }
$app->register(new Silex\Provider\FormServiceProvider()); $app['translator.domains'] = array(); // Controller $app->match('/', function (Request $request) use($app) { date_default_timezone_set('Europe/Paris'); $startDate = new \DateTime('midnight first day of this month'); $endDate = new \DateTime('23:59:59 last day of +4 months'); $form = $app['form.factory']->create(new UserType()); if ($request->getMethod() === 'POST') { $form->bindRequest($request); if ($form->isValid()) { $data = $form->getData(); $data['startDate'] = $startDate; $data['endDate'] = $endDate; try { $client = new Client($data['login'], $data['password']); $events = $client->fetchEvents($data['startDate'], $data['endDate']); if (count($events) > 0) { return CalendarResponse::create($events); } $error = 'No event was found in your calendar.'; } catch (AuthenticationException $e) { $error = 'Your login or password is incorrect. Please try again.'; } catch (\Exception $e) { $error = 'There was an error (cas.tem-tsp.eu or si-etudiants.it-sudparis.eu might be offline). Please try again later.'; } if (isset($error)) { $form->addError(new FormError($error)); } } }