Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Шаблонизатор [3]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (3): « 1 2 [3]   

> Без описания
Crate
Отправлено: 20 Января, 2012 - 06:45:57
Post Id



Посетитель


Покинул форум
Сообщений всего: 312
Дата рег-ции: Янв. 2012  


Помог: 4 раз(а)




Вот что примерно получилось:
PHP:
скопировать код в буфер обмена
  1. class Style {
  2.     function parse ($path, $name) {
  3.         $cache->check($path, $name);
  4.     }
  5. }
  6.        
  7. class Cache {
  8.     function check ($path, $name) {
  9.         $file = ROOT.$path;
  10.         if (file_exists(ROOT."/data/cache".$name)) {include_once (ROOT."/cache/".$name.".php");}
  11.         else {$this->compile($path, $name);}
  12.     }
  13.                
  14.     function compile ($path, $name) {
  15.         $source = fopen ($path);
  16.         $file = fread ($source);
  17.         $result = str_replace ("\{PATH_TO_APP\}", "<?=".PATH_TO_APP.";?>", $file);
  18.         if ($result == true) {
  19.             fwrite (ROOT."/data/cache/".$name.".php", $result);
  20.             include_once (ROOT."/data/cache/".$name.".php");
  21.         }
  22.         else {$this->compile($path, $name);}
  23.     }
  24. }
  25.        
  26. $style = new Style ();
  27. $cache = new Cache ();


Вызов:
PHP:
скопировать код в буфер обмена
  1. $style->parse("путь_до_шаблона", "имя_шаблона");


Дополнительно:
PHP:
скопировать код в буфер обмена
  1. define ("ROOT", $_SERVER['DOCUMENT_ROOT'], true);
  2. define ("PATH_TO_APP", ROOT."/application", true);


(Добавление)
Полностью рабочий код (вызов тот же):
PHP:
скопировать код в буфер обмена
  1. class Style {
  2.         function parse ($path, $name) {
  3.                 $file = ROOT.$path;
  4.                 if (file_exists(ROOT."/data/cache/".$name)) {include_once (ROOT."/data/cache/".$name.".php");}
  5.                 else {$this->compile($path, $name);}
  6.         }
  7.                
  8.         function compile ($path, $name) {
  9.                 $file = file_get_contents ($path);
  10.                 $result = str_replace ("{"."PATH_TO_APP"."}", PATH, $file);
  11.                 file_put_contents (ROOT."/data/cache/".$name.".php", $result);
  12.                 include_once (ROOT."/data/cache/".$name.".php");
  13.         }      
  14. }
  15.        
  16. $style = new Style ();

(Отредактировано автором: 20 Января, 2012 - 08:09:58)

 
 Top
sKaa
Отправлено: 20 Января, 2012 - 15:32:20
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


Помог: 25 раз(а)

[+]


Добавь метод assign, пригодится.

