За последние 24 часа нас посетили 32496 программистов и 1755 роботов. Сейчас ищут 842 программиста ...

Кто как пишет?

Тема в разделе "Прочие вопросы по PHP", создана пользователем 440Hz, 25 фев 2008.

?

Кто как пишет?

  1. 1. как в мануале

    0 голосов
    0,0%
  2. 2. HTML результат работы PHP

    0 голосов
    0,0%
  3. 3. быстрые шаблоны

    0 голосов
    0,0%
  4. 4. шаблоны с логикой (циклы ифы и т.д.)

    0 голосов
    0,0%
  5. 5. по другому (приведу пример и обосную)

    0 голосов
    0,0%
  1. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    1. как в мануале

    PHP:
    1.  
    2. <title><?php echo $title; ?></title>
    3.  
    2. продвинуто

    PHP:
    1.  
    2. <?php
    3. print "<title>{$title}</title>";
    4. ?>
    5.  
    3. простые шаблоны (быстрая замена/подстановка)

    PHP:
    1.  
    2. <?php
    3. $t = new Template('title');
    4. $t->Set('title',$title);
    5. $t->Show();
    6. ?>
    7.  
    Код (Text):
    1.  
    2. <title>{title}</title>
    4. сложные шаблоны с логикой

    PHP:
    1. <?php
    2. $t = new Template('html');
    3. $t->Set('title',$title);
    4. $t->Parse('title','headertitle');
    5. $t->Show('html');
    6. ?>
    Код (Text):
    1.  
    2. <!-- begin html -->
    3. <html>
    4. {headertitle}
    5. <body>{body}</body>
    6. </html>
    7. <!-- end html -->
    8.  
    9. <!-- begin title -->
    10. <title>{title}</title>
    11. <!-- end title -->
     
  2. Anonymous

    Anonymous Guest

    У меня гдето промеж 3 и 4. =) Логики - минимум.
     
  3. Clone

    Clone Guest

    Smarty.
    А как же варианты
    PHP:
    1. <?=$content;?>
    и
    PHP:
    1. <?php
    2. $echo = <<<HEREDOC
    3. <div>
    4.     {$content}
    5. </div>
    6. HEREDOC;
    7. echo $echo;
    ?
    Правда обоим не пользуюсь, но это уже получше чем <title><?php echo $title; ?></title> и <?php print "<title>{$title}</title>"; ?>
     
  4. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Хм, мой вариант такой:

    PHP
    PHP:
    1. <?php
    2. $parser->set('data', $array);
    3. $parser->set('content_center', $this->template('template.htm');
    4.  
    HTML Template
    PHP:
    1.  
    2. <? if (is_set('data')){?>
    3.   <table cellspacing="0" cellpadding="0">
    4.     <tr>
    5.       <th>Header</th>
    6.       <th>Header 2</th>
    7.     </tr>
    8.     <? foreach (get('data') as $value){?>
    9.     <tr>
    10.       <td><?=$value['name_1']?></td>
    11.       <td><?=$value['name_2']?></td>
    12.     </tr>
    13.     <?}?>
    14.   </table>
    15. <?}else{?>
    16.   <div class="no-data">No data avaliable</div>
    17. <?}?>
    18.  
    Минимум логики, голый PHP :)
     
  5. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    а потом ты делаешь eval() или include()?
    жесть...
     
  6. RomanBush

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

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    Зависит от задачи. Если уже сделано на smarty - переделывать в простой вид не буду. Продолжу на smarty.
    Если написано "как в мануале" - переделывать на smarty не буду. Продолжу так.
    А вот "продвинутый" вид я вообще не понимаю - это типа "сами создаём себе трудности, чтобы их успешно пердолевать". Если есть время/желание - переделаю в "мануальный" вид. Если нет - просто не будут трогать. А дальше буду писать нормально, по "мануальному".
    Ну а если написано на ООП - с удовольствием продолжу на ООП.
    Мне пофик вид. Больших проектов с нуля я не писал. И в ближайшее время не предвидится. Так что - продолжаю писать так, как было до меня написано.
     
  7. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Поскольку большие проекты и с нуля, то…
    Каждый модуль генерит XML, который
    а) используется после XSL-преобразование в ответ XML-RPC сервиса;
    б) включается в общую структуру, которая потом через XSL-шаблоны превращается в конечный HTML, JS, CSS…

    PS: мелкие сайты делал на быстрых шаблонах.
     
  8. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    440Hz
    $this->template() делает include шаблона :)
     
  9. Anonymous

    Anonymous Guest

    Вово, у меня Psih-а метод в основном.
     
  10. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    PHP:
    1. <?php
    2. # код код код
    3.  
    4. # Создаём список доступных модулей | ГРУЗИМ ШАБЛОН МЕНЮШКИ И ПРОГОНЯЕМ ЕГО В ЦИКЛЕ, А ПОТОМ ВСТАВЛЯЕМ В ШАПКУ
    5. $mods_dir = opendir(ROOT_PATH.'admin/modules');
    6.  
    7. while(false !== ($mod_name = readdir($mods_dir)))
    8. {
    9.     if($mod_name != '.' and $mod_name != '..')
    10.     {
    11.         $mods_list[] = $mod_name;
    12.  
    13.         if($mod_name != 'error' and $mod_name != 'complete')
    14.         {
    15.             # Подгружаем файл локализации с названием модуля для главного меню
    16.             require_once ROOT_PATH.'languages/'.LANGUAGE.'/admin/'.$mod_name.'/main_menu.php';
    17.  
    18.             if($mod_name == $mod) $TPL_REPL['mod_name'] = $lang['main_menu'];
    19.  
    20.             $main_menu['lang_main_menu'] = $lang['main_menu'];
    21.             $main_menu['url_main_menu'] = HTTP.DOMAIN.PATH.'admin/'.SCRIPT_FILENAME.'?m='.base64_encode($mod_name).SID;
    22.  
    23.             $tpl_main_menu_array[] = $TPL->parse('admin/main_menu', 1, $main_menu);
    24.         }
    25.         else
    26.         {
    27.             $TPL_REPL['mod_name'] = NULL;
    28.         }
    29.     }
    30. }
    31.  
    32. closedir($mods_dir);
    33.  
    34. # Собираем главную менюшку из модулей
    35. $TPL_REPL['main_menu'] = implode('', $tpl_main_menu_array);
    36.  
    37.  
    38. # Служебные ссылки - выход, переход на главную
    39. $TPL_REPL['url_go2index'] = HTTP.DOMAIN.PATH.'index.php?'.SID; # на главную
    40. $TPL_REPL['url_go2out'] = HTTP.DOMAIN.PATH.'admin/'.SCRIPT_FILENAME.'?m='.base64_encode('exit').SID; # выход
    41.  
    42. # код код код
    43.  
    44. # Шаблон верхней шапки | БЕЗ ЛОГИКИ - ПРОСТОЙ
    45. $TPL->parse('admin/header');
    46.  
    47. # код код код
    48.  
    =) типа того

    upd. Все обработанные шаблоны накапливаются в специальной буфере шаблонизатора, а в конце вся страничка выводится так:
    PHP:
    1. <?php
    2. $TPL->show();
     
  11. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Быстрые шаблоны. Вся логика у меня - в обработчике шаблонов. Только с классами я пока не очень дружу, изаю preg_replace и str_replace :) Такие шаблоны очень легко править.
     
  12. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Hight
    А у меня специального буффера нету. Этот буффер сам по себе является самой обычной переменной, просто в него данные добавляются через append.

    Вообще юзаю простейший класик с несколькими методами: set, get, is_set, append и всё. Методы загрузки темплейта идут в самом ядре, т.к. им нужно знать что за класс вызывает подгрузку темплейта и на основании этого идёт соответствующий пусть :)

    А в index.php есть один простой вызов echo $core->load('sys_layout.htm');

    [vs]
    С PHP вставками ничуть не труднее. У меня вообще шаблон требует только того, что-бы ему передали данные, которые ему надо вывести :) И то, обычно всегда стоит проверка на то, что они вообще есть. Довольно удобная структура и избавляет от кучи проверок :)
     
  13. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    PHP:
    1. public function pageAction() {
    2.     $this->setLayout('default.phtml');
    3.     $this->getLayout()->title = 'Страница';
    4.     //...
    5.     $this->list = array(1, 2, 3);
    6.     //...
    7.     $this->setView('page.phtml');
    8. }
    default.phtml
    Код (Text):
    1. <h1><?php print $title?></h1>
    2. <p>
    3.     <?php print $this->getContents()?>
    4. </p>
    page.phtml
    Код (Text):
    1. <ul>
    2. <?php foreach ($list as $item):?>
    3.     <li><?php print $item?></li>
    4. <?php endforeach?>
    5. </ul>
     
  14. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Psih
    На практике у меня примерно так:
    PHP:
    1.  
    2. <?
    3. ...
    4. $template=file_get_contents('page.tpl');
    5. $template=str_replace('{MENU}',$menu,$template);
    6. ...
    7.  
     
  15. EvelRus

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

    С нами с:
    16 ноя 2006
    Сообщения:
    2.168
    Симпатии:
    0
    Адрес:
    Москва
    [vs], абсалютно так же :))))
    Сплошные ифы и ни одного класса ;)
     
  16. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    хе =)
    PHP:
    1. <?php
    2.     # Выборка в буфер
    3.     private function get_tpl($template = NULL)
    4.     {
    5.         if($template == NULL) $this->_log('<b>Error. Class: Templates. Method: get_tpl(). Undefined argument "template".</b>');
    6.  
    7.         if(!file_exists(ROOT_PATH.'templates/'.STYLE.'/'.$template.'.tpl')) $this->_log('<b>Error. Class: Templates. Method: get_tpl(). The file "'.$template.'.tpl" does not exist.</b>');
    8.  
    9.         $this->buffer[$template] = @file_get_contents(ROOT_PATH.'templates/'.STYLE.'/'.$template.'.tpl') or $this->_log('<b>Error. Class: Templates. Method: get_tpl(). Can`t read the file "'.$template.'.tpl".</b>');
    10.  
    11.         $this->get_tpl_counter += 1; # Накручиваем счётчик
    12.     }
    в модуле делаю раз:
    PHP:
    1. <?php
    2. # Шаблон верхней шапки
    3. $TPL->parse('header');
    и всё.
     
  17. EvelRus

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

    С нами с:
    16 ноя 2006
    Сообщения:
    2.168
    Симпатии:
    0
    Адрес:
    Москва
    Никогда не понимал... объясните.. вы присваиваете переменной пустоту и тут же ее проверяете... и задаете условие есл она пустота, то ошибка...
     
  18. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Чего не понятно?! Если я случайно забыл передать в метод параметр мне об это сообщат. Метод _log() сделает die(); с выводом ошибки по умолчанию.
     
  19. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    RTFM, http://ru2.php.net/manual/ru/functions. ... ts.default
     
  20. Clone

    Clone Guest

    Фигасе... А почему бы просто не сделать private function get_tpl($template)?
     
  21. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Так надо. Мой 'наворот' ещё и ошибки в файл пишет. И меня это радует. =)
    Смотри код метода _log();
    PHP:
    1. <?php
    2.     # Логирование
    3.     private function _log($log_message = 'Class: Templates. Method: _log(). Default message.', $die = true)
    4.     {
    5.         if($this->allow_log)
    6.         {
    7.             if(!file_exists($this->log_file)) echo '<b>Class: Templates. Method: _log(). The file "'.$this->log_file.'" does not exist.</b> <br />';
    8.  
    9.             if(!$handle = @fopen($this->log_file, 'a')) echo '<b>Class: Templates. Method: _log(). Can not open the file "'.$this->log_file.'".</b> <br />';
    10.  
    11.             if(@fwrite($handle, "[".date("j m Y")."] [".date("H:i:s")."] [".$_SERVER["REMOTE_ADDR"]."] [".$_SERVER["SCRIPT_FILENAME"]."] [".str_replace("\r\n", NULL, $log_message)."] \r\n") === false) echo '<b>Class: Templates. Method: _log(). Can`t write in the file "'.$this->log_file.'".</b> <br />';
    12.  
    13.             fclose($handle);
    14.         }
    15.  
    16.         if($this->allow_show_log_messages) echo $log_message." <br /> \r\n";
    17.  
    18.         if($die) die('<b>Class: Templates. The script is stopped.</b>');
    19.     }
    upd. А в какой-то теме говорили, что ООП не надо. Надо-надо. 8)
     
  22. S.t.A.M.

    S.t.A.M. Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1.041
    Симпатии:
    0
    хе... как карты лягут )))
     
  23. Clone

    Clone Guest

    Hight, а стандартный PHP-лог чем не устраивает? Он ведь тоже в файл пишется. Зачем писать код, который уже встроен в PHP? Непонятно...
     
  24. Clone

    Clone Guest

    И, чтобы не быть голословным:
    В инклудах:
    PHP:
    1. <?php
    2.  
    3. function make_template_address($component = "")
    4. {
    5.     if ($component == "")
    6.     {
    7.         if (is_dir(SITE_ROOT_PATH.'templates/'.get_defalut_theme()))
    8.             return SITE_ROOT_PATH.'templates/'.get_defalut_theme();
    9.         else
    10.             die("Wrong component(templates path miss): ".$component);
    11.     }
    12.     else
    13.     {
    14.         if (is_dir(SITE_ROOT_PATH.'templates/'.get_defalut_theme().'/components/'.$component))
    15.             return SITE_ROOT_PATH.'templates/'.get_defalut_theme().'/components/'.$component;
    16.         elseif (is_dir(SITE_ROOT_PATH.'components/'.$component.'/templates'))
    17.             return SITE_ROOT_PATH.'components/'.$component.'/templates';
    18.         else
    19.             die("Wrong component(templates path miss): ".$component);
    20.     }
    21. }
    22.  
    23. function make_smarty_template_address($component = "")
    24. {
    25.     return make_template_address($component);
    26. }
    27.  
    28. function &return_component_smarty_object($component_name, &$LANG = array())
    29. {
    30.     require_once SITE_ROOT_PATH."includes/core/smarty/Smarty.class.php";
    31.     $component_smarty = new Smarty;
    32.     $component_smarty->template_dir = make_smarty_template_address($component_name).'/';
    33.     $component_smarty->compile_dir = make_smarty_template_address($component_name).'/compile/';
    34.     $component_smarty->config_dir = make_smarty_template_address($component_name).'/config/';
    35.     $component_smarty->cache_dir = make_smarty_template_address($component_name).'/cache/';
    36.     $component_smarty->compile_check = true;
    37.     $component_smarty->caching = 0;
    38.     $component_smarty->request_use_auto_globals = false;
    39.     $component_smarty->error_reporting = E_ALL;
    40.     $component_smarty->assign_by_ref('LANG', $LANG);
    41.     global $base_url;
    42.     $component_smarty->assign_by_ref('base_url', $base_url);
    43.     return $component_smarty;
    44. }
    В компоненте:
    PHP:
    1. <?php
    2. $mod = explode("/", $_GET['mod']);
    3. $component_smarty =& return_component_smarty_object("news", $LANG);
    4. set_current_position(array(return_href('news') =>$LANG['MODULE_DESCRIPTION_BASE']));
    5.  
    6. //...
    7. // Main page
    8.  
    9.     // Try to get page number
    10.     if (isset($mod[1]))
    11.         $page = escape_page($mod[1]);
    12.     else
    13.         $page = 1;
    14.  
    15.     // Page Not Exists
    16.     if ($page === null)
    17.     {
    18.         define('STATUS_CODE', 404);
    19.         return;
    20.     }
    21.  
    22.     $news_cache = new Cache_Lite(array('lifeTime' => 600));
    23.     if (!$news_categories =& $news_cache->get('news_categories'))
    24.     {
    25.         $result = mysql_query("SELECT id, title, description FROM news_categories");
    26.         $news_categories = array();
    27.         while ($row = mysql_fetch_assoc($result))
    28.             $news_categories[$row['id']] = array('title' => $row['title'], 'description' => $row['description']);
    29.         $news_cache->save($news_categories, 'news_categories');
    30.     }
    31.  
    32.     $sql_query = "SELECT SQL_CALC_FOUND_ROWS id, category, author, title, annotation, date, views FROM news WHERE active='1' ORDER BY date DESC LIMIT ".floor(($page - 1) * NEWS_AT_HOME_PAGE).", ".NEWS_AT_HOME_PAGE;
    33.     if (!$messages =& $news_cache->get($sql_query) || ($total =& $news_cache->get($sql_query.'total')) === false)
    34.     {
    35.         $result = mysql_query($sql_query);
    36.         list($total) = mysql_fetch_row(mysql_query("SELECT FOUND_ROWS()"));
    37.         $messages = array();
    38.         while ($row = mysql_fetch_assoc($result))
    39.         {
    40.                 $messages[] = array(
    41.                         'ID' => $row['id'],
    42.                         'TITLE' => $row['title'],
    43.                         'ANNOTATION' => $row['annotation'],
    44.                         'VIEWS' => ($row['views'] + 1),
    45.                         'POSTER' => array('ID' => $row['author'], 'LOGIN' => ($row['author'] > 0)?get_user_profile_field('members_display_name', $row['author']):$row['author']),
    46.                         'DATE' => $row['date'],
    47.                         'CATEGORY' => array('ID' => $row['category'], 'TITLE' => $news_categories[$row['category']]['title']));
    48.         }
    49.         $news_cache->save($messages, $sql_query);
    50.         $news_cache->save($total, $sql_query.'total');
    51.     }
    52.     if ($page > $total / NEWS_AT_HOME_PAGE)
    53.     {
    54.         define('STATUS_CODE', 404);
    55.         return;
    56.     }
    57.     $component_smarty->assign_by_ref('messages', $messages);
    58.     $total = ceil($total / NEWS_AT_HOME_PAGE);
    59.     $page = min($page, $total);
    60.     $component_smarty->assign_by_ref('end', $total);
    61.     $component_smarty->assign_by_ref('current', $page);
    62.  
    63.     $component_smarty->display('main.tpl');
    64. //...
    Код довольно старый, недавно была ревизия, так что и сам знаю что не самый оптимальный вариант;)
     
  25. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Другой вариант.

    Сначала
    PHP:
    1. $title = 'Vladson';
    Потом
    PHP:
    1. <title><?=$title?></title>