Рейтинг блогов

PHP: Шаблоны – это не сложно!

дата добавления: 04 марта 2007 / 11:07, просмотров: 37670, комментариев: 15

Решил немного подкачать свой навык программирования в PHP, рано или поздно надо это начинать, тем более что основы PHP я уже знаю давно. В принципе, сложностей никаких при работе с PHP я не встретил, удивительно, но мне даже с первого раза удалось его установить под Windows, хотя буквально года 3-4 назад у меня с этим были проблемы :)

 

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

 

Шаблон

 

Шаблон представляет собой обычный HTML-файл, но помимо обычных html-тэгов, он также должен содержать специальные отметки для контента. Я решил сделать это в следующем стиле:

 

001:

002:

003:

004:

005:

006:

007:

008:

009:

010:

011:

012:

013:

014:

015:

<html>

  <head>

    <title>Заголовок окна</title>

  </head>

  <body>

    <h1>Добро пожаловать!</h1>

    <hr />

    <!--Контент-->

    <php:Content>

    <!--//Контент-->

    <hr />

    Это пример простого шаблона<br />

    Обычный HTML, ничего особенного..

  <body>

</html>

 

Как видите, это обычный HTML-код, однако в 9 строке расположен «тэг» <php:Content>, именно в этом месте должен будет появиться в результате указанный контент. Здесь хотелось бы отметить, что строка <php:Content> в принципе может быть любой, однако, для большего удобства, я сделал обязательным наличие <php:>, другими словами, синтаксис определения блока контента следующий:

 

 

<php:ИмяБлока>

 

За счет этого, в одном шаблоне может находиться сколько угодно блоков контента.

 

Класс управления шаблонами

 

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

- Имя файла шаблона;

- Заголовок страницы (<title></title>);

- Контент;

 

Это минимум, но, конечно же, количество параметров можно запросто увеличить.

 

Помимо этого, класс также должен склеивать полученные данные воедино и выводить клиенту. Это немного похоже на MasterPage в ASP .NET, хотя конечно до MasterPage еще далеко, но речь сейчас не об этом.

 

Но, пожалуй, перейдем к делу, а точнее к телу класса:

 

001:

002:

003:

004:

005:

006:

007:

008:

009:

010:

011:

012:

013:

014:

015:

016:

017:

018:

019:

020:

021:

022:

023:

024:

025:

026:

027:

028:

029:

030:

031:

032:

033:

034:

035:

036:

037:

038:

039:

040:

041:

042:

043:

044:

045:

046:

047:

048:

049:

050:

051:

052:

053:

054:

055:

056:

057:

058:

<?

/*

  Модуль управления шаблонами

  Автор: Немиро Алексей

  04 марта 2007 года

  mailto:admin@kbyte.ru

  Copyright (c) Nemiro AS, 2007

*/

 

class templateController {

 

  public $content;       // для хранения контента

  public $templateName;  // имя файла шаблона

  public $errorMessage// сообщение об ошибке

  public $title;         // заголовок <title></tile>

      

  // инициализация

  function templateController() {

    $content = array();

    $templateName = "";

    $errorMessage = "";

    $title = "";

  }

 

  // вывод данных

  function Fill() {

    // загрузка шаблона

    $result = file_get_contents($this->templateName);

    if (!$result) {

      $errorMessage = "<span style="color: Red">

      Ошибка: Файл шаблона

      <strong>".$this->templateName."</strong>

      не найден.</span><br />";

      return $errorMessage;

    } else {

      // ищем <title></title>

      $titleTemplate = "(<title>(.*)</title>)|(<TITLE>(.*)</TITLE>)|(<Title>(.*)</Title>)";

      if (ereg($titleTemplate, $result, $ss)) {

        if ($this->title != NULL) {

          $newTitle = $this->title;

          $result = ereg_replace($titleTemplate, "<title>$newTitle</title>", $result);

        }

      }

 

      // поиск и замена блоков контента самим контентом

      while ($s = current($this->content)) {

        $result = str_replace("<php:".key($this->content).">", $s, $result);

        next($this->content);

      }

                   

      echo $result;

    }       

  }   

}

 

?>

 

В 18 строке происходит инициализация класса. В 26 строке функция, которая получает указанный файл шаблона, загружает его, вставляет контент и возвращает результат.

Загрузка файла шаблона происходит в 28 строке, далее 39 строке производится поиск в загруженном шаблоне тегов <title></title>, и если переменная класса $title имеет значение отличное от NULL, то в 42 строке, <title></title> шаблона меняется на указанный в переменной $title текст. Далее, в 48 строке производится поиск блоков контента. Для определения блоков контента используется ассоциативный массив $content. Затем, в 53 строке функция выводит полученный результат.

 

Сохраните этот класс в отдельном файле, например templateController.php.

 

Работа с шаблонами

 

Теперь попробуем все это дело применить в работе. Первым делом нужно создать файл шаблона, назовем его masterPage.html, он будет содержать один блок контента - MainContent:

 

Файл masterPage.html

001:

002:

003:

004:

005:

006:

007:

008:

009:

010:

011:

012:

013:

014:

015:

<html>

  <head>

    <title>Заголовок окна</title>

  </head>

  <body>

    <h1>Добро пожаловать!</h1>

    <hr />

    <!--Контент-->

    <php:MainContent>

    <!--//Контент-->

    <hr />

    Это пример простого шаблона<br />

    Обычный HTML, ничего особенного..

  <body>

