Я создаю тип контейнера, который имеет много возможных вариантов того, что может быть включено:
- строка заголовка
- строка поиска
- форма бара
- панель вкладок
- Пользовательская панель
- информационная панель
- действие / строка состояния
- область содержимого
Из них требуется только область содержимого. Существуют подтипы, которые разделяют общие наборы столбцов, но их также можно смешивать и сопоставлять в произвольных комбинациях. Кроме того, каждый тип бара может иметь контент на левой или правой стороне.
Я шел по пути создания класса Panel со свойствами, такими как:
- info_left
- info_right
- search_left
- search_right
- и т.д.
затем выполняем такую логику:
// snip from __toString()
if ($this->info_left || $this->info_right) {
$result .= $this->add_bar('info', $this->info_left, $this->info_right);
}
if ($this->search_left || $this->search_right) {
$result .= $this->add_bar('search', $this->search_left, $this->search_right);
}
// end snip
private function add_bar($type, $left, $right) {
$result = <<< HERE
<div class="$type">
<div class="left">$left</div>
<div class="right">$right</div>
</div>
HERE;
}
и для создания панели:
$p = new Panel("my panel");
$p->info_left = "my left content";
$p->search_right = "my right search content";
echo $p;
До сих пор я держался подальше от использования шаблонизатора, потому что логика кажется достаточно сложной, чтобы я почти предпочел оставить ее в классе. (В классе очень мало бизнес-логики, но много логики представления.) Может быть, есть лучший подход ...?