Какой правильный способ MVC сделать это ....? - PullRequest
2 голосов
/ 15 ноября 2009

Быстрый вопрос об общем принципе проектирования MVC в PHP с использованием CodeIgniter или Kohana (на самом деле я использую Kohana).

Я новичок в MVC и не хочу ошибиться ... поэтому мне интересно, есть ли у меня таблицы:

categories, pages, notes

Я создаю отдельный контроллер и просматриваю для каждого ...? Чтобы люди могли перейти на

/category/#
/page/#
/note/#

Но тогда, допустим, я хочу также иметь возможность отображать несколько заметок на странице, было бы плохо вызывать представление заметок в цикле из представления страницы. Так я должен создать какую-то функцию, которая рисует заметки и передает переменные этой функции из представления заметки и из цикла в представлении страницы? Это был бы лучший способ сделать это, если нет, то как мне еще это сделать ...?

Спасибо

Сергей

Ответы [ 4 ]

1 голос
/ 15 ноября 2009

Да, вместо того, чтобы просто передавать 1 объект (категорию, страницу, заметку) на ваш взгляд, передайте список объектов. С помощью цикла внутри представления вы можете отобразить весь список. Это представление может вызывать другое (или функцию), которое знает, как отобразить одну запись.

1 голос
/ 18 ноября 2009

Лично у меня был бы метод "show" для одного элемента и метод "list" для нескольких. В вашем контроллере вы можете сказать что-то вроде $page_data['note'] = get_note(cat_id,page_id) для метода "show" и $page_data['notes'] = get_all_notes(cat_id) для метода "list".

Затем, по вашему мнению, вы перебираете $page_data['notes'] и отображаете HTML для каждого из них. Если в представлении списка используется тот же HTML-код «примечания», что и в представлении «show», создайте шаблон или функцию для выделения HTML-кода с учетом примечания:

// In your "list" view
foreach($n in $page_data['notes']){
    print_note_html($n)
}

//In your "show" view
print_note_html($n)

Функция print_note_html может быть вспомогательным методом, доступным для всех представлений Notes. Имеет смысл?

0 голосов
/ 22 февраля 2010

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

В вашем примере я бы создал функцию для возврата разметки для заметки.

применение / хелперы / view_helper.php

function note($note)
{
    return '<div class="note">' .
        '<h2>' . $note->title . '</h2>' .
        '<p>' . $note->contents . '</p></div>';
}

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

echo note($note);

Для списка заметок в представлении я бы повторил список, вызывающий эту функцию.

<div class="note-list">
<?php foreach ($notes as $note) : ?>
    <?php echo note($note); ?>
<?php endforeach; ?>
</div>

Я обнаружил, что включение многократного представления в другое представление было медленным. Вот почему я так сделал.

Редактировать

Я только что копался в классе CodeIgniter Loader и уверен, что включение PHP происходит каждый раз, когда вы вызываете

$this->load->view('view_name');

Это означает, что если вы используете этот метод для отображения списка из 20 заметок, вы будете делать 20 отдельных включений.

0 голосов
/ 15 ноября 2009
  1. Вы можете выполнить цикл в представлении. Представление разрешено также может получить доступ к модели в MVC. Смотри: http://www.phpwact.org/pattern/model_view_controller
  2. Вам не нужно иметь контроллер (или модель) для каждой таблицы.
...