Портал Belkin-labs»PHP классы»Статья
welcome!

Подключение стилей в заголовок страницы в ООП
Разработка концепции и реальное воплощение

В этой статье будет изложена структура классов, ответственных за управление css-стилями страницы. Напомню, что мы уже к этой теме обращались. Мы старались поставить задачу, а поставленная задача есть уже наполовину решенная задача. Кто хочет начать сначала, прошу обратиться к статье "Подключение стилей в заголовок страницы. Введение в объемную и сложную тему".

О том, что мы не будем здесь рассматривать, а только упомянем

Мы будем говорить о сервисе вставки на страницу CSS-стилей. А что отвечает вообще за вывод страницы? Вот коснемся этой темы, но поверхностно.

Очевидно, в проекте существует класс, отвечающий за вывод страницы. В концепции PHP-тулбокса, которому посвящена серия этих статей, такой класс называется шаблоном страницы. Детально он будет позже рассмотрен.

Делает этот класс очевидные и интуитивно понятные вещи. А именно:

  • производит настройки и построение заголовка страницы, то есть, тега doctype, html, head;
  • производит вывод тега body;
  • выводит конечный, закрывающий, тег html.

Очевидно, что вывод стилей осуществляется в разделе вывода заголовка страницы. В структуре тулбокса есть особый класс, который осуществляет весь сервис вывода заголовка. Система вывода стилей композиционно включена именно в него.

Классы, ответственные за вывод CSS-стилей.

CSS_UNITE

Названия классов
К сожалению, названия классов бегут впереди разработки. Поэтому названия могут не слишком точно отражать функции класса. Часто я даже не помню, почему я назвал класс именно так, но я к этим названиям привык и не склонен классы часто переименовывать.

Есть базовый класс с названием CSS_UNITE. Это черный ящик, выходом которого является html-код тега или тегов link. Попутно класс создает соответствующие файлы кэша. На входе в него некие настройки наших стилей. Как минимум это массив имен файлов, которые мы хотим подключить. Класс либо сливает их в один, и тогда на выходе один тег link, либо не сливает их и тогда на выходе будет несколько тегов link. Как видите, все очень прозрачно.

Класс CSS_UNITE является базовым. Некоторые методы в нем не реализованы. Поэтому в реальности мы работаем с наследником этого класса под названием PRJ_CSS_UNITE. Это уже полностью рабочий класс, который настроен на наш текущий проект.

Класс PRJ_CSS_UNITE композиционно включен в класс, отвечающий за формирование заголовка страницы.

Важное уточнение
Если помните, у нас заказана функциональность, которая позволяет вставлять в CSS-стили некие элементы программирования. Как минимум мы умеем вставлять в них константы, определенные в проекте. Это обстоятельство обуславливает тот факт, что мы всегда, даже когда работаем на локальном хосте и не сливаем CSS-файлы в один файл, и при этом не сжимаем их код, все равно создаем кэш-файлы стилей. У них особые названия и находятся они всегда в папке CSS-стилей кэша. В файловой структуре нашего проекта это папка fcache/css в папке отдельного домена. При этом отдельные файлы мы создаем всегда, даже тогда, когда они уже созданы. Это сделано для удобства отладки.

UNITE_SOURCE

Это базовый класс, отвечающий за обработку содержимого одного css-файла. На входе класс получает урл css-файла (абсолютный или относительный, но в системе адресации веб-сервера, а не файловой системы), а на выходе мы получаем полностью готовый код этого файла. Этот код либо записывается в кэш как отдельный файл, либо добавляется к слитому файлу.

Еще этот класс получает имена отдельных файлов в файловой системе сервера. Это попутная задача при создании неслитых файлов.

Зачем это?
Теоретически мы в объектно-ориентированной среде можем иметь кучу файлов css с одинаковыми именами. Например, мы можем иметь файл menu.css для различных разделов. Ну... для хедера страницы одно меню, для футера другое. Хедер формируется классом хедера и использует файл menu.css. Футер - аналогично. В этом случае мы могли бы и вставлять линки на разные файлы. Они же явно в разных папках будут лежать! НО! мы поставили задачу вставлять в эти файлы константы. Тогда получается, что мы не можем эти файлы портить. Они у нас как бы исходниками являются. Именно поэтому мы всегда все отдельные файлы компилируем и кладем в одну(!!!) папку кэша. Тогда у файлов должны быть разные имена. Ну мы эти имена по особому алгоритму (довольно простому) и генерим. Но это не задача базового класса! Это задача класса проекта, а в некоторых случаях даже класса домена или сайта.

Этот класс тоже базовый и для реальной работы нужно создать класс уровня проекта. Этот класс композиционно используется в классе CSS_UNITE.

CODE_COMPRESS

Этот класс отвечает за сжатие кода. Получает строку и язык (строки 'css' или 'js', отдает ту же строку, только обработанную. Это очень простой класс. Он в составе базовых классов, но полностью работоспособный, то есть не абстрактный. Притом он такой простенький, что отвечает и за сжатие JS и за сжатие CSS. Делать класс для CSS, а потом делать его наследника для JS оказалось невыгодным. Слишком мало кода и он слишком простой.

Композиционно этот класс используется классом ветки UNITE_SOURCE.

Когда-то давным давно
я написал крошечную статейку относительно сжатия css. Это как раз и есть та самая функциональность, которая заложена в класс CODE_COMPRESS.

Почему использована столь разветвленная структура классов?

Оказалось, что такая структура позволяет легче отлаживать задачу и, главное, задача обработки стилей CSS крайне похожа по функциям и реализации на обработку скриптов JS. Так что решив проблему стилей мы практически на 90% решили и задачу обработки скриптов. Это довольно удачно получилось.

А что на счет включения стилей в заголовок в теге style?

Это отдельная задача. Она не вписывается в описанную выше ветвь классов. Для ее решения есть параллельная ветвь. Но она довольно простая.

TAG_STYLE

Этот класс получает на входе либо css-код в виде строки, либо имя файла в системе адресации сайта и на выходе формирует готовый тег style. Этот тег содержит либо сжатый код, либо несжатый. Это зависит от настроек на входе. Для сжатия используется класс CODE_COMPRESS.

css-код в виде строки
- это фактически содержимое одного тега style. Оформлен в виде строки PHP. Может быть сжат или несжат. Может иметь комментарии или не иметь. Это неважно. Главное, чтобы он был правильным. Такой текст может быть не только в строке. Он может храниться в файле. Тогда в результирующий тег style будет вставлено содержимое этого файла.

CSS-Код на входе не должен быть обрамлен тегами style. Это важно в том случае, если программист будет составлять результирующую строку из нескольких строк путем конкатенации.

А что на счет расположения тега style за кодом страницы, то есть за закрывающим тегом html?

Это задача класса шаблона. Я, если честно, ни разу в жизни туда, за закрывающий html, линки на стили не вставлял и не уверен, что придется. Как-то это для меня слишком экстремально выглядит.

Есть ли проверки от дурака?

Нет! Я предполагаю, что программист не дурак! Он создает программу, отлаживает ее и программа работает без ошибок. Если вставлять обильные проверки, помогающие программисту программировать, то работать они будут только очень краткий период времени, а именно, во время отладки, а в режиме реальной работы будут утяжелять код и нагружать сервер бессмысленной нагрузкой. Хоть она и небольшая совсем, но, как говорится, "курочка по зернышку...".

Считаю тему обработки и вывода CSS-стилей закрытой
автор php-тулбокса Дмитрий Белкин.

Статья создана 16.12.2014
Похожие материалы - отбираем по ключевым словам