Возможно эта ситуация уже здесь описывалась, но я не нашёл. У меня в БД есть таблица Config, в которую записываются конфигурации структуры сайта и т.д. Ну просто чтобы не писать все параметры всех страниц в коде, я решил сделать их в БД и просто вытягивать нужное. Структура таблицы [sql]`Config` ( `Category` varchar(24) NOT NULL, //категория параметра, ну допустим меню, или язык пользователя, или что-нибудь ещё `Access` varchar(25) NOT NULL, //уровень доступа вошедшего юзера `Location` text NOT NULL, //местоположение вошедшего юзера `Variable` text NOT NULL //то что нужно выдать в этой ситуации )[/sql] в этой таблице есть такая запись [sql]('Menu', 'Employee', '/', '<UL type=''none''>\r\n<li>".$lang[''link.calls'']."</li><font color=grey>".$lang[''link.calls.desc'']."</font><br>\r\n<li><br>".$lang[''link.stat'']."</li><font color=grey>".$lang[''link.stat.desc'']."</font><br>\r\n<li><br>".$lang[''link.exit'']."</li><font color=grey>".$lang[''link.exit.desc'']."</font><br>\r\n</UL>')[/sql] И вытягивается всё таким запросом [sql]select variable from config where category='Menu' and Access=".$_SESSION['access']." and Location={$_SERVER['REQUEST_URI']}[/sql] Всё хорошо, всё прекрасно работает, но пользователю выводится меню вот в таком виде ".$lang['link.calls']." ".$lang['link.calls.desc']." ".$lang['link.stat']." ".$lang['link.stat.desc']." ".$lang['link.exit']." ".$lang['link.exit.desc']." Как теперь сделать так, чтобы перед выводом из БД эти все переменные заменялись в зависимости от языка пользователя? Т.е. выводились не сами переменные, а их значение в соответствии с настройками вошедшего юзера? Имеются несколько Lang файлов примерно такого содержания $lang['link.members'] = "<a href='/userlist'>Список пользователей</a>"; $lang['link.members.desc'] = " - Здесь отображается список пользователей Вашего окружения."; И т.д. пробовал делать вот так PHP: $q="select variable from config where category='Menu' and Access=".$_SESSION['access']." and Location={$_SERVER['REQUEST_URI']}"; $result=mysql_query($q); $myrow=mysql_fetch_array($result); eval ("\$myrow['variable'] = \"$myrow['variable']\";"); echo $myrow['variable']; бесролезно выдаётся ошибка Код (Text): Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in Z:\home\{Location}\www\parameters.php on line 6 вот что лежит в самом поле variable [sql]<UL type='none'> <li>".$lang['link.calls']."</li><font color=grey>".$lang['link.calls.desc']."</font><br> <li><br>".$lang['link.stat']."</li><font color=grey>".$lang['link.stat.desc']."</font><br> <li><br>".$lang['link.exit']."</li><font color=grey>".$lang['link.exit.desc']."</font><br> </UL>[/sql] Как сделать чтобы это всё адекватно отображалось на страницах? Но только так чтобы не писать кучу кода, который бы объяснял скрипту как это переводится. Т.е. смысл в чём: Сократить объём файлов, переместив меню и прочее в БД, и просто подтягивать это меню оттуда, но учитывать что юзер может не понимать русский, поэтому меню сделано на нескольких языках
Т.е. фактически мне нужно: 1. вытянуть значение поля variable в зависимости от ситуации - готово 2. полученный результат (а именно переменные $lang['бла-бла-бла']) заменять на язык, который поймёт юзер. Во всех файлах есть такой блок, который отвечает за подключение нужного языка PHP: <? if ($myrow['lang']=="eng"){$langs="project.en.lang.php";} //если авторизован и в анкете английский elseif ($myrow['lang']=="rus") {$langs="project.ru.lang.php";} //если авторизован и в анкете русский else {$langs="project.alter.lang.php";} //если не авторизован require $langs; //подключить нужный файл?> что дальше делать?
Попробуйте Код (Text): $lang['lang.calls'] = 'english'; $x = $res['var']; //$res['var'] <--- хранится $lang['lang.calls'] $$x = $lang['lang.calls']; print $$x; //-> english Также McLotos Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in Z:\home\{Location}\www\parameters.php on line 6 нужно сделать так: Код (Text): $myrow['variable'] = 'english'; eval ("\$myrow['variable'] = \"{$myrow['variable']}\";"); print $myrow['variable'];//=> english
Всмысле? Не совсем понял что Вы предлагаете. variable это значение параметра см. "структура таблицы" а в этом параметре данные всегда разные, чтобы было понятнее, посмотрите какой запрос я посылаю к БД $lang['бла-бла'] - это всего0лишь переменные. Ну т.е. чтобы контент сайта отображался на нескольких языках я просто пишу вместо самих слов что-то типа $lang['msg.error'], а в зависимости от языка вошедшего юзера это $lang['msg.error'] заменяется на текст типа ОШИБКА! или ERROR!
я просто не совсем понимаю, что сделать нужно. вот эта переменная $lang['link.calls'], уже будет объявлена до запроса из бд?
Меню не может быть уже в настройках юзера, потому-что оно вытягивается из БД в зависимости от: 1. Текущего местоположения юзера 2. Уровня доступа юзера 3. Языка, указанного в профиле юзера
Тогда если их нету как их заменить? и вы же пробовали Код (Text): eval ("\$myrow['variable'] = \"$myrow['variable']\";"); значит $myrow['variable'] уже должна быть
$myrow['variable'] это и есть <UL type="none"> <li>'$lang['link.calls']'</li><font color=grey>$lang['link.calls.desc']</font><br> <li><br>$lang['link.stat']</li><font color=grey>$lang['link.stat.desc']</font><br> <li><br>$lang['link.exit']</li><font color=grey>$lang['link.exit.desc']</font><br> </UL>
У меня складывается впечатление что мой первый пост настолько большой что его никто не замечает =)) Это переменная из Lang файла, которая в зависимости от подключенного файла может принимать несколько значений PHP: <? if ($myrow['lang']=="eng"){$langs="project.en.lang.php";} //если авторизован и в анкете английский elseif ($myrow['lang']=="rus") {$langs="project.ru.lang.php";} //если авторизован и в анкете русский else {$langs="project.alter.lang.php";} //если не авторизован require $langs; //подключить нужный файл?>
То есть тебе нужно вывести запись из бд, где прописаны переменные и просто вместо этих переменных уже должны быть значения? Тогдя я бы лучше предложил заменить это шаблонами, например вместо: Код (Text): ...<li>".$lang[''link.calls'']."</li>.... заменить с шаблоном: Код (Text): <li>#{link.calls}</li><font color=grey> а потом проще было бы Код (Text): class Template { static funciton evaluate($txt,$ar) { } } print Template::evaluate('<li>#{link.calls}</li><font color=grey>', array('link.calls' => 'english' ...); как-то так сделать
Вообще я как бы не дошёл ещё до создания шаблонов, как это реализовать? Мы задаём запрос [sql]select variable from config where category='Menu' and Access=".$_SESSION['access']." and Location={$_SERVER['REQUEST_URI'][/sql] получаем ответ PHP: $myrow['variable']; выводим его на страницу PHP: <UL type="none"> <li>'$lang['link.calls']'</li><font color=grey>$lang['link.calls.desc']</font><br> <li><br>$lang['link.stat']</li><font color=grey>$lang['link.stat.desc']</font><br> <li><br>$lang['link.exit']</li><font color=grey>$lang['link.exit.desc']</font><br> </UL> А как теперь сделать чтобы шаблон вывел на экран не ".$lang['link.calls']." ".$lang['link.calls.desc']." ".$lang['link.stat']." ".$lang['link.stat.desc']." ".$lang['link.exit']." ".$lang['link.exit.desc']." а значения этих переменных?
Ну вот должно быть что-то около этого PHP: <?php class Template { public static function evaluate($str,$arr) { foreach($arr as $k=>$v) $str = str_replace("#{".$k."}", $v,$str); return $str; } } $str = "<li>#{ling.calls}</li><li>#{ling.desc}</li><li>#{link.stat.desc}</li>"; $arr = array('ling.calls' => 'english','ling.desc' => 123, 'link.stat.desc' => 'stat'); print Template::evaluate($str, $arr); //=> <li>english</li><li>123</li><li>stat</li>
хмм... не совсем понял, что делает этот код, где он должен быть и как он работает. Можете дать линку к материалу?
какую линку я сам только что написал) но идея не нова конечно http://api.prototypejs.org/language/Template/
А если вот такая конструкция, как её использовать? PHP: <?php class template # создали класс { # зададим переменные var $data = array(); # переменная для шаблонов var $root = '.'; # каталог для шаблонов var $ext = '.tpl'; # расширение для шаблонов var $da_vr = array(); # переменная для преобразованых шаблонов function template($dir,$ext) {if(is_dir($dir)){$this -> root = $dir;} else{die('Ошибка! '.$dir.' - это не директория!');} $this -> ext = $ext; } function load($name) {$nn = $name; $dir = $this -> root; $ext = $this -> ext; $name = $dir.'/'.$name.$ext; if(!is_file($name)) {die('Ошибка <b>'.$name.'</b> - это не файл!');} $fp = fopen($name,'r'); $data = fread($fp,filesize($name)); fclose($fp); $this -> data[$nn] = $data; $this -> da_vr[$nm] = $data;} function vars($nm,$vars = array()) {$data = $this -> data[$nm]; while(list($id,$var) = each($vars)) {global $$vars[$id]; $data=str_replace('{'.$vars[$id].'}',$$vars[$id],$data);} $this -> da_vr[$nm] = $data;} function out($name) {$ret = $this -> da_vr[$name]; $this -> da_vr[$name] = $this -> data[$name]; return $ret;} } ?>
У меня в принципе нет никаких шабонов, у меня в проекте только php. Просто раз вы сказали что это нужно делать через шаблон, я вот теперь думаю как можно перевести всё в шаблонную структуру, и как сделать так чтобы проект начал воспринимать шаблоны
ммм, у вас же есть уже переменная $lang как хэш. и вот просто когда вы в бд должны хранить не <li>'$lang['link.calls']'</li>, а <li>#{link.calls}</li> вот из бд вы получите эту строку и теперь для вывода просто сделайте с моим классом Template::evaluate($myrow['variable'], $lang); и всё.
Т.е. мне теперь нужно изменить в поле value все $lang['link.*'] на {link}, патом просто вывести их из БД используя класс? А подскажите как сделать чтобы они выводились через класс?
да это только на #{link} в начале файла где у вас это всё выводится Код (Text): require 'Template.php'; //потом у вас запрос к бд где вы получаете данные $myrow['variable'] //... print Template::evaluate($myrow['variable'],$lang);