Автор Тема: Проста шаблонна система  (Прочетена 6807 пъти)

0 Потребители и 1 Гост преглежда(т) тази тема.

wuser

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 85
  • -Получени: 49
  • Публикации: 2761
Проста шаблонна система
« -: 21 Октомври 2011, 10:56:18 »
Тази тема обсъжда „Проста шаблонна система“.
Автор:  HanKrum.
« Последна редакция: 23 Март 2015, 23:01:38 от Avalanche »
Мъдростта на патилото
Perl Monks: PHP - it's "training wheels without the bike" -- Randal L. Schwartz


Дееба... чувствам се все едно обяснявам на майка ми как да си отвори пощата
"не работи"
WTF?!?!? к'во значи че не работи?
Не ти се компилира, дава ти грешка, вади ти грешни резултати, компютърът ти се изключва като го напишеш или на целия квартал му спира тока?
Stilgar

wuser

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 85
  • -Получени: 49
  • Публикации: 2761
Re: Проста шаблонна система
« Отговор #1 -: 21 Октомври 2011, 11:00:45 »
Така, както ти казах имам забележка. Тези <option> трябваше да бъдат в другия файл. Нали това е целта на шаблоните. Да се раздели кода от html, за да може всеки да си работи неговата част. Така направено, отново ги омесваш. Но това е по-скоро от недооглеждане. Идеята е представена страхотно.
Мъдростта на патилото
Perl Monks: PHP - it's "training wheels without the bike" -- Randal L. Schwartz


Дееба... чувствам се все едно обяснявам на майка ми как да си отвори пощата
"не работи"
WTF?!?!? к'во значи че не работи?
Не ти се компилира, дава ти грешка, вади ти грешни резултати, компютърът ти се изключва като го напишеш или на целия квартал му спира тока?
Stilgar

mgrozdanov

  • Full Member
  • ***
  • Благодарности
  • -Казани: 1
  • -Получени: 0
  • Публикации: 136
Re: Проста шаблонна система
« Отговор #2 -: 21 Октомври 2011, 11:05:36 »
Сега ако подкарате и видеото да върви, ще е прекрасно  :)

wuser

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 85
  • -Получени: 49
  • Публикации: 2761
Re: Проста шаблонна система
« Отговор #3 -: 21 Октомври 2011, 11:29:33 »
Темата се заключва временно до отстраняване на гаден проблем със звука…

Проблема отстранен, темата се отключва.
« Последна редакция: 21 Октомври 2011, 15:27:01 от wuser »
Мъдростта на патилото
Perl Monks: PHP - it's "training wheels without the bike" -- Randal L. Schwartz


Дееба... чувствам се все едно обяснявам на майка ми как да си отвори пощата
"не работи"
WTF?!?!? к'во значи че не работи?
Не ти се компилира, дава ти грешка, вади ти грешни резултати, компютърът ти се изключва като го напишеш или на целия квартал му спира тока?
Stilgar

HanKrum

  • Гост
Re: Проста шаблонна система
« Отговор #4 -: 21 Октомври 2011, 15:58:08 »
Така, както ти казах имам забележка. Тези <option> трябваше да бъдат в другия файл. Нали това е целта на шаблоните. Да се раздели кода от html, за да може всеки да си работи неговата част. Така направено, отново ги омесваш. Но това е по-скоро от недооглеждане. Идеята е представена страхотно.
Абе идеята ми беше променливата $opt да бъде нещо такова:
Код: PHP
  1. for ($p = 0;$p < 10;$p++) {
  2.     $opt .= '<option value="' . $p . '">' . $p . '. poreden red</option>';
  3. }
  4.  
... но ме домързя :)

Другия път, ще ползвам слушалки с микрофон. Направих го на лаптопа и ползвах вградения микрофон и колкото и да се стараех да натискам тихо клавишите, те пак кънтяха пък и шума май е доста голям. ;)
« Последна редакция: 21 Октомври 2011, 22:31:11 от HanKrum »

edembg

  • Newbie
  • *
  • Благодарности
  • -Казани: 0
  • -Получени: 2
  • Публикации: 47
