日历应用程序 - 输出该月的日期

时间:2011-04-23 13:04:58

标签: php model-view-controller codeigniter date calendar

我正在制作日历/计划应用程序,我需要一些建议。

我正在处理我的应用程序的以下部分:

days of the month

它显示从1月到月末,28 / 29,30或31的月份日期。我实现了这个...(here)但我的代码非常难看,我确定必须有另一种方法来做到这一点。

我在CodeIgniter工作。我的控制器包含以下函数来填充列表中的日期:

    public function init_days()
{
            // post values? in case of previous/next months (ajax)
    if($this->input->post('post_month') && $this->input->post('post_year'))
    {
        $month = $this->input->post('post_month');
        $year = $this->input->post('post_year');
        $data = $this->planner_model->calendar_data($month, $year);
    }
    else
    {
        $data = $this->planner_model->calendar_data();
    }

    // init empty calendar
    $data['calendar'] = '';

    // easy var names
    $current_month = $data['current_month'];
    $current_year = $data['current_year'];

    // echo list into $data['calendar']
    for($i = 1; $i <= $data['days_in_month']; $i++)
    {
        if($current_month == date('n') && $current_year == date('Y'))
        {
            if($i < $data['current_day_of_month'])
            {
                $data['calendar'] .= "<li class='prev_month' value='$i'>$i</li>";
            }
            if($i == $data['current_day_of_month'])
            {
                $data['calendar'] .= "<li class='today' value='$i'>$i</li>";
            }
            if($i > $data['current_day_of_month'])
            {
                $data['calendar'] .= "<li class='next_month' value='$i'>$i</li>";
            }
        }
        if( ($current_month > date('n') && $current_year == date('Y')) || ($current_year > date('Y')) )
        {
            $data['calendar'] .= "<li class='next_month' value='$i'>$i</li>";
        }
        if( ($current_month < date('n') && $current_year == date('Y')) || ($current_year < date('Y')) )
        {
            $data['calendar'] .= "<li class='prev_month' value='$i'>$i</li>";
        }
    }
    $data['month_name'] = ucfirst($this->get_month_name($current_month));

    header('Content-type: application/json');
    echo json_encode($data);
}

我的模型返回由控制器调用的$ data数组(在else子句中,第一部分):

    public function calendar_data($month = '', $year = '')
{
    if( ! empty($month) && ! empty($year))
    {
        $data['current_year'] = $year;
        $data['current_month'] = $month;
        $data['current_day_of_month'] = date('j');
        $data['current_day_of_week'] = date('w');
        $data['days_in_month'] = cal_days_in_month(CAL_GREGORIAN, $month, $year);
    }
    else
    {
        $data['current_year'] = date('Y');
        $data['current_month'] = date('n');
        $data['current_day_of_month'] = date('j');
        $data['current_day_of_week'] = date('w');
        $data['days_in_month'] = cal_days_in_month(CAL_GREGORIAN, $data['current_month'], $data['current_year']);
    }


    return $data;
}

然后我在我的视图中输出这个,在$(document).ready。

上调用AJAX

$("#day_list").html(data['calendar']).fadeIn();

我对代码不满意。这是一团糟,我很确定我在这里打破了MVC;不是吗?有人可能会以“更好”的方式提供一些建议或见解吗?非常感谢。

完整的来源是here以防万一有人能够仔细查看它并告诉我是否有其他的东西我做错了。

1 个答案:

答案 0 :(得分:1)

MVC和网络的问题是你永远无法在视图和控制器之间进行清晰的描述。这只是网络的固有特性。我更像是一个CakePHP人,但原则是一样的。当我编写代码时,我总是问自己一些问题,以便知道放置代码的最佳位置。

  1. 我是在检索,存储还是 操纵数据? (如果是的话,那就是 模型)
  2. 我是否正在显示数据或进行展示 数据给最终用户? (如果是的话,那就是 视图)。
  3. 其他一切都进入我的 控制器。
  4. 话虽这么说,只需快速查看代码,看起来你正在梳理模型代码并查看控制器中的代码,这就是你对此感到不安的原因。以下是一些可以帮助您的简单逻辑:

    将构建日期列表的所有代码移动到模型中。称之为:

    function create_date_list() {
      // code here
    }
    

    这只会构建一个您想要显示的日期数组。请记住,您也可以传递数组上的内容,例如日期是假日,当天,周末等。这将帮助您在视图中确定如何格式化日期,而无需将代码添加到视图中这样做。例如,您可能有一个从模型返回的数组,如下所示:

    [dates] {
      [22] {
         [day] => [Friday]
         [type] => [weekday]
      }
      [23] {
         [day] => [Saturday]
         [type] => [Weekend]
      }
      [24] {
         [day] => [Sunday]
         [type] => [Weekend]
         [Holiday] => [Easter]
      }
    }
    

    这可能有点矫枉过正。但是我用这个例子来说明MODEL是你完成所有这些繁重工作的地方,而不是控制器或视图。

    接下来,构建视图。我不确定它在CodeIgniter中是什么,但在蛋糕中它们被称为Elements。这些是任何视图可用的视图代码片段(可重用的视图元素)。因此,构建一个可重用的视图元素,它将采用日期数组,循环遍历它,并以HTML格式编写输出。请注意我如何使用日期数组格式化我的视图。

    <ul>
    <?php foreach($dates as $date): ?>
      <li class="date <?php echo $dates[$date]['type']; ?>><?php echo $date; ?></li>
    <?php endforeach; ?>
    </ul>
    

    漂亮,干净,简洁。优点是,如果您想要更改外观,则无需触摸控制器。 ;)

    现在,对于控制器。将代码放在从模型中调用日期数组的控制器中,并将其传递给视图。这个想法是FAT模型,SKINNY视图。

    function my_function() {
      // get code from model
      // set code for view
      // render view
    }
    

    虽然我没有真正“清理”你的代码。我希望这能为您提供有关如何在自己周围移动代码的指导,以便a)它对您更有意义,并且b)您可以以仍然符合MVC架构的方式清理代码正在努力。

    祝你好运,快乐的编码!