MVC: Должна ли логика «Цвет дисплея» быть в представлении или модели? - PullRequest
1 голос
/ 08 февраля 2012

Я программирую систему управления билетами с CodeIgniter, и у меня возникла дилемма MVC, должно ли условное окрашивание идти в модели или в представлении?Представление должно отображать все билеты в сетке.Допустим, у билетов есть крайний срок.Если осталось менее часа, билет должен быть окрашен в красный цвет, если осталось от одного до шести часов, билет должен быть окрашен в желтый, а когда осталось более шести часов, билет должен быть окрашенЗеленый.

Итак, должен ли просмотр содержать логику, подобную

foreach($tickets as $ticket):
if($hours_left >= 6): <span class="green">...</span>
else if($hours_left >= 1 and $hours_left < 6) <span class="yellow">...</span>
if($hours_left < 1): <span class="red">...</span>

, или же цвет должен быть получен как свойство из модели ?

foreach($tickets as $ticket):
<span class="<?php echo $ticket->color; ?>">...</span>

В первом случае представление получает логику, и оно больше не «глупо».Еще хуже, если это необходимо применить в нескольких представлениях, мне нужно повторить код, который трудно поддерживать, например, если я хочу добавить «синий» цвет.

Во втором случае янужно будет встроить логику отображения в модель, что также противоречит принципам MVC.

Где должна быть размещена логика цвета?

Ответы [ 5 ]

3 голосов
/ 08 февраля 2012

Цвет в данном случае является проблемой представления, скорее всего, еще дальше в CSS.

С другой стороны, «статус» заявки - это информация о модели.Существует порог, когда билет переходит от нормального, серьезного к срочному.Поэтому предоставьте эти данные вместе с билетом:

$ticket['status']='severe';

или

$ticket['status']=$ticketStatusObject

В зависимости от того, являются ли статусы билетов также объектом.

В конце эта модель получаетдля представления и там вы можете применить логику.Сделайте его семантическим, например, например:

<div class="ticket severe">

или

<div class="ticket" status="severe">

И, конечно, в CSS вы его форматируете.

Теперь есть одна интересная концепция, котораясложно с MVC.Цвет - это вид, это в основном верно.Но это также может иметь деловую цель.Как уличный фонарь, идущий зелено-оранжево-красный.В этом случае я бы загружал цвета из модели (TicketStatusObject).Вы все еще можете поместить их в CSS, но генерировать CSS на основе модели, потому что это влияет на бизнес.

Если вы создадите другой слой представления, например мобильное приложение, он будет использовать ту же модель и будет отображать тот же цвет.потому что это важно для вашего приложения и бизнеса.

3 голосов
/ 08 февраля 2012

Я бы не беспокоился о цвете.Скорее перейдите с деловым смыслом и определите , что в вашей модели (или, если необходимо, еще ниже):

время <1: приближающийся крайний срок </p>

время 1 - 6:дедлайн-середина

время> 6: дедлайн-ок

Или что угодно.Тогда лучше используйте это как свой класс, оставляя вам выбирать цвета и другие стили, как вы хотите.

2 голосов
/ 08 февраля 2012

ОБНОВЛЕНИЕ: добавлен пример вспомогательного кода

Я бы написал вспомогательную функцию, которую вы можете вызвать в представлении для добавления правильного CSS.

Таким образом, вы не возитесь со структурой моделиНапример, если у вас есть поле в базе данных с именем ticket_expires, вы все равно сможете использовать это значение в другом месте, если это необходимо.

Чтобы создать вспомогательную функцию;

Создатьфайл в / application / helpers с именем * ticket_helper.php * В этот файл поместите что-то вроде:

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/**
 * Add Style to Ticket
 * 
 * @param string $expire_timestamp
 *
 */
if ( ! function_exists('set_ticket_colour')) {
    function set_ticket_colour($expire_timestamp) {
        // do you logic here.

        // if you want to access your ticket model then...
        $_ci =& get_instance();
        // if model isn't autoloaded
        $_ci->load->model('ticket_model');
        $some_result = $_ci->ticket_model->some_function($some_param);
        return $some_result;
    }
}

Просто не забудьте либо загрузить этот помощник, когда вам это нужно, либо загрузить его автоматически.

Итак, по вашему мнению;

<?php echo set_ticket_colour($ticket->expires_time); ?>
1 голос
/ 09 февраля 2012

Вы всегда должны стремиться сделать ваши взгляды максимально краткими. Это означает удаление как можно большего количества PHP и добавление его в ваши контроллеры, модели или даже в помощника.

Я предлагаю вам оценить часы, оставшиеся от каждого тикета в помощнике, и использовать оператор switch, чтобы вернуть разделенный пробелами список классов, которые должны быть применены к этому тикету.

Тогда, на ваш взгляд, это будет так просто:

<? foreach($ticket as $t): ?>
<div class="<?= $t['classes'];?>"><?= $t['name']; ?></div>
<? endforeach; ?>

Затем используйте CSS для разметки классов.

1 голос
/ 08 февраля 2012

Я бы поставил цвет для отображения логики в модели (второй подход)

Это на самом деле не идет вразрез с принципами MVC.

Что вы действительно делаете, так это сохраняете в модели то, что в билете меньше 6 часов или больше 6 часов.

Второй подход также обеспечивает чистоту ваших шаблонов, удаляя логику представления изпредставление, это облегчает понимание представлений для графического дизайнера.

Я не разработчик PHP (поэтому не могу предоставить код), но у меня был бы вспомогательный класс, обеспечивающий статический метод, которыйпринял объект билета, извлек его часы и возвратил цвет в виде строки.

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