ФорумПрограммированиеПыхнуть хотите?F.A.Q. → Smarty для начинающих познавать суть

Smarty для начинающих познавать суть

  • md5

    Сообщения: 11960 Репутация: N Группа: в ухо

    Spritz 12 сентября 2007 г. 1:41

    Smarty для начинающих познавать суть


    1. Итак, начет с того, для чего вобще нужен шаблонизатор.

    Если уж Вы решили использовать шаблонизатор, то Вы наверняка поняли для себя, что такое отделение кода от представления (view), от того, что видно снаружи (т.н. пользовательского интерфейса). В шаблоны выносится все отображения, вся верстка и определяются места, где будут вставлены или использованы данные, пришедшие от обработчика.
    Все это дело выглядит так: скрипт получает данные от пользователя (get, post и т.д.), обрабатывает их и передаёт в шаблонизатор, а уже шаблонизатор выводи эти данные используя шаблоны.

    2. С чего начать (самый симпл)

    Перед началом — изучаем базовый синтаксис.

    Начинать надо с самого просто. Сделаем шаблон, который будет выводить переданный из скрипта текст и текущее время.

    template.tpl:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru">
    <head profile="http://gmpg.org/xfn/11">
    <title>Изучаем smarty на ПЫХА.РУ</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    </head>
    <html>
    <h1>Здравствуйте</h1>
    <p>{$text|default:"текст не передан в шаблонизатор"}</p>
    <small>{$smarty.now|date_format:"%d-%m-%Y %H:%M:%S"}</small>
    </body>
    </html>


    Итак шаблон, в котый мы должны передать $text. В случае, если эта переменная не определена, выведется значение по умолчанию ("текст не передан в шаблонизатор"). Здесь мы воспользовались модификатором default, который и устанавливает значение по умолчанию (http://smarty.php.net/manual/ru/language.modifier.default.php).

    script.php:

    // подключаем смарти
    require_once ('smarty/Smarty.class.php');
    $smarty = new Smarty;

    $text = 'Текст, который мы собираемся вывести в шаблоне.';

    // передаем шаблонизатору наш текст
    $smarty -> assign('text', $text);

    // выводим шаблон в люди
    $smarty -> display('template.tpl');


    Также, необходимо обратить внимание на использование {$smarty.now} (http://smarty.php.net/manual/ru/language.variables.smarty.now.php), эта переменная выводит текущее время. Здесь для неё используется модификатор date_format (http://smarty.php.net/manual/en/language.modifier.date.format.php), форматирующий дату.


    3. Немного важных мелочей, которые пригодятся в жизни

    3.1 Шаблоны для удобства можно разбивать на блоки (например, шапка, тело и подвал) если они повторяются на разных страницах и подключать в основных файлах.

    Пример. Допустим у нас есть главная и новостная страницы, которые имеют общую шапку и подвал. Их мы положим в папку blocks и назовем header.tpl и footer.tpl ссответственно.
    index.tpl:

    {include file='blocks/header.tpl'}

    Текст главной страницы

    {include file='blocks/footer.tpl'}


    news.tpl:

    {include file='blocks/header.tpl'}

    Вывод новостей идет тут.

    {include file='blocks/footer.tpl'}


    3.2 Ещё одно замечание (обязательное!), о данных.

    Абсолютно все данные, абсолютно все массивы данных должны быть сформированы в скрипте ДО передачи в шаблонизатор! Старайтесь этого не допускать, т.к. с данными в шаблонизаторе работать не нужно, он не для этого..


    4. Разберем жизненную ситуацию :)

    Чтобы приблизиться к реальности, разберем пример вывода новостей.
    Здесь я приведу кусок кода на php, вытаскивающий и передающий новости и кусок шаблона, отвечающий за корректный и красивый вывод новостей.

    news.php

    // достаём наши новости из БД
    $query = "SELECT `id`, `date`, `title`, `content`
    FROM `news`
    ORDER BY `date` DESC";
    $sql = mysql_query($query) or die(mysql_error());

    // создаем массив, в который будем складывать новости
    $news = array();

    while ($row = mysql_fetch_assoc($sql))
    {
    /*
    ** Здесь можно производить любые манипуляции с данными новостей,
    ** перед тем, как они попадут в массив, который будет
    ** в последствии передан шаблонизатору
    ** например, можно обработать дату, перевести месяц на русский и т.д.
    */

    $news[] = $row;
    }

    // массив новостей отдаём шаблонизатору

    $smarty -> assign('news', $news);

    $smarty -> display('news.tpl');


    news.tpl:

    {* подключаем шапку шаблона *}
    {include file='blocks/header.tpl'}

    {* здесь будем организовывать вывод новостей
    ** используем foreach (http://smarty.php.net/manual/ru/language.function.foreach.php)
    ** для вывода каждого элемента массива
    *}

    {foreach key=key item=news_item from=$news}
    <h1>{$news_item.title} ({$news_item.date})</h1>
    <p>{$news_item.content}</p>
    <a href="/news/{$news_item.id}/">подробнее…</a>
    {/foreach}

    {* подключаем подвал шаблона *}
    {include file='blocks/footer.tpl'}



    5. О холиварах и тому подобное

    Я не спорю, что native php шаблоны это верх скорости и не буду уделять здесь внимание нескончаемым спорам.


    6. Думаю

    для начинающих достаточно пищи, чтобы начинать разобраться.
    И помните, все начинается всегда отсюда: http://smarty.php.net/manual/ru/
    все умрут, а я изумруд
  • Dagdamor

    Сообщения: 47 Репутация: N Группа: Кто попало

    Spritz 16 сентября 2007 г. 10:43, спустя 4 дня 9 часов 2 минуты

    В смарти иногда очень напрягает отсутствие врапперов… даже в примере выше Md5 использовал один шаблон для хэдера, другой для футера. Такой подход (голова отдельно, ноги отдельно) в наши дни считается прошлым веком.
  • md5

    Сообщения: 11960 Репутация: N Группа: в ухо

    Spritz 16 сентября 2007 г. 12:07, спустя 1 час 23 минуты 33 секунды

    Такой подход (голова отдельно, ноги отдельно) в наши дни считается прошлым веком.

    согласен
    это пример для начинающих, а именно для построения простейшего шаблона
    все умрут, а я изумруд
  • aligator

    Сообщения: 52 Репутация: N Группа: Кто попало

    Spritz 15 декабря 2007 г. 13:48, спустя 90 дней 2 часа 40 минут

    require_once ('smarty/Smarty.class.php');

    скажите пожалиста где взят Smarty Class?
  • md5

    Сообщения: 11960 Репутация: N Группа: в ухо

    Spritz 15 декабря 2007 г. 14:17, спустя 29 минут 37 секунд

    http://smarty.php.net/
    все умрут, а я изумруд
  • aligator

    Сообщения: 52 Репутация: N Группа: Кто попало

    Spritz 15 декабря 2007 г. 14:50, спустя 33 минуты 11 секунд

    skachal
  • XoxMa

    Сообщения: 135 Репутация: N Группа: Кто попало

    Spritz 25 февраля 2008 г. 9:01, спустя 71 день 18 часов 10 минут

    Странно, я сделал всё как ты сказал, но у меня появляется ошибка:

    Warning: Smarty error: unable to read resource: "temp.tpl" in Smarty/Smarty.class.php on line 1095

    Я даже поставил chmod на файл 777, и пытался шаблон с моей темой включить разными способами:

    $smarty -> display('temp.tpl');
    $smarty -> display('file:temp.tpl');
    $smarty -> display('db:temp.tpl');

    Из-за чего может быть эта ошибка?
  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz 25 февраля 2008 г. 9:08, спустя 6 минут 44 секунды


    Из-за чего может быть эта ошибка?
    Могу предположить, из-за того, что файл лежит не там где надо.
  • md5

    Сообщения: 11960 Репутация: N Группа: в ухо

    Spritz 25 февраля 2008 г. 9:35, спустя 27 минут 21 секунду

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

    ва файле Smarty.class.php
        /**
    * The name of the directory where templates are located.
    *
    * @var string
    */
    var $template_dir = '_templates';

    /**
    * The directory where compiled templates are located.
    *
    * @var string
    */
    var $compile_dir = '_templates/_compiled';


    //или

    $smarty->template_dir = '_templates';


    вобщем проверь их и проверь где шаблоны лежат
    все умрут, а я изумруд
  • XoxMa

    Сообщения: 135 Репутация: N Группа: Кто попало

    Spritz 25 февраля 2008 г. 11:03, спустя 1 час 27 минут 39 секунд

    Спасиб, наконец-то заработало…
  • roman678

    Сообщения: 4 Репутация: N Группа: Кто попало

    Spritz 27 января 2009 г. 3:48, спустя 336 дней 16 часов 44 минуты

    Вывод новостей происходит, все нормально. А как сделать рабочей ссылку подробнее ??? Тоесть вывод всех данных из таблички. Поле all_news_text
  • md5

    Сообщения: 11960 Репутация: N Группа: в ухо

    Spritz 27 января 2009 г. 3:50, спустя 2 минуты 34 секунды


    Вывод новостей происходит, все нормально. А как сделать рабочей ссылку подробнее ??? Тоесть вывод всех данных из таблички. Поле all_news_text
    надо другой шаблон для отдельной новости
    и при переходе по ссылке, чтобы скрипт указывал, что надо использовать шаблон для отдельной новости
    все умрут, а я изумруд
  • roman678

    Сообщения: 4 Репутация: N Группа: Кто попало

    Spritz 27 января 2009 г. 5:07, спустя 1 час 17 минут 13 секунд

    про шаблон я то понял, просто не пойму как по ссылке указать другой шоблон. думаю гадаю как сделать… просто очень нужно
  • md5

    Сообщения: 11960 Репутация: N Группа: в ухо

    Spritz 27 января 2009 г. 5:13, спустя 5 минут 42 секунды

    да всем нужно
    надо в скрипте анализировать, где мы находимся, в списке новостей или в конкретной новости и в зависимости от этого выбирать шаблон
    все умрут, а я изумруд
  • roman678

    Сообщения: 4 Репутация: N Группа: Кто попало

    Spritz 27 января 2009 г. 5:17, спустя 3 минуты 31 секунду

    лан буду юзать. авось и доюзаюсь

Пожалуйста, авторизуйтесь, чтобы написать комментарий!