За последние 24 часа нас посетили 51083 программиста и 1801 робот. Сейчас ищут 862 программиста ...

Обработка полученной информации перед выводом пользователю

Тема в разделе "Прочие вопросы по PHP", создана пользователем McLotos, 23 авг 2011.

  1. McLotos

    McLotos Активный пользователь

    С нами с:
    24 фев 2011
    Сообщения:
    90
    Симпатии:
    0
    Возможно эта ситуация уже здесь описывалась, но я не нашёл. У меня в БД есть таблица 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:
    1. $q="select variable from config where category='Menu' and Access=".$_SESSION['access']." and Location={$_SERVER['REQUEST_URI']}";
    2. $result=mysql_query($q);
    3. $myrow=mysql_fetch_array($result);
    4. eval ("\$myrow['variable'] = \"$myrow['variable']\";");
    5. echo $myrow['variable'];
    бесролезно
    выдаётся ошибка
    Код (Text):
    1. 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]
    Как сделать чтобы это всё адекватно отображалось на страницах? Но только так чтобы не писать кучу кода, который бы объяснял скрипту как это переводится. Т.е. смысл в чём: Сократить объём файлов, переместив меню и прочее в БД, и просто подтягивать это меню оттуда, но учитывать что юзер может не понимать русский, поэтому меню сделано на нескольких языках
     
  2. McLotos

    McLotos Активный пользователь

    С нами с:
    24 фев 2011
    Сообщения:
    90
    Симпатии:
    0
    Т.е. фактически мне нужно:
    1. вытянуть значение поля variable в зависимости от ситуации - готово
    2. полученный результат (а именно переменные $lang['бла-бла-бла']) заменять на язык, который поймёт юзер.
    Во всех файлах есть такой блок, который отвечает за подключение нужного языка
    PHP:
    1. <?
    2. if ($myrow['lang']=="eng"){$langs="project.en.lang.php";} //если авторизован и в анкете английский
    3. elseif ($myrow['lang']=="rus") {$langs="project.ru.lang.php";} //если авторизован и в анкете русский
    4. else {$langs="project.alter.lang.php";} //если не авторизован
    5. require $langs; //подключить нужный файл?>
    что дальше делать?
     
  3. Михаил

    Михаил Активный пользователь

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    Попробуйте


    Код (Text):
    1.  
    2. $lang['lang.calls'] = 'english';
    3. $x = $res['var']; //$res['var'] <--- хранится $lang['lang.calls']
    4. $$x = $lang['lang.calls'];
    5. 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):
    1.  
    2.  
    3.     $myrow['variable'] = 'english';
    4.    
    5.     eval ("\$myrow['variable'] = \"{$myrow['variable']}\";");
    6.     print $myrow['variable'];//=> english
     
  4. McLotos

    McLotos Активный пользователь

    С нами с:
    24 фев 2011
    Сообщения:
    90
    Симпатии:
    0
    Всмысле? Не совсем понял что Вы предлагаете.
    variable это значение параметра см. "структура таблицы"
    а в этом параметре данные всегда разные, чтобы было понятнее, посмотрите какой запрос я посылаю к БД
    $lang['бла-бла'] - это всего0лишь переменные.
    Ну т.е. чтобы контент сайта отображался на нескольких языках я просто пишу вместо самих слов что-то типа $lang['msg.error'], а в зависимости от языка вошедшего юзера это $lang['msg.error'] заменяется на текст типа ОШИБКА! или ERROR!
     
  5. Михаил

    Михаил Активный пользователь

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    я просто не совсем понимаю, что сделать нужно.
    вот эта переменная $lang['link.calls'], уже будет объявлена до запроса из бд?
     
  6. McLotos

    McLotos Активный пользователь

    С нами с:
    24 фев 2011
    Сообщения:
    90
    Симпатии:
    0
    Нет, если Вы внимательно прочтёте мой пост ещё раз, то всё поймёте, там подробно всё описано.
     
  7. Михаил

    Михаил Активный пользователь

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    Но я понимаю что они уже должны быть в настройках пользователя
     
  8. McLotos

    McLotos Активный пользователь

    С нами с:
    24 фев 2011
    Сообщения:
    90
    Симпатии:
    0
    Меню не может быть уже в настройках юзера, потому-что оно вытягивается из БД в зависимости от:
    1. Текущего местоположения юзера
    2. Уровня доступа юзера
    3. Языка, указанного в профиле юзера
     
  9. Михаил

    Михаил Активный пользователь

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    Тогда если их нету как их заменить?
    и вы же пробовали
    Код (Text):
    1. eval ("\$myrow['variable'] = \"$myrow['variable']\";");
    значит $myrow['variable'] уже должна быть
     
  10. McLotos

    McLotos Активный пользователь

    С нами с:
    24 фев 2011
    Сообщения:
    90
    Симпатии:
    0
    $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>
     
  11. Михаил

    Михаил Активный пользователь

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    А это объявдена
    $lang['link.calls'],
     
  12. McLotos

    McLotos Активный пользователь

    С нами с:
    24 фев 2011
    Сообщения:
    90
    Симпатии:
    0
    У меня складывается впечатление что мой первый пост настолько большой что его никто не замечает =))
    Это переменная из Lang файла, которая в зависимости от подключенного файла может принимать несколько значений
    PHP:
    1.  <?
    2.  if ($myrow['lang']=="eng"){$langs="project.en.lang.php";} //если авторизован и в анкете английский
    3.  elseif ($myrow['lang']=="rus") {$langs="project.ru.lang.php";} //если авторизован и в анкете русский
    4.  else {$langs="project.alter.lang.php";} //если не авторизован
    5.  require $langs; //подключить нужный файл?>
     
  13. Михаил

    Михаил Активный пользователь

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    То есть тебе нужно вывести запись из бд, где прописаны переменные и просто вместо этих переменных уже должны быть значения?
    Тогдя я бы лучше предложил заменить это шаблонами, например
    вместо:
    Код (Text):
    1.  
    2. ...<li>".$lang[''link.calls'']."</li>....
    заменить с шаблоном:
    Код (Text):
    1.  
    2. <li>#{link.calls}</li><font color=grey>
    а потом проще было бы
    Код (Text):
    1.  
    2. class Template
    3. {
    4.    static funciton evaluate($txt,$ar)
    5.   {
    6.  
    7.   }
    8. }
    9. print Template::evaluate('<li>#{link.calls}</li><font color=grey>', array('link.calls' => 'english' ...);
    как-то так сделать
     
  14. McLotos

    McLotos Активный пользователь

    С нами с:
    24 фев 2011
    Сообщения:
    90
    Симпатии:
    0
    Вообще я как бы не дошёл ещё до создания шаблонов, как это реализовать?
    Мы задаём запрос
    [sql]select variable from config where category='Menu' and Access=".$_SESSION['access']." and Location={$_SERVER['REQUEST_URI'][/sql]
    получаем ответ
    PHP:
    1. $myrow['variable'];
    выводим его на страницу
    PHP:
    1. <UL type="none">
    2. <li>'$lang['link.calls']'</li><font color=grey>$lang['link.calls.desc']</font><br>
    3. <li><br>$lang['link.stat']</li><font color=grey>$lang['link.stat.desc']</font><br>
    4. <li><br>$lang['link.exit']</li><font color=grey>$lang['link.exit.desc']</font><br>
    5. </UL>
    А как теперь сделать чтобы шаблон вывел на экран не
    ".$lang['link.calls']."
    ".$lang['link.calls.desc']."

    ".$lang['link.stat']."
    ".$lang['link.stat.desc']."

    ".$lang['link.exit']."
    ".$lang['link.exit.desc']."

    а значения этих переменных?
     
  15. Михаил

    Михаил Активный пользователь

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    Ну вот должно быть что-то около этого
    PHP:
    1.  
    2. <?php
    3.  
    4. class Template
    5. {
    6.    
    7.     public static function evaluate($str,$arr)
    8.     {
    9.         foreach($arr as $k=>$v)
    10.              $str = str_replace("#{".$k."}", $v,$str);
    11.        
    12.         return $str;
    13.     }
    14.    
    15. }
    16.  
    17. $str = "<li>#{ling.calls}</li><li>#{ling.desc}</li><li>#{link.stat.desc}</li>";
    18.  
    19. $arr = array('ling.calls' => 'english','ling.desc' => 123, 'link.stat.desc' => 'stat');
    20.  
    21. print Template::evaluate($str, $arr); //=> <li>english</li><li>123</li><li>stat</li>
    22.  
    23.  
     
  16. McLotos

    McLotos Активный пользователь

    С нами с:
    24 фев 2011
    Сообщения:
    90
    Симпатии:
    0
    хмм... не совсем понял, что делает этот код, где он должен быть и как он работает. Можете дать линку к материалу?
     
  17. Михаил

    Михаил Активный пользователь

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
  18. McLotos

    McLotos Активный пользователь

    С нами с:
    24 фев 2011
    Сообщения:
    90
    Симпатии:
    0
    А если вот такая конструкция, как её использовать?
    PHP:
    1. <?php
    2. class template # создали класс
    3. { # зададим переменные
    4. var $data = array(); # переменная для шаблонов
    5. var $root = '.'; # каталог для шаблонов
    6. var $ext = '.tpl'; # расширение для шаблонов
    7. var $da_vr = array(); # переменная для преобразованых шаблонов
    8. function template($dir,$ext)
    9. {if(is_dir($dir)){$this -> root = $dir;}
    10. else{die('Ошибка! '.$dir.' - это не директория!');}
    11. $this -> ext = $ext;
    12. }
    13. function load($name)
    14. {$nn = $name;
    15. $dir = $this -> root;
    16. $ext = $this -> ext;
    17. $name = $dir.'/'.$name.$ext;
    18. if(!is_file($name)) {die('Ошибка <b>'.$name.'</b> - это не файл!');}
    19. $fp = fopen($name,'r');
    20. $data = fread($fp,filesize($name));
    21. fclose($fp);
    22. $this -> data[$nn] = $data;
    23. $this -> da_vr[$nm] = $data;}
    24. function vars($nm,$vars = array())
    25. {$data = $this -> data[$nm];
    26. while(list($id,$var) = each($vars))
    27. {global $$vars[$id];
    28. $data=str_replace('{'.$vars[$id].'}',$$vars[$id],$data);}
    29. $this -> da_vr[$nm] = $data;}
    30. function out($name)
    31. {$ret = $this -> da_vr[$name];
    32. $this -> da_vr[$name] = $this -> data[$name];
    33. return $ret;}
    34. }
    35. ?>
     
  19. Михаил

    Михаил Активный пользователь

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    пример файла шаблонов
     
  20. McLotos

    McLotos Активный пользователь

    С нами с:
    24 фев 2011
    Сообщения:
    90
    Симпатии:
    0
    Не понял... =(



    скоро голова взорвётся
     
  21. Михаил

    Михаил Активный пользователь

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    ну дай файл где есть шаблон записаный
     
  22. McLotos

    McLotos Активный пользователь

    С нами с:
    24 фев 2011
    Сообщения:
    90
    Симпатии:
    0
    У меня в принципе нет никаких шабонов, у меня в проекте только php.
    Просто раз вы сказали что это нужно делать через шаблон, я вот теперь думаю как можно перевести всё в шаблонную структуру, и как сделать так чтобы проект начал воспринимать шаблоны
     
  23. Михаил

    Михаил Активный пользователь

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    ммм, у вас же есть уже переменная $lang как хэш. и вот просто когда вы в бд должны хранить не <li>'$lang['link.calls']'</li>, а <li>#{link.calls}</li> вот из бд вы получите эту строку и теперь для вывода просто
    сделайте с моим классом Template::evaluate($myrow['variable'], $lang); и всё.
     
  24. McLotos

    McLotos Активный пользователь

    С нами с:
    24 фев 2011
    Сообщения:
    90
    Симпатии:
    0
    Т.е. мне теперь нужно изменить в поле value все $lang['link.*'] на {link}, патом просто вывести их из БД используя класс?
    А подскажите как сделать чтобы они выводились через класс?
     
  25. Михаил

    Михаил Активный пользователь

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    да это только на #{link}

    в начале файла где у вас это всё выводится

    Код (Text):
    1.  
    2. require 'Template.php';
    3. //потом у вас запрос к бд где вы получаете данные $myrow['variable']
    4. //...
    5. print Template::evaluate($myrow['variable'],$lang);