PHP:
скопировать код в буфер обмена
  1.  
  2. class Style {
  3.  protected $vars = array();
  4.  function parse ($path, $name) {
  5.                 $file = ROOT.$path;
  6.                 if (file_exists(ROOT."/data/cache/".$name)) {include_once (ROOT."/data/cache/".$name.".php");}
  7.                 else {$this->compile($path, $name);}
  8.         }
  9.  
  10.  public function assign($var, $value){
  11.   if(is_scalar($value)){
  12.   $this->vars[$var] = $value;
  13.   }
  14.   else{
  15.   $this->vars[$var] =&$value;
  16.   }
  17. }
  18.  
  19. function compile ($path, $name) {
  20.                 $file = file_get_contents ($path);
  21.                 $result = str_replace ("{"."PATH_TO_APP"."}", PATH, $file);
  22.                 file_put_contents (ROOT."/data/cache/".$name.".php", $result);
  23.                 // ---------
  24.                 extract($this->vars);
  25.                 include_once (ROOT."/data/cache/".$name.".php");
  26.         }      
  27.  


Теперь можно делать так :

PHP:
скопировать код в буфер обмена
  1.  
  2. $style = new Style ();
  3. $style->assign('qwe', 123);
  4. ....
  5.  

и в шаблоне будет доступна новая переменная $qwe, значение которой будет 123...
Так же можно для удобства сделать чтобы каждый метод возвращал объект класса. Аля текучий интерфейс.
$style= new Style();
$style->assign('qwe', 123)->parse(...)->compile ($path, $name);

(Отредактировано автором: 20 Января, 2012 - 17:28:57)

 
 Top
sKaa
Отправлено: 20 Января, 2012 - 17:52:35
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


Помог: 25 раз(а)

[+]


fread и fwrite необходимо обратно вернуть вместо file_get_contents и file_put_contents если хочешь реализовывать метод assign
 
 Top
Crate
Отправлено: 21 Января, 2012 - 12:41:03
Post Id



Посетитель


Покинул форум
Сообщений всего: 312
Дата рег-ции: Янв. 2012  


Помог: 4 раз(а)




А вот другой вопрос: как мне поступить если например нужно заменить много значений?
Попробовал циклом, но нечего не выходит:
PHP:
скопировать код в буфер обмена
  1. class Style {
  2.                 function parse ($path, $name) {
  3.                         if (file_exists(ROOT."/data/cache/".$name)) {include_once (ROOT."/data/cache/".$name.".php");}
  4.                         else {$this->compile($path, $name);}
  5.                 }
  6.                
  7.                 function compile ($path, $name) {
  8.                         $file = file_get_contents ($path);
  9.                         $result = $this->replace ($file);
  10.                         // $result = $this->replace ($file);
  11.                         file_put_contents (ROOT."/data/cache/".$name.".php", $result);
  12.                         include_once (ROOT."/data/cache/".$name.".php");
  13.                 }
  14.                
  15.                 function replace ($data) {
  16.                         $matches = array (
  17.                         "{"."PATH"."}" => PATH,
  18.                         "{L_"."PANEL"."}" => $language['panel'],
  19.                         "{L_"."PARAMETERS"."}" => $language['parapeters'],
  20.                         "{L_"."GENERAL"."}" => $language['general'],
  21.                         "{L_"."PAGES"."}" => $language['pages'],
  22.                         "{L_"."LINK"."}" => $language['link'],
  23.                         "{L_"."TITLE"."}" => $language['title'],
  24.                         "{L_"."SUBTITLE"."}" => $language['subtitle'],
  25.                         "{L_"."CONTENT"."}" => $language['content'],
  26.                         "{L_"."DESCRIPTION"."}" => $language['description'],
  27.                         "{L_"."KEYWORDS"."}" => $language['keywords'],
  28.                         "{L_"."ANNOUNCE"."}" => $language['announce'],
  29.                         "{L_"."POSITION"."}" => $language['position'],
  30.                         "{L_"."STATUS"."}" => $language['status'],
  31.                         "{L_"."MEDIAFILES"."}" => $language['mediafiles'],
  32.                         "{L_"."PACKS"."}" => $language['packs'],
  33.                         "{L_"."UPDATES"."}" => $language['updates'],
  34.                         "{L_"."STYLES"."}" => $language['styles'],
  35.                         "{L_"."LANGUAGES"."}" => $language['languages'],
  36.                         "{L_"."PLUGINS"."}" => $language['plugins'],
  37.                         "{L_"."LIBRARIES"."}" => $language['libraries'],
  38.                         "{L_"."TOOLS"."}" => $language['tools'],
  39.                         "{L_"."PAGES_CREATE_SUCCESS"."}" => $language['pages_create_success'],
  40.                         "{L_"."PAGES_EDIT_SUCCESS"."}" => $language['pages_edit_success'],
  41.             );
  42.                         foreach ($replace as $key => $val) {
  43.                             $result = str_replace ($key, $val, $data);
  44.                         }
  45.                         return $result;
  46.                 }
  47.         }
  48.        
  49.         $style = new Style ();
 
 Top
Мелкий Супермодератор
Отправлено: 21 Января, 2012 - 12:59:41
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




PHP:
скопировать код в буфер обмена
  1. foreach ($replace as $key => $val) {
  2.     $result = str_replace ($key, $val, $data);
  3. }

замените на:


Включите ошибки в E_ALL | E_STRICT. Вы пытались циклом пройтись по несуществующей переменной $replace.

Ну и почему "{L_"."PANEL"."}" вместо "{L_PANEL}"?


-----
PostgreSQL DBA
 
 Top
sKaa
Отправлено: 21 Января, 2012 - 13:12:34
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


Помог: 25 раз(а)

[+]


Crate пишет:
function replace ($data) {

Вообще для таких целей я вверху как раз и описал метод assign
 
 Top
Crate
Отправлено: 21 Января, 2012 - 13:33:11
Post Id



Посетитель


Покинул форум
Сообщений всего: 312
Дата рег-ции: Янв. 2012  


Помог: 4 раз(а)




Мелкий
Спасибо, все работает =)

sKaa пишет:
Вообще для таких целей я вверху как раз и описал метод assign
Он мне не нужен, т. к. все переменные будут в ядре.
(Добавление)
Правда теперь не хочет заменять на языковые переменные типа $language['panel'].
 
 Top
Crate
Отправлено: 22 Января, 2012 - 10:28:44
Post Id



Посетитель


Покинул форум
Сообщений всего: 312
Дата рег-ции: Янв. 2012  


Помог: 4 раз(а)




Ребята, а как теперь кэш обновлять? Я думал очищать папку, но гугл нашел только вот это:
PHP:
скопировать код в буфер обмена
  1. function recRMDir($path){
  2.     if (substr($path, strlen($path)-1, 1) != '/') $path .= '/';
  3.     if ($handle = @opendir($path)){
  4.         while ($obj = readdir($handle)){
  5.             if ($obj != '.' && $obj != '..'){
  6.                 if (is_dir($path.$obj)){
  7.                     if (!recRMDir($path.$obj)) return false;
  8.                 }elseif (is_file($path.$obj)){
  9.                     if (!unlink($path.$obj))    return false;
  10.                     }
  11.             }
  12.         }
  13.           closedir($handle);
  14.             if (!@rmdir($path)) return false;
  15.           return true;
  16.     }
  17.    return false;
  18. }

Проверил. Не работает. можно в принципе и удалять папку целиком а потом создавать ее заново, но как сделать проще?
 
 Top
Crate
Отправлено: 23 Января, 2012 - 09:16:01
Post Id



Посетитель


Покинул форум
Сообщений всего: 312
Дата рег-ции: Янв. 2012  


Помог: 4 раз(а)




Люди, у меня проблема. Проверил в E_ALL там пишет:
CODE (text):
скопировать код в буфер обмена
  1. Notice: Undefined variable: language in Z:\home\test1.ru\www\application\includes\styles.php on line 25


Код:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.     /* This file is part of */
  3.  
  4.        
  5.         class Style {
  6.                 function parse ($path) {
  7.                         $name = basename ($path);
  8.                         $this->check ($path, $name);
  9.                 }
  10.                 function check ($path, $name) {
  11.                         if (file_exists(ROOT."/data/cache/".$name)) {include_once (ROOT."/data/cache/".$name.".php");}
  12.                         else {$this->compile($path, $name);}
  13.                 }
  14.                
  15.                 function compile ($path, $name) {
  16.                         $file = file_get_contents ($path);
  17.                         $result = $this->replace ($file);
  18.                         file_put_contents (ROOT."/data/cache/".$name.".php", $result);
  19.                         include_once (ROOT."/data/cache/".$name.".php");
  20.                 }
  21.                
  22.                 function replace ($data) {
  23.                         $matches = array (
  24.                         "{PATH}" => PATH,
  25.                         "{L_PANEL}" => $language['panel'],
  26.                         "{L_PARAMETERS}" => $language['parameters'],
  27.                         "{L_GENERAL}" => $language['general'],
  28.                         "{L_PAGES}" => $language['pages'],
  29.                         "{L_LINK}" => $language['link'],
  30.                         "{L_TITLE}" => $language['title'],
  31.                         "{L_SUBTITLE}" => $language['subtitle'],
  32.                         "{L_CONTENT}" => $language['content'],
  33.                         "{L_DESCRIPTION}" => $language['description'],
  34.                         "{L_KEYWORDS}" => $language['keywords'],
  35.                         "{L_ANNOUNCE}" => $language['announce'],
  36.                         "{L_POSITION}" => $language['position'],
  37.                         "{L_STATUS}" => $language['status'],
  38.                         "{L_MEDIAFILES}" => $language['mediafiles'],
  39.                         "{L_PACKS}" => $language['packs'],
  40.                         "{L_UPDATES}" => $language['updates'],
  41.                         "{L_STYLES}" => $language['styles'],
  42.                         "{L_LANGUAGES}" => $language['languages'],
  43.                         "{L_PLUGINS}" => $language['plugins'],
  44.                         "{L_LIBRARIES}" => $language['libraries'],
  45.                         "{L_TOOLS}" => $language['tools'],
  46.                         "{L_PAGES_CREATE_SUCCESS}" => $language['pages_create_success'],
  47.                         "{L_PAGES_EDIT_SUCCESS}" => $language['pages_edit_success'],
  48.             );
  49.                         $result = str_replace (array_keys($matches), array_values($matches), $data);
  50.                         // $result = preg_replace ("{^([A-Z]+)$}", $matches["$1"], $data);
  51.                         return $result;
  52.                 }
  53.                
  54.                 function update () {
  55.                         $handle = opendir (ROOT."/data/cache");
  56.                         while (false !== ($file = readdir($handle))) {
  57.                 $delete = unlink ($file);
  58.             }
  59.                         closedir ($handle);
  60.                         if ($delete == true) {$result = "Удаление завершено.";}
  61.                         else {echo "Удаление незавершено.";}
  62.                         /*
  63.                         $delete = rmdir (ROOT."/data/cache");
  64.                         $create = mkdir (ROOT."/data/cache");
  65.                         if ($delete == true) {$result = "Удаление завершено.";}
  66.                         else {echo "Удаление незавершено.";}
  67.                         if ($create == true) {$result = "Создание завершено.";}
  68.                         else {echo "Создание незавершено.";}
  69.                         if ($delete == true and $create == true) {$result = "Обновление завершено.";}
  70.                         */
  71.                         return $result;
  72.                 }
  73.         }
  74.        
  75.         $style = new Style (); 
  76. ?>


Языковой массив находится в другом файле, но он подключается через инклюд. В чем проблема то?
 
 Top
Страниц (3): « 1 2 [3]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« CMS и фреймворки »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB