我正在制作日历/计划应用程序,我需要一些建议。
我正在处理我的应用程序的以下部分:
它显示从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以防万一有人能够仔细查看它并告诉我是否有其他的东西我做错了。
答案 0 :(得分:1)
MVC和网络的问题是你永远无法在视图和控制器之间进行清晰的描述。这只是网络的固有特性。我更像是一个CakePHP人,但原则是一样的。当我编写代码时,我总是问自己一些问题,以便知道放置代码的最佳位置。
话虽这么说,只需快速查看代码,看起来你正在梳理模型代码并查看控制器中的代码,这就是你对此感到不安的原因。以下是一些可以帮助您的简单逻辑:
将构建日期列表的所有代码移动到模型中。称之为:
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架构的方式清理代码正在努力。
祝你好运,快乐的编码!