Изучаем файл index.php

 Код на PHP

 Код на HTML

 DOCTYPE, HEAD, BODY

 HEADER

 MAIN_MENU, BREADCRUMBS

 Контент

 FOOTER

 

 Что бы до конца понять, как работает код этой и других страниц, нужно знать хотя бы основы программирования, HTML, PHP, CSS. Всё это вы можете найти в разделе  "Программирование".

 Для удобства дальнейшей работы настройте компьютер таким образом, что бы все текстовые файлы сайта с расширением .php.css.hml.html  и т.д. открывались в редакторе Notepad++

При запросе, полученном от браузера, система обращается к файлу   index.php    шаблона, установленного по умолчанию. Давайте внимательно изучим содержимое этого файла, так как именно он отвечает за составление кода страницы.

Откройте файл. Путь к файлу, если шаблон уже установлен на сайт (см. глава 2, "Установка базовой основы"), таков:

〉〉〉 OSPanel > domains > shablon1 > template > имя_вашего_шаблона > index.php

где shablon1 - это название специального сайта, установленного на локальном сервере, как это описано в главе 2; соответственно, вы должны вписать здесь своё название. Если всё сделано правильно, то вы увидите на экране вот такую "картинку":

 

 

Код на PHP

В начале файла находится код, написанный на языке PHP; такой код присутствует практически во всех шаблонах и традиционно начинается с информативного блока, в котором содержится некоторая информация (версия Joomla, название шаблона, автор, тип лицензии и т.д.). Так как каждая строка начинается с символа *, а весь блок заключён в /** ... */, то эта информация игнорируется системой и предназначена только для разработчиков.

  3     /**
  4     * @package         Joomla_3.8.Site
  5     * @subpackage   Templates.WDS_template_number_1
  6     * @avtor              WDS
  7     * @copyright  
  8     * @license           GNU GPL
  9     */

Сразу после блока информации следует стандартное выражение, запрещающее прямой доступ к файлу. Для чего необходима такого рода защита и как это всё работает вы можете прочитать в статье Программирование > CMS Joomla > "Запрет прямого доступа (константа '_JEXEC')" , а пока нужно только запомнить, что такая строка встречается в начале всех файлов с расширением .php кроме файла   index.php  , находящегося в корне сайта:

 12     defined('_JEXEC') or die;

Далее создаются все необходимые переменные, которым присваиваются соответствующие значения, и подключаются:

  • JS Frameworks;
  • Bootstrap;
  • скрипты JavaScript, находящиеся в соответствующей папке шаблона;
  • каскадные таблицы стилей (CSS):

 14     //Создание переменных и получение данных
 15    $config = JFactory::getConfig();
 16    $logo = $this->params->get('logo');
 17    $doc = JFactory::getDocument();
 18    $app = JFactory::getApplication();
 19    $templateparams = $app->getTemplate(true)->params;

 20    // Добавление JS Frameworks и Bootstrap CSS
 21    JHtml::_('bootstrap.framework');
 22    JHtml::_('bootstrap.loadCss', true, $this->direction); 

 23    //Подключение JavaScript и CSS
 24    $doc->addStyleSheet(JUri::base().'/templates/'.$this->template.'/css/stl_tpl_wds_v1.css');
 25    $doc->addStyleSheet(JUri::base().'/templates/'.$this->template.'/css/main_menu.css');
 26    $doc->addStyleSheet(JUri::base().'/templates/system/css/system.css');
 27    $doc->addScript('/templates/'.$this->template.'/JavaScript/IntExp_HTML5.js');

Последний блок в коде PHP применяется для изменения расположения основного контента. В этом блоке переменная $contentwidth получает соответствующее значение (left, right или mid) в зависимости от наличия модулей в левой и правой колонках; в дальнейшем вид страницы будет зависеть именно от этого значения:

 28    // Блокировка пустых LEFT и RIGHT, ввод значений в переменную для настройки ...
 29   if($this->countModules("left")&&!$this->countModules("right")){ $contentwidth="left";}
 30   if($this->countModules("right")&&!$this->countModules("left")){ $contentwidth="right";}
 31   if($this->countModules("left")&&$this->countModules("right")){$contentwidth="mid";}

 На этом код на  PHP  заканчивается и начинается код на  HTML .

