Smarty, доступ к списку переменных шаблона.

FedulovIvan

Новичок
Smarty, доступ к списку переменных шаблона.

Доброго времени суток! Не знаю, возможно кто-нибудь сможет мне помочь.
Пишу цмс. Есть такая идея. Внутри шаблонов присутствуют какие-либо блоки(по сути переменные), выделенные в какие-нибудь специальные тэги. Например {require $someVar}

Алгоритм такой:
1. Шаблон предварительно парсится, находится список этих "запрашиваемых шаблоном" переменных.
2. Получаем/заполняем значения этих переменных: $someVar = 'hello world';
3. Найденным переменным присваиваются значения $Smarty->assign->( 'someVar', $someVar );
4. Рендерится шаблон: $Smarty->display();

Вот интересно, какими средствами самого класса смарти это можно реализовать?

Пока два варианта в голове:
a. Написать свой алгоритм предварительно парсинга шаблонов для поиска "запрашиваемых" переменных.
b. Запихать всю логику получения данных в пользовательскую функцию для смарти(но концептуально это мне не подходит).
 

RUNET

Новичок
средствами плагинов ...

пишешь плагин require
и в нем уже проверяешь существование этой переменной
если мне не изменяет память, то из плагина до assign добраться не сложно ...

кажется даже так ....
PHP:
function smarty_function_require($var, &$smarty)
{
   if(!isset($smatry->_tpl_vars[$var])) bla bla bla ...
}
 

AmdY

Пью пиво
Команда форума
есть assign, capture и ещё много чего в мануале http://smarty.net/manual/en/ достаточно просмотреть хотя бы оглавление.
 

FedulovIvan

Новичок
To RUNET:
Твой вариант сгодиться для доступа к уже созданным переменным. Например к тем ,что добавлены методом assign.

Возможно я не доконца обьяснил суть идеи...

Условно. Если обратиться к концепции MVC. У нас есть Модель, Вид, Контроллер. По сути, обратной связи между видом и контроллером нет. Т.е. контроллер формирует набор данных, которые передаються шаблонизатору для оторбражения. Так вот нужно "научить" контроллер понять, какие данные могут потребоваться для какого-нить конкретного шаблона (посредством его парсинга, и поиска условных тэгов). Потом контроллер получает эти данные, загружает в вид (Smarty) и рендерит html.
Соответственно получение данных внутри вида (вариант реализации с польз. ф-ей smarty ) нарушает идеологию.

To AmdY:
Capture тоже не совсем нужный вариант. Не уверен, что есть доступ к переменной capture вне самого шаблона. что-то вроде:
PHP:
$Smarty->fetch('some.tpl');
print_r(  $Smarty->capture ); // получили список "пойманных" блоков
// далее пройтись циклом по полученным переменным и присвоить им значения
// и снова
$Smarty->display('some.tpl');
 

RUNET

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

FedulovIvan

Новичок
Ну например, есть страница, тебе нужно вставить куда-ли,о блок с 5ю последними новостями в шаблоне пишешь:

PHP:
//bla-bla-bla
{news_block count=5 order=desc}
а стальное проблемы цмс = )
 

whirlwind

TDD infected, paranoid
FedulovIvan ты знаешь что такое функции? Не надо ничего парсить. Надо увидеть разницу между вызовом функции news_block($count, $order) и твоей записью {news_block count=5 order=desc}. Идея твоя не нова. Общепринятое название этой идеи - активный шаблон.
 

Alexandre

PHPПенсионер
такс, поспал чуток...
эээ, ммм, меня вот теперь мучает вопрос, а собсно нахера оно надо ???
я смысла понять не могу (может ещё сплю)...
это называется "активные шаблоны"
оно нахрен не надо, только запутывает логику MVC

-~{}~ 20.11.09 10:32:

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

FedulovIvan

Новичок
Ну раз называют активным шаблоном, то пусть так и будет. Пока, для архитектуры цмс считаю это полезным. Дальше практика покажет.
Но считаю неверным вызывать методы контроллера, внутри пользовательских функций Smarty. Поэтому и запарился с темой "предварительного парсинга" шаблона.
 

AmdY

Пью пиво
Команда форума
бла-бла-бла.
Где написано что MVC не подразумевает обращения к контроллеру? Возможно, Alexandre прав и с непривычки логика кажется путаной, но это из-за перехода от MTС(модель-шаблон-контроллер) к MVC.


FedulovIvan
тогда тебе нужно писать плагины к смарти http://smarty.net/manual/en/plugins.php
 

FedulovIvan

Новичок
Amdy, a где написано что нельзя запихать бизнесс-логику в вид? Бери себе и размещай ее там... В тюрьму точно не посадят.
Моя задача думаю так и сведется в итоге к написанию дополнения к смарти.

Зы. Зачем кидать линки на английский доки, когда есть нормальный перевод документации на русском?)
 

AmdY

Пью пиво
Команда форума
не путай зелёное и квадратное, разделение - это одно, а вот взаимодействие между компонентами - это другое.

переводы обычно страдают неактуальностью.
 

Tiesto

Новичок
вопрос мой не в тему ... но поднимать новый топик будет глупо ..)

а как на сайте сделанном с помощью Smarty .. имеющий смену языка ... вставить кнопку с надписью "Старт" к примеру .. да так чтобы слово Старт отображалось не иероглифами ...??
 

AmdY

Пью пиво
Команда форума
Tiesto
смарти здесь ни при чём, пароль для гугла - кодировки
 

Tiesto

Новичок
Спасибо за ответ , но я уже разобрался

был некий файл с языками , с таким содержимым

define(Sign_in, "Вход");

чтобы корректно отобразит надписи на формах , на русском и английском языке ,
нужно было заменить обычную надпись Вход в файлах с html .. на
{$Sign_in}

так вот ..)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Автор оригинала: AmdY
Где написано что MVC не подразумевает обращения к контроллеру?
Возможно, Alexandre прав и с непривычки логика кажется путаной, но это из-за перехода от MTС(модель-шаблон-контроллер) к MVC.
на практике проблема в том, что для активных шаблонов нужно не шаблонизатор доработать, не плагины дописать, а целый большой фреймверк сделать

в этом был бы большой смысл, если бы fastcgi работал без полной реинициализации: при вызове открывается нужный шаблон и дергаются нужные функции
а так смысла нет
 

x2com

Новичок
Понимаю что занимаюсь некро-постингом, нео больше нигде не нашел похожей темы. Скажите, @FedulovIvan, вы решили свою проблему со Smarty? А то чувствуется мне придётся лезть в ядро смартей, что крайне не желательно. :)
 
Последнее редактирование:

x2com

Новичок
UPD:
Я похоже нашел!
PHP:
               try {
                    $_tpl = $smarty->createTemplate('main.tpl', null, null, null, false);
                    if ($_tpl->mustCompile()) {
                        $_tpl->compileTemplateSource();
                    }
                }
                catch (Exception $e) {
                    echo 'Error: ', $e->getMessage(), "<br><br>";
                }
                $tags = $tpl->getTags($_tpl);
                print_r($tags);
Возвращает смарти тэги с атрибутами
 
Сверху