fenom-template / fenom

Template Engine for PHP. Maintainers wanted!
Other
446 stars 108 forks source link

Проблема с глобальной переменной #181

Closed alglyzin closed 9 years ago

alglyzin commented 9 years ago

$fenom -> addAccessor('site_name', function (Fenom\Tokenizer $tokens) { return 'echo 'Адрес сайта';'; });

Проблема не решилась((

Parse error: syntax error, unexpected T_ECHO in /classes/Fenom/Template.php(462) : eval()'d code on line 6 Warning: Cannot modify header information - headers already sent by (output started at /classes/Fenom/Template.php(462) : eval()'d code:111) in

pafnuty commented 9 years ago

Похоже вы с кавычками перемудрили? попробуйте так:

$fenom -> addAccessor('site_name', function (Fenom\Tokenizer $tokens) { return 'echo "Адрес сайта";'; });
alglyzin commented 9 years ago

Ни чего не помогает((((

Parse error: syntax error, unexpected T_ECHO in .../classes/Fenom/Template.php(462) : eval()'d code on line 6 Warning: Cannot modify header information - headers already sent by

bzick commented 9 years ago

Скиньте сюда или на мой emial код как добавляете акцессор

alglyzin commented 9 years ago

$fenom -> addAccessor('site_name', function (Fenom\Tokenizer $tokens) { return 'echo "Адрес сайта";'; });

bzick commented 9 years ago

Я понял, это я ввел вас в заблуждение.

$fenom -> addAccessor('site_name', function (Fenom\Tokenizer $tokens) { return '"Адрес сайта"'; });

не надо никаких echo и точек запятой, просто нужно указать код как получить значение. Как его использовать будет решать Fenom исходя из контекста. Прошу прощения, отвечал не подумав

alglyzin commented 9 years ago

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

$fenom -> addAccessor('site_name', function (Fenom\Tokenizer $tokens) { global $config; return '"$config"'; });

Notice: Undefined variable: config in .../classes/Fenom/Template.php(462) : eval()'d code on line 6

bzick commented 9 years ago

Акцессор должен вернуть PHP код, который будет выполнен только во время выполнения шаблона. Поэтому все не так просто как хотелось бы. Что бы упростить жизнь разработчику есть вариант немного проще (по вашей задаче):

//  используем шаблонизатор как хранилище наших объектов
$fenom->config = $config;
$fenom->addAccessorSmart('site_name', '$tpl->getStorage()->config', \Fenom::ACCESSOR_VAR);
// $tpl->getStorage() получить объект шаблонизатора в шаблоне, ->config получить наш объект у шаблонизатора
maxisoft-git commented 9 years ago

А можно узнать более развернутый пример или условие задачи которая требует свои акцессор ? просто мне кажется что все можно решить иначе.

bzick commented 9 years ago

Как правило, обычно хватает всем addAccessorSmart. Использование addAccessor напрямую очень редкое явление так как там надо самим парсить всю цепочку слов: от $. и до того момента когда подсчитаете что вам хватит. Наглядные примеры работы с addAccessor можно глянуть в классе Fenom\Accessor (список предопределенных акцессоров с парсерам).

alglyzin commented 9 years ago

Просто хотел передать в $.site_name название сайта Придется в переменную пихать в шаблон. Ибо я так и не понял как это сделать(

maxisoft-git commented 9 years ago

Готовый вариант Вам написали выше.

bzick commented 9 years ago

Используйте пример, который описал выше

$fenom->config = [
    "site_name" => // ...
    "site_scripts" => //...
    // и что еще придумете
];
$fenom->addAccessorSmart('site_name', '$tpl->getStorage()->config', \Fenom::ACCESSOR_VAR);

Тогда в шаблоне

Site: {$.config.site_name}
alglyzin commented 9 years ago

Спасибо, решил вопрос)