Класс включает недопустимость работы переменных внутри шаблонов

У меня есть класс PHP, который упрощает вставку созданных мной шаблонов …

т.е.

...
/*Get Templates*/
public function template($file){
if(isset($file) && file_exists($file.".php")){
$controller = $this;
include $file.".php";
}else{
echo "";
}
}

Который находится в каталоге за пределами public_html как так

kms/php_includes/kms.php

Но если я использую это в моей странице индекса

public_html/index.php

Ни одна из переменных, которые я установил в индексе, не работает внутри шаблонов?

пример

index.php

$user = "Mr.EasyBB";
$controller->template("../kms/site/header");//$controller is the class variable

header.php

echo $user; //this doesn't work
$controller->template("../kms/site/svg/smile"); //this still works

Но в kms/site/header.php

Я получаю undefined variable user направлен на заголовок php файла. Это связано с тем, что источник шаблона находится за пределами public_html или я делаю что-то глупое и не осознаю этого.

Мне кажется, проблема в том, что файлы находятся в разных каталогах, поэтому моей обычной практикой было добавить набор и получить.

 ...
private $variables = array();

public function get($prop){
if($this->variables[$prop]){
return $this->variables[$prop];
}
}
public function set($prop=null,$val=null){
if($prop !== null && $val !== null){
$this->variables[$prop] = $val;
}
}

/*Get Templates*/
public function template($file){
if(isset($file) && file_exists($file.".php")){
$controller = $this;
foreach($this->variables as $var->$val){
//i need to assign explicitly the $var name here hence why I used double dollar signs. But it's not working either.
$$var = $val;
}
include $file.".php";
}else{
echo "";
}
}

0

Решение

Эти два файла не могут связываться друг с другом, потому что им предоставляются две разные области видимости; они включены в два отдельных вызова template()

Попробуйте установить $controller->user в index.php и повторно использовать его в header.php,

// controller
function template() {
$this->user = 'Foo';
include 'header.php'; // tells php to use header.php as if
// it were just more code for this function
}

// header.php
echo $this->user; // Foo

Вы также можете хранить ваши переменные в массиве и извлекать их, прежде чем включать заголовок.

// controller
function template() {
$this->templateVars['user'] = 'Foo';
extract($this->templateVars);
echo $user; // Foo
include 'header.php';
}

// header.php
echo $user; // Foo

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

$this->templateVars['USER'] = 'Foo'; // etc
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]