Как создать tpl файлы на php. Подробно о файлах *.tpl шаблона Dle их предназначение. после него будет напечатан заголовок страницы, и всё это закроется тэгом


Отделение логики получения данных от логики их отображения - очень важная составляющая веб-девелопмента.
Любой программист, который поднялся чуть выше уровня "Hello world", начинает ощущать потребность в таком разделении. Но далеко не все приходят к правильным выводам и решениям.
Поэтому я приведу здесь самые важные правила:
1. Код получения и код отображения данных надо разделять.
2. Любой вывод должен начинаться только после того, как для него готовы все данные.
3. Как следствие, любой скрипт должен заниматься только обработкой данных. После этого он может либо отправить какой-то НТТР заголовок, или вызвать шаблон, передав ему подготовленные данные, или и то и другое вместе.
4. Каким именно шаблонизатором пользоваться - дело десятое. Самый простой и доступный - сам РНР, поэтому примеры будет приводиться на нём.

Заблуждения
Нет, наверное, в веб-программировании темы столь же очевидной, сколь и непонятной, как шаблоны. Каждый, рано или поздно, приходит к выводу о необходимости испрользования шаблонов. Но приходит, почему-то, через какие-то дичайшие заблуждения и фантазии.

Самое простое и очевидное заблуждение состоит в том, что новички называют шаблоном вынесенный в отдельный файл "дизайн" - общий html для всех страниц сайта. И на этом успокаиваются. Динамическую информацию, ничтоже сумняшеся, выводя старым добрым echo:-)
На самом же деле, шаблонизатор в основном занимается выводом изменяющегося содержимого страниц сайта. А вывод "дизайна" - задача второстепенная.

Фантазий же главных две:
1. Шаблоны нужны "дизайнеру", чтобы он мог их править, не разбираясь в PHP.
2. Следовательно, шаблоны служат для отделения PHP от HTML.

Давайте попробуем задуматься над первым утверждением. Кто такой дизайнер? Это человек, который работает в фотошопе. HTML он чаще всего не знает вообще. А над шаблоном работает либо специальный верстальщик или - чаще всего... сам программист! Смешно, правда?
Теперь следствие, про отделение PHP от HTML. Отлично. Перед нами стоит святая цель отделить. Поэтому мы придумываем Смарти и пишем:
{foreach key=cid item=con from=$contacts}
{$con.name} - {$con.nick}

{/foreach}

Ещё смешнее.
"Дизайнер", ради которого все затевалось, падает в обморок от счастья.

Теория
Получается, что наши причины, по которым мы решили пользоваться шаблонами, гроша выеденного не стоят. И что же теперь - не нужны, выходит, шабоны вообще? Нужны. Но сначала надо ответить себе на вопрос - "зачем?" Для чего нужны шаблоны. И проверить ответ практикой. Я много раз задавал людям этот вопрос. Но почти никто не может на него ответить. Зачем ему нужны шаблоны. Получается, люди делают что-то, не зная зачем.
Это - самое смешное.

За время своей деятельности в качестве веб-программиста я сформулировал для себя три причины, по которым нужны шаблоны лично мне. По сути, их две. А сводятся, в конечном счете, к одной:

Один код - несколько представлений .

Часто бывает так, что вместо одной информации надо показать другую. Например, код работы с БД получает вместо текста новости сообщение об ошибке. В этом случае вместо страницы новости нужно показать совсем другую - с извинениями и просьбой зайти позже. С помощью шаблонов это делается элементарно.

Часто одну и ту же информацию надо показывать в нескольких видах. К примеру - обычная страница и страница для печати. Информация та же самая, код её получения один и тот же, а код вывода - разный. Столкнувшись с такой ситуацией, очень быстро разделишь свой код на две части, одна из которых отвечает за вывод, а вторая - не отвечает. Еще пример: допустим, нам захотелось выводить информацию не напрямую в HTML, а через AJAX-запрос, в формате JSON. Если у нас использовался шаблонизатор, то мы меняем в нашем коде ровно одну строчку - вызов шаблонизатора на вызов json_encode() . А если бы у нас вывод был перемешан с кодом получения данных, то код бы пришлось переписывать весь!

В чем-то похожая ситуация: допустим, наш скрипт стоит на двух сайтах. Плюс копия у нас дома. И вот дома мы нашли крупную багу. Заделали её. Теперь надо обновить код на сайтах. И вот он - момент истины: если шаблоны были использованы правильно, то мы просто заливаем код на оба сайта, и все продолжает работать, как ни в чем не бывало! Такая ситуация, как я считаю - идеальная проверка выбранного подхода к шаблонизации.

Ещё один важный момент, который многие упускают (в своих теоретических рассуждениях, при этом постоянно сталкиваясь с ним на практике!) - порядок выполнения скрипта не всегда совпадает с порядком вывода в шаблоне . Хрестоматийный пример - вывод заголовка статьи в теге . Если мы выводим информацию по мере поступления, то просто не сможем этого сделать - шапка сайта <i>уже </i> выведена, к моменту, когда мы начали получать текст новости. </p><p>Следует также помнить, что кроме текста РНР скрипты еще и выводят HTTP заголовки. Которые обязаны выводиться до любого текста, или даже вместо текста вообще (если мы например хотим перенаправить пользователя на другую страницу). Если мы сначала реализуем логику работы приложения, ничего не выводя при этом, то выдать нужный НТТР заголовок не составит для нас никакой проблемы. </p><p>У вас могут быть и свои причины использовать шаблоны. Но только с одним условием - эти причины должны быть вызваны реальной, жизненной необходимостью, а не "высшими соображениями" и заботой о каких-то неизвестных вам людях.</p><p><b><a name="example">Практика</a> </b><br> Теперь от теории перейдем к практике.<br> В самом простом случае в показе любой страницы у нас всегда будут участвовать два шаблона: общий шаблон сайта и шаблон контента конкретной страницы.<br> Допустим, мы хотим сделать страницу со ссылками на сайты друзей.<br> В этом случае код упрощенный код будет выглядеть так:</p><p>Сам файл links.php. НИЧЕГО не выводит. Только готовит данные и после этого вызывает шаблон.<br><span><?<br><span>//инклюдим настройки.<br></span> include "settings.php" ;</p><p>//получаем данные из базы, определяем переменные <br></span>$pagetitle = "Ссылки" ;<br>$DATA = $db -> getAll ("SELECT * FROM links" );</p><p>//задаем шаблон страницы и вызываем общий шаблон сайта<br></span>$tpl = "tpl_links.php" ;<br>include "tpl_main.php" ;<br> </p><p>Общий шаблон (tpl_main.php):</p><p><html xmlns="http://www.w3.org/1999/xhtml"><br> <head><br> <title>My site. <?=$pagetitle?>






