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

Вакансии в Москве: Ведуший PHP разработчик 110-150к

Тема в разделе "Вопросы по программированию на РНР", создана пользователем sychoboy, 16 мар 2017.

  1. sychoboy

    sychoboy Новичок

    Сообщения:
    14
    Adress:
    Volgograd, Russia
    Country:
    Location on Map:
    есть 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);
    }





     
  2. c0dex

    c0dex web.dev 2002-... Команда форума

    Сообщения:
    7.271
    Ваш город:
    Moscow, Russia
    Adress:
    Moscow, Russia
    Country:
    Location on Map:
  3. sychoboy

    sychoboy Новичок

    Сообщения:
    14
    Adress:
    Volgograd, Russia
    Country:
    Location on Map:
    помогите с буферизацией, гуглю несколько дней
     
  4. c0dex

    c0dex web.dev 2002-... Команда форума

    Сообщения:
    7.271
    Ваш город:
    Moscow, Russia
    Adress:
    Moscow, Russia
    Country:
    Location on Map:
    Гугли, дебаж.

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

    WMix герр M:)ller

    Сообщения:
    5.445
    Adress:
    Waiblingen, Germany
    Country:
    Location on Map:
    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();
     
  6. sychoboy

    sychoboy Новичок

    Сообщения:
    14
    Adress:
    Volgograd, Russia
    Country:
    Location on Map:
    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
    )

    )

    )
     
  7. sychoboy

    sychoboy Новичок

    Сообщения:
    14
    Adress:
    Volgograd, Russia
    Country:
    Location on Map:
    саму функцию можно упростить,

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

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

    echo $test->ShowA();

    //....some code

    $test->SetA("test");


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

    WMix герр M:)ller

    Сообщения:
    5.445
    Adress:
    Waiblingen, Germany
    Country:
    Location on Map:
    для размышления
    PHP:
    <?php

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

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

    sychoboy Новичок

    Сообщения:
    14
    Adress:
    Volgograd, Russia
    Country:
    Location on Map:
    получаем output--- чтонить

    если честно легче мне не стало.

    как это завязать все с функциями
     
  10. AnrDaemon

    AnrDaemon Продвинутый новичок

    Сообщения:
    3.656
    Ваш город:
    Moscow, Russia
    Adress:
    Moscow, Russia
    Country:
    Location on Map:
    Попробовать включить мозг?…
     
  11. WMix

    WMix герр M:)ller

    Сообщения:
    5.445
    Adress:
    Waiblingen, Germany
    Country:
    Location on Map:
  12. sychoboy

    sychoboy Новичок

    Сообщения:
    14
    Adress:
    Volgograd, Russia
    Country:
    Location on Map:
    <?
    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("тест").
     
    AnrDaemon нравится это.
  13. WMix

    WMix герр M:)ller

    Сообщения:
    5.445
    Adress:
    Waiblingen, Germany
    Country:
    Location on Map:
    тебе не нужен буфер, ты о чемто другом, типа "отлженый вызов"... show должно исполняться после set. там и curring и декоратор. пока сам не поймешь что хочешь и стоит ли оно того, врятли тебе можно чемто помочь
     
  14. sychoboy

    sychoboy Новичок

    Сообщения:
    14
    Adress:
    Volgograd, Russia
    Country:
    Location on Map:
    Да вы правы, мне нужен отложенный вызов функции.
     
  15. Ирокез

    Ирокез бессмертный пони Команда форума

    Сообщения:
    304
    Ваш город:
    Минск
    Adress:
    Minsk, Belarus
    Country:
    Location on Map:
    Воспользуйтесь схемой
    PHP:

    ob_start
    (function($cont){
    return 
    str_replace(['%PLACEHOLDER%'],['ЗНАЧЕНИЕ-A'],$cont);
    });


    <
    title>%PLACEHOLDER%</title>


     
  16. antson

    antson Новичок

    Сообщения:
    971
    Ваш город:
    Россия, Липецк
    Adress:
    Lipetsk, Russia
    Country:
    Location on Map:
    @sychoboy, проблема в архитектуре.
    вью должна выводить после того как отработал контролер.
    нельзя сделать так

    $a = null;
    echo $a;
    $a = 'Hello word';
     
  17. sychoboy

    sychoboy Новичок

    Сообщения:
    14
    Adress:
    Volgograd, Russia
    Country:
    Location on Map:


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

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

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

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

    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();
         ?>
    про сеттеры не пишу, вроде и так понятно.
     
    Последнее редактирование: 20 мар 2017 в 14:28