Доброго времени суток. Возникла проблема. Использую smarty по следующей схеме 1. index.php - подключение всех библиотек, в том числе смарти $smarty->display(index.tpl) 2. index.tpl - шаблон. в нём подключаю шапку, тело, футер. В теле идёт вызов пхп функций (файл с функция подключал в index.php) которые обращаются к базе и генерят содержимое. Так вот проблема в том что при первом заходе на страницу блоки где должен быть результат работы функций пустые, после F5 всё отображается уже нормально. Проблема как на локале, так и на вдске в инете. Сталкивался кто-нить с таким ? Как решить проблему ?
код в студию. с куками или сессиями что-то скорее всего, а не в.. прости-господи <i>неуспевании</i> ) зы: заголовок темы понравился. реально ржал. хотя я бы её переименовал в <i>php не успевает за smarty</i> =)))
С заголовком проблема была -) index.php Код (Text): <?php /** * @author WarGot * @copyright 2009 * CORE */ error_reporting(7); // КУКИ if (empty($_COOKIE['lang'])){ setcookie("lang","ru",time()+3600,"/"); } if (!empty($_GET['user_lang'])){ if ($_GET['user_lang'] == "ru" or $_GET['user_lang'] == "us"){ unset($_COOKIE['lang']); setcookie("lang",$_GET['user_lang'],time()+3600,"/"); header('Location: /main'); } } // КУКИ // подлючаем конфиг мускула include("libs/mysql/config.php"); // подключаем класс для работы с мускулом require("libs/mysql/class.php"); // подрубаемся к мускулу $db = new mysql($config['server'], $config['user'], $config['pass'], $config['database'], $config['tablePrefix']); $db->connect(); unset($mysql_database,$mysql_password,$mysql_server,$mysql_user); // include smarty class require_once('libs/smarty/Smarty.class.php'); $smarty = new Smarty(); include("functions.php"); include("core.php"); // подгрузка различных опций из БД site_options(); $smarty->template_dir = 'templates/'.OPT_TEMPLATE."/"; $smarty->compile_dir = 'templates_c/'; $smarty->config_dir = 'configs/'; $smarty->cache_dir = 'cache/'; $smarty->clear_all_cache(); $smarty->caching = false; $smarty->caching = 0; //** раскомментируйте следующую строку для отображения отладочной консоли //$smarty->debugging = true; // БЛОГ ОБРАБОТКИ ПЕРЕМЕННЫХ $module = clear_vars($_REQUEST['module']); $type = clear_vars($_REQUEST['type']); $action = clear_vars($_REQUEST['action']); $id = clear_vars($_REQUEST['id']); $pages = clear_vars($_REQUEST['pages']); // обработка центрального блока if (empty($module)){ $smarty->display('mordochka.tpl'); } elseif (!empty($module)){ include("modules/".$module.".php"); $smarty->assign('module',$module.".tpl"); $smarty->display('index.tpl'); } ?> index.tpl Код (Text): <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>title</title> <link href="templates/default/css.css" rel="stylesheet" type="text/css"> <!--[if IE 6]> <link href="ie.css" rel="stylesheet" type="text/css"> <![endif]--> </head> <body> <div id="page"> <div id="ie"> <div id="header"> <div id="logo"><a href="#"><img src="templates/nii/img/logo.png" alt="img"></a></div> <div id="wapka"></div> </div> <div id="nav"> <div id="rnavv"></div> <div id="rnav"> {php}template_widget_file("main_left");{/php} </div> <div id="rnavn"></div> </div> <div id="mal"> <div id="mal1"></div> <div id="mal2"></div> </div> <div id="lnav"> {php}template_widget_file("main_right");{/php} </div> </div> <div id="niz"> <div id="ban"> 2{php}template_widget_file("banners");{/php}2 </div> <div id="news"> <div id="fonv"> <div id="new"><a href="#">Новости</a></div></div> <div id="novost"> 1{php}template_widget_file("latest_news");{/php}1 </div> <div id="fonn"></div> </div> </div> <div id="foot"> <div id="footer"> <p>Copyright</p> </div> </div> </div> </body> </html> Например функция template_widget_file которая у мну и глючит при вызове в шаблоне с помощью {php}template_widget_file("main_left");{/php} Код (Text): // выводит виджет по запросу файла виджета function template_widget_file($file){ $template_widgets_echo = 1; include("widgets/".$file.".php"); } и наконец-то сам код виджета который инклудом идёт Код (Text): <?php error_reporting(7); /** * @author WarGot * @copyright 2009 */ // информация которая выводится в админке и частично используется виджетом $widget_info['title'] = "Информационный блок"; $widget_info['desc'] = "Левый блок навигации для главной страницы"; $widget_info['lang'] = "ru"; $widget_info['version'] = "1"; $widget_info['style'] = "one_level.tpl"; // функция виджета // ИМЯ ФУНКЦИИ состоит из слов template_widget_ и имени файла!!!! function template_widget_left_main(){ // запрашивает $db - получаем возможность работы с мускулом global $db; // делаем сам заброс // определяем язык if ($_COOKIE['lang'] == "ru"){$cat = 46;} if ($_COOKIE['lang'] == "us"){$cat = 47;} $sql = "SELECT * FROM ".$db->pre."content WHERE content_type = 'pages' and content_category_id = '$cat'"; $rows = $db->query($sql); $result = "<ul>"; while ($row = $db->fetch_array($rows)){ $result .= "<li><a href='/pages/{$row['content_id']}'>{$row['content_title']}</a></li>"; } $result .= "</ul>"; return $result; } if ($template_widgets_echo == 1){ // отдаём шаблону виджета тайтл echo template_widget_left_main(); } ?> Понимаю что принцип работы жестокий. Но ведь работает, правда не с первого раза -(
SDR Твоя фраза относительно кукисов заставила код ещё раз перепроверить, так как на них вывод по языковой версии завязан. Неа, они тут не причём. Первый раз идёт полный игнор вызова php функции из шаблона. %)
WarGot пошаговая отладка. Делаешь каждые 5-10 строк die('current line' . __LINE__); и по одной из них комментируешь сверху вниз. Попутно наблюдая куда заходит в функции.