Код на HTML

В начале, в соответствии с требованиями  HTML , следует указание типа документа:

 35     <!DOCTYPE html>

Затем следует тэг <html>.  Здесь находится информация, необходимая для правильной работы браузера, а так же устанавливается язык сайта по умолчанию:

 38    <!-- HTML + подключение языка контента -->
 39    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $this->language; ?>"lang="<?php echo  $this->language; ?>" dir="<?php echo $this->direction; ?>" >

 Обратите внимание: информация, заключённая в теги <!-- ... --> игнорируется системой и нужна лишь для удобства работы с кодом.

 40    <!-- HEAD -->
 41    <head>
 42    <jdoc:include type="head" />
 43   </head>

 О том, что такое jdoc:include, читайте в Программирование > CMS Joomla.

И вот теперь следует открывающий тэг <BODY>:

 45    <!-- BODY -->
 46    <body>

Между открывающим и закрывающим тегами <body> и </body> находится специальный контейнер, в которое вложено всё содержимое сайта, за исключением Footer ("подвала"). Наличие этого контейнера не обязательно, но такой контейнер даёт определённое преимущество в оформлении, даёт возможность адаптировать страницы к разным размерам мониторов и так далее (об этом будет рассказано позднее):

 48    <!-- Создание основного блока-контейнера b-container -->
 49    <div id="b-container">

Создание содержимого страницы начинается с HEADER ("шапки" сайта):

 51    <!-- Создание HEADER -->
 52    <header id="header">

После открывающего тэга вставляется изображение, которое указано в панели управления (см. Часть 1, глава 8):

 54    <!-- Вставка изображения в шапку сайта: -->
 55    <div class="logo">

 56    <!-- если изображение существует, то оно будет установлено, -->
 57    <?php if ($logo): ?>
 58    <a href="/<?php echo $this->baseurl ?>"><img src="/<?php echo $this->baseurl ?>/<?php
          echo      htmlspecialchars($logo); ?>"  alt="<?php echo $config->get('sitename');?>" title=
          "<?php echo $config->get('sitename');?>" /></a>
 59    <?php endif;?>

 60    <!-- если изображения нет, будет выведено название сайта -->
 61    <?php if (!$logo ): ?>
 62    <a href="/<?php echo $this->baseurl ?>"><?php echo htmlspecialchars($templateparams->
          get('sitetitle'));?>    </a>
 63    <?php endif; ?>
 64    </div>

Этот код даёт команду вставить изображение в шапку сайта, а если изображение не найдено, то будет выведено название сайта, указанное в соответствующем поле в панели управления.

И последняя часть кода в HEADER создаёт соответствующую модульную позицию, после которой следует закрывающий тэг:

 66    <!-- Подключение модульной позиции HEADER -->
 67    <jdoc:include type="modules" name="header" style="xhtml" />
 68    </header>

Рассмотрим внимательнее эту часть кода.

Заявление jdoc:include даёт указание системе создать модульную позицию, на что указывает type="modules", с именем name="header"  и стилем style="xhtml". Это стандартный код для создания модульных позиций.

 При необходимости вы можете при помощи такого кода создавать новые модульные позиции.

Далее таким же образом создаётся модульная позиция для главного меню сайта:

 70    <!-- Подключение модульной позиции Главное меню сайта - MAIN MENU -->
 71    <?php if($this->countModules('main_menu')) : ?>
 72    <nav id="main_menu"><jdoc:include type="modules" name="main_menu" /></nav>
 73    <div id="clear"></div> 
 74    <?php endif; ?>

Здесь стоит обратить внимание на то, что код, который даёт указание создать модульную позицию, находиться внутри конструкции кода на PHP:

    <?php if(...) ?>
   <nav id="main_menu"><jdoc:include type="modules" name="main_menu" /></nav>
    <?php endif; ?>

Такие конструкции при создании элементов страницы встречаются очень часто; это нужно для того, что бы в случае отсутствия самого элемента (в данном случае – главного меню) модульная позиция не создавалась и место на странице под этот элемент не резервировалось.

