Оцениваем варианты выполнения раздела 2.1 по пунктам.
Установка:
а) Для того чтобы модуль мог работать на любых сайтах в первую очередь необходимы настройки файла .htaccess. Дело в том, что файлы модуля будут включаться в тело HTML файлов. А некоторые серверы не обрабатывают PHP код, внедренный в HTML документы. Решаем созданием файла .htaccess с нужной командой.
б) В связи с тем, что многие файлы будут подключаемыми необходимо указать корректные пути к этим файлам.
в) для простоты установки модуль должен быть выполнен в виде папки с файлами, и устанавливаться простым копированием этой папки в корень сайта.
База данных:
Модуль должен автоматически подключаться к базе данных и далее работать с ней. При отсутствии базы данных он должен её создать, а также автоматически создать в этой базе таблицы необходимые для работы. Решаем с помощью запросов к MySQL.
Доступ:
а) Необходима авторизация пользователей. Регистрация пользователей должна исключать регистрацию ботов. Поэтому модуль должен содержать минимальную защиту от подобных регистраций. Решаем с помощью капчи и подтверждения регистрации по адресу электронной почты.
б) У администратора модуля должна быть возможность управления пользователями и комментариями. Решаем созданием административного раздела модуля.
4. Внешний вид:
а) Элементы модуля должны иметь свой стиль. Решаем в файле style.css модуля.
б) чтобы не сильно влиять на дизайн сайта элементы регистрации, авторизации и элементы непосредственного вывода комментариев необходимо разделить. Решаем созданием раздельных контроллеров для элементов авторизации и печати.
2.3 Реализация логики
Рис. 4 Блок схема модуля,
Учитывая вышеизложенное, изобразим полученные результаты графически. Результат представлен на рис.3. Модуль комментариев будет представлять из себя папку, содержащую блоки кода в виде файлов и вложенных папок, указанных на рисунке 3.
2.4 Подключения, корень сайта
Как видно файлов достаточно много даже при самом схематичном рассмотрении. возникает вопрос, а как же они будут друг с другом взаимодействовать? Совершенно очевидно, что придется делать ссылки и вставки частей кода друг в друга. Возникает следующий вопрос: если модуль планируется подключать неизвестно к чему, т.е. не известен сайт, неизвестен хостинг, неизвестны директории, то как с этим неизвестно, чем взаимодействовать? Ведь необходимо прописывать пути. Каким образом? Немного теории.
Любой сайт существует в двух измерениях[5]: реальном и виртуальном. Для всех посетителей – это виртуальный веб-сервер. На котором нет файлов, а есть виртуальные адреса URI. Если вы видите строку в браузере http://site.ru/ufo/phantom.html – это не файл. Это URI, виртуальный адрес. Никакого файла с именем phantom.html на сервере может вообще не быть. Вполне вероятно, что и папки ufo там тоже нет, а все URL адреса обрабатываются одним единственным PHP файлом. И браузер работает именно с виртуальными адресами. Браузер не может видеть реальную файловую структуру сервера. Он не видит никаких дисков C, D, E и т.д. он видит только URL адреса, а не файлы.
Для разработчиков, сайт – это программа, выполняющаяся на совершенно конкретном реальном компьютере. С совершенно конкретным жестким диском, директориями и файлами. И скрипт, работая со своими данными, подгружая другие скрипты, работает именно с реальными файлами, на реальном физическом диске.
Еще раз: ПУть к файлу скрипта и виртуальный адрес этого скрипта для просмотра в браузере – это не одно и то же
Как достучаться до файла? Вариантов два: абсолютный и относительный путь.
Если путь указывается от корня системы, то это путь абсолютный. Абсолютный путь в PHP – это полный путь к папке или файлу. Вот пара примеров для разных операционных систем:
• С:\OpenServer\domains\test.ru\index.php – для Open Server на Windows
• /var/www/html/test.ru/index.php – для Ubuntu
Как видим, это полный путь от корня диска до конкретного файла или папки.
Виртуальный адрес этого скрипта при просмотре через браузер, будет:
http://www. test.ru\index.php
Для браузера это самый полный путь, который только может быть. Он начинается от корня сайта.
В юникс-системах и на веб сайтах корень обозначается косой чертой "/", в Windows начинается c буквы диска.
Относительный путь – это путь без указания корня.
У относительных путей в PHP есть один недостаток – они строятся по своей логике, которую не интересуют наши желания. В результате этого нужный файл зачастую просто не обнаруживается. Происходит это потому что когда мы подключаем скрипт по относительному пути, например include ‘ufo.php’, то сначала PHP попытается найти этот файл в папках, указанных в директиве include_path, затем будет искать файл в папке, в которой находится подключающий скрипт, и под конец попытается найти файл в папке текущего рабочего каталога.
Что это значит на практике. Допустим у нас есть в корне сайта две папки chat и ufo, и в папке ufo у нас есть скрипт phantom.html. Так вот, при помощи относительного пути вставить наш phantom.html в файлы папки chat не получится. От слова никак не получится. Почему? Попробую привести аналогию с движением автомобиля.
Рис. 5 относительный путь – дорога в одну сторону,
где СТАРТ – корень сайта.
Движение из точки старт возможно только в одном направлении. Или налево или направо. Мы не можем взять предметы в месте chat и затем отвезти их в место ufo. Если автомобиль выезжает из позиции старт в направлении ufo и по прибытии в ufo обнаружится, что нужные предметы для этого места отсутствуют, то все. Мы оказались у разбитого корыта. Вернуться назад за нужными предметами мы не можем. Движение одностороннее.
Рис. 6 Абсолютный путь – двустороннее движение,
где СТАРТ – корень сайта.
При абсолютном же пути движение двустороннее и мы всегда можем вернуться обратно на старт. Отправится в ufo. Узнать, что там необходимо. Сделать крюк допустим до места chat и вернуться обратно уже с полным пакетом всего что надо. Если и сейчас что-то забыли, не вопрос. Можно опять съездить куда надо и вернуться. Т.е. абсолютный путь дает спокойное и предсказуемое поведение в точках назначения.
Поэтому использовать полностью относительные пути в PHP я бы не советовал вообще. Целесообразнее определить с помощью PHP корневую директорию веб-сервера, а местоположения файлов указывать относительно ее.
Значит остается абсолютный путь. Применительно к решению данной задачи есть два варианта по созданию абсолютных путей:
Вариант А: использовать константу __DIR__.
__DIR__ константа для получения абсолютного пути к папке, это директория файла. Если используется внутри подключаемого файла, то возвращается директория этого файла. Это эквивалентно вызову dirname(__FILE__). Возвращаемое имя директории не оканчивается на слеш, за исключением корневой директории[6].
Применительно к нашей задаче данная константа не совсем удобна, зато будет работать везде. Неудобство будет заключаться в том, что в первую очередь нас интересует путь к корню сайта, а поскольку мы не знаем заранее его название, то придется использовать обходной способ. И этот способ будет работать только когда мы будем знать названия папок из которых будут вызываться include. Заключается способ в том, что на тех страницах, где будут вызываться include прописываются папки для поиска загружаемых файлов. Это делается при помощи функции set_include_path которая задает значение настройки конфигурации include_path на время выполнения скрипта.
Конфигурационная директива include_path указывает список директорий, в которых функции require, include, fopen(), file(), readfile() и file_get_contents() ищут файлы. Формат соответствует формату системной переменной окружения PATH: список директорий, разделенных двоеточием в Unix или точкой с запятой в Windows[7].
При поиске подключаемых файлов PHP отдельно рассматривает каждое значение в include_path. Он проверяет первый путь, если файл в нем не найден, то он переходит к следующему, и так до тех пор, пока не найдет подключаемый файл, либо вернет E_WARNING или E_ERROR.
Проще говоря, необходимо указать папку, в которой будут искаться подключаемые файлы.
Таким образом, чтобы подключить файлы, в начале страницы, где требуется включение, будет нужно прописать код:
Листинг А. Получение пути к корню сайта. Размещается вначале страницы.
<?php