У меня есть класс 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 "";
}
}
Эти два файла не могут связываться друг с другом, потому что им предоставляются две разные области видимости; они включены в два отдельных вызова 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
Других решений пока нет …