Ich versuche, ein Skelett-View-System in PHP zu peitschen, aber ich kann nicht herausfinden, wie eingebettete Ansichten erhalten ihre Eltern Variablen erhalten. Zum Beispiel:Templating System Bereichsproblem
Ansicht Klasse
class View
{
private $_vars=array();
private $_file;
public function __construct($file)
{
$this->_file='views/'.$file.'.php';
}
public function set($var, $value=null)
{
if (is_array($var))
{
$this->_vars=array_merge($var, $this->_vars);
}
else
$this->_vars[$var]=$value;
return $this;
}
public function output()
{
if (count($this->_vars))
extract($this->_vars, EXTR_REFS);
require($this->_file);
exit;
}
public static function factory($file)
{
return new self($file);
}
}
test.php (Top-Level-Ansicht)
<html>
<body>
Hey <?=$name?>! This is <?=$adj?>!
<?=View::factory('embed')->output()?>
</body>
</html>
embed.php (eingebettet in test.php
<html>
<body>
Hey <?=$name?>! This is an embedded view file!!
</body>
</html>
Code:
$vars=array(
'name' => 'ryan',
'adj' => 'cool'
);
View::factory('test')->set($vars)->output();
Ausgang:
Hey ryan! This is cool! Hey [error for $name not being defined]
this is an embedded view file!!
Das Problem sind die Variablen, die ich in der obersten Ebene festgelegt nicht auf die eingebettete Ansicht übergeben bekommen. Wie könnte ich das möglich machen?
Danke. Dies hat mir gezeigt, dass Sie selbst in großen Frameworks die Ansicht in Ihrem Controller rendern und dann die gerenderte Ansicht in einer Variablen nur an die oberste Ebene übergeben müssen. Ich habe versucht, den Blick in eine andere Ansicht zu rendern. – ryeguy