Приложение календаря - выводит дни месяца - PullRequest
1 голос
/ 23 апреля 2011

Я работаю над приложением календаря / планировщика, и мне нужен совет.

Я работаю над следующей частью моего приложения:

days of the month

Показывает дни месяца с 1 до конца месяца, 28/29, 30 или 31. Я достиг этого .. ( здесь ), но мой код очень уродлив, и я ' Я уверен, что должен быть другой способ сделать это.

Я работаю в 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;
}

Затем я вывожу это в виде, используя вызов AJAX для $ (document) .ready.

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

Я не доволен кодом. Это беспорядок, и я вполне уверен, что я нарушаю MVC здесь; не так ли? Может ли кто-нибудь дать какой-нибудь совет или понять, как сделать это «лучше»? Большое спасибо.

Полный источник: здесь на случай, если кто-нибудь будет любезен просмотреть его и сказать мне, если есть другие вещи, которые я делаю неправильно.

1 Ответ

1 голос
/ 23 апреля 2011

Проблема с MVC и сетью заключается в том, что вы никогда не сможете четко разграничить вид и контроллер. Это просто внутренняя природа сети. Я скорее парень из 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]
  }
}

Это может быть излишним или нет. Но я использовал этот пример, чтобы показать, что МОДЕЛЬ - это место, где вы выполняете всю эту тяжелую работу, а не контроллер или представление.

Далее создайте представление. Я не уверен, что это в CodeIgniter, но в торт они называются элементы. Это фрагменты кода представления, которые доступны для любого представления (повторно используемые элементы представления). Поэтому создайте повторно используемый элемент представления, который будет принимать массив дат, проходить по нему и записывать вывод в HTML. Обратите внимание, как я могу использовать массив дат для форматирования моего представления.

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

Красиво, чисто и лаконично. Преимущество в том, что если вы хотите изменить внешний вид, вам не нужно прикасаться к контроллеру. ;)

Теперь для контроллера. Поместите код в контроллер, который вызывает массив дат из модели и передает его в представление. Идея - модель FAT, КОЖНЫЙ вид.

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

Хотя я на самом деле не "очистил" ваш код. Я надеюсь, что это даст вам руководство, которое вы искали, о том, как перемещать код вокруг себя так, чтобы: а) это имело больше смысла для вас, и б) вы могли очистить код таким образом, который все еще будет соответствовать архитектуре MVC, которую вы стремимся к.

Удачи и счастливого кодирования!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...