Разберем подробнее HTML-структуру странички. Тема та же - стандартная Bluemarine.
После того, как мы посмотрели исходник готовой страницы, самое время немного полазить по файлам .tpl.php. Исключительно для понимания структуры. Сегодня мы их все еще менять не будем.
Итак, главный, центровой файл page.tpl.php в студию!
<html xmlns="http://www.w3.org/1999/xhtml" lang="<?php print $language ?>" xml:lang="<?php print $language ?>">
<head>
<title><?php print $head_title ?></title>
<?php print $head ?>
<?php print $styles ?>
<?php print $scripts ?>
<script type="text/javascript"><?php /* Needed to avoid Flash of Unstyle Content in IE */ ?> </script>
</head>
Что мы видим тут по сравнению со вчерашними наблюдениями? Как и следовало из расширения - это обычный PHP-файл. Поскольку PHP в душе уже сам шаблон, то почему бы его и не использовать по прямому назначению? Итак, до вызова этого файла в переменных $head, $styles, $scripts и т.д. находятся уже сгенерированные куски нашей страницы. А в этом шаблоне мы их собственно и выводим в том порядке, в котором хочется дизайнеру/верстальщику.
<table border="0" cellpadding="0" cellspacing="0" id="header">
Главное в этом фрагменте - начинается таблица с id #header. В файлах *.css часть ее свойств будут наследованы от вышестоящих элементов (в нашем случае body), часть будет описана для всех таблиц в целом, а некоторые свойства - непостредственно для данной таблицы. То есть если мы хотим что-то изменить в отображении верхней полоски - нам надо рыть внутри свойств этой таблицы.
<td id="logo">
<?php if ($logo) { ?><a href="<?php print $base_path ?>" title="<?php print t('Home') ?>"><img src="<?php print $logo ?>" alt="<?php print t('Home') ?>" /></a><?php } ?>
<?php if ($site_name) { ?><h1 class='site-name'><a href="<?php print $base_path ?>" title="<?php print t('Home') ?>"><?php print $site_name ?></a></h1><?php } ?>
<?php if ($site_slogan) { ?><div class='site-slogan'><?php print $site_slogan ?></div><?php } ?>
</td>
Ячейка с id #logo. Уже наверное понятно, что если нам что-то надо от этой ячейки - добро пожаловать в секцию #logo { ... } файла .css.
Обращаем внимание, что картинка-логотип не имеет своего отдельного id и даже класса. С одной стороны, если сильно прижмет, можно и поправить этот файл (но не рекомендуется делать до начала соответствующего урока!), либо обращаться к этой картинке как #logo img { } (то есть ко всем картинкам элемента #logo, что в данном случае прокатит, поскольку в нем всего одна картинка). Зачем нам переопределять свойства картинки? Ну вдруг захотим размер поменять, или рамочкой обвести. Дизайнеры - они такие непредсказуемые.
Для тех, кто не умеет в уме вычищать теги <?php ?>
, смотрим во что в результате превращается этот кусок шаблона:
<a title="Home" href="/">
<img alt="Home" src="/themes/bluemarine/logo.png"/>
</a>
<h1 class="site-name">
<a title="Home" href="/">Drupal</a>
</h1>
</td>
Отступы и переводы строк сделаны мной для удобства чтения. На самом деле не совсем мной, а очень полезным Firebug'ом. Так что если еще не поставили его себе - срочно исправить упущение.
Маленькое отступление, чтобы не запутывать пытливых читателей: это плагин при разборе страницы самопроизвольно меняет местами свойства внутри тэгов. Например, если просмотреть исходник страницы, то тег <img>
на самом деле выглядит так: <img src="/themes/bluemarine/logo.png" alt="Home" />
. То есть как и в шаблоне, сначала идет свойство src, и только потом alt. Просьба не пугаться, шаблон выводится строго посимвольно.
<?php if (isset($secondary_links)) { ?><?php print theme('links', $secondary_links, array('class' =>'links', 'id' => 'subnavlist')) ?><?php } ?>
<?php if (isset($primary_links)) { ?><?php print theme('links', $primary_links, array('class' =>'links', 'id' => 'navlist')) ?><?php } ?>
<?php print $search_box ?>
</td>
</tr>
<tr>
<td colspan="2"><div><?php print $header ?></div></td>
</tr>
</table>
В этой ячейке с id #menu выводятся первичные и вторичные ссылки (если определены конечно). Вот эта конструкция <?php if (isset($primary_links)) { ?>
отвечает за вывод частей шаблона. И поэтому, если $primary_links не определены, то ничего туда и выводиться не будет. Если обратили на это внимание еще в прошлом фрагменте, то не вывелся целиком <div class='site-slogan'>
со слоганом сайта. Для чего такие сложности? Просто без использования такой конструкции если не будет слогана, то останутся его уши в виде открывающего и закрывающего тега
<tr>
Тут начинается самое интересное - таблица контента. С понятным id.
Сайдбар - это столбики слева и справа от основного тела сайта. Туда выводятся разные блоки. Например меню, блок входа и т.д. Собственно ширину это колонки можно легко задать в свойствах #sidebar-left. Ну и как уже догадались, если у нас никаких блоков ни слева ни справа нет, то вся ячейка просто не выводится.
<?php if ($mission) { ?><div id="mission"><?php print $mission ?></div><?php } ?>
<div id="main">
<?php print $breadcrumb ?>
<h1 class="title"><?php print $title ?></h1>
<div class="tabs"><?php print $tabs ?></div>
<?php print $help ?>
<?php print $messages ?>
<?php print $content; ?>
<?php print $feed_icons; ?>
</div>
</td>
Уже натренировав глаз на предыдущих кусках, легко заметить, что сюда просто выводятся уже сгенериованные куски странички - мисиия (если есть), путь текуще странички, заголовок страницы, закладки, подсказки и собственно контент.
Ну и что у нас осталось незатронутым? Правый сайдбар и подвал странички. Общая структура страницы должна быть уже ясна.
Соответственно, если нам будет нужно поменять оформление шапки сайта, изменить размеры колонок (уже понятно, что в данной теме подразумевается трехколоночный дизайн, сделанный таблицей), то вопросов, к каким элементам обращаться, возникнуть уже не должно.
Комментарии
Спасибо!
спасибо
Что меня бесит, так это строки типа:
<a href="<?php print $base_path ?>" title="<?php print t('Home') ?>"><img src="<?php print $logo ?>" alt="<?php print t('Home') ?>" /></a><?php } ?>
<?php if ($site_name) { ?>
<h1 class='site-name'><a href="<?php print $base_path ?>" title="<?php print t('Home') ?>"><?php print $site_name ?></a></h1><?php } ?>
<?php if ($site_slogan) { ?>
<div class='site-slogan'><?php print $site_slogan ?></div><?php } ?>
Предпочитаю более читабельные конструкции:
$home = t('Home');
if($logo)
print ('');
if ($site_name)
print('$site_name');
if ($site_slogan)
print('
');
?>
Если HTML-кода много, можно использовать php-оператор <<<.
Почти всех просто прёт сто раз писать
PS: Сорри за оффтоп, просто накипело.
Эти замысловатые конструкции лучше обрабатываются каким-нибудь визуальным HTML-редактором.
А твой подход мне напоминает Perl
Я пользуюсь редакторами с подсветкой кода. В понимании проблем нет - просто не люблю лишние буквы.
-- А твой подход мне напоминает Perl
Я сишник
теоретически, первый вариант работает быстрее поскольку строки не обрабатывется интерпретатором php, в твоём примере - дополнительные функции print.
Чего-то я не понимаю, видимо...
При условии срабатывания всех if-ов, в первом примере восемь раз вызывается ф-я print, и два раза - t(), в моём - три раза print и один раз t() (кстати, а ф-я t() в данном случае лезет в базу за переводом или нет?).
Но я думаю это "ловля блох" и на эффективности не сильно сказывается (сам знаешь, где у Drupal слабые места), а вот понятности добавляет.
И ещё, в первом примере интерпретатор вызывается десять раз, в моём - один.
Не понял, почему интерпритатор вызывается 10 раз.
Что касается кавычек. Я за то, что бы выносить чистый HTML за пределы <?php ?>. Потому что:
Dan
странно - а что даже в одинарные кавычки друпал переменные подставляет?
Ну нет, конечно - облажался
> Не понял, почему интерпритатор вызывается 10 раз.
Я так понимаю работу апача (поправьте если не прав) при разборе файла он встречает конструкцию <?php ?>, для её обработки сразу, на месте, вызывается связанный обработчик (в данном случае - PHP). Если эта конструкция встречается 10 раз - обработчик вызывается 10 раз. Я правильно понимаю механизм? Кто знает точно?
Так, но не совсем.
Обработчик php вызывается сразу, в месте с сервером.
В простейшем примере, запускается Apache, он запускает своего потомка, а потомок запускает обработчик.
И все это ещё до того, как ты открыл сайт на localhost.
Про потомка понятно. Вопрос, как именно запускаются обработчики. Ты говоришь, что одновременно с апачем, но мне кажется это только в случае, если обработчик встроен как модуль, а если как CGI (или FastCGI)?
Точно не скажу, по моему в FastCGI принцип тот, который ты описал выше.
От темы отошли ребята. А тема очень интересная.
Насчет php. При запуске апач загружаются все подключенные библиотеки.
В случае моего последнего вебсервера эта библиотека php5apache2_2.dll.
Так что мне кажется правильно когда мы не заставляем сервер обрабатывать html через php то есть метод print, echo или content ^_^
Как бы не вызывался (модуль, CGI, FastCGI) интерпретатор PHP, Apache как только понимает, что файл php (грубо говоря, видит расширение .php), сразу отдает его интерпретатору, а сам ничего не парсит, а уже интерпретатор переключается в режимы простой выдачи и выполнения команд (причем первый работает быстрее естественно). Сам Apache про теги
<?php ?>, <? ?>, <?= ?>
и т. п. ничего не знает (как, в принципе, ничего не знает и про html теги). Его задача (упрощенно) понять, каким обработчиком нужно обработать запрос браузера, что и как этому обработчику задать в качестве параметров (какой файла он будет обрабатывать главное) и как выдать браузеру результаты работы обработчика (в случае php, например, определить какие HTTP заголовки выдал интепретатор сам и их уже не выводить). Вообще Apache - это HTTP сервер, все что касается HTML, PHP, Perl, C и т. д. его не волнует, максимум HTTP заголовки анализирует и свои добавляетСовет: настроить горячие клавиши (или внутренние шаблоны редактора), например
<?php print ?>
на ctrl+shift+p повеситьСам спор "PHP внутри HTML" или наоборот вечен, как вечен PHP Есть и плюсы, и минусы у обоих подходов (а есть еще и другие подходы). Первого обычно придерживаются те, кто привык работать в команде с разными дизайнерами/верстальщиками/визуальными HTML редакторами :), им достаточно объяснить (поначалу ), что все что внутри "скобок" <?php ?> будет заменено на обычный текст, без всяких тегов и они спокойно могут верстать и править шаблоны. Второго те, кто пришел из мира "серьезного" программирования и делает сайты "под ключ" (максимум дизайнер дает дизайн в .psd). Если кто только начинает осваивать PHP лучше придерживаться первого способа, он универсальнее
З.Ы. Надеюсь кому-то поможет прояснить ситуацию
Полезно, спс!
Чёрт возьми, чуваки!
Вы все такие умные!
+1
Я тоже сишник помоему удобнее
и читабельней будет как говорит "Dan"
подумайте сами, а если ваш код возмёт ктото из новичков, или начальник захочет поумничать!!
Есть такое понимание как красивый стиль программирования!
Ребят, подскажите пожалуйста...начал устанавливать новую тему professional_theme... и после установки на экране вся информация пропала...написана ошибка следующая
Fatal error: Call to undefined function i18n_menu_translated_tree() in /home/b/blabla/blabla.ru/public_html/sites/all/themes/themes/professional_theme/templates/page.tpl.php on line 79
подскажите пожалуйста что делать? как вернуть старую тему и всю информацию?
sites\default\settings.php
# $conf['theme_default'] = 'garland';
Уберите камент. Дальше догадаетесь.