Использование шаблонов.

Astral Man

We Will Rock You
Использование шаблонов.

Всем привет!

Есть главный шаблон, в него подлючаются блоки (тоже шаблоны).
Главный шаблон подключается в самом движке, в этом шаблоне подлючаются блоки в нужных местах, соответственно этим блокам нужна какая-то информация для вывода. Например есть блок:

menu.tpl
PHP:
<table>
    <tr><td>{$menu}</td></tr>
</table>
и файл php который заполняет $menu

главный шаблон
PHP:
<table>
    <tr><td>{include file="head.tpl"}</td></tr>
    <tr><td>{include file="menu.tpl"}</td></tr>
    <tr><td>{include file="main.tpl"}</td></tr>
    ...
</table>
В главном шаблоне идет подлючение блоков, а как включить файл menu.php и т.п. в начале шаблона блока или как?
Подключать все php файлы относящиеся к блокам в файле движка не пойдет т.к. блоков может быть очень много а использоваться будут несколько.
 

Demiurg

Guest
для начала расскажи, что за шаблонный движок ты используешь и зачем тебе включать файл menu.php.
 

Astral Man

We Will Rock You
Автор оригинала: Demiurg
что за шаблонный движок ты используешь
Начал использовать Smarty, доку всю прочитал очень понравилось.
зачем тебе включать файл menu.php
В этом файле идет запрос к БД и создается массив $menu с ссылками. Этот массив передаем шаблону {$menu}
 

Demiurg

Guest
>Начал использовать Smarty, доку всю прочитал очень понравилось.
ну так и написал бы сразу, что бы мы тут не гадали

>В этом файле идет запрос к БД и создается массив $menu с ссылками. Этот массив передаем шаблону {$menu}
а зачем делать подключение php файла именно из шаблона ? До того, как шаблон начнет отображаться нельзя все данные передать ему ?
 

Astral Man

We Will Rock You
Автор оригинала: Demiurg
а зачем делать подключение php файла именно из шаблона ? До того, как шаблон начнет отображаться нельзя все данные передать ему ?
Если был бы определенный набор блоков их можно было бы подлючить в движке, и передать данные в шаблон, но проблемма в том что блоков очень много, а использовать нужно некоторые из них, и вот встает вопрос откуда мне знать какой блок будет использоваться в главном шаблоне?
По этому в зависимости от используемых блоках нужно включить php файлы что бы передать данные в шаблоны.
 

Demiurg

Guest
тогда тебе insert нужен, подключать модули по именам, и по этому имени ты должен как то определять и нужный скрипт и шаблон.
 

Astral Man

We Will Rock You
Demiurg
А других медотов нет?
Случайно нет доки по созданию модульных движков с использование шаблонов?
 

Johannes

Guest
Автор оригинала: Astral Man
Если был бы определенный набор блоков их можно было бы подлючить в движке, и передать данные в шаблон, но проблемма в том что блоков очень много, а использовать нужно некоторые из них, и вот встает вопрос откуда мне знать какой блок будет использоваться в главном шаблоне?
По этому в зависимости от используемых блоках нужно включить php файлы что бы передать данные в шаблоны.
Извини, но что значит откуда мне знать какой блок будет использоваться в главном шаблоне? Где ты обрабатываеш условия на отображение блоков, в темплейте, что-ли?
 

Astral Man

We Will Rock You
Johannes
Блоки
menu, news, main, banner и т.д.

Шаблон №1
menu, main, banner
для этого шаблона используются файлы menu.php, main.php, banner.php, соотвественно их нужно подлючить до вывода шаблона.
Для другого шаблона будут использоваться другие файлы, и по этому мне необходимо знать какие файлы нужно подключить.
 

Johannes

Guest
Я предполагаю (и это логично было бы), что в РНР-срипте, с которого вызывается главний шаблон, указывается какие "подшаблоны" должны выводится. Соответственно там же можно и поместить логику на include соответствующих menu.php, main.php, etc.
Если я не прав, то укажи за каким механизмом ты это делаеш.
 

Astral Man

We Will Rock You
Johannes
Вот ты правильно говоришь "Указать", но у меня десятки блоков, создаю шаблон используя несколько блоков, и php файлы которые выводят информацию для блоков подлючаются. Если мне нужно добавить новый блок в шаблон, соответственно должен подключится php файл для этого блока. Проблема в след. нужно узнать какие блоки использует шаблон. Можно конечно прописывать имена php файлов в отдельном файле, но это не красиво.
 

Johannes

Guest
Слушай, Astral Man, если хочеш, чтобы кото-то разобрался в твоей проблеме - опиши конкретнее логику программы.
Танцуеш все время вокруг "много-блоков". Телепатом надо быть, чтобы понять как у тебя все организовано.
Что значит
добавить новый блок в шаблон
?
Если ты статично прописал include темплейта в шаблоне, то ты должен статично прописать подключение рнр-файла в скрипте, который вызывает шаблон. Если есть логика выбора подключаемых шаблонов, то опиши ее.
 

