Основная проблема в том, что ваши взгляды не имеют прямого знания друг о друге. Позвонив по этому номеру:
<?=View::factory('embed')->output()?>
в своем «родительском» представлении вы создаете и выводите шаблон, который не знает о том, что он находится внутри другого шаблона.
Есть два подхода, которые я мог бы порекомендовать здесь.
# 1 - свяжите ваши шаблоны.
Сделав ваши встроенные шаблоны «дочерними» для родительского шаблона, вы можете позволить им иметь доступ к родительским переменным во время output()
. Я использую этот подход в построенной мной системе View. Это выглядит примерно так:
$pView = new View_Parent_Class();
$cView = new View_Child_Class();
$pView->addView($cView);
Во время $pview->render()
дочернему представлению легко предоставляется доступ к переменным родителя.
Для этого метода может потребоваться много рефакторинга, поэтому я опущу грязные детали и перейду ко второму подходу.
# 2 - передать родительские переменные
Вероятно, это будет самый простой метод для реализации, учитывая подход, который вы уже использовали. Добавьте необязательный параметр в ваш метод вывода и слегка переписайте его, например:
public function output($extra_vars = null)
{
if (count($this->_vars))
extract($this->_vars, EXTR_REFS);
if (is_array($extra_vars)) extract($extra_vars, EXTR_REFS);
require($this->_file);
exit;
}
Если вы добавите также простой метод получения:
public function get_vars()
{
return $this->_vars;
}
Затем вы можете встраивать свои файлы с тем, что фактически обеспечивает доступ для чтения к родительским переменным:
<?=View::factory('embed')->output($this->get_vars())?>
$this
будет ссылкой на текущий шаблон, т.е. родитель. Обратите внимание, что с помощью этого метода вы можете столкнуться с именами переменных из-за двух вызовов extract
.