Темплейт клас подобряване

Анонимен това е моят код който с четене и пробване сглобих. Колегата незнам как иска да изглежда кода в контролерите от цитата ми. Реално той иска да пиша в темплейта кой да въвежда а аз директно на 1 ниво си подавам в кода какво да ми зарежда. Иска да го автоматизирам за всичките контролери затова ме кара да го въвеждам в темплейта кой е следващият и директно да го зарежда. Така само че ми се струва че губя възможността на някоя страница да не изграждам следващият контролер от темплейта @show('head') а примерно да генерирам точно определен друг код. Но можеби не съм разбрал идеята на колегата напълно, защото не съм го виждал кода му как ще изглежда по неговото виждане в контролерите и самите темплейтчета.

dakata__92 каза:
Това е друго нещо, както се получи. Има последователна структура!
В контролерите на страниците изграждам така:
PHP:
$template = $this->getTemplateEngine();
		return $template->render(MODEL_VIEW_FOLDER.'main.php',array(
			'head' => $template->render(MODEL_VIEW_FOLDER.'mainhead.php'), 
			'body' => $template->render(MODEL_VIEW_FOLDER.'mainbody.php',array(
				'header' => 'Еdit page<br>'.$template->render(MODEL_VIEW_FOLDER.'header.php',array(
					'navigation' => $links
				)),
				'footer' => $template->render(MODEL_VIEW_FOLDER.'footer.php')
			))
		));

В темплейта правя така:

PHP:
<!DOCTYPE html>
<html>
<head>
<?php print $head; ?>
</head>
<body>
<?php print $body; ?>
</body>
</html>

Рендера ми е:

PHP:
public function render($__file, Array $__data = Array())
	{
		if ($this->isFileExists($__file)) {
			if ($__data) {
				extract($__data);
			}
			ob_start();
			include($__file);
			$__outputBuffer = ob_get_contents();
			ob_end_clean();
			return $__outputBuffer;
		}
		return false;
	}

И мисля, че така е във пъъъти по-добре!
 
Не, неговия код вкарва само променливите, т.е темплейта му си остава

HTML:
<body><?=$var;?>

Докато моя, при следния код генерира горния

HTML:
<body>{{$var}}

А ако искаш, може и в темплейта да инклудваш други със @show
Не е задължително да го използваш това @show, можеш да минеш и без него. И ето така ти изглежда кода в контролера:

Код:
return $template->render('file.html',['var'=>123]);
 
lam3r4370 каза:
Не, неговия код вкарва само променливите, т.е темплейта му си остава

HTML:
<body><?=$var;?>

Докато моя, при следния код генерира горния

HTML:
<body>{{$var}}

А ако искаш, може и в темплейта да инклудваш други със @show
Не е задължително да го използваш това @show, можеш да минеш и без него. И ето така ти изглежда кода в контролера:

Код:
return $template->render('file.html',['var'=>123]);

Добре де, print "<body><?=$var;?>"; Тоест по-точно print $find['action']->getViewResponse(); във FrontController-a ми извежда същият текст. Тоест ми праща в браузъра <body><?=$var;?> а не <body>стойността на $var. Честно казано разликата между твоят и моят код в момента е, че моят налага използването на <?php print $var; ?> в темплейта и това налага той да е с разширение .php . Разбрах, че искаш да отделя стринга от изпълнителният код, но нещо не ми с еполучева с твоят код. Не ми замества променливите. Нещо не правя както трябва. Какво се предполага че означава <?=$var;?> оцветеното в червено. хубаво кратките тагове въвеждам но нищо не ми се изпълнява просто ми го връща това като стринг.
 
dakata__92 каза:
Какво мислите за този клас?
http://chadminick.com/articles/simple-php-template-engine.html#sthash.jnggect5.dpbs
Май е по-добър от моят.

:idea: :)

Според мен този клас е супер. Изключително прост и лесен за използване. Не виждам никакъв смисъл от някакви регулярни изрази и други подобни, при положение че не получаваш никакви предимства а дори напротив.
 
teroristd каза:
dakata__92 каза:
Какво мислите за този клас?
http://chadminick.com/articles/simple-php-template-engine.html#sthash.jnggect5.dpbs
Май е по-добър от моят.

:idea: :)

Според мен този клас е супер. Изключително прост и лесен за използване. Не виждам никакъв смисъл от някакви регулярни изрази и други подобни, при положение че не получаваш никакви предимства а дори напротив.
Поради тази причина и аз замених file_get_contents със include и този вид логика. Просто идеята на колегата ми се струва и хубава и лоша и силно се замислям дали не е по-доброто решение. Просто ми трябва стабилно обяснение или по-скоро стабилен пример с работещ код и прочие.
 
PHP:
public function render($file, array $data) {
        if (!$this->isFileExists($file)) {
               throw new Exception('file does not exist');
        }
        ob_start();
        extract($data);
        include $file;
        $ob = ob_get_contents();
        ob_end_clean();
        $ob = preg_replace('/{{(.*)}}/g', "<?=$2;?>", $ob);
        $callback = function($matches) use($data) {
                return $this->render($matches[0], $data);
        }
        $ob = preg_replace_callback('/@show\(\'(.*)\'\)/g', $callback, $ob);
        file_put_contents('compiled/'.$file, $ob);
        include('template/'.$file');
}

Не съобразих, че няма да ти го изпълни при предния вариант, сега вече го записва във папка compiled(направи си я) и така го include-ва
 
lam3r4370 каза:
PHP:
public function render($file, array $data) {
        if (!$this->isFileExists($file)) {
               throw new Exception('file does not exist');
        }
        ob_start();
        extract($data);
        include $file;
        $ob = ob_get_contents();
        ob_end_clean();
        $ob = preg_replace('/{{(.*)}}/g', "<?=$2;?>", $ob);
        $callback = function($matches) use($data) {
                return $this->render($matches[0], $data);
        }
        $ob = preg_replace_callback('/@show\(\'(.*)\'\)/g', $callback, $ob);
        file_put_contents('compiled/'.$file, $ob);
        include('template/'.$file');
}

Не съобразих, че няма да ти го изпълни при предния вариант, сега вече го записва във папка compiled(направи си я) и така го include-ва

Тук не трябва ли двете папки да са еднакви (compiled)?
PHP:
file_put_contents('compiled/'.$file, $ob);
        include('template/'.$file');
 

Back
Горе