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 :: include - vs - шаблонизатор

 PHP.SU

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


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

> Описание: решаем проблему include в моем шаблонизаторе
Snic
Отправлено: 06 Февраля, 2009 - 03:33:00
Post Id



Гость


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


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




Привет!
пишу свою cms, но столкнулся с такой проблемой
при выводи контента через вставки вида {menu}, {content}

include выводится не там где нужно,
а там где нужно выводится цифра 1 (откуда она берется хрен его знает),
а сам инклудируемый файл появляется в верху страницы.

прикладываю пару скриншотов, в первом скрине будет показано как нужно,
а во втором как у меня выводится.


вот то что мы имеем на этот момент:
index.php
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. include('inc/config.php'); // подключаем конфигурацию
  3. if ( isset( $_GET['mod'] ) ) $mod = $_GET['mod'];
  4. if (!isset($mod) || ($mod=='') || (!file_exists ('mods/'.$mod.'/index.php')))
  5. {
  6.    $mod=$start_mod; // модуль по умолчанию
  7. }
  8.  
  9. // Вызываем функцию, которая вернет нам html
  10. $content = get_content( $mod );
  11. $menu = get_menu();
  12.  
  13. // Считываем в переменную содержимое шаблона
  14. if ( is_file( 'templates/'. $template_site .'/main.tpl' ) )
  15. {
  16.   $html = file_get_contents( 'templates/'. $template_site .'/main.tpl' );
  17. } else {
  18.   $html = file_get_contents( 'templates/default/main.tpl' );
  19. }
  20. // Заменяем в шаблоне вставки вида {menu}, {content}, ...
  21. $html = str_replace( '{content}', $content, $html );
  22. $html = str_replace( '{menu}', $menu, $html );
  23.  
  24. // Выводим содержимое в браузер
  25. echo $html;
  26.  
  27. function get_content( $mod )
  28. {
  29.   $html = include('mods/'.$mod.'/index.php');
  30.   return $html;
  31. }
  32.  
  33. function get_menu()
  34. {
  35.   $html = 'тут меню';
  36.   return $html;
  37. }
  38.  
  39. ?>
  40.  

inc/config.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4. $start_mod='page'; // модуль по умолчанию
  5. $template_site='default'; // шаблон сайта
  6.  
  7. ?>
  8.  

mods/blog/index.php
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. if (!eregi('index.php', $_SERVER['PHP_SELF'])) { header('Content-Type: text/html; charset=UTF-8'); die ('Ошибка: Доступ запрещен!'); }
  3.  
  4. echo 'Модуль blog<br>';
  5. echo '<a href="index.php?mod=page">преход на маодуль page</a>';
  6. ?>
  7.  

mods/page/index.php
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. if (!eregi('index.php', $_SERVER['PHP_SELF'])) { header('Content-Type: text/html; charset=UTF-8'); die ('Ошибка: Доступ запрещен!'); }
  3.  
  4. echo 'Модуль page<br>';
  5. echo '<a href="index.php?mod=blog">преход на маодуль blog</a>';
  6. ?>
  7.  

templates/default/main.tpl
PHP:
скопировать код в буфер обмена
  1.  
  2. <html>
  3.  
  4. <head>
  5.  
  6.         <title>Безымянный</title>
  7.  
  8.         <meta http-equiv="content-type" content="text/html;charset=utf-8">
  9.  
  10.         <link rel="stylesheet" href="templates/default/style.css" type="text/css">
  11.  
  12. </head>
  13.  
  14. <body>
  15.  
  16.        
  17.  
  18. <table>
  19.  
  20.   <tbody align="center" valign="center" bgcolor="lightGray">
  21.  
  22.     <tr>
  23.  
  24.       <td>
  25.  
  26.       {menu}
  27.  
  28.       </td>
  29.  
  30.       <td>
  31.  
  32.        {content}
  33.  
  34.       </td>
  35.  
  36.     </tr>
  37.  
  38.   </tbody>
  39.  
  40. </table>
  41.  
  42.        
  43.  
  44. </body>
  45.  
  46. </html>
  47.  

Скачать файл: cms.zip
Скачан раз: 441

(Отредактировано автором: 06 Февраля, 2009 - 03:35:51)



-----
Лень - двигатель прогресса, имхо Улыбка
Работаю над проектами в сфере информационного сайтостроения.
 
 Top
Champion Супермодератор
Отправлено: 06 Февраля, 2009 - 08:33:39
Post Id



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


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


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




Snic пишет:
$html = include('mods/'.$mod.'/index.php');
Вот отсюда она и берется. Штсдгву возвращает true в случае успешного подключения фала. А само подключение файла происходт на место include без всяких дополнительных опреаций руками
 
 Top
Snic
Отправлено: 06 Февраля, 2009 - 09:30:40
Post Id



Гость


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


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




Champion
это то понятно что оно от туда берется, это же я сам писал
мне не понятно другое, как эту тему решить, вот в чем вопрос.

(Отредактировано автором: 06 Февраля, 2009 - 09:31:47)



-----
Лень - двигатель прогресса, имхо Улыбка
Работаю над проектами в сфере информационного сайтостроения.
 
 Top
Dastar
Отправлено: 06 Февраля, 2009 - 09:43:11
Post Id



