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
Форумы портала PHP.SU :: Версия для печати :: В str_replace поменистить функцию оО
Форумы портала PHP.SU » » Вопросы новичков » В str_replace поменистить функцию оО

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

1. etoYA - 06 Марта, 2012 - 21:05:49 - перейти к сообщению
В общем начал издеватся над php, написал свой велосипед ездить на нем конечно не очень шикарно, но за то не ощущаются все неровности, колеса же квадратные!).
Чтобы сделать ЧПУ взял за основу статью DeepVarvar'a. Вот как эти модули включить в нужное мне место, я тут понял, что этот самый controller нужно подключить в нужный мне блок, но у меня тут такой вопрос, как в функцию str_replace подключить другую функцию, либо вообще результат запроса БД?

Вот шаблонизатор

PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. class Template{
  4.         private $dir = './templates/'; // папка с шаблонами
  5.         private $vars = array(); // переменные
  6.         private $template; // шаблон
  7.        
  8.         function __construct(){
  9.                 $this->conf = Config::getInstance();
  10.         }
  11.         function load($name){ // загрузка шаблона
  12.                 if (!is_dir($this->dir.$name)) $name = 'default'; // если шаблона не существует, то подключить стандартный шаблон
  13.                 $this->template =  file_get_contents($this->dir.$name.'/'.'main.tpl'); // подключение главного шаблона
  14.                 // сканирование папки с шаблоном для определения подключаемых щаблонов
  15.                 $scan = scandir($this->dir.$name);
  16.                 foreach ($scan as $file){
  17.                         if (is_file($this->dir.$name.'/'.$file)){
  18.                                 $tpl[] = substr($file, 0, -4);
  19.                         }
  20.                 }
  21.                 // создание шаблона
  22.                 for ($i=0; $i<count($tpl); $i++){
  23.                         $this->template = str_replace(strtoupper('{'.$tpl[$i].'}'),file_get_contents($this->dir.$name.'/'.$tpl[$i].'.tpl'), $this->template);
  24.                 }
  25.                 // подключение css
  26.                 $this->template = str_replace('CSSURL', $this->conf->get('main','url').'/templates/'.$name.'/css/style.css', $this->template);
  27.                 $this->template = preg_replace('#\[/(.*?)\]#', '</div>', $this->template);
  28.                 $this->template = preg_replace('#\[(.+?)\]#','<div id="$1">',$this->template);
  29.                 return $this->template;
  30.         }
  31.         function set($key, $value){
  32.                 // установка переменной
  33.                 $this->vars[$key] = $value;
  34.         }
  35.         function get(){
  36.                 foreach($this->vars as $k=>$v){
  37.                         $this->template = str_replace($k, $v, $this->template);
  38.                 }
  39.                 echo $this->template;
  40.         }
  41. }
  42. ?>
  43.  


Вот его вызов

PHP:
скопировать код в буфер обмена
  1. $tmp = new Template;
  2. $tmp->load('default');
  3. $tmp->set('{TITLE}', 'Так то титул');
  4. $tmp->get();
2. snikers987 - 06 Марта, 2012 - 21:59:29 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1.  
  2. public function get(){
  3.         echo strtr($this->template, $this->vars);
  4. }
  5.  


тоже самое, но не буду говорить о скорости работы. но думаю быстрее
3. etoYA - 06 Марта, 2012 - 22:17:39 - перейти к сообщению
snikers987, учту, точнее уже учел)).

PHP:
скопировать код в буфер обмена
  1. $tmp->set('{TITLE}', require_once('engine/inc/controller.php'));
Как сделать, чтобы возвращало не true, а подключало файл? Я тут думаю file_get_conents и eval?
4. Opposite - 06 Марта, 2012 - 23:27:21 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. class Templater {
  2.                 public function load($template) {
  3.                         ob_start();
  4.                         include ... / require ...;
  5.                         return ob_get_clean();
  6.                 }
  7. }


Мммм, тебе это надо? Не понял
5. etoYA - 06 Марта, 2012 - 23:42:53 - перейти к сообщению
Opposite, ob_start ... это вроде бы хэш?

Мне нужно заменить вместо {BLABLA} подключить php код
6. snikers987 - 06 Марта, 2012 - 23:48:58 - перейти к сообщению
etoYA пишет:
Opposite, ob_start ... это вроде бы хэш?

Мне нужно заменить вместо {BLABLA} подключить php код

ob_start() - буферизация вывода
7. etoYA - 06 Марта, 2012 - 23:58:53 - перейти к сообщению
Все, вроде бы понял

PHP:
скопировать код в буфер обмена
  1.  
  2.         function inc(){
  3.                 ob_start();
  4.                 include $_SERVER['DOCUMENT_ROOT'].'/engine/modules/controller.php';
  5.                 return ob_get_clean();
  6.         }
  7.  

PHP:
скопировать код в буфер обмена
  1. $tmp->set('{CONTROLLER}', $tmp->inc());
8. Opposite - 07 Марта, 2012 - 00:04:40 - перейти к сообщению
etoYA пишет:
Как сделать, чтобы возвращало не true, а подключало файл? Я тут думаю file_get_conents и eval?

etoYA пишет:
Opposite, ob_start ... это вроде бы хэш?

snikers987 пишет:
ob_start() - буферизация вывода

Я отвечал на твой вопрос. Ты в функции подключаешь файл, содержимое заносится в буффер и, соответственно, присваивается переменной.

PHP:
скопировать код в буфер обмена
  1.  
  2.      public function load($template) {
  3.                         ob_start();
  4.                         require_once($template);
  5.                         return ob_get_clean();
  6.                 }
  7.  

PHP:
скопировать код в буфер обмена
  1.  
  2. $tmp->set('{TITLE}', load('engine/inc/controller.php'));
  3.  


В $vars['{TITLE}'] будет содержимое файла engine/inc/controller.php

 

Powered by ExBB FM 1.0 RC1