</html>

 

Далее, создадим PHP-файл – Index.php, который будет ссылаться на созданный ранее класс templateController.php, и будет состоять исключительно из PHP-кода:

 

Файл Index.php

001:

002:

003:

004:

005:

006:

007:

008:

009:

010:

011:

012:

013:

014:

015:

016:

017:

018:

019:

020:

021:

022:

<?

  // присоединяем класс управления шаблонами

  require "./templateController.php";

 

  // создаем экземпляр класса управления шаблонами

  $master = new templateController();

 

  // указываем новый файл шаблона

  $master->templateName = "./masterPage.html";

 

  // указываем контент для блока MainContent

  $master->content["MainContent"] = "

  <h1>Привет!</h1>n

  Это пример работы с шаблонами<br /><br />

  Все просто, не правда ли!";

 

  // указываем <title></title>

  $master->title = "Это просто ТЕСТ";

 

  // выводим результат

  $master->Fill();

?>

 

В 3 строке в файл Index.php включается файл templateController.php, в 6 строке инициализируется новый экземпляр класса templateController, а в 9 строке указывается файл шаблона masterPage.html. Далее, в 12 строке формируется контент для блока <php:MainContent> в файле masterPage.html, в 18 строке указывается новый заголовок страницы, а затем, в 21 строке выводится готовый html.

 

 

Вот, собственно, и все!

 

Как видите, ничего сложно в этом нет, при этом количество блоков контента может быть любым, также как и файл шаблона! Собственно, можно даже использовать несколько файлов шаблонов на одной странице, либо использовать данный класс не только для работы с HTML-шаблонами, но и с другими видами шаблонов, тут все уже зависит от вашей фантазии ;)

 

 

Удачи!

 

 

ЗЫ: Ваши вопросы, жалобы и предложения пишите в комментарии ;)

Комментарии (всего: 15)

Добавить комментарий rss
Автор: Gozhix @ 02 декабря 2007, 01:59   ·   ссылка
Алексей, молодец! Это один из самых понятных примеров создания шаблонов, которые мне удалось найти в рунете!
Автор: Amor @ 05 февраля 2008, 22:44   ·   ссылка
прива Мне твой пример понравился СПС. но немог бы ты скинуть мне на мыло какуюто инфу для начинающих по PHP и если есть то какойто примитивний движок сайта на PHP что бы я смог разоратся как они правильно организовуются.
ЗЫ: Зарание спасибо
Автор: Алексей Немиро @ 06 февраля 2008, 07:46   ·   ссылка
2Gozhix:
Спасибо :)

2Amor:
Инфу можно найти, например, тут: http://ru.php.net/.

Насчет движков ничего сказать не могу, не люблю использовать движки, автором которых я не являюсь :)
Автор: mike @ 09 марта 2008, 00:44   ·   ссылка
Хороший пример. Только у меня проблема, не получается в контенте Index.php указать class или id у дива.
Автор: Алексей Немиро @ 09 марта 2008, 03:40   ·   ссылка
2mike: Не получается указать, или он просто не работает?
Если не работает, то видимо проблема с расположением файла стилей (.css)..
Автор: mike @ 09 марта 2008, 12:45   ·   ссылка
да стили расположенны в той же папке, Style.css скорее всего у меня не получается правильно их указать. Как это сделать? В masterPage.html они отлично работают, а в index.php не получается ...
Автор: Алексей Немиро @ 07 июня 2008, 09:15   ·   ссылка
Так:
/путь к файлу относительно корневого каталога сайта

по любому будет работать, где бы не находилась страница.
Автор: Алексей Немиро @ 07 июня 2008, 09:17   ·   ссылка
классно я через несколько месяцев ответ написал :)
Все времени не было заглянуть на свой сайт..
Автор: BREND @ 10 июля 2008, 13:22   ·   ссылка
Ето же пустая трата времени.
Писать клас, А НАДО ЛИ?
Зечем открывать файл и искать там свои строки и менять????

Почему не сделать так:

<?php
$text = "Это текст";
$title = "Это заголовок";
include "tamplateclasses.html";
?>
Автор: Алексей Немиро @ 10 июля 2008, 13:51   ·   ссылка
include

тогда уж require.

Писать клас, А НАДО ЛИ?

Надо :)
А нужно это для универсальности и гибкости. В своих php-проектах я использую похожую, но более продвинутую модель (то, что в этой статье, это лишь наброски, общая идея), она чем-то напоминает работу с MasterPage и WebControls в ASP .NET. Блоков контента может быть сколько угодно, помимо title можно указывать всякие дополнительные заголовки, мета-тэги и т.п. В общем, в итоге довольно удобно работать, хтмл глаза не мозолит, универсально все, аккуратно разложено по полочкам.

Единственное, с чем я могу согласиться, что подобные шаманства влияют на производительность, но это некритично и вполне контролируемо.
Страницы: 1 · 2

Добавить комментарий

Добавлять комментарии могут только зарегистрированные пользователи сайта.
Если у Вас уже есть учётная запись на этом сайте, пройдите процудуру авторизации.
В противном случае, зарегистрируйтесь на сайте.