После модульной позиции для главного меню таким же образом создаётся позиция для вывода пути на сайте breadcrumbs:

 76    <!-- Подключение модульной позиции Хлебные крошки - breadcrumbs -->
 77    <?php if($this->countModules('breadcrumbs')) : ?>
 78    <nav class="breadcrumbs"><jdoc:include type="module" name="breadcrumbs" /></nav>
 79    <?php endif; ?>

После breadcrumbs создаётся основная секция, в которой будут находиться основной контент и различные модули:

 81    <!-- Подключение основной секции MAIN_SECTION -->
 82    <section role="main" id="sect_main">

Обратите внимание на некоторые особенности основной секции.

Во-первых, в ней будут созданы модульные позиции для левой и правой колонок LEFT и RIGHT, модульная позиция TOP-CONTENT ("над контентом") и  BOTTOM-CONTENT ("под контентом"), но не будет создана модульная позиция для контента, поэтому основной контент просто займёт всё остальное место.

Во-вторых, для основного контента будет создана отдельная секция, которая будет представлена в трёх вариантах: content-left, content-right, content-mid, при этом каждый вариант будет настроен отдельно при помощи таблиц CSS. В зависимости от значения переменной $contentwidth, полученного вначале, в коде страницы будет использоваться один из этих вариантов; соответственно, основной контент будет располагаться слева (content-left) или справа (content-right) от модулей либо по середине (content-mid).

Итак, читаем и разбираем код далее:

 84    <!-- Создание модульной позиции LEFT -->
 85    <?php if($this->countModules('left')) : ?>
 86    <aside class="left"><jdoc:include type="modules" name="left" style="myxhtml" /></aside>
 87    <?php endif; ?>

Думаю, всем уже понятно, что была создана модульная позиция LEFT.

 89    <!-- Создание секции основного контента -->
 90    <section class="content<?php echo $contentwidth; ?>">

А это уже создана секция основного контента, о чём было сказано выше. Обратите внимание на то, что при помощи кода PHP в названии класса к слову content добавляется слово, хранящееся в переменной $contentwidth.

 92    <!-- Создание модульной позиции TOP-CONTENT -->
 93    <?php if($this->countModules('top-content')) : ?>
 94    <div class="top-content"><jdoc:include type="modules" name="top-content" style="myxhtml" /></div>
 95   <?php endif; ?>

Вышеуказанный код, как вы поняли, создаёт позицию "Над контентом", но только в том случае, если в неё есть что вставлять, т.е. какой-либо модуль. Если модуля не окажется, то и позиция не будет создана.

Далее следует код основного контента:

  97     <!-- Основной контент -->
  98     <article>
  99     <?php if(count($app->getMessageQueue())) { ?>
 100    <jdoc:include type="message" />
 101    <?php } ?>
 102    <jdoc:include type="component" style="xhtml" />
 103    </article>

Этот код (строка 102) вставляет на страницу компонент (материал так же является компонентом), но в некоторых случаях выдаёт специальное сообщение системы (строка 100).

Далее по уже известному принципу создаются модульные позиции BOTTOM-CONTENT и RIGHT:

 105    <!-- Создание модульной позиции BOTTOM-CONTENT -->
 106    <?php if($this->countModules('bottom-content')) : ?>
 107    <div class="clr"></div>
 108    <div class="bottom-content"><jdoc:include type="modules" name="bottom-content" style="myxhtml" /></div>
 109    <?php endif; ?>
 110    </section>
 111 
 112    <!-- Создание модульной позиции RIGHT-->
 113    <?php if($this->countModules('right')) : ?>
 114    <aside class="rigth"><jdoc:include type="modules" name="right" style="myxhtml" /></aside>
 115    <?php endif; ?>
 116    </section>

Здесь ничего сложного нет, но нужно обратить внимание на присутствие двух закрывающих тэгов </section>. Первый закрывающий тэг (строка 110) относится к тэгу <section> секции основного контента (строка 90), а второй – к тэгу <section>  секции MAIN_SECTION (строка 82).

И последнее, что мы видим внизу основного блок-контейнера ("b-container", строка 49):

 118    <div class="clr"></div>
 119    <div id="f-loc"></div>

 

Для чего это нужно?

Строка <div class="clr"></div> не создаёт какой-либо видимый элемент на странице, но имеет очень важное значение: он располагается под всеми элементами, расположенными выше; это достигается за счёт настроек в файле каскадных таблиц стилей   stl_tpl_wds_v1.css  :

 209    .clr {
              ...
 212         clear: both;
             ...
 216     }