n00b

Guest
Originally posted by Johannes
Слушай, Astral Man, если хочеш, чтобы кото-то разобрался в твоей проблеме - опиши конкретнее логику программы.
Танцуеш все время вокруг "много-блоков". Телепатом надо быть, чтобы понять как у тебя все организовано.
По идее его организация:
Есть файлы (всё те же main.php, menu.php, banner.php)
И есть шаблон где он юзает {$main} {$menu} {$banner}

Однако сначала он вставит баннер, а потом захочет убрать. А редактировать файл php - стирать или добавлять инклуд он не хочет, а хочет указать через шаблон, что надо подключать какой то файл.
(Вроде так понял.)
 

Astral Man

We Will Rock You
n00b
Ты правильно понял. Вот и хотелось узнать как организовать такое, более оптимально.
 

Johannes

Guest
тогда разве что читать файл шаблона через $smarty->fetch и парсить его потом на вхождение {include ...} а потом, соответственно, подключать *.рнр файлы. Другого выхода не вижу. Может кто-то может прижумать че-то назамен?
 

jonjonson

Guest
Может как-то так?
PHP:
class MyApp
{
    var $mIsMyAppOn = true;

    //...

}

class Banner
{
    var $mIsBannerOn = true;

    //...
}

class Menu
{
    var $mIsMenuOn = true;

    //...
}

class NewsList
{
    var $mIsNewsListOn = true;

    //...
}

$config_info = &new MyConfig (/home/foo/my_config_file);
$config_info->Get();

$new_app = &new MyApp ();

$smarty = new Smarty;

if (!$config_info->my_app)
{
    $new_app->mIsMyAppOn = false;
} else
{
    $new_banner = &new Banner ();
    if (!$config_info->customer_banner)
    {
        $new_banner->mIsBannerOn = false;
    }
    $new_menu = &new Menu();
    if (!$config_info->menu)
    {
        $new_menu->mIsMenuOn = false;
    }
    $new_news_list = &new NewsList ();
    if (!$config_info->news_list)
    {
        $new_news_list->mIsNewsListOn = false;
    }
    
    $smarty->assign('banner', $new_banner);
    $smarty->assign('menu', $new_menu);
    $smarty->assign('news', $new_news_list);
}

$smarty->assign('app', $new_app);

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

//------------------------------------ file index.tpl ----

{include file="header.tpl"}
{if !$app->mIsMyAppOn}
    Приходите завтра!<BR />
{else}
    {if $banner->mIsBannerOn}
        {include file="banner.tpl"}
    {/if}
    {if $menu->mIsMenuOn}
        {include file="menu.tpl"}
    {/if}
    {if $news->mIsNewsListOn}
        {include file="news.tpl"}
    {/if}
{/if}
{include file="footer.tpl"}
 

n00b

Guest
Если я опять же не ошибаюсь, то ему надо динамическое подключение не в шаблоне (если код так понял), а в файле php
 

alexhemp

Новичок
а чем Вам штатная ф-ция icnlude_php не угодила?

На самом деле тут просто проблема "Курицы и Яйца"

Что первично - шаблоны или код?

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

Smarty такое позволяет делать, только вот нужно озаботится persistent connect-ами к базе.

Вот пример из документации:
Скрипт - load_nav.php
Код:
<?php

// load in variables from a mysql db and assign them to the template
require_once("MySQL.class.php");
$sql = new MySQL;
$sql->query("select * from site_nav_sections order by name",SQL_ALL);
$this->assign($sections,$sql->record);
?>
Шаблон - nav.tpl
---------
Код:
{* absolute path, or relative to $trusted_dir *}
{include_php file="/path/to/load_nav.php"}

{foreach item=$curr_section from=$sections}
	<a href="{$curr_section.url}">{$curr_section.name}</a><br>
{/foreach}
Ну и соотв. вставляйте вызов шаблона в header/footer.

Кстати рекомендую для целостности использовать не header/footer а вложенные шаблоны (посредством $smarty->fetch('...'));

У меня сделано так

1. page.tpl - описывает страницу со всеми блоками навигации и т.п. Данные для блоков готовит common.php подключаемый из всех файлов.
2. В конце каждого файла

$smaty->assign('BODY', $smarty->fetch('index.tpl'));
$smarty->parse('page.tpl');

page.tpl - шаблон оформления - у него на месте текста страницы вставлен {$BODY}

Вопрос на засыпку - можно ли парсить page.tpl передавая просто название шаблона и использовать {include file=$body} ?
 
Сверху