В нужном месте в него включается шaблон нашей страницы (tpl_links.php):





  • " target="_blank">


    • Сразу скажу, что я уже писал об этой теме здесь: . Однако, не все поняли данный материал, и я решил к нему вернуться и написать всё немного по-другому. Не секрет, что любой серьёзный движок никогда не будет смешивать в своём коде HTML и PHP . Однако, HTML и PHP коды очень тесно взаимосвязаны, поэтому для того, чтобы не нарушать правила "хорошего тона", были придуманы tpl-файлы . Данные файлы служат для хранения HTML-кода с элементами шаблонов , которые подставляются в PHP-коде . Давайте подробнее разберём использование tpl-файлов с примером.

      Возьмём с Вами самый элементарный пример - это панель пользователя, где есть его аватарка и приветствие по имени. Первым делом, создадим tpl-файл , и пусть он называется userpanel.tpl . Напоминаю, что это всего лишь кусок HTML-кода с элементами шаблона :

      Здравствуйте, %name%!




      Ничего сложного, это просто обычный HTML-код . Только вместо определённых значений стоят %элементы_шаблона% .

      Теперь разберёмся с PHP-обработкой . Здесь всё будет более, чем абстрактно, но, к сожалению, по-другому никак. Главное - это понять принцип работы. И так PHP-код для обработки созданного tpl-файла :

      /* Данная функция, хоть и использует буферы, но суть элементарна: вернуть содержимое файла */
      function getTemplate($name) {
      ob_start(); // Начинаем сохрание выходных данных в буфер
      include ($name.".tpl"); // Отправляем в буфер содержимое файла
      $text = ob_get_clean(); // Очищаем буфер и возвращаем содержимое
      return $text; // Возвращение текста из файла
      }
      $name = "Николай"; // Извлекается из базы
      $avatar = "avatars/user_15.jpg"; // Извлекается из базы
      /* Начинается замена элементов шаблона на реальные данные */
      $userpanel = str_replace(
      array(
      "%name%",
      "%avatar%"
      ),
      array (
      $name,
      $avatar
      ),
      getTemplate("userpanel")
      );
      echo $userpanel; // Выводим окончательный результат
      ?>

      Это простейший вариант. Всё прокомментировано, поэтому вопросов по этому примеру возникнуть не должно. И по сути любая страница состоит из таких вот блоков. Ваша задача взять нужные блоки (функция getTemplate() ), заменить нужными данными (функция str_replace() и данные полученные, например, из базы), а потом просто соединить все блоки, как обычные строки, и вывести всё на страницу.

      Безусловно, без ООП здесь очень проблемно будет. Вы такое количество условий наплодите (страниц же много), что быстро запутаетесь. Но принцип использования tpl-файлов , надеюсь, Вы осознали. Дальше уже самостоятельно подумайте, как всё это обернуть в ООП , чтобы всё было максимально простым с точки зрения понимания кода и его сопровождения в будущем.

      Всем привет. Хочу представить очередной велосипед написанный на PHP с использованием Document Object Model. В чем его отличие от остальных трёхколёсных представителей того же вида? На самом деле отличий не так уж и много, он сочетает в себе лучшее из многих. Например:

      1. Полное разделение html и php.
      2. Никаких дополнительных меток в шаблонах типа


      3. Возможность встраивать в верстку содержимое других файлов шаблона, как из php, так и используя специальный тэг в верстке.
      4. Возможность создавать любой html-тэг на лету.
      5. Возможность сохранение в html файл все что было сгенерировано и собрано.
      6. Проверка существования html-файла запрашиваемой страницы перед тем как генерировать шаблон.

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

      Первое что я обычно делаю это получаю всю информацию из БД о странице (ключевые слова, описание страницы, название шаблона и адреса css и js файлов). Все это я сохраняю в массив $head. Дальше я получаю из БД контент и сохраняю в массив $page. И приступаю к работе с классом.

      Итак, сначала я вызываю конструктор класса и передаю в него все необходимые параметры:

      $tpl = new Template; $tpl -> ext = TPL_EXTENSION; # расширение файлов в каталоге шаблона $tpl -> htm = CACHE_EXTENSION; # расширение для уже сгенерированных страниц $tpl -> skin_dir = DIR_TEMPLATES; # директория, в которой лежат все шаблоны сайта (например templates) $tpl -> js_dir = DIR_JS; # директория где нужно искать JS файлы $tpl -> css_dir = DIR_CSS; # директория где лежат CSS $tpl -> img_dir = DIR_IMG; # директория где картинки $tpl -> skin = $_SESSION["skin"]; # имя шаблона, который я хочу использовать $tpl -> cache = DIR_CACHE; # куда сохранять готовые html $tpl -> log = FILE_T_LOGS; # куда писать логи $tpl -> tag_start = SYMBOL_START_TAG; # Символ, с которого начинаются переменные в шаблоне $tpl -> tag_end = SYMBOL_END_TAG; # Символ, которым заканчиваются переменные в шаблоне $tpl -> dir_delimeter = DIRECTORY_SEPARATOR; $tpl -> space = SYMBOL_SPACE; # символ, заменяющий пробел.
      Фуф, вроде все переменные передали, идем дальше.
      Чтобы не заставлять класс делать лишнюю работу, сначала мы проверяем, вдруг у нас уже есть готовый Html-файл запрашиваемой страницы.
      if($tpl -> TestPageStatus() === TRUE) { require $tpl -> cacheFileName; } else { $tpl -> page("index"); # передаем имя файла шаблона, кстати их можно передать несколько, через запятую $tpl -> assign("HEAD",$head); $tpl -> assign("CONTENT",$page); $tpl -> build(); # даем команду собрать шаблон $tpl -> ShowPage(); # выводим. }
      Вот собственно и все методы, которые нужно использовать для того чтобы вывести страницу.

      Теперь разберем еще пару-тройку полезных методов этого класса. Допустим что мы уже передали в класс все необходимое, но еще не дали ему команду на вывод, потому-что вдруг вспомнили что нам нужно создать несколько Html-тэгов в шаблоне. Это тоже делается очень просто. Для начала нужно найти блок, в котором мы хотим что-то добавить. Найти можно 2 способами:

      $tpl -> findById("findMe"); $tpl -> findByTagName("div");
      Метод findById логично подразумевает что в шаблоне все id тэгов уникальны. А метод findByTagName вернет первый подходящий.
      Результат который мы получили поиском мы должны передать в метод $tpl -> createChild(), чтобы иметь возможность создавать в найденном элементе, дочерние тэги. Метод createChild кстати, после создания нового элемента, возвращает его нам, так что мы можем использовать только что созданный элемент еще где-нибудь.

      Ковыряясь и экспериментируя я нашел 3 способа создания тэгов в шаблоне, поэтому покажу сразу 3 примера. Пример1:

      Нам нужно создать

      внутри

      $parent = $tpl -> findById("parent"); $tpl -> createChild($parent,"div", "id=child, class=test");
      Получим:


      Пример 2:

      Нам нужно создать

      Какой-то текст
      внутри

      $parent = $tpl -> findById("parent"); $tpl -> createChild($parent,"div", "id=child,class=test", "Какой-то текст");
      Получим:

      Какой-то текст

      Пример3:
      Нам нужно создать

      Новый элемент
      в первом попавшемся span-элементе

      $parent = $tpl -> findByTagName("span"); # (1) $tpl -> createChild($parent, "div", "Новый элемент"); # (2)
      (1) Поиск родителя не по id, а по тэгу найдет первого подходящего
      (2) Если нам не нужны атрибуты, а только значение нового элемента, то их можно не передавать

      Получим:

      Новый элемент

      И после этих манипуляций я уже вызываю ShowPage. И тут мы плавно подошли к еще 2 интересным моментам.
      Представим ситуацию, что у нас есть шаблон, предположим что это шаблон list.tpl со списком, допустим, мобильных телефонов:

      {CONTENT.Brand}

      {CONTENT.Model}

      {CONTENT.Info}

      Если мы передали информацию только по 1 телефону, то будет просто произведена замена переменных на их значения, а если мы передали информацию сразу по нескольким телефонам, то класс скопирует этот участок столько раз, сколько вариантов значений к нему пришло. И это он сделает сам, в отличие, например от класса xTemplate, которому приходилось под каждое значение вызывает assign и parse
      Правда есть один не очень удобный момент, если после этого блока стоят какие-то еще, например:

      {CONTENT.Brand}

      {CONTENT.Model}

      {CONTENT.Info}
      Еще какой-то блок

      То в такой ситуации нам придется применить небольшую хитрость, упаковав наш мобильник

      {CONTENT.Brand}

      {CONTENT.Model}

      {CONTENT.Info}
      Еще какой-то блок

      В таком случае все мобильники будут появляться друг за другом, внутри
      , а «Еще какой-то блок» так и останется внизу.

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

      Представьте что верстальщик хочет чтобы содержимое page.html файла было добавлено в блок файла list.html, для этого он в нужном месте файла list.html дописывает page и когда класс увидит этот тэг он заменит его на содержимое файла page.html

      Количество таких вставок не ограничено и их расположение абсолютно не критично, поэтому можно вставлять их как угодно и в любом количестве.

      Вот пожалуй и все, если что-то вспомню, сообщу дополнительно. Спасибо что дочитали до конца.

      Теги: php, класс, template, шаблонизатор, парсер

      Статья поможет пользователям, которые еще довольно мало знакомы с шаблонами Dle и tpl файлов в частности. Статья поможет разобраться в чем их основное предназначение и как с ними работать.
      Люди которые хорошо знакомы и не очень с HTML и CSS легко освоят работу с файлами шаблона dle.

      Итак начнем в состоящий из шаблонов с расширением *.tpl есть стандартные и обязательные файлы шаблонов, которые должны там присутствовать. При отсутствии одного из файла система будет сообщать о ошибке , в некоторых случаях интернет-портал не будет работать совсем.
      Подробно о каждом файле шаблона DataLife Engine

      addcomments.tpl - Форма для добавления комментариев только в полной новости.

      addnews.tpl - Форма для добавления публикации на веб-ресурс, для заполнения данных о новости: заголовок, категорию новости, короткую и полную новость, поля для облака тегов и различные администраторские функции.

      comments.tpl - Отвечает за оформление комментариев, как в полной публикации так и последние комментарии.

      feedback.tpl - Основное оформление формы обратной связи с поля заполнения.

      fullstory.tpl - Шаблон файл оформление полной новости, дату публикации, автор, количество комментариев, вывод похожих новостей и т.д.

      info.tpl - Форма сообщения страницы ошибки на веб-ресурсе, выходит например при неправильной авторизации.

      informer.tpl - Файл оформления вывода информера (партнеров или например новости Яндекс и т.д.) на блоге.

      login.tpl - Основной файл оформления формы Авторизации, Админ панели

      lostpassword.tpl - Форма восстановления (при потери) пароля, выводится только для не авторизованных пользователей.

      main.tpl - Основной файл оформления главной страницы вывода информации блога DLE, к которому подключаются остальные шаблоны.

      navigation.tpl - Шаблон оформления перехода по страницам, постраничная навигация.

      offline.tpl - Страница отключенного сайта при технических работах, если необходимо провести глобальные изменения на веб-проекте. Будет виден всем кроме администрации интернет источника.

      pm.tpl - Форма оформления Отправки, Входящих и Отправленных сообщений на интернет-портале дле, отвечает за оформление личных сообщений пользователя.

      preview.tpl - Настройки оформления стилей CSS для окна предварительного просмотра при добавлении новости, в которую входит оформление для короткой и полной новости.

      print.tpl - Страницы Распечатки для принтера.

      profile_popup.tpl - Всплывающее модальное окно при включенном AJAX скрипте, которое выходит при выборе логина пользователя мышкой. Отвечает за оформление POP - Up окна с краткой информацией о пользователе.

      registration.tpl - Форма регистрации нового пользователя после принятия правил выдает анкету с полями для заполнения и регистрации.
      ПС.Правила интернет-портала находятся в статической странице, и не присутствуют в данном шаблоне.

      relatednews.tpl - Форма оформления Вывод похожих новостей.

      search.tpl - Выводит страницу простого поиска по веб-ресурсу, куда входит поле для заполнения и кнопки Поиск и Расширенный поиск.

      searchresult.tpl - Форма оформления результата поиска, а также при выборе Расширенный поиск выводит поля для заполнения.

      shortstory.tpl -Важный шаблон осуществляет оформление короткой новости.

      speedbar.tpl - Данный файл выводит полную ссылку на категорию в которой опубликована новость, и отвечает за быстрый переход в нужный раздел (хлебные крошки).

      static.tpl - Данный файл шаблона отвечает за оформление и вывод статических страниц созданных в админ панели Dle.

      static_print.tpl - Применяется для оформления статической страницы Версия для печати

      stats.tpl - Оформление Статистики веб-ресурса, с выводом всей информации.

      tagscloud.tpl - Шаблон оформления облака тегов.

      topnews.tpl - Применяется для оформления популярных новостей.

      userinfo.tpl - Форма оформления профиля информации о пользователи, а также POP - Up окном для последующего редактирования данных, открывается если пользователь зарегистрирован на веб-проекте.

      vote.tpl - Используется оформления вывода результатов голосований, как Все опросы на DLE или Всего проголосовало.

      На данный момент перечислены основные tpl файлы шаблона Dle, с выходом новых версий возможны изменения и добавления новых шаблонов TPL для движка DataLife Engine .

      Помимо основных шаблонов TPL в DLE, любой пользователь может добавить свои, для удобного оформления, улучшения и установки сторонних модулей на веб-проект!
      Для этого создается сам шаблон например:

      leftblocks.tpl (левый блок веб-проекта) в который добавляются элементы оформления.

      Внимание! Для нормальной работы файл должен находится в папке с основными шаблонами там же где и main.tpl!
      Для подключения такого блока используется тег {include} Например:
      Который вставляется в нужном месте main.tpl

      {include file="leftblocks.tpl"}

      Помимо такой вставки есть ещё вариант подключения коротких новостей с помощью шаблонов например:

      shortstory-1.tpl Короткая новость в который добавляются элементы оформления. Пример вставки:

      {title}

      В main.tpl вставляем тег с настройками:

      {custom category="2,3" template="shortstory-1" aviable="global" from="0" limit="5" cache="yes"}

      В результате если вставить такую вставку например: в правый блок, появится ссылка и title последних новостей категории 2 и 3 как на нашем сайте www.сайт раздел Новости "Модули ДЛЕ " и т.д., где

      custom category="2,3" (категории из которых берется новость можно добавить ещё через запятую)
      template="shortstory-1" (название шаблона)
      aviable="global" (глобально для всех, можно установить main вместо global будет только на главной выводится информация)
      from="0"
      limit="5" (количество публикаций)
      cache="yes" (Включить/Выключить кеширование)

      Также в шаблонах присутствую стандартные папки:
      bbcodes (Папка с файлами картинок для редактирования таких как Смайлов, HTML цвета и BBcodes)
      dleimages (Папка с файлами картинок для оформления рейтинга, закладок, водяного знака и т.д.)
      images ((Папка с файлами изображений для оформления шаблона. может иметь разное название)
      js (Папка с файлами скриптов JS и т.д.)
      style (Папка с файлами каскадов стилей для оформления шаблонов)

      Внимание! Скрипты обязательно должны находиться в папке JS ,в котором должен быть файл.htaccess для защиты от разного рода угроз, если такого файла не будет скрипт не запустится (сработает система защиты Dle).
      Внимание! Во всех папках шаблона также должен быть файл.htaccess
      Пример файла.htaccess с данными внутри:
      Order Deny,AllowAllow from all

      Внимание! В шаблоне там же где main.tpl должен быть файл.htaccess С таким кодом:
      Order allow,denyDeny from all

      Файл.htaccess можно скачать из шаблона дистрибутива движка DataLife Engine

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

      <html > <head > <meta name="description" content= /> <meta name="keywords" content= /> <title > title > <link href="style.css" rel="stylesheet" type="text/css" /> head > <body > // начало меню <table border="1" > <tr > <td > <a href="/" > <b > Главнаяb > a > td > tr > <tr > <td > <a href="/about/" > Обо мнеa > td > tr > <tr > <td > <a href="/me_and_me/" > Я и мировое господствоa > td > tr > <tr > <td > <a href="/contacts/" > Контактыa > td > tr > table > // конец меню <h1 > Главная страницаh1 > <p > p > <p > Текст обо мне: Текст обо мне: Текст обо мне: Текст обо мне: p > <p > Текст обо мне: Текст обо мне: Текст обо мне: Текст обо мне: p > <p > Текст обо мне: Текст обо мне: Текст обо мне: Текст обо мне: p > body > html >

      Для того, чтобы добавить шаблон в CMS, нужно создать файл в директории tpls/content , например, test.tpl , и вставить туда ваш HTML-код. CSS-файл следует положить в папку css/cms и назвать style.css . Изображения желательно положить в папку images . Не забудьте поменять пути ко всем изображениям и CSS-файлам.

      Замечание

      В названии файла шаблона нельзя использовать русские буквы!

      Чтобы система «увидела » новый шаблон и начала использовать его для вывода страниц, шаблон необходимо добавить в систему. Для этого следует зайти в настройки модуля «Структура », вкладка «Шаблоны » (http://yourdomain.ru/admin/content/config/ ). Вы увидите список уже установленных шаблонов в каждом домене, которые существуют в выбранной языковой версии.

      Чтобы подключить новый файл шаблона, заполните в самой нижней свободной строке поля «Название шаблона » (дайте ему какое-нибудь осмысленное название, например «Мой тестовый шаблон ») и «Имя файла » (в нашем случае, test.tpl) и нажмите кнопку «Сохранить ».

      Если вы хотите, чтобы этот шаблон использовался в качестве шаблона по умолчанию, поставьте напротив него отметку «Основной ». Теперь этот шаблон будет выбран по умолчанию в выпадающем списке выбора шаблонов. Так же он будет использоваться для вывода системных страниц, которые используют шаблон по умолчанию (Регистрация, Восстановление пароля, Карта сайта).

      Шаблоны будут видны в выпадающем списке при редактировании каждой страницы:

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

      Попробуйте создать новую страницу (убедитесь, что в опции «Шаблон дизайна » выбран новый шаблон) и посмотрите, что получилось на сайте.

      На сайте должен появиться ваш HTML-шаблон. Но сейчас он статический. Теперь вам надо сделать его динамическим.

      Для начала надо определить, какие части HTML-кода будут изменяться. В нашем случае изменяться будут:

        заголовок окна ;</p> <p>мета-теги keywords и description;</p> <p>заголовок текста <h1>;</p> <p>собственно текст;</p> <p>меню сайта.</p> </ul><p>Значит, предстоит немного поработать с HTML-шаблоном и вместо изменяющихся участков поставить соответствующие макросы.</p> <p>Например, в начале HTML-файла заданы мета-теги и тайтл:</p> <<span>meta name=<span>"description" </span><span> content=<span>"описание сайта Василия Пупкина" </span> /> </span> <<span>meta name=<span>"keywords" </span><span> content=<span>"Вася Василий Пупкин официальный сайт" </span> /> </span> <<span>title > </span>Сайт Васи Пупкина: Главная страница</<span>title > </span> <p>Заменяем их на соответствующие макросы (список макросов дан в приложении):</p> <<span>meta name=<span>"description" </span><span> content="%description%" </span> /> </span> <<span>meta name=<span>"keywords" </span> content=<span>"%keywords%" </span> /> </span> <<span>title > </span>%title%</<span>title > </span> <p>Теперь система при формировании страниц будет брать мета-теги и тайтл, прописанные для каждой страницы индивидуально, и подставлять их вместо соответствующих макросов. Названия макросов запомнить очень просто.</p> <p>Аналогично поступим с заголовком текста. Было так:</p> <<span>h1 > </span>Главная страница</<span>h1 > </span> <p>А станет так. Заголовок текста выводится макросом %header%:</p> <<span>h1 > </span>%header%</<span>h1 > </span> <p>Основной текст страницы тоже изменяется:</p> <<span>p > </span>Текст обо мне: Текст обо мне: Текст обо мне: Текст обо мне: </<span>p > </span> <<span>p > </span>Текст обо мне: Текст обо мне: Текст обо мне: Текст обо мне: </<span>p > </span> <<span>p > </span>Текст обо мне: Текст обо мне: Текст обо мне: Текст обо мне: </<span>p > </span> <<span>p > </span>Текст обо мне: Текст обо мне: Текст обо мне: Текст обо мне: </<span>p > </span> <p>Для вывода основного текста страницы есть макрос <i>%content% </i> :</p> <i>%content% </i> <p>В начало файла между тегами <head> и </head> вставляем макрос:</p><p>Эта строчка подключает функцию быстрого редактирования и другие полезные возможности. При помощи нее вы сможете, нажав <b>Shift </b> +<b>D </b> , быстро перейти к правке текущей страницы сайта или каких-либо ее фрагментов.</p> <p>В итоге должно получиться следующее:</p> <<span>html > </span> <<span>head > </span> <<span>meta name=<span>"description" </span><span> content="%description%" </span> /> </span> <<span>meta name=<span>"keywords" </span> content=<span>"%keywords%" </span> /> </span> <<span>title > </span>%title%</<span>title > </span> <<span>link href=<span>"style.css" </span> rel=<span>"stylesheet" </span> type=<span>"text/css" </span> /> </span> %system includeQuickEditJs()% </<span>head > </span> <<span>body > </span> // начало меню <<span>table border=<span>"1" </span>> </span> <<span>tr > </span> <<span>td > </span><<span>a href=<span>"/" </span>> </span><<span>b > </span>Главная</<span>b > </span></<span>a > </span></<span>td > </span> </<span>tr > </span> <<span>tr > </span> <<span>td > </span><<span>a href=<span>"/about/" </span>> </span>О компании</<span>a > </span></<span>td > </span> </<span>tr > </span> <<span>tr > </span> <<span>td > </span><<span>a href=<span>"/projects/" </span>> </span>Проекты</<span>a > </span></<span>td > </span> </<span>tr > </span> <<span>tr > </span> <<span>td > </span><<span>a href=<span>"/contacts/" </span>> </span>Контакты</<span>a > </span></<span>td > </span> </<span>tr > </span> </<span>table > </span> // конец меню <<span>h1 > </span>%header%</<span>h1 > </span> %content% </<span>body > </span> </<span>html > </span> <p>Итак, мы сохраняем файл шаблона и смотрим на результат. Теперь страница практически полностью динамическая, за исключением меню. Предстоит «оживить » меню сайта. Посмотрим как сверстано меню:</p> // начало меню <<span>table border=<span>"1" </span>> </span> <<span>tr > </span> <<span>td > </span><<span>a href=<span>"/" </span>> </span><<span>b > </span>Главная</<span>b > </span></<span>a > </span></<span>td > </span> </<span>tr > </span> <<span>tr > </span> <<span>td > </span><<span>a href=<span>"/about/" </span>> </span>Обо мне</<span>a > </span></<span>td > </span> </<span>tr > </span> <<span>tr > </span> <<span>td > </span><<span>a href=<span>"/me_and_me/" </span>> </span>Я и мировое господство</<span>a > </span></<span>td > </span> </<span>tr > </span> <<span>tr > </span> <<span>td > </span><<span>a href=<span>"/contacts/" </span>> </span>Контакты</<span>a > </span></<span>td > </span> </<span>tr > </span> </<span>table > </span> // конец меню <p>Меню состоит из пунктов. Само меню как-то оформлено, и у пунктов тоже есть оформление. Например, у всего меню может быть некая рамка или фон, текущий пункт меню может быть выделен жирным и т.п. Также в одном меню могут быть разные уровни.</p> <p>Выделим обрамление меню:</p> // начало меню <<span>table border=<span>"1" </span>> </span> <span><!-здесь пойдут пункты меню --> </span> </<span>table > </span> // конец меню <p>Пункт меню оформлен так:</p> <<span>tr > </span> <<span>td > </span><<span>a href=<span>"/contacts/" </span>> </span>Контакты</<span>a > </span></<span>td > </span> </<span>tr > </span> <p>Текущий пункт меню оформлен по-другому:</p> <<span>tr > </span> <<span>td > </span><<span>a href=<span>"/" </span>> </span><<span>b > </span>Главная</<span>b > </span></<span>a > </span></<span>td > </span> </<span>tr > </span> <p>Исходный шаблон меню находится в файле /tpls/content/menu/default.tpl и выглядит так:</p> <?php $FORMS = Array (); $FORMS ["menu_block_level1" ] = <<<END %lines% END; $FORMS ["menu_line_level1" ] = <<<END <div class ="menu" > %text% </div> <<<END <div class ="menu_a" > <span class ="menu_a" >%text%</span> </div> END; ?> <p>Вначале немного непонятно. На самом деле, все очень просто. Посмотрим на первую часть кода:</p> $FORMS ["menu_block_level1" ] = <<<END %lines% END; <p>Это блок, который называется <b>menu_block_level1 </b> . Есть всего 3 типа таких блоков.</p> <ul><p><b>menu_block_level1 </b> ― содержит HTML-обрамление меню;</p> <p><b>menu_line_level1 </b> ― содержит HTML-код пункта меню;</p> <p><b>menu_line_level1_a </b> ― то же самое, что и menu_line_level1, только используется для активного пункта меню.</p> </ul><p>Все, что расположено между <<<END и END; воспринимается, как html-шаблон (для всего меню или для отдельного пункта).</p> <p>При генерации меню, система берет шаблоны пунктов (например, menu_line_level1), и ставит их друг за другом. Получается HTML-код, в котором содержатся все пункты меню. Этот код вставляется вместо макроса <i>%lines% </i> .</p> <p>Итак, необходимо проставить код, который мы выделили выше (обрамление, пункты меню) в соответствующие блоки. Должно получиться примерно так:</p> <?php $FORMS = Array (); $FORMS ["menu_block_level1" ] = <<<END <table border="1" > %lines% </table> END; $FORMS ["menu_line_level1" ] = <<<END <tr> <td>%text%</td> </tr> END; $FORMS ["menu_line_level1_a" ] = <<<END <tr> <td><b>%text%</b></td> </tr> END; ?> <p>Мы уже знаем, что вместо <i>%lines% </i> система подставляет пункты меню с их HTML-обрамлением. Нам встретились новые макросы. Вместо <i>%link% </i> вставляется URL пункта меню, а вместо <i>%text% </i> ― текст (определяется в поле «<span>название страницы </span>»).</p> <p>Теперь меню можно вставить в шаблон страницы макросом <i>%menu% </i> ::</p> <<span>html > </span> <<span>head > </span> <<span>meta name=<span>"description" </span><span> content="%description%" </span> /> </span> <<span>meta name=<span>"keywords" </span> content=<span>"%keywords%" </span> /> </span> <<span>title > </span>%title%</<span>title > </span> <<span>link href=<span>"style.css" </span> rel=<span>"stylesheet" </span> type=<span>"text/css" </span> /> </span> %system includeQuickEditJs()% </<span>head > </span> <<span>body > </span> // начало меню %menu% // конец меню <<span>h1 > </span>%header%</<span>h1 > </span> %content% </<span>body > </span> </<span>html > </span> <p><b>Шаблон готов. </b> </p> <p>Если вы хотите на каких-то страницах сайта выводить меню по другому шаблону, нужно создать еще один файл с шаблоном меню в той же папке. Например, menu2.tpl . Соответственно, при подключении меню к шаблону страницы вместо %menu% надо написать немного по-другому: %content menu("menu2")% .</p> <p>Работа этого и других макросов подробно описана в текущей документации. Работа с ними строится точно по такому же принципу: вы разбиваете необходимый кусок HTML-шаблона на отдельные части, подставляете в соответствующие блоки нужных шаблонов, вставляете на место этого куска соответствующий макрос и он начинает работать.</p> <p><b>Важно учитывать: </b> </span> не стоит размещать несколько макросов на одной строке. Вложенные макросы могут не сработать в качестве аргумента у других макросов.</p> <script>document.write("<img style='display:none;' src='//counter.yadro.ru/hit;artfast_after?t44.1;r"+ escape(document.referrer)+((typeof(screen)=="undefined")?"": ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth? screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";h"+escape(document.title.substring(0,150))+ ";"+Math.random()+ "border='0' width='1' height='1' loading=lazy>");</script> </div> <div class="sidebar col-md-3"> <noindex> <div class="anchor_fix"></div> <div class="fixed_related" id="getFixed"> <div class='yarpp-related'> <div class="subscribe"> <ul class="related"> </ul> </div> </div> </div> <div id="vk_groups"></div> </div> </div> </noindex> </div> </div> </div> </div> </div> </div> <div class="footer"> <div class="container"> <div class="copyright pull-left"> © 2024 vspishkacraft.ru - Windows. Программы. Железо. Интернет. Безопасность. Операционные системы<br> <style type="text/css"> .madeby { margin: 10px 0; font-size: 12px; line-height: 15px; color: white; float: left; display: block; width: 240px; text-align: left; clear: right; padding-left: 40px; background-repeat: no-repeat; background-position: left center; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA+BpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAxNy0wMi0yNFQxMzozNjo1MSswMzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMTctMDItMjRUMTM6MzcrMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMTctMDItMjRUMTM6MzcrMDM6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjJDNDE4M0FFRkE3RDExRTY4RDA5RDBBNDU4QTVENTdDIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjJDNDE4M0FGRkE3RDExRTY4RDA5RDBBNDU4QTVENTdDIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MkM0MTgzQUNGQTdEMTFFNjhEMDlEMEE0NThBNUQ1N0MiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MkM0MTgzQURGQTdEMTFFNjhEMDlEMEE0NThBNUQ1N0MiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6p6JuUAAAEDElEQVR42qyXz4sURxTHX1X1RMPuQSSJIMIqLBEMISxBgj8QQV13Z/Ym/gVCLvkLPOYPiIGI1z16yc0wTtRl1REU0bCCECQoiHiJASE60zPdPT2T76vqrq7qnh1n3RR8t6p7u9+n3qvXr2rEaDQir23M07bawvPx99e+2kkDeYIGYgn9oYD+r8bzT4V/786hfQCt4D5g6hTGs4AS9IvYtsf8+lAYaCoCjI/C8DLGDehrAxJk+0SDzwbb8pCBQ/EFAHXtVSrOUip3aUDqwLhPLLiD67sfA5aAfQvDK+jZMx5LA8uMpyWYD75NP9yPpgXvhs4AVM9gn2ehLVQOqVlLgBywUYsNTgJ/A9WhJYT1GIyrYi1lBhsH1eMYgHsY7wD4uAPl/zd98Mb8LP6eglY0jGhfKXHMeCA38/I1DP+uDQ/EGl142KHLx9YdIFEsntKP668MeGP+e/TnoRPQJ6XE8cPpr2GK8X30LR2+gXiiARceGkd+Pj5LiTpaQPUEmrmf7PEz6IiFDh3vrGcW+g+ujVeJvIXrt6XEKRaqH5zG9Y4MmEm0CvDC8za85qS5Ds1UkiYVz2D8Vxj+Df0f6IcTEqcAh6rh3U/kvxSpB8WnYcpcGwbrMNS1D8aZIvUpRXIV/SNoCMEbRz1HfM3t4hlBvaAOkVYIva/dpNVriQ/m9t1fbYpVHbCugSrSkEjNQXdgdH8VmBnuB+Y6zMA9tQDt1cAO9K7G4KZfDNx28k/AZR2gLrwkx7s5yMB7QdXL0JmEBgeL1NGwXEOotTmYW6TaMFaHup6HDO8B3mPPcy+zMLqT4fau1nCg8Lr2mNavvpkM7qsqvGeNG3gIeFha3y5D8GGcO7cbsCMl8I1q3R0HNmrD4DLUtSE1EwA8gOfBASdxXMgSeqVDzetr+uZ04CJx7iGkBu57OAfgbRg8kCWOq4aFchTC4A30qIyp1mo27JU51NwE+2uiK9SMvt/Psx0lsq8OZtnPz0r0i/ZTjJXZFP6+MvwwmJMmsSUurzgGHqkWQDMWFMmXzphBh/HeZ/678vq4HagKDhWVKk7+PSPsGTzK4SidsYXyZEvVSqCey7XpwL2AvOrVt4WEAYAj4WKGS4Y3bVgTPeGGLqP5MqXiAQ0uvZ0SrMh64UGze+x5LBl+Cf0LJ6x7oQW7TZqDX3Ozzb4K5oyMxoBjWfSccLE67YRUH+AgoYHF+XEL4Pc11zs3cYqNI99tEukeBpbJP7C+otFPTz8OHJegfuIUIR0KvESLJUs3Jx3iNgm1F9Y8caiUOO4Bfg9UK1lqTj6qVsC24lQ3gL6z3v6vhtfQMn+M+VbDP1q2Bu4GRi7UAlX1Z0rR2g78Lta3s7VQh4FfMvPPYzTV+TuHf/mhB/8TYAD5G5WwXg8pHgAAAABJRU5ErkJggg=='); } </style> </div> <ul id="menu-bottom-menu" class="bottom-menu pull-right"> <li id="menu-item-14" class="menu-item menu-item-type-post_type menu-item-object-page"><a href="/sitemap.xml">Карта сайта</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="">Реклама</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="/feedback.html">Контакты</a></li> </ul> </div> </div> <a id="to-top" href="#" class="scrollToTop"></a> <link rel='stylesheet' id='yarppRelatedCss-css' href='/wp-content/plugins/yet-another-related-posts-plugin/style/related.css?ver=9dc0bdd0f1d2506e0eda58c88609f331' media='all' /> <script type='text/javascript' src='/wp-content/themes/blank/js/lib/conditionizr-4.3.0.min.js?ver=9dc0bdd0f1d2506e0eda58c88609f331'></script> <script type='text/javascript' src='/wp-content/themes/blank/js/lib/modernizr-2.7.1.min.js?ver=9dc0bdd0f1d2506e0eda58c88609f331'></script> <script type='text/javascript' src='/wp-includes/js/jquery/jquery.js?ver=9dc0bdd0f1d2506e0eda58c88609f331'></script> <script type='text/javascript' src='/wp-includes/js/jquery/jquery-migrate.min.js?ver=9dc0bdd0f1d2506e0eda58c88609f331'></script> <script type='text/javascript' src='/wp-content/themes/blank/js/scripts.js?ver=9dc0bdd0f1d2506e0eda58c88609f331'></script> <script type='text/javascript' src='/wp-includes/js/comment-reply.min.js?ver=9dc0bdd0f1d2506e0eda58c88609f331'></script> <script type='text/javascript' src='/wp-includes/js/imagesloaded.min.js?ver=9dc0bdd0f1d2506e0eda58c88609f331'></script> <script type='text/javascript' src='/wp-includes/js/masonry.min.js?ver=9dc0bdd0f1d2506e0eda58c88609f331'></script> <script type='text/javascript' src='/wp-includes/js/jquery/jquery.masonry.min.js?ver=9dc0bdd0f1d2506e0eda58c88609f331b'></script> <script type='text/javascript' src='/wp-content/plugins/advanced-recent-posts/lptw-recent-posts.js?ver=9dc0bdd0f1d2506e0eda58c88609f331'></script> <script type='text/javascript' src='/wp-content/plugins/contact-form-7/includes/js/jquery.form.min.js?ver=9dc0bdd0f1d2506e0eda58c88609f331-2014.06.20'></script> <script type='text/javascript' src='/assets/scripts1.js'></script> <script type='text/javascript' src='//vspishkacraft.ru/wp-content/plugins/woocommerce/assets/js/jquery-blockui/jquery.blockUI.min.js?ver=9dc0bdd0f1d2506e0eda58c88609f331'></script> <script type='text/javascript' src='//vspishkacraft.ru/wp-content/plugins/woocommerce/assets/js/frontend/woocommerce.min.js?ver=9dc0bdd0f1d2506e0eda58c88609f331'></script> <script type='text/javascript' src='//vspishkacraft.ru/wp-content/plugins/woocommerce/assets/js/jquery-cookie/jquery.cookie.min.js?ver=9dc0bdd0f1d2506e0eda58c88609f331'></script> <script type='text/javascript' src='//vspishkacraft.ru/wp-content/plugins/woocommerce/assets/js/frontend/cart-fragments.min.js?ver=9dc0bdd0f1d2506e0eda58c88609f331'></script> <script type='text/javascript' src='/wp-content/plugins/optin-monster/assets/js/api.js?ver=9dc0bdd0f1d2506e0eda58c88609f331'></script> <script type='text/javascript' src='/wp-includes/js/wp-embed.min.js?ver=9dc0bdd0f1d2506e0eda58c88609f331'></script> <script type='text/javascript' src='/wp-content/plugins/disqus-comment-system/media/js/count.js?ver=9dc0bdd0f1d2506e0eda58c88609f331'></script> <script type="text/javascript">(window.Image ? (new Image()) : document.createElement('img')).src = location.protocol + '//vk.com/rtrg?r=YXkLp5Vwqs9VOMWfFWIads6jxBixx6wQyBkSJ0/Hg4WE7l3w2X85qYgv7X5VakufxBiqU5gywDqKku6fxSALURgdcV62OTDaFtTzE45QC4pQEML4f9Q7UhtvgO1g2wr9zg1bO6bL1u*sYLa5sLCeA7pR51y8cE2HUSPPCKbldn8-';</script> <script type="text/javascript" src="/wp-content/themes/blank/javascript.js"></script> <script type="text/javascript" src="//vk.com/js/api/openapi.js?116"></script> <script type="text/javascript" src="/wp-content/themes/blank/js/readmore.min.js"></script> <script type="text/javascript"> jQuery(document).ready(function() { jQuery('.click_menu').click(function() { jQuery('.mobile_menu .list_menu').toggle('normal'); return false; } ); jQuery('.container').click(function() { jQuery('.mobile_menu .list_menu').hide('normal'); } ); // jQuery('.vis .click_menu').click(function() { // jQuery('.vis.mobile_menu').addClass('hide').removeClass('vis'); // } ); } ); </script> <script type="text/javascript"> jQuery(document).ready(function() { jQuery('.fixed_related .entry-image').height((jQuery(window).height()/3)-130); jQuery(function($) { function fixDiv() { if (jQuery( ".anchor_fix" ).length > 0) { var $cache = $('#getFixed'); if ($(window).scrollTop() > jQuery( ".anchor_fix" ).position().top+100) $cache.css({ 'position': 'fixed', 'top': '10px' } ); else $cache.css({ 'position': 'relative', 'top': 'auto' } ); } } $(window).scroll(fixDiv); if (jQuery( ".anchor_fix" ).length > 0) fixDiv(); } ); } ); </script> </body> </html>