微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – CodeIgniter日历/计划应用程序,结构和执行

这个项目实际上让我失眠.我整天想着它,我在晚上梦见它,当我躺着醒来时,我会考虑更多.哈哈,这真让我到了哭泣的地步.我不知道如何构建我的应用程序,我不知道如何执行我的想法.

首先,简要介绍一下.我学习交互式多媒体设计,我有一门名为“项目”的课程.顾名思义,我们必须使用PHP,HTML / CSS,MysqL,AJAX,以及我们想要使用的任何技术来思考和创建项目,更具体地说是Web应用程序.由于我们还必须在一定程度上挑战自己,所以我决定学习并使用CodeIgniter框架来完成这个项目.我们必须向教授们展示我们能够取得的成就. (但是这个应用程序不会被部署或使用.它只是一个展示.)

我将为学生创建一个Web应用程序,一个日历/计划器.他们可以跟踪他们的课程和家庭作业,空闲时间等.这是我想要实现的截图:

我已经抛出了滑块,并通过使用下一个/上一个按钮的AJAX请求来修复它.您可以看到最新版本的网站here.

但是,我对我的代码不满意.我对我正在做的事情不满意.说实话,我很困惑.我绝望地感到困惑.

我读过关于CodeIgniter的博客,书籍,网站,关于MVC模型;我对PHP有相当不错的知识,我很快就选择了这个框架.但仍然如此困惑.

我开始编码我的login form.一切都很好.我有一个登录控制器,带有一个index()函数,一个go()函数,它专注于表单验证(使用form_validation库)和设置会话.它通过AJAX处理错误消息,并通过我的登录模型与数据库通信.我认为这很好地遵循了MVC模式.

实际的“计划者”页面一个完全不同的故事.我想知道的第一件事是我是否可以在视图中使用/调用函数.如果我遵循MVC指南,我会说我做不到.所以我现在正在做的是将所有数据堆叠在我的控制器中的$data数组中,然后通过jQuery AJAX调用将这些数据直接回显到我的网页中.

这提出了我的第一个,一个荒谬简单的问题.这个可以吗?我主要担心的当然是没有启用javascript的用户;应用程序根本不起作用.我已经阅读过关于优雅降级和渐进增强的内容,但我不确定这个应用程序是否可以在没有JS的情况下使用.

另一件我不确定的事情(AJAX明智)是我在$(document).ready上有两个不同的AJAX调用,然后当用户点击不同的元素时又有四个.令我困扰的是jQuery .html()实际上并没有将内容放在我的html标签内(当我查看源代码时).

顶部的天数列表由名为init_days()的函数生成.我使用$(document).ready()AJAX调用之一填充列表.它工作正常,但功能一个巨大的混乱.在控制器中,我创建一个数组$data并将整个列表(包含html标签)回显到$data [‘calendar’];然后我直接输出到< ul>标签

    // populate initial calendar
    $.ajax(
    {
        type: "POST",
        url: "/planner/init_days",
        success: function(data){
            $("#days_loader").hide();
            $(".month").prepend(data['month_name'] + " " + current_year);
            $("#day_list").html(data['calendar']).fadeIn();
        }
    });

但是,当使用下一个和前一个按钮时,我会调用相同的函数,只需要一个data:选项来提交新月(以及必要时,年份).这对我来说似乎有点多余;将(几乎)相同的代码放三次.不知道如何解决这个问题.

我现在被困住的主要问题是这些日子之下的部分.我有那些“祸好,4月20日”的表格标题,但在那之下,我需要得到我的实际事件.我不确定创建此功能的最佳方法是什么.我应该把它放在桌子上吗?但那我怎么把某些事件放在正确的地方呢?目前,我所有的功能都是将某一天的所有事件输出到数组中的函数,如下所示:

Array ( [0] => Array ( [id] => 1 [title] => Test Event [description] => Dit is een test event. [day_start] => 2011-04-20 [day_end] => 2011-04-20 [user_id] => 1 [time_start] => 11 [time_end] => 12 ) [1] => Array ( [id] => 2 [title] => Test Event 2 [description] => Dit is een tweede event. [day_start] => 2011-04-20 [day_end] => 2011-04-20 [user_id] => 1 [time_start] => 12 [time_end] => 13 ) )

