【问题标题】:Events and Full Calendar in CakePHPCakePHP 中的事件和完整日历
【发布时间】:2014-07-25 10:35:10
【问题描述】:

我在 CakePHP 中设置了 FullCalendar 插件,我可以看到它,它会显示出来,我正在尝试将事件从我的 PHP 控制器(视图管理提要)放到我的 Full Calendar Plugin 中。我不知道怎么了,我的日历中没有显示任何事件。如果有人能找到我的日历为空的原因,我将不胜感激。 看看屏幕,这就是我的控制台中的内容:

答案是NULL。

JS文件:

// 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) {
            ///
            }
        });

    });

事件控制器

// 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));
    }

在视图/事件/admin_feed

<?php 
echo $json; 
?>

现在的回应:

【问题讨论】:

    标签: cakephp fullcalendar


    【解决方案1】:

    为此,您应该真正利用路由和视图。它允许您正确组织代码并保持 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);
    }
    

    现在,您的 admin_feed 操作不仅可以用作 json 提要(尽管这可能只是您想要的)。这也使测试更容易。

    将以下内容添加到您的路由中,告诉 Cake 您要允许 json 扩展:

    Router::parseExtensions('json');
    

    然后,将RequestHandler 添加到您的控制器组件中。当找到 json 扩展时,该组件将自动切换到您的 json 视图和布局。

    接下来,为/View/Layout/json/default.ctp中的所有json视图添加一个布局:

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

    然后,将您的视图添加到/View/Events/json/admin_feed.ctp

    <?php
    echo json_encode($events);
    

    就是这样。现在,如果您想使用admin_feed 来查看 HTML 中的事件,您可以为其添加一个视图。

    您的完整日历网址现在应该是:FcRoot + '/admin/events/feed.json'。尝试在浏览器中访问它,看看你是否看到了 json。

    【讨论】:

    • 感谢您的帮助,我完全按照您的要求进行操作,当我要去 127.0.0.1/NOUVEAU/admin/events/feed.json 时,它会写成 "null" 。我有我的表事件,一些其他的视图,里面有数据。我不明白为什么。 ://
    • 我添加了一个新屏幕 ^^ 从控制台,我得到的响应是页面的 html 代码,我猜是布局...
    • 当你在浏览器中访问时,你会得到json吗? json和HTML?如果页面中发生错误,则 json 格式将错误。或者,如果您包含调试信息,它也可能导致 json 出现问题。首先在浏览器中检查它,看看您是否收到错误或调试信息。
    • 在浏览器中,如果我输入 url,我会得到 "null" 。如果我要去页面(全日历所在的视图),则不会显示事件,并且在我的控制台(萤火虫)中,我有一个 HTML 代码作为响应。我把屏幕放在我的第一篇文章中。
    • 尝试在视图中调试$events,然后。听起来json_encode 失败了。
    【解决方案2】:

    不设置,直接回显

    echo json_encode($data);
    

    应该在视图中使用设置值,在您的情况下,您只是作为 ajax 响应“返回”

    对于 ajax 调用,根本不需要查看,将 $this-&gt;autoRender = false; 放入您的函数中:这将防止“寻找”查看文件。

    【讨论】:

    • 我编辑了我的帖子,我有一个带有 json echo 的视图。我试图输入“echo json_encode($data);”而不是 echo $json 但它仍然是一样的。
    • @user3790914 我更新了答案,请试一试,如果它不起作用,请使用调试查看输出:而不是 echo json_encode($data); 在您的函数中尝试 debug($data);die; 在 json_encode 之前并查看在萤火虫,如果它是空的,这意味着你的$data有问题。附言debug 只是为了开发,ASA 你理解问题,当然回到 echo json_encode。
    • 不推荐这样做,因为它使测试变得非常困难,并且破坏了常见的模式,使理解代码更加困难。不要偷懒,做一个视图:)
    • @jeremyharris 测试有什么困难?这与懒惰无关,为什么不需要呈现在视野中?如果你应该使用视图,那么你应该在控制器中设置然后在视图中使用它,额外的步骤...... +渲染过程,但是阻止渲染这两个步骤已经消失了
    • @hashmode 通过测试,我的意思是单元测试。 echoing 要求您捕获缓冲区以确保获得预期结果。额外的步骤将关注点分开,并且更容易找出错误所在。渲染过程不需要太多时间或精力。节省步骤,例如跳过单元测试,因为它可以节省时间,这通常看起来是个好主意,但结果通常会使事情变得更加困难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    相关资源
    最近更新 更多