/**
  * 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;
 }
Exemplo n.º 2
0
$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));
            }
        }
    }