如何构建数据库并在CodeIgniter 2项目中填充日历?

时间:2013-03-07 19:20:00

标签: php codeigniter calendar codeigniter-2

我搜索过SO和Google,但找不到我需要的东西。

我正在使用CodeIgniter 2构建一个简单的事件日历。As per the CodeIgniter documentation,这是基本的代码结构,它正在运行......

// $data[2] contains the data for day #2, etc.

$data[2] = '<a href="#">event title 1</a>';
$data[8] = '<a href="#">event title 2</a><br/><a href="#">event title 3</a>';
$data[13] = '<a href="#">event title</a>';
$data[24] = '<a href="#">event title</a>';

// {content} in template is where $data is inserted for each day

$prefs = array (
    // my calendar options
    'template'  => '
        {cal_cell_content}{day}<br/>{content}{/cal_cell_content}
        {cal_cell_content_today}<div class="highlight">{day}<br/>{content}</div>{/cal_cell_content_today}'
);

$this->load->library('calendar', $prefs);

$year   = ($year === FALSE ? date('Y') : $year);
$month  = ($month === FALSE ? date('m') : $month);

echo $this->calendar->generate($year, $month, $data);

现在我是如何设置数据库表的......

  • 每个事件都有一个title字段,可以创建$slug。 (~/events/view/title-slug

  • 每个活动都有一个date字段,数据格式为mm/dd/yyyy

现在,我正在考虑如何查询特定月/年的数据库,并提取数据以插入每个$data[]变量。

好像我需要做以下事情:

  • 在我的数据库表格中为monthdayyear创建新列。

  • 在我的date输入数据经过验证后,将其保存到date列。

  • 拆分我的date输入数据,并将每个部分保存到monthdayyear列。

然后我只想查询我的数据库year&amp; month,然后循环浏览这些结果,为每个$data[]构建我的day数组。

这是我应该接近这个问题的正确方法吗?拥有date列以及monthdayyear列似乎非常多余。只能使用datemm/dd/yyyy)列来完成吗?太简单?太复杂了?我想避免给用户多个字段来输入日期,最后我会有一个jQuery日期选择器来帮助确保正确的数据格式。

我知道这可能看起来像一个简单的问题,但我无法在线找到简单的代码示例。我发现的大多数都是过时的(CI而不是CI2),对于我正在做的事情来说过于复杂,或者使用包含已经包含日期(~/events/view/yyyy/mm/dd)的URI段的日常内容项。


修改

这就是我的模型目前的设置方式:

return $this->db->get_where('events', array('yyyy' => $year, 'mm' => $month))->result_array();

2 个答案:

答案 0 :(得分:1)

您可以按原样保留所有内容,只需构建查询以将月份和年份作为单独的列返回:

SQL中的

SELECT id, 
       title, 
       description, 
       MONTH(date_field) as event_month, 
       YEAR(date_field) as event_year 
FROM my_table
... etc ...

并在Active Record(taken from here)中:

$this->db->select('id');
$this->db->select('title');
$this->db->select('description');
$this->db->select("MONTH(date_field) AS event_month");
$this->db->select("YEAR(date_field) AS event_year");
$query = $this->db->get('my_table');
$results = $query->result();

答案 1 :(得分:0)

首先,我将date列更改为MySQL“日期”格式yyyy-mm-dd,以便利用built-in MySQL date functions

我的原始$查询如下,其中'yyyy''mm'是我的多余“年”和“月”列:

$this->db->get_where('events', array('yyyy' => $year, 'mm' => $month))->result_array();

我只是使用内置的MySQL日期函数将其更改为以下内容:

$this->db->get_where('events', array('YEAR(date)' => $year, 'MONTH(date)' => $month))->result_array();

这解决了这个问题。现在我不再需要维护“年”和“月”的额外列。


此外,我可以使用MySQL“alias”函数将date列的“day”部分分配给名为dd的虚拟列:

$this->db->select('DAY(date) AS dd');

但是,这会失败,因为它会超越CI的默认select('*')。因此,您必须先select()所有相关列,否则会出错:

$this->db->select('*');
$this->db->select('DAY(date) AS dd');

将所有内容放在模型中:

// select all relevant columns
$this->db->select('*');

/* use MySQL date functions to creates virtual column called 'dd' containing
"day" portion of the real 'date' column. */
$this->db->select('DAY(date) AS dd'); 

/* use MySQL date functions to match $year and $month to "year" and "month"
portions of real 'date' column. */  
return $this->db->get_where('events', array('YEAR(date)' => $year, 'MONTH(date)' => $month))->result_array();