2014-11-06 2 views
2

Я хочу, чтобы мои шаблоны руля с макетом. Я пытаюсь написать свой собственный вид из класса Zend_View_Abstract свободно на основе нескольких руководств, которые я встречаю для Smarty/ZF1. Не знаю, правильно ли я это сделаю, должен быть более простой способ (метод контроллера, помощник и т. Д.). Во всяком случае я выложу то, что у меня есть:Как использовать механизм шаблонов (усы, рули) в Zend framework 1?

<?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; 
    } 
} 

ОК, я знаю, что я, вероятно, буду об этом совершенно неправильно. В его простейшей форме, youu реализовать рули таким образом:

use Handlebars\Handlebars; 

$engine = new Handlebars; 

$template = file_get_contents($filePath); 

$result = $engine->render(
    $template, 
    $data 
); 

.. но, как можно видеть, мне нужно иметь доступ к $ Filepath (просмотреть файл сценария), данные $ (массив, который переходит в руки вид из контроллера), то я мог бы установить с моей точки зрения класса макет, как, например:

$this->layout()->content = $result; 
require $layoutPath; 

Я был бы очень признателен, если кто-то может объяснить, как это должно быть сделано. Я не получаю нигде с документами или чтением учебников в Интернете. Кроме того, я немного зациклен на ZF1, поскольку это то, что написано в большинстве наших приложений. Спасибо за вашу помощь.

ответ

1

Попробуйте (не проверено, но доставит вас туда или очень близко).

В функции визуализации:

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; 
} 
Смежные вопросы