Re: Проста шаблонна система
« Отговор #5 -: 21 Октомври 2011, 21:02:39 »
Добър пример. Ети и моят:
<?php
/*
  ****************************************************************************
  * template class                                                           *
  * Version 3                                                                *
  *                                                                          *
  * Copyright (C) 2004 - 2005 by Roumen Georgiev - edembg@edemarts.com       *
  *                                                                          *
  * Author:                                                                  *
  * Roumen Georgiev, Sofia, Bulgaria, edembg@edemarts.com                    *
  *                                                                          *
  ****************************************************************************
*/

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/*
Sintaxis

variables - <!--%VarName%--> or <!--%VarName[index]%-->

constants - [!--%ConstantName%--!]

if construct - {?if expression?} Action {?/if?}
{?if $c == 1?}PPPPP{?/if?}<br> {?if !$c?}NNNNN{?/if?}

loops {!loop indexName $VarName!} Action {!/loop!}
{!loop i $d!}
{?if {*index*}%2?} 1 {?/if?}{?if !{*index*}%2?} 0 {?/if?}<br>
<!--%d[i]%-->
{!/loop!}
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
class template
  
{
  var 
$vars = array(), $template$content;
  var 
$indent 0$indent_str "";
  var 
$loop_stack$loop_point;

   
  function 
template($template)
    {
    
$this->template $template;
    }
    
  
  function 
set_indent($indent)
    {
    
$this->indent $indent;
    
$this->indent_str "";
    for (
$i 0$i $indent$i++)
      {
      
$this->indent_str .= "\t";
      }
    }
  
  function 
inc_indent()
    {
    
$this->indent_str .= "\t";
    }
    
  function 
dec_indent()
    {
    
$this->indent_str substr($this->indent_str1);
    }
  function 
tbl_row_beg($prop "")
    {
    
$code $this->indent_str."<tr";
    if (
$prop != ""$code .= ' '.$prop;
    
$code .= ">\n";
    return (
$code);
    }
    
  function 
tbl_row_end()
    {
    
$code $this->indent_str."</tr>\n";
    return (
$code);
    }

  function 
table($values$property$row_prop = array())
    {
    
$code "";
    
$j 0;
    
$i 0;
    foreach (
$values as $bval)
      {
      
$this->dec_indent();
      if (
sizeof($row_prop) == 0$code .= $this->tbl_row_beg();
      else {
        
$code .= $this->tbl_row_beg($row_prop[$j]);
        
$j++;
        if (
$j == sizeof($row_prop)) $j 0;
        }
      
$this->inc_indent();
      foreach (
$bval as $sval)  
        {
        
$code .= $this->indent_str.'<td';
        if (
$property[$i] != ''$code .= ' '.$property[$i];
        
$code .= '>'.$sval."</td>\n";
        
$i++;
        if (
$i == sizeof($property)) $i 0;
        }
      
$this->dec_indent();
      
$code .= $this->tbl_row_end();
      
$this->inc_indent();
      }
    return (
$code);
    }
    
  function 
option($content$selected)
    {
    
$out "";
    foreach (
$content as $key => $val)
      {
      
$out .= $this->indent_str.'<option value="'.$key.'"';
      if (
in_array($key$selected)) $out .= ' selected="selected"';
      
$out .= '>'.$val.'</option>'."\n";
      }
    return (
$out);
    }
    
  function 
select($name$size$params$content$selected)  
    {
    
$ret $this->indent_str.'<select name="'.$name.'" size="'.$size.'"';
    if (
$params != ""$ret .= " ".$params;
    
$ret .= ">\n";
    
$this->inc_indent();
    
$ret .= $this->option($content$selected);
    
$this->dec_indent();
    
$ret .= "</select>\n";
    return (
$ret);
    }
  
  function 
image($path$alt,$height$width$border 0$align ""$end "")
    {
    
$image $this->indent_str.'<img src="'.$path.'" alt="'.$alt.'" height="'.$height.'" width="'.$width.'" border="'.$border.'"';
    if (
$align != ""$image .= ' align="'.$align.'"';
    
$image .= ' />'.$end;
    return(
$image);
    }

   function 
link($URL$label$class ""$title ""$target ""$end "")
    {
    
$javascript_event= (strtolower($label)=="delete") ? true false;
    
$res $this->indent_str.'<a href="'.$URL.'"';
    if (
$title != ""$res .= ' title="'.$title.'"';
    if (
$target != ""$res .= ' target="'.$target.'"';
    if (
$class != ""$res .= ' class="'.$class.'"';
    
$res .= ($javascript_event) ? " onClick='if (!confirm(\"Are you sure?\")){ return false;}'" "";
    
$res .= '>'.$label.'</a>'.$end;
    return (
$res);
    }

function checkbox($name$value$checked false$end "")
{
$res '<input type="checkbox" name="'.$name.'" value="'.$value.'"';
if ($checked$res .= ' checked';
$res .= '>'.$end;
return ($res);
}

 function 
input($type$name$value ""$size ""$extra ""$end "")
        {
        
$res '<input type="'.$type.'" name="'.$name.'"';
        if (
$value != ""$res .= ' value="'.$value.'"';
        if (
$size != ""$res .= ' size="'.$size.'"';
        if (
$extra != ""$res .= ' '.$extra;
        
$res .= '>'.$end;
        return (
$res);
        }


  function 
var_set($name$value)
    {
    
$this->vars[$name] = $value;
    }

function mk_eval($str)
{
// $obuf = "\$ev = (";
$obuf "(";
$buf explode(" "$str);
foreach ($buf as $val)
{
if (false === strpos($val"$")) $obuf .= $val;
else {
$val str_replace("$"""$val);
if ($pos strpos($val"["))
{
$c substr($val0$pos);
$d substr($val$pos);
$ev " \$this->vars[".$c."]".$d;
} else $ev " \$this->vars[".$val."]";
$obuf .= $ev." ";
}
}
$obuf .= ") ? true : false;";
//print $obuf."<br>\n";
return ($obuf);
}
    
  function 
compile()
    {
    
$this->content "";
    
$stack = array();
    
$cur_bool $wr true;
    
    
$fp fopen($this->template'r');
    if (!
$fp) return("Error opening template");
    while(!
FEOF($fp))
      {
      
$this->content .= fread($fp4096);
      }
    
fclose($fp);
//++++++++++++++++++++++++++++++++++++++++++++++++++
$this->loop_stack = array();
$this->loop_point 0;
$buf1 preg_split("[({!loop)|(/loop!})]"$this->content);
$this->content "";

foreach ($buf1 as $val)
{
$pos strpos($val"!}");
$r_pos strpos($val"{!");

if ($this->loop_point == && !$pos && false === $r_pos$this->content .= $val;
else {
if (!$pos && false === $r_pos$this->l_add($val);
else {
if ($pos)$this->l_push($val);
if (false !== $r_pos

if (!$pos$this->l_add($val); 
$this->l_pop(); 
} else if (!$pos)$this->l_add($val);
}
}
}
//++++++++++++++++++++++++++++++++++++++++++++++++++
//print $this->content;
$buf1 preg_split("[({\?if)|(/if\?})]"$this->content);
//print_r($buf1);
$this->content "";
//$count = 0;
foreach ($buf1 as $val)
{
//$count++;
//print "<br>".$count."<br>\n";
//if ($count > 9) print $val."<br>\n";
//print "<br>$count<br>------------<br>\nlen = ".strlen($val)."<br>".($cur_bool?"yes":"no")."<br>\n";
//var_dump($stack);
$pos strpos($val"?}");
$r_pos strpos($val"{?");
//if ($r_pos == strlen($val) - 2) $r_pos = false; 
if ($cur_bool && false === $pos && false === $r_pos$this->content .= $val;
else {
//print "<br>\n".$val."<br>\n";
if ($cur_bool)
{
if ($pos)
{
$sw $this->mk_eval(trim(substr($val0$pos)));
//var_dump($sw);
//print "<br>\n";
//print "\$sw = ".$sw."<br>\n";
eval("\$sw = ".$sw);
//if ($sw) print "true<br>\n";
//else print "false<br>\n";
if ($sw)
{
if (false === $r_pos
{
//print "Push1 -  $val  - $pos - $r_pos - ".strlen($val).($cur_bool ? " v" : " h")."<br>\n";
array_push($stack$sw);
$cur_bool $sw;
$this->content .= substr($val$pos 2);
} else {
//print "Out after Push1<br>\n";
$this->content .= str_replace("{?"""substr($val$pos 2));
}
$wr false;
} else {
if (false === $r_pos

//print "Push2 -  $val  - $pos - $r_pos - ".strlen($val).($cur_bool ? " v" : " h")."<br>\n";
// array_push($stack, $sw); 
array_push($stack$cur_bool); 
$cur_bool $sw
}
$wr false;
}

if ($wr)
{
if (false !== $r_pos)
{
if (sizeof($stack) > 0
{
//print "Pop1 - <br>\n";
$cur_bool array_pop($stack);
}
else $cur_bool true;
$this->content .= substr($val0$r_pos);
} else {
$this->content .= $val;
}
} else $wr true;
} else {
//print "pos = ".$pos.", r_pos = ".$r_pos.", N r_pos".strpos($val, "?}")."<br>\n";
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//var_dump($stack); print "<br>\n";
if (false !== $pos)
{
if (false === $r_pos

//print "Push3 -  $val  - $pos - $r_pos - ".strlen($val).($cur_bool ? " v" : " h")."<br>\n"; 
array_push($stack$cur_bool); 
}
} else {
if (false !== $r_pos
{
if (sizeof($stack) > 0

//print "Pop2 - $val  - $pos - $r_pos - ".strlen($val).($cur_bool ? " v" : " h")."<br>\n"; 
$cur_bool array_pop($stack); 
}
else $cur_bool true;
}

}
/*
if (false !== $pos)
{
if (false === $r_pos) 

print "Push3 -  $val  - $pos - $r_pos - ".strlen($val).($cur_bool ? " v" : " h")."<br>\n"; 
array_push($stack, $cur_bool); 
}
}
if (false !== $r_pos) 
{
if (sizeof($stack) > 0) 

print "Pop2 - $val  - $pos - $r_pos - ".strlen($val).($cur_bool ? " v" : " h")."<br>\n"; 
$cur_bool = array_pop($stack); 
}
else $cur_bool = true;
}
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
}
}
}
//++++++++++++++++++++++++++++++++++++++++++++++++++
//print $this->content;
    
$buf1 explode("<!--%"$this->content);
    
$this->content "";
    foreach (
$buf1 as $value
    
{
      if (!strpos($value"%-->")) $this->content .= $value;
    
  else {
        
$buf2 explode("%-->"$value);

if ($pos strpos($buf2[0], "["))
{
$c substr($buf2[0], 0$pos);
$d substr($buf2[0], $pos);
$ev "\$ev = \$this->vars['".$c."']".$d.";";
} else $ev "\$ev = \$this->vars['".$buf2[0]."'];";
//print $ev;

eval($ev);
$this->content .= $ev.$buf2[1];
    
  }
    
}
    

    
$buf1 explode("[!--%"$this->content);
    
$this->content "";
    foreach (
$buf1 as $value)
    
{
    
if (!strpos($value"%--!]")) $this->content .= $value;
    
else {
    
$buf2 explode("%--!]"$value);
    
$ev "\$ev = @constant(\"".$buf2[0]."\");";
    
eval($ev);
    
$this->content .= $ev.$buf2[1];
    
}
    
}
    return (
$this->content);
    }
    
function l_push($val)
{
$this->loop_stack[$this->loop_point] = str_replace("{!""",$val);
$this->loop_point++;
}

function l_pop()
{
$this->loop_point--;

$buf explode("!}"$this->loop_stack[$this->loop_point]);

$buf1 explode(" "trim($buf[0]));
$leter trim($buf1[0]);
/*
$ev = "\$count = @sizeof(\$this->vars['".str_replace("$", "", $buf1[1])."']);";
eval($ev);
$buf2 = "";
for ($i = 0; $i < $count; $i++)
{
$tmp = str_replace("[".$leter."]", "[".$i."]", $buf[1]);
// $buf2 .= str_replace("[".$leter."]", "[".$i."]", $buf[1]);
$buf2 .= str_replace("{*index*}", $i, $tmp);
}
*/
$ev "\$l_var = \$this->vars['".str_replace("$"""$buf1[1])."'];";
eval($ev);
$buf2 "";

