Как я могу улучшить эту систему шаблонов? - PullRequest
1 голос
/ 23 июля 2010

На данный момент у меня есть базовый файл шаблона HTML. Когда бы я ни захотел создать новую страницу, я копирую шаблон и помещаю несколько require_once операторов между конкретными тегами. Мне было интересно, есть ли лучший способ, который сделал бы ненужным копировать шаблон каждый раз. Вот типичный пример:

  <html>
   <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <link rel="stylesheet" type="text/css" href="css/second.css" />
    <script language="JavaScript" type="text/javascript"
        src="js/validation_functions.js"></script>
    <title>Order a Ticket for the ball</title>
   </head>
   <body>

    <div id="banner">St. Tom's Ambulance Ball</div>

    <!-- START[container] -->
    <!-- "body" -->
    <div id="container">

        <!-- START[header] -->
        <div id="header">

            <!-- header -->
            <div id="header_text">introduction</div>
            <div id="header_cell2">the process</div>
            <div id="header_cell3">start</div>

        </div>
        <!-- END[header -->

        <!-- START[content] -->
        <!-- "other container" -->
        <div id="content">

            <!-- START[form] -->
            <div id="form">
                <?php
                require_once(realpath($config["directories"]["views"]."/index.form.view.php"));
                ?>
            </div>
            <!-- END[form] -->

            <!-- START[data] -->
            <!-- "main content" -->
            <div id="data">
                <?php
                require_once(realpath($config["directories"]["views"]."/index.data.view.php"));
                ?>
            </div>
            <!-- END[data] -->

            <!-- START[side] -->
            <div id="side">
                <?php
                require_once(realpath($config["directories"]["views"]."/index.side.view.php"));
                ?>
            </div>
            <!-- END[side] -->

        </div>
        <!-- END[content] -->

        <!-- START[footer] -->
        <div id="footer">
            <!-- footer -->
            <div id="footer_text">
                <ul>
                    <li><a href="index.php">home</a></li>
                    <li><a href="">partners</a></li>
                    <li><a href="">projects</a></li>
                    <li><a href="">contact us</a></li>
                </ul>
            </div>

            <div id="footer_cell2">&nbsp;</div>
            <div id="footer_cell3">&nbsp;</div>

        </div>
        <!-- END[footer] -->

    </div>
    <!-- END[container] -->

  </body>
 </html>

РЕДАКТИРОВАТЬ: Я принял к сведению ваши предложения по использованию GET. Новая идея состоит в том, чтобы каждый URL-адрес запроса формировался как index.php? Page = page_name. Этот запрос затем обрабатывается главным контроллером, который затем устанавливает переменные шаблона на основе значения $ _GET ['page']. Для этого шаблон теперь будет:

  <html>
   <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <link rel="stylesheet" type="text/css" href="css/second.css" />
    <script language="JavaScript" type="text/javascript"
        src="js/validation_functions.js"></script>
    <title><?php h($title) ?></title>
   </head>
   <body>

    <div id="banner">St. Tom's Ambulance Ball</div>

    <!-- START[container] -->
    <!-- "body" -->
    <div id="container">

        <!-- START[header] -->
        <div id="header">

            <!-- header -->
            <div id="header_text"><?php h($header_1) ?></div>
            <div id="header_cell2"><?php h($header_2) ?></div>
            <div id="header_cell3"><?php h($header_3) ?></div>

        </div>
        <!-- END[header -->

        <!-- START[content] -->
        <!-- "other container" -->
        <div id="content">

            <!-- START[form] -->
            <div id="form">
                <?php
                require_once(realpath($view_1));
                ?>
            </div>
            <!-- END[form] -->

            <!-- START[data] -->
            <!-- "main content" -->
            <div id="data">
                <?php
                require_once(realpath($view_2));
                ?>
            </div>
            <!-- END[data] -->

            <!-- START[side] -->
            <div id="side">
                <?php
                require_once(realpath($view_3));
                ?>
            </div>
            <!-- END[side] -->

        </div>
        <!-- END[content] -->

        <!-- START[footer] -->
        <div id="footer">
            <!-- footer -->
            <div id="footer_text">
                <ul>
                    <li><a href="index.php">home</a></li>
                    <li><a href="">partners</a></li>
                    <li><a href="">projects</a></li>
                    <li><a href="">contact us</a></li>
                </ul>
            </div>

            <div id="footer_cell2">&nbsp;</div>
            <div id="footer_cell3">&nbsp;</div>

        </div>
        <!-- END[footer] -->

    </div>
    <!-- END[container] -->

  </body>
 </html>

Примечание: h () - это функция, которая в первую очередь удаляет все нежелательные теги сущностей перед выводом строки.

В соответствующей заметке вверху каждой страницы у меня есть несколько файлов контроллеров, которые включены в require_once. Мне было интересно, можно ли реализовать функцию, которая просто включает файлы, основанные на определенной строке ввода (имя функции / страницы), т.е. "index" следующим образом:

function include_controller($page){
  switch($page){
    case "index":
       require_once(realpath($config["directories"]["controllers"]."/index_.php"));
       break;
    case "checkout":
      require_once(realpath($config["directories"]["controllers"]."/checkout_.php"));
      break;
    default:
      break;
  }
}

Ответы [ 5 ]

1 голос
/ 23 июля 2010

Как уже говорили другие, было бы лучше использовать какую-то среду MVC.Или, по крайней мере, использовать шаблонизатор (например, Smarty).Ваш пример в порядке, хотя, для 90-х годов:)

1 голос
/ 23 июля 2010

Сохраните этот файл как файл шаблона.Тогда для всей функциональности на вашем сайте всегда попадайте в этот файл.Давайте посидим этот файл index.php.Таким образом, все запросы функциональности идут в index.php.Но с другими параметрами, что касается функциональности A.

index.php? Function = a Для функциональности b

index.php? Function = b

также можно добавить дополнительные параметры.

Теперь на основе a, b и набора параметров посмотрите, какие файлы вы хотите включить, как требуется один раз.

1 голос
/ 23 июля 2010

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

Редактировать: Чтобы ответить на второй вопрос, вместо использования переключателя вы можете просто проверить, существует ли файл. Если это так, включите этот файл, в противном случае выведите ошибку («Страница не существует» или что-то подобное).

function include_controller($page){
    if (file_exists($config["directories"]["controllers"]."/$page_.php")) {
        // page exists, include it
        require_once($config["directories"]["controllers"]."/$page_.php"));
    } else {
        // page not found
    }
}

Очевидно, что вы, вероятно, должны сделать функцию немного более надежной и, возможно, ограничить файлы, которые будут включены в определенный каталог или что-то еще. Также убедитесь, что вы правильно отфильтровали переменную $ page, чтобы пользователи не могли получить доступ к какому-либо файлу.

0 голосов
/ 23 июля 2010

Вы можете обойтись одним шаблоном, если вы выберете другой способ указать, какая страница запрашивается, например, с помощью переменной GET. Вы можете загрузить страницы в базу данных и указать каждую из включенных частей, а затем иметь один php 'шаблонизатор', который загружает запрашиваемую страницу из базы данных и выводит шаблон с правыми включениями.

0 голосов
/ 23 июля 2010

Если ваш сервер поддерживает это, вы можете ссылаться на то, что хотите включить на всех страницах в .htaccess:

php_value auto_prepend_file "header.php"
php_value auto_append_file  "footer.php"

(найдено на codingforums.com )

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