Формирование страницы

Маршруты

Разделы формируются на основании статических маршрутов, которые прописаны в config/routes.php.

Файл представляет собой массив где ключ - это url-запрос относительно дирректории проекта, а значение - это строка содержащая 2 элемента разделенные "/". Первый элемент представляет собой название файла контроллера, а второй элемент - название обработчика (метода) контроллера.

Контроллеры

Контроллеры расположены в дирректории controllers. Название файла должно соответствовать первому элементу значения маршрута. Сам файл содержит класс контроллера. Название класса соответствует названию файла, начинается с большой буквы и заканчивается на "_C". Окончание свидетельствует о том, что класс представляет из себя контроллер.

Метод класса контроллера должен иметь такое же название, как и вторая часть значения маршрута с окончанием "Action". Также метод принимает массив параметров страницы, переданные из маршрута. Каждый класс контроллера должен наследовать исходный класс Controller.

К примеру зададим маршрут: "articles/([a-z-]+)/([0-9-]+)" => "articles/show/$1/$2". Под такой маршрут подпадает url-запрос: /articles/sport/15.

В данном случае файл контроллера будет называться articles. Класс контроллера будет иметь название Articles_C, а метод, отвечающий за формирование страницы - showAction. Пример приведен ниже.

class Articles_C extends Controller
{
	public function showAction( $args )
	{
		//При url-запросе "articles/sport/15" $args = ["sport", "15"];
	}
}

Макеты

Макеты храняться в директории templates/template([0-9-]+). В данной дирректории обязательно должны быть 2 файла: header.php и footer.php. Данные файлы подключаются при помощи:

Page::instance()->showHeader( 1 );
	//Контент страницы
Page::instance()->showFooter( 1 );

Принимаемое значение это id подключаемого макета. Данный аргумент не является обязательным. По умолчанию подключается макет, id которого задан статически в классе Page (models/core/page.php).

Работа с базой данных

Общие сведенья

За соединение с базой данных отвечает класс Core_Database.

Название таблицы объекта формируется на основании названия класса в нижнем регистре с окончанием "s" и префиксом, указанным в techsupport/config/config.php.

Параметры подключения к базе данных хранятся в стандартном мудловском config.php.

Примеры работы с БД

У каждого объекта, наследуемого от Core_Entity, существует метод queryBuilder, который возвращает объект конструктора SQL-запросов. К примеру, необходимо выполнить SQL-запрос, возвращающий все статьи, которые были подтверждены:


$Article = Core::factory( "Article" ); //Создание объекта статьи
$confirmedArticles = $Article
	->queryBuilder() //Вызов конструктора запроса
	->where( "confirmed", "=", "1" ) //Указание условий выборки
	->findAll(); //Метод, выполняющий запрос и возвращающий массив результатов
										

Основные классы системы

Общие сведенья

Все классы объявляются в отдельных файлах в директории models. Название класса должно, грубо говоря, представлять из себя путь к файлу с классом, относительно дирректории models. Каждое слово, разделенное нижним подчеркиванием, должно начинаться с большой буквы. К примеру класс в файле models/application/screenshot.php будет иметь название Application_Screenshot. Каждый объявляемый класс должен наследовать Core_Entity для возможности преобразования объектов класса в XML сущьности и работы с XSL-шаблонами.

