<?php namespace Fury\Modules\Template; /** * Class: Template * @author Eugene Sukhodolskiy <e.sukhodolskiy@outlook.com> * @version 0.1 * Date: 10.01.2020 */ class Template implements TemplateInterface{ protected static $driver = false; protected $parent; protected $template_childs = []; public $templates_folder; public $project_folder; protected $template_html; public $template_name; public $template_file; public $template_content; protected $template_extends = ['flag' => false, 'srcname' => '', 'name' => '', 'object' => NULL]; public $was_drawn = false; protected $inside_data; public static $all_templates = []; public function __construct($project_folder, $templates_folder, $parent = NULL){ $this -> project_folder = $project_folder; $this -> templates_folder = $templates_folder; $this -> parent = $parent; self::$all_templates[] = $this; if(self::$driver){ self::$driver -> event_create_template_instance($this); } } public static function set_driver($driver){ self::$driver = $driver; } public function make($template_name, $inside_data = []){ $template = $this -> t_path($template_name); if(self::$driver){ self::$driver -> event_start_making($template_name, $template, $inside_data, $this); } $this -> inside_data = $inside_data; $this -> heir_manipulation_run(); ob_start(); extract($this -> inside_data); include $template; $html = ob_get_clean(); $this -> template_html = $html; $this -> template_name = $template_name; $this -> template_file = $template; if($this -> template_extends['flag']){ $this -> template_extends['object'] -> set_content($html); $this -> template_html = $this -> template_extends['object'] -> make($this -> template_extends['name']); } $this -> was_drawn(); return $this -> template_html; } protected function t_path($template_name){ if(strpos($template_name, '.php') === false){ $template_name .= '.php'; } return $this -> project_folder . '/' . $this -> templates_folder . '/' . $template_name; } public function get_html(){ return $this -> $template_html; } public function join($child_template_name, array $inside_data = []){ if(self::$driver){ self::$driver -> event_start_joining($child_template_name, $inside_data); } list($child_template, $child_template_name) = $this -> create_template_object($child_template_name); $this -> template_childs[$child_template_name] = $child_template; return $child_template -> make($child_template_name, $inside_data); } private function heir_manipulation_run(){ $methname = 'heir_manipulation'; if(method_exists($this, $methname)){ $returned_data = $this -> $methname($this -> inside_data); if(is_array($returned_data)) { $this -> inside_data = $returned_data; } } } protected function create_template_object($child_template_name){ if(strpos($child_template_name, ':')){ list($child_template_class, $child_template_name) = explode(':', $child_template_name); } if(!isset($child_template_class)){ $child_template = new Template($this -> project_folder, $this -> templates_folder, $this); }else{ $child_template = new $child_template_class($this -> project_folder, $this -> templates_folder, $this); } return [$child_template, $child_template_name]; } public function parent(){ return $this -> parent; } public function childs(){ return $this -> template_childs; } public function extends_from($extends_template_name){ $this -> template_extends['flag'] = true; $this -> template_extends['srcname'] = $extends_template_name; list($child_template, $child_template_name) = $this -> create_template_object($extends_template_name); $this -> template_extends['name'] = $child_template_name; $this -> template_extends['object'] = $child_template; $this -> template_childs[$this -> template_extends['srcname']] = $child_template; } public function set_content($content){ $this -> template_content = $content; } public function content(){ return $this -> template_content; } public function get_inside_data(){ return $this -> inside_data; } private function was_drawn(){ $this -> was_drawn = true; if(self::$driver){ self::$driver -> event_ready_template($this -> template_name, $this); } } }