Частый гость


Покинул форум
Сообщений всего: 199
Дата рег-ции: Янв. 2008  
Откуда: Израиль


Помог: -6 раз(а)




эмм... Может изменить include на file_get_content ?


-----
Не знаешь - молчи.
 
 Top
Stierus Супермодератор
Отправлено: 06 Февраля, 2009 - 10:33:59
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


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




Смотрю на код и возникает пара вопросов:
Тут у нас переменным присвивается некий кусок html для вывода на странице
PHP:
скопировать код в буфер обмена
  1. // Вызываем функцию, которая вернет нам html
  2. $content = get_content( $mod );
  3. $menu = get_menu();
  4.  

Тут мы для чего-то считываем весь шаблон в переменную, забивая память :
PHP:
скопировать код в буфер обмена
  1.  
  2. // Считываем в переменную содержимое шаблона
  3. if ( is_file( 'templates/'. $template_site .'/main.tpl' ) )
  4. {
  5.   $html = file_get_contents( 'templates/'. $template_site .'/main.tpl' );
  6. } else {
  7.   $html = file_get_contents( 'templates/default/main.tpl' );
  8. }
  9.  

Тут мы тратим ресурсы процессора на поиск и замену строк (немаленьких строк)
PHP:
скопировать код в буфер обмена
  1.  
  2. // Заменяем в шаблоне вставки вида {menu}, {content}, ...
  3. $html = str_replace( '{content}', $content, $html );
  4. $html = str_replace( '{menu}', $menu, $html );
  5.  

А тут мы всё полученное тупо выводим пользователю
PHP:
скопировать код в буфер обмена
  1.  
  2. // Выводим содержимое в браузер
  3. echo $html;
  4.  



А теперь вопрос, всё это лишь для того, что бы в вашем шаблоне main.tpl вместо <?= $content ?> и <?= $menu?> были {content} {menu} ?
Не лучше(+ легче) сделать :
PHP:
скопировать код в буфер обмена
  1. // Вызываем функцию, которая вернет нам html
  2. $content = get_content( $mod );
  3. $menu = get_menu();
  4.  
  5. // Считываем в переменную содержимое шаблона
  6. if ( is_file( 'templates/'. $template_site .'/main.php' ) )
  7. {
  8.   include( 'templates/'. $template_site .'/main.php' );
  9. } else {
  10.   include( 'templates/default/main.php' );
  11. }


Ну а main.php:
PHP:
скопировать код в буфер обмена
  1. <html>
  2.  
  3. <head>
  4.  
  5.     <title>Безымянный</title>
  6.  
  7.     <meta http-equiv="content-type" content="text/html;charset=utf-8">
  8.  
  9.     <link rel="stylesheet" href="templates/default/style.css" type="text/css">
  10.  
  11. </head>
  12.  
  13. <body>
  14.  
  15.    
  16.  
  17. <table>
  18.  
  19.   <tbody align="center" valign="center" bgcolor="lightGray">
  20.  
  21.     <tr>
  22.  
  23.       <td>
  24.  
  25.       <?= $menu ?>
  26.  
  27.       </td>
  28.  
  29.       <td>
  30.  
  31.        <?=$content ?>
  32.  
  33.       </td>
  34.  
  35.     </tr>
  36.  
  37.   </tbody>
  38.  
  39. </table>
  40.  
  41.    
  42.  
  43. </body>
  44.  
  45. </html>
 
My status
 Top
Snic
Отправлено: 06 Февраля, 2009 - 10:48:27
Post Id



Гость


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


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




решил проблему таким образом
поправил файлы модулей вот так
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. if (!eregi('index.php', $_SERVER['PHP_SELF'])) { header('Content-Type: text/html; charset=UTF-8'); die ('Ошибка: Доступ запрещен!'); }
  4.  
  5. $html = $html.'Модуль page<br>';
  6. $html = $html.'<a href="index.php?mod=blog">преход на маодуль blog</a>';
  7. return $html;
  8. ?>
  9.  

(Отредактировано автором: 06 Февраля, 2009 - 10:53:21)



-----
Лень - двигатель прогресса, имхо Улыбка
Работаю над проектами в сфере информационного сайтостроения.
 
 Top
Stierus Супермодератор
Отправлено: 06 Февраля, 2009 - 10:55:12
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


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




PHP:
скопировать код в буфер обмена
  1. if (!eregi('index.php', $_SERVER['PHP_SELF'])) {
лучше замени на
PHP:
скопировать код в буфер обмена
  1. if( __FILE__ == $_SERVER['SCRIPT_FILENAME']){
 
My status
 Top
Snic
Отправлено: 06 Февраля, 2009 - 11:01:17
Post Id



Гость


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


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




Stierus
чем про мотивируешь?


-----
Лень - двигатель прогресса, имхо Улыбка
Работаю над проектами в сфере информационного сайтостроения.
 
 Top
Stierus Супермодератор
Отправлено: 06 Февраля, 2009 - 11:13:32
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


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




тем, что уходит регулярное выражение; тем, что проверка не на index.php, а на соответствие название текущего файла и вызываемого (то есть именно инклуд\не инклуд, а не есть\нет index в названии файла)
 
My status
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB