Я хочу, чтобы мои шаблоны руля с макетом. Я пытаюсь написать свой собственный класс View из Zend_View_Abstract, основываясь на нескольких уроках, которые мне встречаются для Smarty / ZF1. Не знаю, правильно ли я поступаю, должно быть проще (метод контроллера, помощник и т. Д.). В любом случае я выложу то, что имею:
<?php
use Handlebars\Handlebars;
class Handlebars_View extends Zend_View_Abstract
{
private $engine = false;
public function __construct($data = array())
{
parent::__construct($data);
$this->engine = new Handlebars;
}
public function assign($spec, $value=null)
{
}
public function escape($var)
{
if (is_string($var))
{
return parent::escape($var);
}
elseif (is_array($var))
{
foreach ($var as $key => $val)
{
$var[$key] = $this->escape($val);
}
return $var;
}
else
{
return $var;
}
}
public function render($name)
{
// this will get me /var/www/shared-views-zf/application/views/scripts/
// I don't know how to get the rest of the path e.g. 'users/login.phtml'
//$viewScriptsPath = $this->getAllPaths()['scripts'][1]; // incomplete
//$viewScriptsPath.= $viewNameFromSomewhere; // ??
//$template = file_get_contents($viewScriptsPath); can't do this yet
// get data which was pre assigned
//$data =
//
//$content = $this->engine->render($template, $data)
// i can set the layout content here (but how do I get the content)
$this->layout()->content = 'Heloo';
// getlayout full path
require $this->getScriptPath($name); // require /var/www/shared-views-zf/application/layouts/scripts/layout.phtml
}
public function _run() {}
}
Ясно, что в моей функции рендеринга отсутствуют части, но, надеюсь, видно направление, в котором я пытался идти. Кроме того, у меня есть следующее в моей начальной загрузке:
<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
protected function _initViews()
{
$view = new Handlebars_View();
$viewRender = Zend_Controller_Action_HelperBroker::getStaticHelper(
'ViewRenderer'
);
$viewRender->setView($view);
$viewRender->setViewSuffix('phtml');
Zend_Controller_Action_HelperBroker::addHelper($viewRender);
return $view;
}
}
Ладно, я знаю, что, вероятно, поступлю совершенно неправильно. В простейшей форме вы реализуете рули следующим образом:
use Handlebars\Handlebars;
$engine = new Handlebars;
$template = file_get_contents($filePath);
$result = $engine->render(
$template,
$data
);
.. но, как видно, мне нужно иметь доступ к $ filePath (файл сценария просмотра), $ data (массив, который передается в представление из контроллера), тогда я мог бы установить из моего класса View макет как таковой:
$this->layout()->content = $result;
require $layoutPath;
Буду очень признателен, если кто-нибудь сможет объяснить, как это должно быть сделано. На самом деле я никуда не делюсь с документами и не читаю учебники онлайн. Кроме того, я немного застрял с ZF1, так как это то, на чем написано большинство наших приложений. Спасибо за вашу помощь.
Попробуйте это (не проверено, но вы попадете туда или очень близко).
В функции рендеринга:
public function render($name)
{
$ext = pathinfo($name, PATHINFO_EXTENSION);
// optional if you want to fallback to phtml
if ($ext === 'hbs') {
// get data which was assigned at controller level
$data = $this->getVars();
// it may get mad at this part!
$template = file_get_contents($this->getScriptPath($name));
// render
$res = $this->engine->render($template, $data);
} else {
$res = parent::render($name);
}
return $res;
}
Других решений пока нет …