我不确定桌子是不是最好的方法.困扰我的主要事情是,我正在工作几个小时,所有这些不同的时间都在页面上有自己的位置,如果这是有道理的. (比如上午9点会在列的顶部,晚上11点会在底部,duh).

我愿意提供一个链接到我的源代码(github),如果有人想看看我的混乱,也许试着让我再次走上正确的轨道.也许我在正确的轨道上,仍然;我只是觉得那样.我被困在显示事件部分,我只是觉得很可怕,因为我对我写的内容不满意(尽管大部分内容都适用于此时).

因为我现在正处于复活节假期,我不能再联系我的老师一周,所以我愿意提供100-150代表奖金,以便为这个巨大的咆哮/问题提供一个好的,有用的答案.

如果我有任何关于设计模式,MVC,CodeIgniter和PHP最佳实践的书籍,网站,博客,请同时提供.非常感谢.

如果你到了这一步,感谢你一路阅读.我很感激.

编辑:我的源代码在这里https://github.com/cabaret/Studieplanner

PS:这个问题是对my previous question.的后续跟进,从那时起我已经采取了很多步骤,但我仍然不高兴,而且非常困惑.我感谢任何帮助.

解决方法:

好吧,让我看看我是否可以把它分解成碎片并帮助你.

首先,你的术语是否一致尚不清楚,所以我要在这里建立一个小词汇表,所以我确信你理解我的意思:

>请求生命周期通过您的应用程序的整个HTTP请求. Ajax调用是生命周期,页面加载是生命周期,一旦文档被发送并且连接关闭,生命周期就结束了.
>控制器代码负责通过您的网站控制请求生命周期的执行.
>查看任何页面/请求的实际输出代码.这是应用程序/视图中的代码,实际上每次有一个请求生命周期(可能重定向和ajax除外).
>客户端代码加载页面后发生的Javascript逻辑. Ajax调用由客户端代码完成.

我会稍微回答你的问题,所以请耐心等待:

This brings forward my first, ridiculously simple, question. Is this okay? One of my main concerns is of course users who don’t have javascript enabled; the application simply doesn’t work. I have read about graceful degradation and progressive enhancement, but I’m just not sure if this application is do-able without JS.

事实上,Javascript是我们现在称之为“Web应用程序”的一个非常固有的部分. Web应用程序和一个网站是前者是聪明的.大多数站点通常只处理请求并显示相关数据,但应用程序通常会做出决策,更新系统状态并根据输入修改输出.

您似乎正在构建的内容我将归类为Web应用程序.

我不相信HTML5的这个时代(有点)与facebooks&今天的youtubes,要求使用javascript来使用Web应用程序是不合理的.

现在禁用这些javascript的人通过像AdBlock& amp; NoScript通常允许您有选择地禁用内容.解决这个问题的最佳方法是将您的javascript分成易于识别的组件,以便用户知道允许哪些脚本.

> Site.js – 负责网站的功能&操作.
> Ads.js – 负责您的广告

如果您尝试通常不会使用您的服务,则无法阻止他人屏蔽您的广告. (假设你计划广告)

因此,构建优雅降级以通知用户您的应用程序需要JavaScript才能运行,您甚至可以让他们知道需要哪些文件来帮助简化流程.

The actual ‘planner’ page is a whole different story though. One of the first things I was wondering about is whether or not I can use/call functions from a view. If I follow the MVC guidelines, I would say I cannot. So what I’m doing Now is stacking all the data in $data arrays in my controller and then echo’ing those out through jQuery AJAX calls, straight into my webpage.

要记住的关键是:MVC是指导而非规则.虽然最好坚持使用您的系统,但您必须将其应用于相关的位置.您可能不应该从视图中提取数据库记录,但是当出现一些开箱即用的情况时,它会为您提供两个选项:

>在有意义的地方略微打破范式(有充分理由)
>重构您的系统以适应范例

一个很好的例子:可重用的小部件块,如标签云或最近的帖子块

最重要的是,您可能不希望继续向$this-> load-> vars(…)提供数据,甚至更糟糕的是在每个$this-> load->视图中每个控制器功能.

