Как сохранить несколько похожих файлов 'view / layout' DRY без использования инструкций if () везде в CakePHP? - PullRequest
2 голосов
/ 10 июня 2009

Я разрабатываю приложение с CakePHP, и у меня есть два макета: один для домашней страницы, а другой для остальной части приложения. За исключением некоторой кодировки в заголовке, они почти одинаковы. Что я могу сделать, чтобы сохранить DRY , без использования if () операторов по всему макету?

Ответы [ 2 ]

5 голосов
/ 10 июня 2009

Я бы предложил использовать тонну элементов. Таким образом, вы все равно можете хранить весь код в одном месте. Например, если это макет вашей домашней страницы (исключая шаблон):

<body>
     <?php echo $this->renderElement('pageHeader'); ?>
     <?php echo $this->renderElement('frontPageNotification'); ?>
     <?php echo $this->renderElement('navAndOtherStuff'); ?>
     ...
</body>

И это ваш внутренний макет (где вы хотите отобразить все, кроме элемента frontPageNotification:

<body>
     <?php echo $this->renderElement('pageHeader'); ?>
     <?php echo $this->renderElement('navAndOtherStuff'); ?>
     ...
</body>

Теперь, если они почти одинаковы, я бы, вероятно, просто использовал один макет и имел бы несколько операторов if внутри самого макета, чтобы определить, что должно отображаться. Кроме того, вы можете выбрать, какие элементы отображать, посмотрев массив $ this-> params, чтобы выяснить, какой контроллер и действие находятся за загружаемой страницей. Как:

<body>
     <?php echo $this->renderElement('pageHeader'); ?>

     <?php if($this->params['controller'] == 'pages' && $this->params['action'] == 'index') { echo $this->renderElement('frontPageNotification'); } ?>
     <?php echo $this->renderElement('navAndOtherStuff'); ?>
     ...
</body>

Что, по общему признанию, довольно некрасиво. Просто пытаюсь представить все возможные варианты:)

Удачи

1 голос
/ 10 июня 2009

Определить интерфейс для типа макета. Каждое место, где у вас есть «если макет основной» или «если макет другой», определяют функцию интерфейса

interface IMyLayout
{
    function DrawArea1(...)
    ...
}

class CMyMainLayout implements IMyLayout
{
    function DrawArea1()
    {
        //... draw area 1 for main
    }
    ...
}


class CMyOtherLayout implements IMyLayout
{
    function DrawArea1()
    {
        //... draw area 1 for other
    }
}

Затем вы просто выбираете тот или другой, обновляя правильный объект

 if ($main)
 {
     $layout = new CMyMainLayout;
 }
 else
 {
     $layout = new CMyOtherLayout;
 }

 $layout->DrawArea1();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...