Название всех свойств объекта должно соответствовать названию столбца в базе данных. Любые другие свойства объекта, не имеющие отношение к таблице в базе данных объявляются при помощи ассоциативного массива. Извиняюсь за такие неудобства, но есть что есть :( Обещаю исправиться.

Для работы со свойствами, хранящимися в таблице базе данных, лучше использовать сеттеры и геттеры дабы проверять тип значения, присваемого свойству.

Router

Данный класс отвечает за поиск подходящего маршрута для url-запроса, подключение класса контроллера и вызов соответстввующего метода контроллера.

Класс обладает лишь одним свойством: $routes - список всех заданных маршрутов в файле config/routes.php

Статические методы класса:
  • ::setRoutes(). Переносит внесенные пути из файла config/routes.php в свойство routes.
  • ::getRoutes(). Возвращает значение свойства routes. Использовался лишь для отладки во время разработки.
  • ::error404() (ошибка 404). Если url-запрос не подходит ни под один маршрут выводит страницу ошибки 404 (views/404.php). Ещё используется если у пользователя недостаточно прав доступа к странице.
  • ::getUrl(). Возвращает отформатированною строку url-запроса. Отделяет GET-параметры и путь к дирректории системы.
  • ::match(). Возвращает true/false. Если найден путь из списка, подпадающий под url-запрос - возвращает true. Аналогично, если не найдено ни одного маршрута - возвращает false.
  • ::run(). Главный метод класса, использующий вышеперечисленные методы и вызывает метод контроллера, отвечающий за формирование страницы.

Page

Данный класс отвечает за формирование параметров страницы и подключение макетов, также реализует шаблон проектирования Singleton. Доступ к методам и свойствам объекта данного класса происходит при помощи метода instance к примеру:

Page::instance()->setTitle( "Заголовок страницы" );

Свойства класса:
  • $_instance - экземпляр класса Page, возвращаемый методом instance.
  • $title - заголовок страницы (значение тэга <title>).
  • $templateId - id подключаемого макета.
  • $params - дополнительные параметры страницы. Данная переменная представляет собой ассоциативный массив.
Методы класса
  • ::instance() - метод, возвращающий экземпляр класса Page.
  • ->setTitle( string $title ) - сеттер для свойства $title.
  • ->setTemplateId( int $id ) - сеттер для свойства $templateId
  • ->getTitle() - геттер для свойства title.
  • ->showHeader( [, int $templateId] ) - вывод шапки страницы header.php.
  • ->showFooter( [, int $templateId] ) - вывод подвала страницы footer.php.
  • ->setParam( string $paramName, mixed $value ) - устанавливает значение дополнительного параметра страницы.
  • ->getParam( string $paramName ) - возвращает значение дополнительного параметра по имени.

Orm

ORM (англ. Object-Relational Mapping, рус. объектно-реляционное отображение, или преобразование) — технология программирования, которая связывает базы данных с концепциями объектно-ориентированных языков программирования, создавая «виртуальную объектную базу данных». Более подробно о том, что такое ORM можно найти источники в интернете.

В данной системе класс Orm выступает в роли конструктора SQL-запросов.

По умолчанию метод where обрамляет значение в одинарные кавычки. Для передачи значнеия в данный метод без обрамления их в кавычки необходимо воспользоваться статическим методом unchanged класса Core.

Свойства класса:
  • protected $queryString - сгенерированная строка SQL-запроса.
  • public $tableName - название таблицы класса объекта в базе данных.
  • данного свойства равно "stdClass".
  • private $select - строка выбираемых значений. По умолчанию выбираются значения всех столбцов таблицы.
  • private $from - строка названий таблиц, из которых выбираются значения. По умолчанию значения берутся из таблицы объекта.
  • private $where - строка списка условий выборки.
  • private $order - строка, содержащая указание порядка выборки.
  • private $limit - строка с указанием лимита выборки. По умолчанию лимит не задан.
  • private $join - строка с подключаемыми таблицами и условиями. Реализация оператора JOIN.
  • private $leftJoin - строка с подключаемыми таблицами и условиями. Реализация оператора LEFT JOIN.
  • private $having - реализация оператора HAVING.
  • private $groupby - строка с указанием группировки.
  • private $offset - отступ.
  • private $open - флаг открытия скобки в запросе. По умолчанию равен 0
  • private $close - флаг закрытия скобки в запросе. По умолчанию равен 0
Методы класса:
  • ->open() - открытие скобки в SQL-запросе.
  • ->close() - закрытие скобки в SQL-запросе.
  • ->getCount() - возвращает кол-во записей по заданным параметрам.
  • ->save( object $obj ) - сохранение объекта в базе данных. Реализация операторов INSERT/UPDATE.
  • ->delete( object $obj ) - удаление объекта из базы данных.
  • ->executeQuery( string $query ) - выполнение SQL-запроса. $query - строка SQL-запроса.
  • ->clearQuery() - очистка заданых параметров SQL-запроса.
  • ->select( array/string $params ) - задание выбираемых полей из базы данных для оператора SELECT. $params - либо массив выбираемых полей, либо строка с названием столбца.
  • ->from( array/string $tables ) - указание таблиц, из которых будет производиться выборка. $tables - массив названий таблиц либо строка с названием таблицы.
  • ->where( string $row, string $operation, string $value, $or = null ) - указание условий выборки. $row - название столбца таблицы. $operation - операция ("=", "<>", "NOT" и т.д.). $value - значение. $or - логический оператор перед условием (OR/AND). По умолчанию задан AND. Пример: where( "done", "=", 1 ).
  • ->between( string $param, mixed $val1, mixed $val2, $condition = "and" ) - реализация оператора BETWEEN.
  • ->orderBy( string $row, string $order = "ASC" ) - реализация оператора ORDER BY. По умолчанию выборка идет по возрастанию значений.
  • ->limit( int $count ) - реализация оператора LIMIT.
  • ->offset( int $val ) - реализация оператора OFFSET.
  • ->join( string $table, string $condition ) - реализация оператора JOIN. $table - присоеденяемая таблица. $condition - уловие "джоина"
  • ->leftJoin( string $table, string ) - реализация LEFT JOIN аналогично методу join.
  • ->having( string $row, string $operation, string $value ) - реализация HAVING.
  • ->groupBy( string $val ) - группировка результата выборки по определенному полю. Реализация GROUP BY.
  • ->find() - метод выполнение SQL-запроса. Возвращает первую запись в таблице, подошедшую под условия выборки в виде объекта либо false.
  • ->findAll() - аналогичен методу find, но возвращает всегда массив (массив объектов либо пустой).

Core

Методы класса:
  • ::factory( string $className, [, int $id] ). Основной метод. Возвращает новый объект модели либо объект из базы данных, при указании id. Любой объект в контроллере, не считая Page, создается при помощи данного метода. Файл с классом подключается автоматически, главное чтобы название класса объекта соответствовало правилу наименования, описанного выше в подразделе Общие сведенья. Пример использования:
    Core::factory( "Application_Screenshot" );     //Вернет новый объект класса Application_Screenshot
    Core::factory( "Application_Screenshot", 4 );  //Вернет объект класса Application_Screenshot со значениями свойств, 
    											   //соответствующими записи в таблице с id = 4
  • ::controller( string $controllerName [, mixed $constructData] ). Метод аналогичен методу factory. Создает объекты контроллеров и используется только в классе Router.
  • ::getMessage( string $messageName, [, array messageParams = []] ). Возвращает строку по её названию из config/messages/ru/messages.php.
  • ::unchanged( string $value ). Используется для передачи значения в метод where класса Orm без обрамления в кавычки.
  • ::attach( string $event, function $handler ) (Observer). Добавление обработчика для события.
  • ::detach( string $event ) (Observer). Удаление обработчика для события.
  • ::notify( array $args, function $event ) (Observer). Вызов срабатывания события.

Описание методов, реализующих шаблон проектирования «Наблюдатель» (Observer) и пример их использования описаны в моей статье РЕАЛИЗАЦИЯ ШАБЛОНА ПРОЕКТИРОВАНИЯ «НАБЛЮДАТЕЛЬ» НА PHP.