一种方法是重新设计您的系统,以便您有一个共同的主题库负责收集常见信息和提供它,然后传递您的视图数据($this-> load-> view(“someview”,array(),true)将您的视图呈现为字符串而不是页面).

另一种方法是设计一个具有简单作业的特殊视图,使用模型加载相关数据(如果可以,则缓存)&显示它.像小部件或自包含的东西.这打破了MVC,但你需要检查我们使用MVC的原因.关键是视图不应该对实现负责,这样你可以换出视图,控制器逻辑保持不变.这适用吗?这可能是一个高度视图实现的特定组件,控制器可能不知道它需要这些信息.因此,如果你对它进行操作并对其进行标记以便记住它对自己负责,那么你应该能够很好地适应它.

Another thing I’m not sure about (AJAX-wise) is the fact that I have two different AJAX-calls on $(document).ready, and then like four more when the user clicks on different elements. It also bothers me that jQuery .html() doesn’t actually put the contents inside my html tags (when I view source).

这听起来像是在尝试在客户端代码中做太多.可以通过视图提供任何ajax调用@开头吗?

用户点击东西时,有四个ajax调用?大多数点击代表单个操作,通常只有一个ajax应该足够,如果你需要处理响应并请求更多信息,可能是两个,但很少超过这个.

jQuery中的$.fn.html(…)将第一个参数放在所选元素中.如果你想要替换整个页面的HTML(不推荐,永远……应该是页面加载).你会这样称呼:

var theHtmlToPutInPage = "... whatever ...";
$("body").html(theHtmlToPutInPage);

My main problem, where I’m stuck Now, is the part beneath the days. I have those ‘woe, 20 april’ table headers, but then underneath that I need to get my actual events. I’m not sure what would be the best approach to creating this feature. Should I put it in a table? But then how would I put certain events on the right place? For Now, all I have achieved is a function which outputs all events for a certain day into an array, like so:

有很多方法可以解决这个问题.你可以将整个事物构建为时间块的大表,但这可能会让人感到困惑.此外,桌子是讨厌的,Theremany写得很好articles时和&在哪里使用表格.

您可以将视觉效果设置为CSS Divs&amp ;;使用position:absolute并从您的客户端代码(javascript)控制浮动约会.

这是你项目中一个相当复杂的部分,有很多答案,我没有时间在这里深入探讨任何解决方案,你只需要原型和实验.

I’m willing to provide a link to my source code (github) if anyone would like to take a look at my mess and perhaps try to put me on the right track again. Perhaps I AM on the right track, still; I just don’t feel that way. I got stuck at the displaying-events part, and I just feel horrible because I’m not happy with what I wrote (even though most of it works, at this point).

我愿意看一下&提出建议,因为我相信其他人也会这样.

As I’m on Easter break at the moment, I can’t contact my teacher for another week, so I’m willing to provide a 100-150 rep bounty for a good, helpful answer to this huge rant/question.

一般来说赏金应该被用作激励因素来正确回答你的问题.这种让人们深入了解的事情(也许这个答案,现在已经变得很长).

欢迎您提供赏金,这是您的代表,但不要觉得您必须提供赏金.如果这个答案是令人满意的(或者其他人可能发布的任何其他答案,那么简单地接受答案应该绰绰有余).

摘要&最后的想法

好吧,所以在写这个怪物的答案的过程中(它算作中篇小说了吗?)我想我可能已经推断出你可能出错的地方.它可能是设计的,但可能是偶然的.

我想你可能会误认为客户端代码的视图.当我们谈论MVC时,我们并不一定意味着,它应该都是通过ajax加载的,而视图是javascript&在客户端的浏览器上运行dom.

如果情况并非如此,那么请忽略最后一段.

听起来你的责任权重得恰到好处.看起来你的任务太多了javascript.页面加载不是恶魔,ajax很时髦,但通常可以是Too Much.你必须找到适合你的应用程序.看起来您可以通过对视图而不是客户端代码承担更多责任来简化您的问题.

我希望这个答案对你有所帮助,对不起,我花了很长时间才发布这个帖子,当你发布它时我看到了你的问题,但是没有时间像这样深入探讨.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