| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344 |
- <?php
- /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
- namespace eYaf;
- /**
- * Layout class used for render layouts and views.
- *
- * Layout class allows to use of a base layout skeleton and render views inside
- * this layout template.
- * The concept is to not render and display the view template directly but storing it
- * in {@link $content} property. Then will render the skeleton layout and
- * pass the {@link $content} property to it.
- * <code>
- * application/views/layouts/front.phtml
- *
- * <html>
- * <head>
- * <title><?php echo $title ?></title>
- * </head>
- * <body>
- * <?= $_content_ // This is where your view from each action
- * will be displayed ?>
- * </body>
- * </html>
- * </code>
- *
- * If no layout is defined then returns the renderd action view template.
- *
- * Also allows to set variable to views and access them from the base
- * skeleton layout. In above layout $title variable is set to title tag.
- * Then in a view template we can set the value for $title variable.
- * <code>
- * application/views/index/index.phtml
- *
- * <?php $this->title = "Index Action" ?>
- * <h1>Index Action</h1>
- * </code>
- *
- * @author Andreas Kollaros <[email protected]>
- *
- */
- class Layout implements \Yaf\View_Interface
- {
- /**
- * The template engine to render views and layout templates.
- *
- * Default engine is Yaf\View\Simple
- *
- * @var Yaf\View\Simple
- */
- public $engine;
- /**
- * Options to be passed to template engine.
- *
- * @var array
- */
- protected $options=array();
- /**
- *
- */
- protected $layout_path;
- /**
- * The name of layout file without extension.
- *
- * @var string
- */
- protected $layout = 'layout';
- /**
- * Handles the rendered action view data.
- *
- * @var string
- */
- protected $content;
- /**
- * Array with assigned template variables.
- *
- * @var array
- */
- protected $tpl_vars = array();
- /**
- * Template directory.
- *
- * @var string
- */
- protected $tpl_dir;
- /**
- * Constructor
- *
- * @param array $options key/value pair of options to be assigned to
- * template engine.
- *
- * @return void
- */
- public function __construct($path, $options=array())
- {
- $this->layout_path = $path;
- $this->options = $options;
- }
- /**
- * Return the instance of a template engine.
- *
- * @return Yaf\View\Simple
- */
- protected function engine()
- {
- $this->engine = $this->engine ?: new \Yaf\View\Simple(
- $this->tpl_dir,
- $this->options
- );
- return $this->engine;
- }
- /**
- * Create engine instance and set the path of views and layout templates.
- *
- * Layout path is set by default to layout directory inside views path.
- *
- * @param string $path The directory to set as the path.
- *
- * @return void
- */
- public function setScriptPath($path)
- {
- if (is_readable($path)) {
- $this->tpl_dir = $path;
- $this->engine()->setScriptPath($path);
- // Overwirte layouts path by setting it where views path is.
- // This will force layout in modules to be placed in
- // modules/views/layouts directory
- $this->layout_path = $path . "/layouts";
- return true;
- }
- throw new \Exception("Invalid path: {$path}");
- }
- /**
- * Getter method for views path.
- *
- * @return string
- */
- public function getScriptPath()
- {
- return $this->engine()->getScriptPath();
- }
- /**
- * Setter for Layout::layout variable
- *
- * @param string $name the name of layout file without extension.
- *
- * @return void
- */
- public function setLayout($name)
- {
- $this->layout = $name;
- }
- /**
- * Getter for Layout::layout variable
- *
- * @return string the name of layout file without extension
- */
- public function getLayout()
- {
- return $this->layout;
- }
- public function setLayoutPath($path)
- {
- $this->layout_path = $path;
- }
- /**
- * Get full layout path with filename and extension.
- *
- * @return string
- */
- public function getLayoutPath()
- {
- $config = \Yaf\Application::app()->getConfig()->get('application');
- return $this->layout_path . "/" . $this->layout . ".{$config->view->ext}";
- }
- /**
- * Assign a variable to the template
- *
- * @param string $name The variable name.
- * @param mixed $value The variable value.
- *
- * @return void
- */
- public function __set($name, $value)
- {
- $this->assign($name, $value);
- }
- /**
- * Allows testing with empty() and isset() to work
- *
- * @param string $name
- *
- * @return boolean
- */
- public function __isset($name)
- {
- return (null !== $this->engine()->$name);
- }
- /**
- * Allows unset() on object properties to work
- *
- * @param string $name
- *
- * @return void
- */
- public function __unset($name)
- {
- $this->engine()->clear($name);
- }
- /**
- * Assign variables to the template
- *
- * Allows setting a specific key to the specified value, OR passing
- * an array of key => value pairs to set en masse.
- *
- * @see __set()
- *
- * @param string|array $name The assignment strategy to use (key or
- * array of key => value pairs)
- * @param mixed $value (Optional) If assigning a named variable,
- * use this as the value.
- *
- * @return void
- */
- public function assign($name, $value = null)
- {
- $this->tpl_vars[$name] = $value;
- $this->engine()->assign($name, $value);
- }
- /**
- * Assign variables by reference to the template
- *
- */
- public function assignRef($name, &$value)
- {
- $this->tpl_vars[$name] = $value;
- $this->engine()->assignRef($name, $value);
- }
- /**
- * Clear all assigned variables
- *
- * Clears all variables assigned to Yaf\View either via
- * {@link assign()} or property overloading
- * ({@link __get()}/{@link __set()}).
- *
- * @return void
- */
- public function clearVars() {
- $this->tpl_vars = array();
- $this->engine()->clear();
- }
- /**
- * Processes a view and returns the output.
- *
- * This method called once from controller to render the given view.
- * So render the view at $this->content property and then render the
- * layout template.
- *
- * @param string $tpl The template to process.
- * @param array $tpl_vars Additional variables to be assigned to template.
- *
- * @return string The view or layout template output.
- */
- public function render($tpl, $tpl_vars=array()) {
- $tpl_vars = array_merge($this->tpl_vars, $tpl_vars);
- $this->content = $this->engine()->render($tpl, $tpl_vars);
- // if no layout is defined,
- // return the rendered view template
- if (null == $this->layout) {
- return $this->content;
- }
- // If we assign some variables into view template, then maybe we need
- // them to layout view.
- // Hack??
- // Get template vars from view via Reflection class and assign them to
- // layout view
- $ref = new \ReflectionClass($this->engine());
- $prop = $ref->getProperty('_tpl_vars');
- $prop->setAccessible(true);
- $view_vars = $prop->getValue($this->engine());
- $tpl_vars = array_merge($tpl_vars, $view_vars);
- $tpl_vars['_content_'] = $this->content;
- return $this->engine()->render(
- $this->getLayoutPath(),
- $tpl_vars
- );
- }
- /**
- * Directly display the constens of a view / layout template.
- *
- * @param string $tpl The template to process.
- * @param array $tpl_vars Additional variables to be assigned to template.
- *
- * @return void
- */
- public function display($tpl, $tpl_vars=array()) {
- echo $this->render($tpl, $tpl_vars);
- }
- }
|