Шаблонизация PHP

sychoboy

Новичок
есть class main

есть функция GetTitle();

архитектура получается примерно такой

страница index.php вызывает header.php(файл шаблона) и footer.php(файл шаблона)

$KAKUT - объект класса main.
/*************************************/
<?
require($_SERVER["DOCUMENT_ROOT"]."/dir/header.php");
$KAKUT->InitTemplateHeader();
$KAKUT->SetTitle("Главная");
?>


<?
require($_SERVER["DOCUMENT_ROOT"]."/dir//footer.php");
$KAKUT->InitTemplateFooter();
?>

/*************************/
Проблема, в коде шаблона

листинг header.php
/**************************/


<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
<head>

<title><?echo $KAKUT->ShowTitle();?></title>

<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />


<?=$KAKUT->ShowHead();?>
<meta name="viewport" content="initial-scale=1, width=device-width, maximum-scale=1, minimum-scale=1, user-scalable=no">

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.js"></script>


<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->



<link href="<?=$KAKUT->GetTemplatePath();?>/jquery.fancybox.css" type="text/css" rel="stylesheet">

<link rel="stylesheet" type="text/css" href="<?=$KAKUT->GetTemplatePath();?>/css/owl.css" />
<link rel="stylesheet" type="text/css" href="<?=$KAKUT->GetTemplatePath();?>/css/kakut.css" />

<link href="http://allfont.ru/allfont.css?fonts=bookman-old-style-bold" rel="stylesheet" type="text/css" />

<link rel="stylesheet" href="<?=$KAKUT->GetTemplatePath();?>/css/font-awesome.min.css">


</head>
<body>


и тд...
/*******************************/

$KAKUT->ShowTitle() возвращает $KAKUT->titile

аналог функции GetTitle, только с буферизацией. Но буферизация не срабатывает.


public function AddBufferContent($callback)
{
ob_start();

$args = array();
$args_num = func_num_args();
if($args_num>1)
for($i=1; $i<$args_num; $i++)
$args[] = func_get_arg($i);



$this->buffer_content[] = ob_get_contents();
//$this->buffer_content[] = "";
$this->buffer_content_type[] = array("F"=>$callback, "P"=>$args);
$this->buffer_man = true;
$this->auto_buffer_cleaned = false;

$this->buffer_man = false;
$this->buffered = true;



if (is_object($GLOBALS["KAKUT"]))
{
$cnt = count($this->buffer_content_type);
for ($i = 0; $i < $cnt; $i++)
{
$this->buffer_content[$i*2+1] = call_user_func_array($this->buffer_content_type[$i]["F"], $this->buffer_content_type[$i]["P"]);
}
}

$content = implode("", $this->buffer_content) . $content;

ob_end_clean();
return $content;


}


public function ShowTitle($property_name="title")
{
return $this->AddBufferContent(array(&$this, "GetTitle"), $property_name);
}





 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Гугли, дебаж.

"Не срабатывает" это не ошибка. Включи вывод ошибок, смотри, есть ли что-то в логах.
 

WMix

герр M:)ller
Партнер клуба
PHP:
ob_start();

$args = array();
$args_num = func_num_args();
if($args_num>1)
for($i=1; $i<$args_num; $i++)
$args[] = func_get_arg($i);
// ^^ и что из перечисленных комманд создает content??
$this->buffer_content[] = ob_get_contents();
 

sychoboy

Новичок
PHP:
ob_start();

$args = array();
$args_num = func_num_args();
if($args_num>1)
for($i=1; $i<$args_num; $i++)
$args[] = func_get_arg($i);
// ^^ и что из перечисленных комманд создает content??
$this->buffer_content[] = ob_get_contents();
ob_get_contents(); ничего не возвращает.

вот print_r объекта

[buffer_content] => Array
(
[0] =>
[1] =>
)

[buffer_content_type] => Array
(
[0] => Array
(
[F] => Array
(
[0] => Kakutrix Object
*RECURSION*
[1] => GetTitle
)

[P] => Array
(
[0] => title
[1] => 1
)

)

)
 

sychoboy

Новичок
саму функцию можно упростить,

задача получать значение допустим метода Set из любого места страницы, и отправлять его естественно выше,

то есть к прмеру

echo $test->ShowA();

//....some code

$test->SetA("test");


естественно методы show работают с буферизацией и с методом ::GetA()
 

WMix

герр M:)ller
Партнер клуба
для размышления
PHP:
<?php

