Как создать сложный контейнер в PHP - PullRequest
0 голосов
/ 02 мая 2009

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

  • строка заголовка
  • строка поиска
  • форма бара
  • панель вкладок
  • Пользовательская панель
  • информационная панель
  • действие / строка состояния
  • область содержимого

Из них требуется только область содержимого. Существуют подтипы, которые разделяют общие наборы столбцов, но их также можно смешивать и сопоставлять в произвольных комбинациях. Кроме того, каждый тип бара может иметь контент на левой или правой стороне.

Я шел по пути создания класса 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;

До сих пор я держался подальше от использования шаблонизатора, потому что логика кажется достаточно сложной, чтобы я почти предпочел оставить ее в классе. (В классе очень мало бизнес-логики, но много логики представления.) Может быть, есть лучший подход ...?

Ответы [ 2 ]

0 голосов
/ 02 мая 2009

Вы должны рассмотреть возможность использования шаблона Decorator. Сценарий, приведенный в качестве примера в Википедии, похоже, та же самая проблема, что и вы.

0 голосов
/ 02 мая 2009

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

так было бы что-то вроде:

<div class="title">
    <div class="left">my left content</div>
    <div class="right search">my right search content</div>
</div>

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

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