Всем добрый вечер. Собственно интересует такой вопрос. Есть шаблон вида: так вот как сделать так что бы при переходе вида: http://localhost/index.php?module=news там где отмечено {module} выводился код модуля и собственно где написано {blocks} там выводились блоки... я прочитал очень много информации на сайтах но везде написано по разному и так не чего не понял... возможно вопрос стоит не корректно... то есть модульность я организовал, а вот как теперь выводить это все в шаблон... шаблонизатор у меня smarty... читал про буферизацию, но все равно немного не допонял, так сказать пока что лично не объяснят не поймешь)) P.S. блоки то еще можно проинклюдить а вот с модулями действительно беда)) выручайте люди добрые 4 день уже мучаюсь))
не совсем понимаю в чём проблема... на странице делай четыре <div> на css позиционируюй их в нужном месте... в каждый див инклюд нужный шаблон.
По идее, в шаблонизаторе должен быть метод для того чтобы подставить вместо переменной шаблона какое-то значение. В Смарти, вроде, называется assign, но могу ошибаться - Смарти не пользуюсь.
вы не поняли суть вопроса... вот как реализовать... то бишь у нас есть файл modules/news/index.php - модуль, в шаблоне в нужном месте когда мы переходим по /index.php?module=news у нас где на картинке написан {$module} должен вывестись модуль... то бишь мы это как то реализовываем в ядре и там уже например делаем $smarty->assign('modules', $modules); $modules в данный момент текущий модуль... то бишь вот как такую шнягу сделать.... то есть блоки и от модуля чем отличаются( в моем понятие), блоков может быть хоть сколько, а модуль 1 на одной странице... я не хочу делать для каждого модуля свой шабл, то есть я так делать буду если мне это по реализации надо( то есть например для модуля новости)...
к примеру Код (Text): if ($_GET['module'] == 'news') { // или делать инклуд, например include(MOD_DIR.'/'.$_GET['module'].'php'); $newsContent = 'Модуль новостей'; $smarty->assign('module', $newsContent); } elseif ($_GET['module'] == 'articles') { $articlesContent = 'Модуль статей'; $smarty->assign('module', $articlesContent); } else { $indexContent = 'Главная'; $smarty->assign('module', $indexContent); } $smarty->display(системный_путь_к_папке_шаблона.'index.html'); Т.е. при открытии какого-то модуля, вся его инфа должна отдаваться в module. А в главном файле шаблона(сделал его index.html), где должны выводить свой контент модули, уже вставить переменную {$module} Это как один из вариантов. Если я конечно правильно понял, что нужно.
а вот вместо $articlesContent = 'Модуль статей'; и $newsContent = 'Модуль новостей'; как сделать код данных модулей, то бишь $articlesContent = include "адрес модуля"; так работать будет??
Немного сложнее все. Первое include(адрес модуля); Второе. Нужно(можно) еще использовать fetch() для создания отдельных файлов шаблонов для модулей. Если у вас там будут статьи, то они же будут массивом. Так этот массив разбирать в файле шаблона модуля, например articles.html А в $smarty->assign('module', $smarty->fetch(путь до файла articles.html);
хм... сейчас попробую =) Добавлено спустя 38 минут 53 секунды: вот так вот получается=(( может мне вместо смарти пока какой-нить другой шаблонизатор попробовать?? например какой-нить самописный... P.S. это когда проходишь по адресу /index.php?module=news
у вас там видимо что-то выводится через echo ? Или разместили {$module} не там? Шаблонизаторы примерно все одинаковые. Т.е. суть у них одна. В архиве smarty есть примеры готовые. Да и мануалов полно как вывод делать.
1) вот ваш код, который вы мне дали: Код (Text): if ($_GET['module'] == 'news') { // или делать инклуд, например include(MOD_DIR.'/'.$_GET['module'].'php'); $newsContent = include("modules/{$_GET['module']}/index.php"); $smarty->assign('module',$newsContent); } elseif ($_GET['module'] == 'test') { $articlesContent = 'Модуль статей'; $smarty->assign('module', $articlesContent); } else { $indexContent = 'Главная'; $smarty->assign('module', $indexContent); } $smarty->display('site/index.tpl'); 2) если переходить по ссылке news то выходит такая бредятина, если переходить по ссылке test то все пучком
Код (Text): include("modules/{$_GET['module']}/index.php") $smarty->assign('module',$newsContent); а в файле modules/news/index.php уже делать $newsContent = 'Мод новостей'; А test срабатывает правильно.
Да, так работает, но как же быть, если мне например надо вывести вот такой вот код... Код (Text): <?php global $main; $result = $main->db->sql_query("SELECT * FROM ".USERS); echo "<table width='100%'>"; echo "<tr><td><center>Тест</center></td></tr>". "<tr>". "<td width='50'>". "<select name='team1' onchange='showOption(this)'>"; while($r=$main->db->sql_fetchrow($result)) { echo "<option value='{$r['uid']},{$r['user_id']}'>{$r['user_name']}</option>"; } echo "</select></td>"; echo "</table>"; echo " <script type='text/javascript'> function test2() { alert('Hello world'); } </srcipt>"; echo "<a href='#' onclick='test2()'>буль</a>"; ?> <script type="text/javascript"> function dobroe () { alert("Добрый день <?={$r['user_name']}?>"); } </script> <a href="/index.php?module=teams" onclick="dobroe()">ЫЫЫ</a> <html> <script> function test() { alert("Добрый день <?{$r['user_name']}?>"); } </script> <body> <select id="d1" onchange="test();"> <option value="#">1</option> <option value="#">2</option> </select> </body> </html> <script type="text/javascript"> function showOption(el) { var player = 'Игроку'; var add = 'отправлена заявка'; var ve = (',',el.options[el.selectedIndex].value); var ve = ve.split(','); alert(player+' '+ve[1]+' '+add); } </script> <select onchange="showOption(this)"> <option value="ay">ya</option> <option value="by">yb</option> <option value="ce">ec</option> <option value="di">id</option> </select> <?php /////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////// open(); echo "<center>Время</center>"; close(); ?> <?php ////////////////////////// //author:blackwolfinsane// //www.sallatt.ru // ////////////////////////// function taim (){ $sql=mysql_query ("SELECT * FROM kasseler_test WHERE id=1;"); $row = mysql_fetch_array($sql); $date=$row['time']; $now = strtotime("now"); $newyear = strtotime("$date"); $timeU = $newyear - $now; /////////минуты часы и дни в секундах: $min = 60; $hour = 60 * 60; $day = 60 * 60 * 24; $r_days = floor ($timeU / $day); $r_hours = floor (($timeU - ($r_days * $day))/$hour); $r_min = floor (($timeU - ($r_days * $day) - ($r_hours * $hour))/$min); $r_sec = (($timeU - ($r_days * $day) - ($r_hours * $hour) - ($r_min * $min))); open(); echo $r_days." Дней "; echo $r_hours." Часов "; echo $r_min." Минут "; echo $r_sec." Секунд"; echo "<br />"; close(); } echo taim(); ?> <?php $sql=mysql_query ("SELECT * FROM kasseler_test WHERE id=1;"); $row = mysql_fetch_array($sql); $date=$row['time']; open(); echo $date; close(); ?> <script type="text/javascript"> var e = SetTimeout('taim()',1000); $(document).ready(function() { var timer = setInterval(function() { $.get('index.php?taim', {}, function(e){ alert(e); // Только вместо alert(e) нужно как-то тебе выделить элемент страницы-виновник торжества и убрать слеши комментов у нижеследующей строки $('#timeoclock').html(e); } }, 2000); }); </script> <?php open(); echo "<table>". "<tr>". "<td style='width:34px' align='center'>Игра</td>". "<td style='width:165px' align='center'>Команды</td>". "<td style='width:100px' align='center'>Карта</td>". "<td style='width:100px' align='center'>Время</td>". "<td style='width:180px' align='center'>Колличество игроков</td>". "<td style='width:34px' align='center'>Счет</td>". "</tr>". "</table>"; close(); ?> <?php $result = $main->db->sql_query("SELECT * FROM `kasseler_wars` ORDER BY `date_time` DESC LIMIT 40"); for ($i = 0; $i < mysql_num_rows($result); $i++) { $row = $main->db->sql_fetchrow($result); $row['date_time']=str_replace(":","-",$row['date_time']); $time = date("Y-m-d", $row['date_time']); $game = '<img src="".$link."/images/games/css.gif" border="0" widht="14" height="14" align="absmiddle">'; $link = 'http://localhost/'; if($row['teamsize'] == 3) { $teamsize = '<b><font color="#CC0000">3</font> на <font color="#0379E7">3</font></b>'; }elseif($row['teamsize'] == 4) { $teamsize1 = '<b><font color="#CC0000">4</font> на <font color="#0379E7">4</font></b>'; }else($row['teamsize'] == 5);{ $teamsize = '<b><font color="#CC0000">5</font> на <font color="#0379E7">5</font></b>'; } if($row['score_t1'] > $row['score_t2']) { $score_t1 = '<b><font color="#009900">'.$row['score_t1'].'</font></b>'; $score_t2 = '<b><font color="#fd0101">'.$row['score_t2'].'</font></b>'; }elseif($row['score_t1'] < $row['score_t2']) { $score_t1 = '<b><font color="#fd0101">'.$row['score_t1'].'</font></b>'; $score_t2 = '<b><font color="#009900">'.$row['score_t2'].'</font></b>'; }else{ $score_t1 = '<b><font color="#FF6600">'.$row['score_t1'].'</font></b>'; $score_t2 = '<b><font color="#FF6600">'.$row['score_t2'].'</font></b>'; } if($row['score_t1'] > $row['score_t2']) { $score_t1 = '<b><font color="#009900">'.$row['score_t1'].'</font></b>'; $score_t2 = '<b><font color="#fd0101">'.$row['score_t2'].'</font></b>'; }elseif($row['score_t1'] < $row['score_t2']) { $score_t1 = '<b><font color="#fd0101">'.$row['score_t1'].'</font></b>'; $score_t2 = '<b><font color="#009900">'.$row['score_t2'].'</font></b>'; }else{ $score_t1 = '<b><font color="#FF6600">'.$row['score_t1'].'</font></b>'; $score_t2 = '<b><font color="#FF6600">'.$row['score_t2'].'</font></b>'; } $pic_map = '<img src="/img/maps/'.$row['map'].'.jpg" width="120px" align="absmiddle"><br>'; open(); echo " <table> <tr> <td style='width:34px' align='center'></td> <td style='width:165px' align='center'>$row[name_team1] VS. $row[name_team2]</td> <td style='width:100px' align='center'>$row[map]</td> <td style='width:100px' align='center'>$time</td> <td style='width:180px' align='center'>$teamsize</td> <td style='width:34px' align='center'>$score_t1 : $score_t2</td> </tr> </table>"; close(); /*$filesize=filesize('/localhost/warmod/'.$row['map'].'_'.$time.'.dem'); if($filesize >= 1048576 && $filesize < 1073741824) { $sizename = "MB <img src='images/cup/success.png' width='12' height='12' alt='success' align='absmiddle' />"; $size = (round($filesize / 1048576 * 100) / 100); } elseif($filesize >= 1024 && $filesize < 1048576) { $sizename = "KB <img src='images/cup/success.png' width='12' height='12' alt='success' align='absmiddle' />"; $size = (round($filesize / 1024 * 100) / 100); } else { $sizename = "Byte <img src='images/cup/success.png' width='12' height='12' alt='success' align='absmiddle' />"; $size = $filesize; } if (file_exists('/localhost/warmod/'.$row['map'].'_'.$time.'.dem')) { $size = $size; $nofile = "Размер файла $size $sizename"; } else { $size = "Удалено <img src='images/cup/error.png' width='12' height='12' alt='удалено' align='absmiddle' />"; $sizename = ""; $nofile = 'Демо удалено, приносим свои извинения за предоставленые неудобства'; } if (file_exists('/localhost/warmod/'.$row['map'].'_'.$time.'.dem')) { $file_exist = "Скачать демо</br> Размер $size $sizename $maps $pic_map"; } else { $file_exist = "Демо отсутствует $maps $pic_map "; }*/} ?> то есть работать не с отдельной частью а со всем модулем...
Использовать fetch() (выше давал пример) и создать файл шаблона модуля news.html и сунуть в него все JS скрипты и результат php передавать через assign в news.html. Это самый простой вариант, имхо. А еще проще - отказаться от шаблонизатора, если у вас модули с таким содержимым. Просто, чтобы не тратить время на внедрение smarty Вот у вас там есть, к примеру Код (Text): echo "<table width='100%'>"; echo выведет свое содержимое в верху страницы, так как оно не попадает в переменную {$module} Суть то в том, что все должно сходится в переменную {$module},
опять же а как же тогда реализовано в кмс?? то есть я как хочу... 1) вот у нас подключился и вывел модуль 2) если в модуле указаны данные через что выводить, тогда выводить. а если нет тупо выводить как страницу... это же можно же как то реализовать... без ООП..
реализовано примерно так же как описал я. Т.е. весь результат PHP передается в шаблоны через smarty. а для всяких модулей уже создаются страницы шаблона, в которых обрабатывается результат переданный из PHP. Изучите просто работу smarty. в сети полно хороших примеров, да и на сайте smarty то же.
всем спасибо за помощь, решил эту проблему довольно таки простым способом( для модулей).. Код (Text): if (isset($_REQUEST['module'])) { ob_start(); include ("modules/{$_REQUEST['module']}/index.php"); $contents .= ob_get_contents(); ob_end_clean(); $smarty->assign('module',$contents); } $smarty->display('site/index.tpl');
короч народ требуется помощь.... есть массив: Код (Text): $blocks = array ( array('id' => '1', 'name' => 'test', 'view' => '0', 'blockfile' => 'test.php'), array('id' => '2', 'name' => 'test2', 'view' => '1', 'blockfile' => 'test2.php') ); надо вывести блоки где значение view не равно 0 то бишь view равен 1, как это сделать?? вывод делать в шаблон смарти.... вот как у меня сейчас: скрипт Код (Text): foreach ($blocks as $b){ if(file_exists("blocks/{$b['blockfile']}") AND !empty($b['blockfile']) AND $b['view']!=0){ ob_start(); require("blocks/{$b['blockfile']}"); $content = ob_get_contents(); ob_end_clean(); $smarty->display('site/block.tpl'); $smarty->assign('block', $content); $smarty->assign('tit', $b['name']); } } это прописано в шаблоне {include file='site/block.tpl'} я понял что надо в шаблоне так же сделать цикл, но че то не доперло.. P.S. документацию смарти читал и про секции и про foreach...