ob_start();
echo "чтонить";
$content = ob_get_contents();
echo "blabla";
ob_end_clean();

echo "output---\n". $content;
 

sychoboy

Новичок
<?
Попробовать включить мозг?…
php
class Test{
public $a;
public function get(){
echo $this->a;
}

public function set($a){
$this->a = $a;
}

public function show($proprety_name = "a"){
$content = $this->buffer("get");
echo "output---\n". $content;
}

public function buffer($callback){

ob_start();

//вызываем функцию
call_user_func(array(&$this, $callback));

$content = ob_get_contents();

ob_end_clean();

return $content;
}
}

$t = new Test;

$t->show();

$t->set("тест");





?>

если $t->show(); и $t->set("тест"); поменять местами, все работает. но задача, чтобы $t->show() работал именно перед $t->set("тест").
 

WMix

герр M:)ller
Партнер клуба
тебе не нужен буфер, ты о чемто другом, типа "отлженый вызов"... show должно исполняться после set. там и curring и декоратор. пока сам не поймешь что хочешь и стоит ли оно того, врятли тебе можно чемто помочь
 

sychoboy

Новичок
тебе не нужен буфер, ты о чемто другом, типа "отлженый вызов"... show должно исполняться после set. там и curring и декоратор. пока сам не поймешь что хочешь и стоит ли оно того, врятли тебе можно чемто помочь
Да вы правы, мне нужен отложенный вызов функции.
 

antson

Новичок
Партнер клуба
@sychoboy, проблема в архитектуре.
вью должна выводить после того как отработал контролер.
нельзя сделать так

$a = null;
echo $a;
$a = 'Hello word';
 

sychoboy

Новичок
Воспользуйтесь схемой
PHP:
ob_start(function($cont){
return str_replace(['%PLACEHOLDER%'],['ЗНАЧЕНИЕ-A'],$cont);
});


<title>%PLACEHOLDER%</title>
@sychoboy, проблема в архитектуре.
вью должна выводить после того как отработал контролер.
нельзя сделать так

$a = null;
echo $a;
$a = 'Hello word';

тебе не нужен буфер, ты о чемто другом, типа "отлженый вызов"... show должно исполняться после set. там и curring и декоратор. пока сам не поймешь что хочешь и стоит ли оно того, врятли тебе можно чемто помочь

Спасибо всем за советы и помощь.

Может кому пригодиться.

Я решил проблему след образом.

Как и описывал ранее, тело страницы

PHP:
<?
require($_SERVER["DOCUMENT_ROOT"]."/kakutrix/header.php");
$KAKUT->InitTemplateHeader();

//можно использовать сколько угодно раз с любого места страницы
$KAKUT->SetPageProp("title","description","keywords");

//можно использовать сколько угодно раз с любого места страницы
$KAKUT->AttachCss("/upload/css.css");
?>


<?

require($_SERVER["DOCUMENT_ROOT"]."/kakutrix/footer.php");
$KAKUT->InitTemplateFooter();
//$KAKUT->debug_arr($KAKUT);
?>
а теперь решение

PHP:
  .............................

    public function InitTemplateFooter(){
        $temp = $this->GetTemplatePath();
        require($_SERVER['DOCUMENT_ROOT'] . $temp . "/footer.php");
      
        //подключаем в header свойства страницы
        $this->AddPageProp();
      
        //подключаем в header все файлы css
        $this->AddHeadCss();
      
    }

    public function AddPageProp(){
        $out = ob_get_contents();
        ob_end_clean();

        $html = '
        <title>' . $this->title . '</title>
        ';
        $html .= '
        <meta name="robots" content="index, follow" />
        ';
        $html .= '
        <meta name="description" content="' . $this->meta["DESCRIPTION"] . '"/>
        ';
        $html .= '
        <meta name="keywords" content="' . $this->meta["KEYWORDS"] . '"/>
        ';
      
        echo $html ;
      
        $this->ShowCss(); //функция запускает буффер
      
        echo $out;
    }
........................................
header.php - файл шаблона
PHP:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
<head>
    <?
        echo $KAKUT->GetContentType();
    ?>
     <meta name="viewport" content="initial-scale=1, width=device-width, maximum-scale=1, minimum-scale=1, user-scalable=no">
     <?
        echo $KAKUT->ShowHead(); //функция запускает буффер
        echo $KAKUT->TemplateCss();
     ?>
про сеттеры не пишу, вроде и так понятно.
 
Последнее редактирование:
Сверху