1. Задавайте здесь вопросы о коде, которые не подходят в другие разделы, такие как:
    Дизайн > Верстка
    PHP > Как сделать на PHP
    Скрыть объявление

как в переменную вставить функцию :)

Тема в разделе "Web Coding", создана пользователем Striche, 2 июл 2007.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Striche

    Striche Прохожие

    :bc: Тема названна коряво - но суть проблемы в:
    В БД хронится дизайн, в зависимости от условий бирется разный, вставляется на страницу через
    PHP:
    echo $res[Header];
    , в дизайн надо вставить функцию, переменную - у меня они распознаются как текст (html теги).
     
  2. xpnet

    xpnet Прохожие

    возможно функция eval тебе поможет )
     
  3. Striche

    Striche Прохожие

    пробывал, но не получилось :ah:
    покажите пример, и будет мне счастье :)
    есть переменная $res[Header], она представляет из сабя текст: $res[Header]="<bla-bla tegi> ".Funct(2)."";
    Как сделать, что бы при: echo $res[Header]; ".Funct(2)." распозновалась как функция (и выполнялась).
    Покажите пример, как надо ставить ковычки(") внутри $res[Header] (надо ли их экранировать), как правильно вставить функцию или переменную. Как это вывести на экран. Получиться всего пара строк, так толко не получается :(
     
  4. Striche

    Striche Прохожие

    вот функция:
    PHP:
    function ViewSubdivision ($ID$LVL)
     {
        global 
    $db_prefix;
        global 
    $LVL;
        
    $LVL++;
        
    $result mysql_query('SELECT Sub_ID,Parent_ID,Sub_Name,Sub_URL,Hidden_URL,Template_ID,Class_ID,Description,Keywords,Created,LastUpdated FROM '.$db_prefix.'Subdivision WHERE (Parent_ID = "'.$ID.'") ORDER BY Sub_ID') or $mysql_error();
        if (!
    mysql_num_rows($result)) return;
        echo 
    '<ul>';
        while(
    $unit mysql_fetch_array($result)){
            echo 
    '<li>';
            echo 
    '<a href=/'.$unit[Hidden_URL].'/>'.$unit[Sub_Name].'</a>';
            
    ViewSubdivision($unit[Sub_ID], $LVL);
            
    $LVL--;
        }
        echo 
    '</ul>';
     }
    вот содержимое "$templ[Header]":
    Код:
    <html>
    
    <head>
    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">
    </head>
    
    <body leftmargin=0 rightmargin=0 bottommargin=0 topmargin=0 bgcolor=#3D0103>
    ".ViewSubdivision(10,0)."
    Листинг фунции, которая "строит" html-страницу
    PHP:
    // до этого идет запрос к БД
    $str $templ[Header];
    eval (
    "\$str = \"$str\";");
    echo 
    $str;
    echo 
    $messa;
    echo 
    $templ[Footer];
    Получается:
    HTML:
    <ul><li><a href=/bisnestravel/tourism/1/>1</a><ul><li><a href=/bisnestravel/tourism/1/11/>2a</a><ul><li><a href=/bisnestravel/tourism/1/11/ssylka/>Еще подраздел</a></ul></ul></ul><html>
    
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
    </head>
    
    <body leftmargin=0 rightmargin=0 bottommargin=0 topmargin=0 bgcolor=#3D0103>
    а должно быть:
    HTML:
    <html>
    
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
    </head>
    
    <body leftmargin=0 rightmargin=0 bottommargin=0 topmargin=0 bgcolor=#3D0103>
    <ul><li><a href=/bisnestravel/tourism/1/>1</a><ul><li><a href=/bisnestravel/tourism/1/11/>2a</a><ul><li><a href=/bisnestravel/tourism/1/11/ssylka/>Еще подраздел</a></ul></ul></ul>
    Мне кажется косяк в нутри функции "ViewSubdivision" - но это только кажется :nezn:
    Наставьте меня на путь истинный, буду очень благодарен.
    P.S. делаю подобиее CMS (добавление разделов, редактирование текста). В определенном макете дизайна надо вывести меню (дерево подразделов). - CMS построена по примеру NetCat
     
  5. -Nou-

    -Nou- Постоялец

    Регистр.:
    29 апр 2007
    Сообщения:
    134
    Симпатии:
    12
    А где у тебя хранится содержимое $templ[Header]? Нельзя ли просто сделать так: хранить в файлике твой хедер, но потом, в скрипте просто объединить содержимое файла и результат работы функции:
    Код:
    $templ[Header] = $data_from_file.ViewSubdivision(10,0);
    и никаких eval тут не надо
     
  6. Striche

    Striche Прохожие

    PHP:
    $templ mysql_query('SELECT Template_ID,Parent_Template_ID,Template_Name,Settings,Header,Footer,CSS FROM '.$db_prefix.'Template WHERE (Template_ID = "'.$sub[Template_ID].'") ORDER BY Template_ID') or $mysql_error();
    $templ mysql_fetch_assoc($templ);
    PHP:
    $templ[Header] = $data_from_file.ViewSubdivision(10,0);
    Это пойдет если функцию вставлять после [headr], а если надо вставить внутри [headr]? Люди же это как то делают, вот как?

    P.S. уважаемммые модераторы, если удалили "нужный" пост, то оставьте коментарий: "почему удалили". Заранее спасибо.
     
  7. -Nou-

    -Nou- Постоялец

    Регистр.:
    29 апр 2007
    Сообщения:
    134
    Симпатии:
    12
    Не пойму, зачем функцию вставлять внутри темплейта, это не есть правило хорошего тона. Обычно делают так:
    Темплейт:
    HTML:
    My Text my text My Text my text My Text my text My Text my text [yourfunction] My Text my text
    Код:
    PHP:
    $templ[Header] = str_replace("[yourfunction]"ViewSubdivision(10,0), $data_from_file);
     
  8. ozor

    ozor Писатель

    Регистр.:
    22 дек 2006
    Сообщения:
    7
    Симпатии:
    1
    команда echo не заносит в переменную текст, а непосредственно отправляет его сразу на вывод в браузер. поэтому, твой код, по-моему, надо чуть-чуть модифицировать.

    Твой код:
    Код:
    function ViewSubdivision ($ID, $LVL) 
    { 
        global $db_prefix; 
        global $LVL; 
        $LVL++; 
        $result = mysql_query('SELECT Sub_ID,Parent_ID,Sub_Name,Sub_URL,Hidden_URL,Template_ID,Class_ID,Description,Keywords,Created,LastUpdated FROM '.$db_prefix.'Subdivision WHERE (Parent_ID = "'.$ID.'") ORDER BY Sub_ID') or $mysql_error(); 
        if (!mysql_num_rows($result)) return; 
        echo '<ul>'; 
        while($unit = mysql_fetch_array($result)){ 
            echo '<li>'; 
            echo '<a href=/'.$unit[Hidden_URL].'/>'.$unit[Sub_Name].'</a>'; 
            ViewSubdivision($unit[Sub_ID], $LVL); 
            $LVL--; 
        } 
        echo '</ul>'; 
    }
    Как я предлагаю:
    Код:
    function ViewSubdivision ($ID, $LVL) 
    { 
        global $db_prefix; 
        global $LVL; 
        $LVL++; 
        $result = mysql_query('SELECT Sub_ID,Parent_ID,Sub_Name,Sub_URL,Hidden_URL,Template_ID,Class_ID,Description,Keywords,Created,LastUpdated FROM '.$db_prefix.'Subdivision WHERE (Parent_ID = "'.$ID.'") ORDER BY Sub_ID') or $mysql_error(); 
        if (!mysql_num_rows($result)) return; 
        $ret = '<ul>'; 
        while($unit = mysql_fetch_array($result)){ 
            $ret .= '<li>'; 
            $ret .= '<a href=/'.$unit[Hidden_URL].'/>'.$unit[Sub_Name].'</a>'; 
            ViewSubdivision($unit[Sub_ID], $LVL); 
            $LVL--; 
        } 
        $ret .= '</ul>'; 
        
        return $ret;
    } 
    ---
    или же использовать функции работы с буфером.

    Твой код:
    Код:
    $str = $templ[Header]; 
    eval ("\$str = \"$str\";"); 
    echo $str; 
    echo $messa; 
    echo $templ[Footer];
    Как я предлагаю:
    Код:
    ob_start();
    	$templ[Header];
    	$str = ob_get_contents();
    ob_end_clean();
    	eval ("\$str = \"$str\";"); 
    	echo $str; 
    	echo $messa; 
    	echo $templ[Footer];
    

    А если будешь использовать echo без буферизации, то ничё у тебя не выйдет. ечо будет выдаваться раньше кода, просто занесенного в переменную.
     
Статус темы:
Закрыта.