【问题标题】:How to structure database and populate Calendar in CodeIgniter 2 project?如何在 CodeIgniter 2 项目中构建数据库和填充日历?
【发布时间】:2013-03-07 19:19:59
【问题描述】:

我搜索了 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 列中。

然后我会简单地在我的数据库中查询yearmonth,然后遍历这些结果来为每个day 构造我的$data[] 数组。

这是我应该解决这个问题的正确方法吗?拥有date 列以及monthdayyear 列似乎非常多余。可以只使用date (mm/dd/yyyy) 列吗?太简单?太复杂了?我想避免为用户提供多个字段来输入日期,最终我将拥有一个 jQuery 日期选择器来帮助确保正确的数据格式。

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


编辑

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

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

【问题讨论】:

    标签: php codeigniter calendar codeigniter-2


    【解决方案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();
    

    【讨论】:

    • 我不明白这是如何工作的。 MONTH(date) 怎么知道我的日期字符串的哪一部分是月份?
    • 假设您正在使用 MySQL - MONTH 是一个核心函数,它仅从 date 字段返回月份:date-and-time-functions.html#function_month - 我还假设您正在使用字段类型date 用于您的日期字段,而不是 varchar
    • 我的date 字段包含mm/dd/yyyy 格式的日期,我想我没有正确设置我的字段类型。
    • 是的,如果项目还不算太晚,我建议更新该字段。最好利用原生类型。我相信date 类型的格式是:yyyy-mm-dd
    • 现在还不算太晚,当我更改它时,我丢失了我所有的虚拟date 数据。数据录入呢?我认为 2012-02-29 对用户来说不如 2012 年 2 月 29 日那么直观。我宁愿不必不断地从数据库中操作它来显示并再次返回......除非有一个自动处理它的函数。
    【解决方案2】:

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

    我原来的 $query 如下,'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 的“别名”函数将 date 列的“天”部分分配给名为 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-21
      • 1970-01-01
      • 2020-07-04
      • 2011-08-26
      • 2012-06-25
      • 1970-01-01
      • 1970-01-01
      • 2012-01-12
      相关资源
      最近更新 更多