Для чего это нужно? Это нужно для того, что бы следующий ниже элемент начинался только после того, как на странице закончатся все предыдущие.

Дело в том, что все элементы на странице выстраиваются в том порядке, в котором расположены в коде, но длина каждого элемента может быть разной! Если, к примеру, на сайте слева и справа от основного контента находятся различные модули, то длина каждого столбца может быть неравномерной, так как вряд ли кто-то будет создавать абсолютно одинаковые модули по высоте и располагать их симметрично с обоих сторон! Но иногда возникает ситуация, когда очередной элемент страницы должен быть расположен строго под всеми другими независимо от их высоты (как раз то, что и нужно для "подвала" сайта), и вот здесь приходит на помощь созданный класс "clr", который чётко отделяет все верхние элементы от тех, которые будут созданы ниже.

Код в строке 119 <div id="f-loc"></div> нужен для корректного отображения FOOTER - "подвала" сайта, который не входит в основной блок-контейнер. Для чего это сделано?

Обратите внимание на то, что "подвал" сайта располагается в самом низу, под всеми элементами страницы, что обеспечивает наличие кода в строке 118, о котором было рассказано выше. Но проблема в том, что высота основного блок-контейнера зависит от высоты страницы, а так как все страницы разные по объёму текста и наличию изображений, то если эта высота окажется слишком маленькая (например, при выводе ошибки 404), "подвал" сайта окажется не внизу, а в середине экрана, а это смотрится не совсем красиво. Что бы "привязать" "подвал" сайта к низу экрана, эта модульная позиция выведена за пределы блок-контейнера, но в самом блок-контейнере под эту позицию обязательно зарезервировано место при помощи кода в строке 119, причём без дополнительной обёртки в <?php if> ... <?php endif; ?>. Это место имеет строго определённую высоту, определённую в файле стилей   stl_tpl_wds_v1.css  :

 218    /* f-loc */
 219    #f-loc {height:90px;}

Сам же FOOTER при помощи файла стилей размещается таким образом, что он "привязывается" к низу экрана, но об этом будет подробно рассказано в главе 5 "Работа с CSS"

И последнее, что создаёт код страницы – FOOTER.

 123    <!-- Создание FOOTER - подвала сайта -->
 124    <footer id="footer">
 125 
 126    <!-- Создание модульной позиции FOOTER -->
 127    <div class="copyright"><jdoc:include type="modules" name="footer" /></div>

Данный код объяснений не требует, здесь всё понятно.

 130   <p class="copyright"> WDS</p>
 131   <p class="copyright2"> © <?php echo date("Y"); ?> Copyright</p>

Строка 130 создаёт надпись: "WDS", указывающую на авторские права; здесь вы можете разместить любой свой текст по своему усмотрению, например, "Все права защищены" и т.п.

Строка 131 создаёт надпись "© 2018 Copyright". Код, написанный на PHP, нужен для вставления соответствующей даты (символ "Y" указывает на год).

 133    <!-- Создание модульной позиции f-menu -->
 134    <div class="footer-menu"><jdoc:include type="modules" name="f-menu" /></div>

Этот код создаёт последнюю позицию на сайте, находящуюся в левом углу "подвала" сайта – f-menu. Здесь можно будет в дальнейшем разместить информацию, которая обычно всегда присутствует в "подвале" сайта: обратная связь, контакты и тому подобное.

В самом конце следуют закрывающие тэги:

 135    </footer>
 136    </body>
 137    </html>

Ну вот и всё!

Теперь вы знаете, из чего состоит и для чего нужен файл index.php, как он управляет созданием кода страницы. Теперь вы знаете, как добавить или убрать модульную позицию, надписи и так далее, а значит, уже можете самостоятельно "подогнать", переписать код этого файла под создаваемый вами шаблон. Но так как этот файл только создаёт различные элементы, но не указывает для них точные координаты, размеры и оформление, то самое время перейти к работе с каскадными таблицами стилей CSS.

 

Добавлять комментарии и ответы могут только пользователи, прошедшие регистрацию!
Зарегистрируйтесь и напишите своё мнение или ответ!