Zend Framework Генерация HTML в цикле

Я новичок в Zend Framework и хотел бы получить совет о том, как лучше всего обработать данные базы данных для создания списка ссылок. Насколько я понимаю, модель должна содержать большую часть логики приложения с максимально легкими контроллерами и представлениями.

Я запрашиваю базу данных, чтобы получить набор записей, и я хочу перебрать их и создать HTML-ссылки. Псевдокод ниже.

КОНТРОЛЕР:

$this->view->myList = MODEL->generateHtml();

МОДЕЛЬ:

function generateHtml() {
    query db

    loop through record set

    build a string of html within loop including links

    return string to controller

}

ВИД:

echo $this->myList;

Это, кажется, помещает логику в модель и оставляет свет контроллера и вид только для рендеринга.

У меня есть одна проблема: я хочу использовать $this->view->url для создания ссылок маршрутизации в html, который я вывожу, но не могу сделать это в модели. Чтение, которое я прочитал в Интернете, предполагает, что вы не должны создавать html в модели. Я могу сгенерировать массив необходимых данных в модели и вернуть его, а затем прокрутить его либо в контроллере, либо в представлении, чтобы сгенерировать html, но я не уверен в правильности подхода и был бы признателен за некоторые советы.

Спасибо за любую оказанную помощь.


НОВАЯ ПРОБЛЕМА - ОБНОВЛЕННЫЙ КОД:

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

Мой код сейчас:

МОДЕЛЬ:

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

КОНТРОЛЛЕР:

    $aStoryList = array( 
        array(
           'headline' => 'Headline 1', 
           'story' => 'Story 1' 
        ), 
        array(
           'headline' => 'Headline 2',
           'story' => 'Story 2'
        )
    );
    $this->view->aStoryList = $aStoryList;

ПОСМОТРЕТЬ:

echo $this->partialLoop('partials/storyList.phtml', $this->aStoryList);

список историй.phtml:

echo "<br />" . $this->headline . $this->story;

Я разместил частичное таким образом ....

просмотры/частичные/storyList.phtml

Это размещение и путь, используемые в представлении, получены из ответа на этот вопрос stackoverflow — Где сохранить частичные представления (представления) в Zend Framework, чтобы они были доступны для всех представлений в моем приложении?

Когда я запускаю это, я получаю следующую ошибку

Сообщение: сценарий 'partials/storyList.phtml' не найден в пути (/home/sites/xxxxx.com/public_html/xxxxxx/application/views/scripts/)

Вырви мне волосы сейчас же!


person slip0000    schedule 04.06.2012    source источник


Ответы (1)


Модель должна использоваться для извлечения данных из источника данных, но не должна генерировать HTML-разметку. Сохраните генерацию HTML для представления. Контроллер будет связующим звеном между моделью и представлением; то есть контроллер будет выполнять работу по извлечению данных и передаче их в представление, где генерируется вывод.

В вашем конкретном случае PartialLoop View Helper должен быть полезен для создания разметки в цикле.

Я бы предложил следующий псевдокод вместо того, что вы разместили выше:

КОНТРОЛЕР:

$this->view->myList = MODEL->getListOfItems();  // return an array of data

МОДЕЛЬ:

function getListOfItems() {
    $results = array(); // array of data to return

    // query db

    // loop over result set
    foreach($result as $row) {
        $results[] = $row;
    }

    return $results;
}

ВИД:

<?php echo $this->partialLoop('myList.phtml', $this->myList);

Частичный просмотр myList.phtml:

<tr>
    <td><a href="<?php echo $this->url(array('id' => $this->id))"><?php echo $this->username ?></a></td>
    <td><?php echo $this->firstName ?> <?php echo $this->lastName ?></td>
    <td><?php echo $this->email ?></td>
</tr>

Обобщить:

  • Модель запросов контроллера для данных
  • Модель возвращает массив результатов
  • Контроллер передает массив непосредственно для просмотра
  • Представление вызывает partialLoop помощника и передает массив из модели
  • Помощник partialLoop выполняет итерацию по всем результатам, передавая их по одному в myList.phtml (обратите внимание, как область видимости переменной становится локальной для партиала представления).

В моем примере предполагается, что массив, возвращаемый моделью, содержит ключи id, username, firstName, lastName.

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

person drew010    schedule 04.06.2012
comment
Можете ли вы вызвать partialLoop внутри другого partialLoop? Еще одна вещь (хотя я не уверен в этом) не использует помощник частичного представления плохо для производительности, и вместо этого следует использовать render? - person Songo; 05.06.2012
comment
Привет, Дрю! Большое спасибо, что нашли время написать подробный и содержательный ответ. Я не слышал о помощнике представления partialLoop, но посмотрю. Глядя на ваш псевдокод, он выглядит именно так, как я хочу. Очень ценю ваши усилия - ура ( stackoverflow не позволит мне проголосовать за ваш ответ, поскольку я новичок, но действительно ценю ваши усилия) - person slip0000; 05.06.2012
comment
@Songo Глядя на код для partial и partialLoop, я не вижу причин, по которым вы не могли бы вызвать partialLoop из другого partialLoop (пока вы не попадаете в рекурсивную дыру, передавая одни и те же данные ). Вероятно, есть некоторый удар по производительности, поскольку partialLoop вызывает partial, который clones ваш объект представления, очищает его vars и назначает ему частичные vars, а затем вызывает render() в клонированном представлении и возвращает содержимое. Было бы интересно увидеть некоторые тесты по сравнению частичного цикла с циклом и рендерингом просмотра. - person drew010; 05.06.2012
comment
Просто очень небольшое улучшение. В идеале запрос к базе данных уже должен возвращать массив, поэтому для создания массива не требуется никаких дополнительных циклов внутри PHP. - person Sam; 05.06.2012
comment
Привет еще раз - я отредактировал свой вопрос выше, чтобы проиллюстрировать новую проблему, связанную с путем, с которой я столкнулся. Я уверен, что ответ partialLoop будет работать, если я смогу запустить его. Спасибо всем, кто может мне посоветовать. - person slip0000; 05.06.2012
comment
@slip0000 Место, где он ищет каталог partials, находится в /home/sites/xxxxx.com/public_html/xxxxxxx/application/views/scripts/. Поэтому, если вы создадите /home/sites/xxxxx.com/public_html/xxxxxxx/application/views/scripts/partials/storyList.phtml, он должен работать правильно. - person drew010; 05.06.2012