if (is_array($l_var) && sizeof($l_var) != 0)
{
foreach ($l_var as $i => $a)
{
$tmp str_replace("[".$leter."]""[".$i."]"$buf[1]);
$buf2 .= str_replace("{*index*}"$i$tmp);
}
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
if ($this->loop_point != 0
{
$this->l_add($buf2);
} else {
$this->content .= $buf2;
}
unset($this->loop_stack[$this->loop_point]);
}

function l_add($val)
{
$this->loop_stack[$this->loop_point 1] .= str_replace("{!""",$val);
}
//==============OLD FUNCTIONS============================================================
function opt_tag($name$size$extra ""$content$selected$disabled 0)
    {
    
$res '<select name="'.$name.'" size="'.($size == "" || $size == 01:$size).'"';
    if (
$extra != ""$res .= $extra;
    if (
$disabled != $res .= ' disabled';
    
$res .= ">\n";
    
$res .= $this->option($content$selected);
    
$res .= "</select>\n";
    return 
$res;
    }


  }
?>
Също много проста машинка за шаблони. Надявам се да свърши работа на някого, както и на мен.
И най-ярките личности си плащат тока

wuser

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 85
  • -Получени: 49
  • Публикации: 2761
Re: Проста шаблонна система
« Отговор #6 -: 21 Октомври 2011, 22:30:46 »
Много добър клас.
Мъдростта на патилото
Perl Monks: PHP - it's "training wheels without the bike" -- Randal L. Schwartz


Дееба... чувствам се все едно обяснявам на майка ми как да си отвори пощата
"не работи"
WTF?!?!? к'во значи че не работи?
Не ти се компилира, дава ти грешка, вади ти грешни резултати, компютърът ти се изключва като го напишеш или на целия квартал му спира тока?
Stilgar

HanKrum

  • Гост
Re: Проста шаблонна система
« Отговор #7 -: 21 Октомври 2011, 22:34:56 »
Сложи го в "Полезни функции и класове"

wuser

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 85
  • -Получени: 49
  • Публикации: 2761
Re: Проста шаблонна система
« Отговор #8 -: 22 Октомври 2011, 15:16:45 »
Налична е нова версия на видеото с оправен звук. Не очаквайте чудеса. Хана не звучи като Джаксън. Просто премахнах дразнещия фонов шум, но не пукания и такива. Все пак вчера сефте пипнах audacity за някаква реална работа, а не само да го разгледам. Ако има проблеми свиркайте.


//на лисока под ГНУ/Линукс се чува и вижда добре, но ако на други системи има проблем, кажете.
« Последна редакция: 22 Октомври 2011, 15:42:51 от wuser »
Мъдростта на патилото
Perl Monks: PHP - it's "training wheels without the bike" -- Randal L. Schwartz


Дееба... чувствам се все едно обяснявам на майка ми как да си отвори пощата
"не работи"
WTF?!?!? к'во значи че не работи?
Не ти се компилира, дава ти грешка, вади ти грешни резултати, компютърът ти се изключва като го напишеш или на целия квартал му спира тока?
Stilgar

smarfy02

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 13
  • -Получени: 0
  • Публикации: 907
  • https://www.facebook.com/pages/Стилияне-ние-сме-с-
Re: Проста шаблонна система
« Отговор #9 -: 18 Март 2012, 23:30:17 »
хубава урок ,но имам един въпрос относно "content"  има ли ограничение в размера на текста в единичните кавички (ако текста които искам да вложим е голям ...)?

wuser

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 85
  • -Получени: 49
  • Публикации: 2761
Re: Проста шаблонна система
« Отговор #10 -: 19 Март 2012, 00:55:01 »
Не би трябвало. Няма логика да е пречка.
Мъдростта на патилото
Perl Monks: PHP - it's "training wheels without the bike" -- Randal L. Schwartz


Дееба... чувствам се все едно обяснявам на майка ми как да си отвори пощата
"не работи"
WTF?!?!? к'во значи че не работи?
Не ти се компилира, дава ти грешка, вади ти грешни резултати, компютърът ти се изключва като го напишеш или на целия квартал му спира тока?
Stilgar

HanKrum

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 125
  • -Получени: 73
  • Публикации: 1005
  • Кибик
Re: Проста шаблонна система
« Отговор #11 -: 20 Март 2012, 14:29:00 »
хубава урок ,но имам един въпрос относно "content"  има ли ограничение в размера на текста в единичните кавички (ако текста които искам да вложим е голям ...)?
... няма никакво ограничение, ако се заинтересуваш повече ще ти дам идеи как да си направиш и по-сложни неща с този шаблон :)
"Силата на правителството се крепи на невежеството на народа, и те знаят това и винаги ще се борят против просвещението." Лев Толстой