2011-04-23 15 views
1

我正在處理日曆/計劃器應用程序,我需要一些建議。日曆應用程序 - 輸出月份的日子

我的工作我的應用程序的以下部分:

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); 
} 

我的模型返回$數據數組被通過控制器稱爲(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

MVC和web的問題是你永遠不可能真正有清晰的視圖和控制器之間的界定。這只是網絡的固有特性。我更像是一個CakePHP的人,但原理是一樣的。當我編寫代碼時,我總是問自己一些問題,以知道放置代碼的最佳位置。

  1. 我在檢索,存儲或 操縱數據嗎? (如果是這樣,它的型號爲 )
  2. 我是向最終用戶顯示數據還是顯示 數據? (如果是這樣,它是 查看)。
  3. 其他一切都進入我的 控制器。

這就是說,只需快速瀏覽一下代碼,就會發現您正在梳理模型代碼並在控制器中查看代碼,這就是爲什麼您對此感到不安。這裏有一些簡單的邏輯可以幫助您:

將構建日期列表的所有代碼移動到模型中。叫它類似於:

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中是什麼,但在蛋糕中它們被稱爲元素。這些是任何視圖可用的視圖代碼片段(可重用的視圖元素)。因此,構建一個可重用視圖元素,它將採用日期數組,循環遍歷數據,並將輸出寫入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架構的方式清理代碼正在努力。

祝你好運,快樂編碼!

+0

非常感謝;我會再次檢查我的代碼並重寫它,並記住您的建議。這使得現在更有意義,並且在開始時我會提出一些問題,以便我知道在哪裏放置哪些代碼。謝謝! – cabaret 2011-04-23 14:03:02

+1

歡迎您。我們大多數人遇到的問題是我們管理M V&C,因此我們很難在編寫代碼時保持分離。這就是爲什麼我不得不不斷問自己的問題。 – 2011-04-23 14:26:10

+0

嗨。只是讓你知道我使用你的建議重寫了我的代碼,現在我有一個更清潔和更容易的源代碼。與我之前的代碼相比,我還不得不做更少的「作弊」來做我想做的事情。我不能夠感謝你! – cabaret 2011-04-23 18:09:11