user3790914
user3790914

Reputation: 43

Events and Full Calendar in CakePHP

I set the FullCalendar plugin in CakePHP, i can see it, it's displayed, i'm trying to put the events from my PHP Controller (the view admin feed) to my Full Calendar Plugin . I don't know what's wrong , no events are displayed in my calendar . I will be thankfull if someone can find why my calandar is empty . Look the screen, this is what i have in my console :

enter image description here

The answer is NULL .

The JS file :

// JavaScript Document

    $(document).ready(function() {

        $('#calendar').fullCalendar({
            header: {
                left: 'prev,next today',
                center: 'title',
                right: 'month,agendaWeek,agendaDay'
            },
                defaultView: 'agendaWeek',
                firstHour: 8,
                weekMode: 'variable',
                aspectRatio: 2,
                editable: true,
            events: {
                url: FcRoot + '/events/feed',
                color: 'yellow',    // an option!
                textColor: 'black',  // an option!
            },
            eventRender: function(event, element) {
            ///
            }
        });

    });

EventsController

// The feed action is called from JS to get the list of events (JSON)
    public function admin_feed($id=null) {
        $this->layout = "ajax";
        $vars = $this->params['url'];
        $conditions = array('conditions' => array('UNIX_TIMESTAMP(start) >=' => $vars['start'], 'UNIX_TIMESTAMP(start) <=' => $vars['end']));
        $events = $this->Event->find('all', $conditions);
        foreach($events as $event) {
            if($event['Event']['all_day'] == 1) {
                $allday = true;
                $end = $event['Event']['start'];
            } else {
                $allday = false;
                $end = $event['Event']['end'];
            }
            $data[] = array(
                    'id' => $event['Event']['id'],
                    'title'=>$event['Event']['title'],
                    'start'=>$event['Event']['start'],
                    'end' => $end
            );
        }
        $this->set("json", json_encode($data));
    }

In View/Events/admin_feed

<?php 
echo $json; 
?>

The response now :

enter image description here

Upvotes: 1

Views: 3969

Answers (2)

jeremyharris
jeremyharris

Reputation: 7882

You should really take advantage of routing and views for this. It allows you to properly organize your code and keep things DRY.

 public function admin_feed($id=null) {
    $vars = $this->params['url'];
    $conditions = array('conditions' => array('UNIX_TIMESTAMP(start) >=' => $vars['start'], 'UNIX_TIMESTAMP(start) <=' => $vars['end']));
    $events = $this->Event->find('all', $conditions);
    foreach($events as $event) {
        if($event['Event']['all_day'] == 1) {
            $allday = true;
            $end = $event['Event']['start'];
        } else {
            $allday = false;
            $end = $event['Event']['end'];
        }
        $data[] = array(
                'id' => $event['Event']['id'],
                'title'=>$event['Event']['title'],
                'start'=>$event['Event']['start'],
                'end' => $end
        );
    }
    $this->set("events", $data);
}

Now, your admin_feed action is usable as more than just a json feed (even though that may be just want you want). This makes testing easier as well.

Add the following to your routes, to tell Cake that you want to allow the json extension:

Router::parseExtensions('json');

Then, add the RequestHandler to your controller components. This component will automatically switch to your json view and layout when a json extension is found.

Next, add a layout for all json views in /View/Layout/json/default.ctp:

<?php
echo $this->fetch('content');

Then, add your view in /View/Events/json/admin_feed.ctp:

<?php
echo json_encode($events);

That's it. Now, if you want to use admin_feed to view events in HTML, you can by adding a view for it.

Your full calendar url should now be: FcRoot + '/admin/events/feed.json'. Try just visiting it in the browser to see if you see the json.

Upvotes: 1

hashmode
hashmode

Reputation: 164

do not set it, just echo it

echo json_encode($data);

set values are supposed to be used in view, in your case you are just 'returning' as ajax response

for ajax calls, view is not necessary at all, put $this->autoRender = false; in you function: this will prevent 'seeking' for view file.

Upvotes: 1

Related Questions