hack.connect
 
[ru.scene.community]
HackConnect.E-zine issue #1
// 01010 Smarty – что это за зверь?
В своей статье я хочу рассказать о принципиально новом подходе к созданию веб-интерфейсов посредствам класса написанного на php.
Без лишних слов приведу наглядный пример. Итак, допустим нам нужно написать простенькую гостевуху. Через форму мы отправляем сообщения в базу данных, а потом выводим их на экран.
Представим, что у нас есть таблица guestbook, состоящая из пяти полей:
- id INT
- name VARCHAR(100)
- email VARCHAR(200)
- message TEXT
- time_ DATETIME
Вот как бы мы написали часть скрипта, отвечающего за вывод данных из этой таблицы:
 
<?
$query = "SELECT * FROM guestbook";
$result = mysql_query($query);
 
while($array = mysql_fetch_assoc($result)){
            echo("<table border>");          
 
            echo("<tr>
                        <td>".$array[1]."</td>
                        <td>".$array[2]."</td>
                        <td>".$array[4]."</td>
                  </tr>
                  <tr colspan = 3>
                        <td>".$array[3]."</td>
                  </tr>");
           
            echo("</table>");
}
?>
 
Казалось бы, а что плохого в таком подходе. Я назову всего несколько причин.
Во-первых, что меня всегда бесило в работе со строками в любом языке, особенно в Си и JavaScript – это кавычки. Я вечно путался в уже закомментированных кавычках, ставил одинарные вместо двойных и так, далее. До сих пор точно не уяснил, когда можно писать переменную приклеивая её к строкам точками, а внутри кавычек, особенно большие запары происходят с массивами строк, у которых ключи не численные, а ассоциативные.
Во-вторых, особенно в php скриптах, часто за html кодом на весь экран перестаёт читаться сама программа. Довольно много времени убивается на то что бы разобраться с тем, что на самом деле делает скрипт.
И, в-третьих, мое убеждение, что программист и верстальщик – две совершенно разные вещи. Так же как дизайнер и программист. И работать они должны отдельно, не мешая друг другу. Тогда их работа будет наиболее эффективна.
 
Итак, что же я предлагаю. А предлагаю я немного. Всего лишь немного разобраться в классе, позволяющем максимально разнести вёрстку и кодинг друг от друга, тем самым облегчить задачу восприятия html и php кода.
 
Для начала потребуется скачать сам класс. Например с официального сайта производителя: http://www.smarty.php.net.

Отлично. Теперь пороемся в скаченном архиве. Большая его часть – это различные примеры использования и документация. В топку. Всё что нам потребуется это каталоги internals и plugins – в них лежат всякие апгрейды. А также четыре файла сам класс –smarty.class.php, smarty_compiler.class.php, config_file.class.php и файл с разрешением tpl debug.tpl. Всё это льём в один каталог и кладём либо в каталог php/includes/ либо неподалёку от наше гостевухи.

Как же работает сам класс. А работает он очень просто. Создаётся обыкновенный файл с html кодом, который должен будет отображаться в браузере, за одним исключением. В этот код можно будет передавать всяческие значения переменных из скриптов. И вот это уже будет делаться динамически. Например конструкция типа:

<html>
<head>
<title> {$title} </title>
</head>
</html>
Будет выводить в верхнюю панель браузера содержание переменной title, понятное дело, что оно может быть совершенно любым и генерироваться в зависимости от скрипта. Обратим внимание, на то что все переменные в смарти помещаются в фигурные скобки. Таков синтаксис. А шаблоны сохраняются в файл с разрешением tpl.
Ну что ж, начнём пожалуй. Открываем любой текстовый редактор, сохраняем файл с расширением php и начинаем кодить.
Прежде всего нужно подключить сам класс.
include "smarty/smarty.class.php";
$sm = new smarty();
 
Теперь пропишем несколько установок.
 
$sm -> template_dir = "../ smarty /templates/";
$sm -> compile_dir = "../smarty/templates_c/";
$sm -> cache_dir = "../smarty/cache/";
$sm -> config_dir = "../smarty/config/";
 
$sm -> debugging = false;
$sm -> caching = true ;
 
Что к чему. Первая строчка – это путь к директории, где будут лежать шаблоны. Остальные директории являются системными, в них будут храниться различные cash и прочий мусор, ускоряющий работу приложений. Ещё две константы.  Первой намеренно присваиваем значение false, что бы смарти не начинал сам пытаться отлаживать код. Второй присваиваем true. Класс будет стараться запоминать одинаковые куски кода и не лезть каждый раз за ними в исходники. Опять же это нужно только для ускорения работы приложений. Да, конечно все четыре каталога нужно будет создать.

Все формальности выполнены, теперь приступим к работе. Как и в первом случаи лезем в базу данных и вытаскиваем оттуда данные для гостевухи.
define('HOSTNAME', "hostname");
define('USERNAME', "username");
define('PASSWORD', "password");
 
$database_name = "db_name";
 
$connect = mysql_connect(HOSTNAME, USERNAME, PASSWORD);
mysql_select_db($database_name);
 
            $query = "SELECT * FROM guestbook";
$result = mysql_query($query);
$array = mysql_fetch_array($result);
 
Естественно не забываю о том, что нужно подключиться к базе данных. А теперь начинается самое интересное. Нужно передать значения массива в шаблон. Для этого используем метод класса assign. Он принимает два значения – первое это имя переменной в шаблоне, оно может быть любым и не совпадать с именем переменной в скрипте. А второй параметр – это собственно, то что мы передаем в шаблон.
$sm -> assign("mess", $array);
 
В заключении пишем ещё один метод, который будет выводить шаблон в браузер, в качестве параметра передаётся имя шаблона.
           
$sm -> display("guest_book.tpl");
 
Всё. Кодинг закончился. Началась вёрстка. Идём в каталог ../templates/, там создаём файл guest_book.tpl и начинаем писать в нём обыкновенный html код.
<html>
<head>
 
И так далее пока не доберёмся до места, отвечающего за вывод сообщений. Смарти позволяет обходить массивы циклом foreach. Собственно этим сейчас и займёмся.
<h1> Сообщения </h1>
 
Пока ничего особенного.
{foreach from = $mess item = value key = key}
          <table width = "80%">
                   <tr>
                        <td>{$v.1}</td>
                        <td>{$v.2}</td>
                        <td>{$v.4}</td>
                  </tr>
                  <tr colspan = 3>
                        <td>{$v.3}</td>
                  </tr>
             </table>
{/foreach}
 
Давайте разбираться. Цикл берёт наш переданный массив с мессагами для гостевухи и разбивает его содержание в два других массива в value значения в key ключи. Полный аналог пыхавского форича:
foreach($mess as $key => $value){};
не так ли. Дальше создаётся таблица. В ячейки которой помещаются значения из массива mess. Путь к элементам массивов в смарти записывается в формате {имя_массива.ключ1.ключ2.клюс3} (в php $bvz_vfccbdf[ключ1][ ключ2][ ключ3];).
 
Не забываем закрывать цикл. В смарти все операторы должны быть закрыты {} {/}.
 
В принципе на этом я хочу закончить. Конечно же смарти на не заканчивается одним циклом, в нём также возможно использовать условные операторы, различные конвекторы дат и функции работы со строками типа strip_tags(); Обо всём этом я могу описать в следующей, уже не вводной статье, если эта статья кого-нить заинтересует.
/* ----------------------------------------------------[contents]----------------------------------------------------- */