In-Portal Developers Guide

This is a wiki-based Developers Guide for In-Portal Open Source CMS. The purpose of this guide is to provide advanced users, web developers and programmers with documentation on how to expand, customize and improve the functionality and the code the In-Portal software. Please consider contributing to our documentation writing effort.

K4:Application Process Flow

From In-Portal Developers Guide

Jump to: navigation, search
(дополнение)
Current revision (01:13, 28 November 2010) (view source)
(Translation)
 
(One intermediate revision not shown.)
Line 1: Line 1:
{{NotFinished}}{{toc | category = Структура приложения | sortkey = 002.001}}
{{NotFinished}}{{toc | category = Структура приложения | sortkey = 002.001}}
<!-- Пишите ПОСЛЕ этой строки, пожалуйста. Ничего не стирать! -->
<!-- Пишите ПОСЛЕ этой строки, пожалуйста. Ничего не стирать! -->
-
== kApplication - центральный класс системы ==
+
== kApplication - main class of the system ==
-
Объект этого класса создаётся одним из первых и содержит среди своих свойств ссылки на другие важные классы - Session, TemplateParser, kFactory, kHTTPQuery, kEventManager. Также, практически все прочие объекты имеют среди своих свойств ссылку на центральный объект приложения. Таким образом обеспечивается взаимодействие различных компонентов в системе.
+
The object of kApplication class is created one of the first ones and among all key properties contains links to other important classes such as Session, TemplateParser, kFactory, kHTTPQuery, kEventManager and others. At the same time, almost all other objects in the system have a back-link to the main Application object. This allows flexible interaction between different parts of the system.
 +
Example below, demonstrates that this kind of approach (when main application object links to other key objects) allows to call any type of event from any part of the system.
<source lang="php">
<source lang="php">
Line 12: Line 13:
</source>
</source>
-
Пример иллюстрирует - благодаря тому, что центральный объект хранит ссылки на важнейшие объекты, практически из любого места систьемы можно вызвать любое событие.  
+
Method kApplication::HandleEvent passes the actual event processing to an object of kEventManager class. A link to that object is stored inside of application $this->Application->EventManager property.
-
В методе kApplication::HandleEvent обработка события делегируется объекту, ссылка на который находится в свойстве $this->Application->EventManager. По умолчанию это - объект класса kEventManager.
+
At the same time, for event processing from kEventManager::HandleEvent method system makes calls to other methods of the main Application class. For example, in order to get the object of Event Handler for specific event we are using the following:
-
 
+
-
В свою очередь, для обработки события из метода kEventManager::HandleEvent опять же следуют обращения к методам центрального класса. Например, чтобы получить объект обработчика для конкретного указанного события, используется такая конструкция:
+
<source lang="php">
<source lang="php">
Line 24: Line 23:
</source>
</source>
-
То есть, вызывается метод kApplication::recallObject, получающий ссылку на необходимый обработчик событий путём обращения к другому базовому объекту, ссылка на который доступна в свойстве Factory.
+
As you can see, we are calling for kApplication::recallObject method, which gets a link to required Event Handler by making call to another base object, link to which is accessible in the Factory property of Application object.
<source lang="php">
<source lang="php">
Line 30: Line 29:
</source>
</source>
-
Если объект обработчика события ещё не создан, то объект класса kFactory его создаёт, и дополнительно, опять же - обращаясь к центральному объекту Application, получает и обрабатывает событие (так называемое Build Event), которое должно происходить при создании обработчика исходного события:
+
In case if Event Handler object hasn't been created yet, then object of kFactory will create it for the first time while making another call to a base Application object to get and process Build Event which is triggered any time system creates a new Event instance:
   
   
<source lang="php">
<source lang="php">
Line 46: Line 45:
-
== Основные фазы работы приложения ==
+
== Main Phases in Application Process Flow ==
-
Это инициализация, основная фаза и фаза завершения. Пример - из стандартного кода скрипта index.php:  
+
These are Initialization, Processing and Completion phases. Below is example from standard index.php file:  
<source lang="php">
<source lang="php">
-
$application =& kApplication::Instance(); - получение ссылки на объект
+
$application =& kApplication::Instance(); - getting a link to Application object
-
$application->Init(); - инициализация
+
$application->Init(); - initialization phase
-
$application->Run(); - основная фаза
+
$application->Run(); - processing phase
-
$application->Done(); - фаза завершения
+
$application->Done(); - completion phase
</source>
</source>
-
== Фаза инициализации ==
+
== Initialization ==
 +
The key point of initialization in In-Portal is to get the most out your application by building strong and complete infrastructure. This done by initializing and creating all necessary objects, properly defining relations between them, and then processing all incoming data from HTTP requests (GET/POST/COOKIES and others) and finally properly apply all this data on the Web-server, database and application itself.
-
Для того, чтобы использовать всю мощь, все возможности K4, надо вначале обеспечить инфраструктуру - создать все основные объекты, установить между ними связи, инициализировать эти объекты - то есть, произвести в них операции в соответствии с поступившими данными HTTP-запроса, текущими настройками WEB-сервера, значениями в базе данных и.т.п.
+
=== Connecting to Database and Creating Connection object ===
-
=== Подключение к базе данных и создание объекта для операций с базой данных ===
+
Specifically for this task there is a code inside of kApplication::Init() method:
-
 
+
-
В kApplication::Init() для этого есть такой код:
+
<source lang="php">
<source lang="php">
-
$this->Conn = new kDBConnection(SQL_TYPE, Array(&$this, 'handleSQLError') );  // создание объекта
+
$this->Conn = new kDBConnection(SQL_TYPE, Array(&$this, 'handleSQLError') );  // new object
$this->Conn->debugMode = $this->isDebugMode();
$this->Conn->debugMode = $this->isDebugMode();
-
$this->Conn->Connect(SQL_SERVER, SQL_USER, SQL_PASS, SQL_DB); // подключение к базе данных проекта       
+
$this->Conn->Connect(SQL_SERVER, SQL_USER, SQL_PASS, SQL_DB); // connecting to the database
</source>
</source>
-
Подключение к базе данных осуществляется через объект класса kDBConnection. Ссылка на объект помещается в свойство Conn основного объекта приложения, в свою очередь, объект класса kDBConnection в своём конструктроре получает ссылку на основной объект приложения и сохраняет его в своём свойстве Application:
+
Connection to the database is handled through the object of kDBConnection class. Once created, a link to a database object is placed inside of Conn property of the main Application object. In it's turn, this new object of kDBConnection class is getting a link-back to the main Application object in it's construction method using the following code:
<source lang="php">
<source lang="php">
Line 76: Line 74:
</source>
</source>
-
В классах, интенсивно использующих доступ к базе данных (например, в kDBBase и его наследниках kDBItem и kDBList), в целях повышения скорости, ссылка на объект для операций с базой данных хранится в отдельном свойстве Conn:
+
 
 +
Note that a link to database object can also be stored as a separate Conn property in other objects that tightly connected to database and can  make often database calls. Good examples are objects of kDBBase class and his inheritors kDBItem and kDBList classes. This done for better performance:
<source lang="php">
<source lang="php">
Line 86: Line 85:
</source>
</source>
-
Таким образом, после инициализации, практически из любого метода имеется лёгкий доступ к базе данных:
+
Thus, once initialization is complete, the access to the database can be done virtually from any place:
<source lang="php">
<source lang="php">
Line 93: Line 92:
-
=== Создание объекта Factory и регистрация основных классов в нём ===
+
=== Creation of Factory Object and Registering New Classes ===
-
В kApplication::Init() для этого есть такой код:
+
There is a code inside of kApplication::Init() method:
<source lang="php">
<source lang="php">
Line 101: Line 100:
</source>
</source>
-
Объект Factory - один из основных объектов приложения. Его предназначение - учитывать какие объекты уже создавались, и, если запрашиваемый объект уже создавался - просто возвращать ссылку на него. Естественно, чтобы учитывать создание других объектов, объект класса kFactory создаётся раньше.
+
Factory object is one of the key objects in the entire Application. It's designated to keep track of other objects that already been created and return a link to it in case if one is requested by the Application. It's obvious that object of kFactory class is created before any other standard objects.
-
В K4 широко применяется принцип отложенной инициализации. Объекты как правило создаются только тогда, когда они становятся реально необходимы. Благодаря функциональности kFactory для соблюдения принципа отложенной инициализации требуется только одно - зарегистрировать классы, из которых могут впоследствии создаваться объекты. Регистрация класса это быстрая, требующая мало ресурсов операция, которая подразумевает запись в свойства-массивы объекта Factory таких данных как:
+
In-Portal wides uses '''Late Initialization''' approach. Objects are created only when they are needed or required by someone. kFactory  
 +
class provides a functionality when Late Initialization is done automatically as long as proper classes are registered and will be used in creation of its objects. Class Registration is quick and low resource operation which simply saves in properties (array format) of Factory object the following data:
-
* псевдоним класса
+
* pseudo-name of class:
-
* расположение файла с кодом класса
+
* path on the file-system to actual class
-
* классы, которые должны быть определены прежде чем данный класс
+
* list of other classes that must be defined before this class
-
Сразу же после создания объекта Factory регистрируются базовые классы - такие, которые необходимы для продолжения инициализации приложения, либо на более поздних фазах работы приложения.
+
Right after creation of Factory object system will continue registering other base classes critical to the application. This is done through the following method:
<source lang="php">
<source lang="php">
Line 115: Line 115:
</source>
</source>
-
Название функции переводится с английского как "регистрировать классы по умолчанию". Это так называется потому, что любой зарегистрированный в Factory класс может оказаться подменённым на более поздних этапах инициализации в соответствии с конфигурацией конкретного приложения.
+
Note that any of these Default classes registered via kFactory class can be replaced at later point of initialization based on your application needs.
 +
 
 +
[[en:{{FULLPAGENAME}}]]
 +
[[ru:K4:Протекание Процессов в Приложении]]
 +
 
 +
Translated from [http://guide.in-portal.org/rus/index.php?title=K4:%D0%9F%D1%80%D0%BE%D1%82%D0%B5%D0%BA%D0%B0%D0%BD%D0%B8%D0%B5_%D0%9F%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D0%B2_%D0%B2_%D0%9F%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&oldid=1033 (revision 1033)]

Current revision


Структура приложения Структура приложения
Статьи в этой категории

Contents

kApplication - main class of the system

The object of kApplication class is created one of the first ones and among all key properties contains links to other important classes such as Session, TemplateParser, kFactory, kHTTPQuery, kEventManager and others. At the same time, almost all other objects in the system have a back-link to the main Application object. This allows flexible interaction between different parts of the system.

Example below, demonstrates that this kind of approach (when main application object links to other key objects) allows to call any type of event from any part of the system.

$event = new kEvent('custom-sections:OnAddListingLog');
$event->setEventParam('mode', LISTING_MODE_EXTERNAL);
$this->Application->HandleEvent($event);

Method kApplication::HandleEvent passes the actual event processing to an object of kEventManager class. A link to that object is stored inside of application $this->Application->EventManager property.

At the same time, for event processing from kEventManager::HandleEvent method system makes calls to other methods of the main Application class. For example, in order to get the object of Event Handler for specific event we are using the following:

$event_handler =& $this->Application->recallObject($event->Prefix.'_EventHandler');
/* @var $event_handler kEventHandler */
$event_handler->processEvent($event);

As you can see, we are calling for kApplication::recallObject method, which gets a link to required Event Handler by making call to another base object, link to which is accessible in the Factory property of Application object.

$result =& $this->Factory->getObject($name, $pseudo_class, $event_params);

In case if Event Handler object hasn't been created yet, then object of kFactory will create it for the first time while making another call to a base Application object to get and process Build Event which is triggered any time system creates a new Event instance:

$event =& $this->Application->EventManager->getBuildEvent($pseudo_class);
if($event)
{
	$event->Init($prefix,$special);
	foreach($event_params as $param_name=>$param_value)
	{
		$event->setEventParam($param_name,$param_value);
	}
	$this->Application->HandleEvent($event);
}


Main Phases in Application Process Flow

These are Initialization, Processing and Completion phases. Below is example from standard index.php file:

$application =& kApplication::Instance(); - getting a link to Application object
$application->Init(); - initialization phase
$application->Run(); - processing phase
$application->Done(); - completion phase

Initialization

The key point of initialization in In-Portal is to get the most out your application by building strong and complete infrastructure. This done by initializing and creating all necessary objects, properly defining relations between them, and then processing all incoming data from HTTP requests (GET/POST/COOKIES and others) and finally properly apply all this data on the Web-server, database and application itself.

Connecting to Database and Creating Connection object

Specifically for this task there is a code inside of kApplication::Init() method:

$this->Conn = new kDBConnection(SQL_TYPE, Array(&$this, 'handleSQLError') );  // new object
$this->Conn->debugMode = $this->isDebugMode();
$this->Conn->Connect(SQL_SERVER, SQL_USER, SQL_PASS, SQL_DB); // connecting to the database

Connection to the database is handled through the object of kDBConnection class. Once created, a link to a database object is placed inside of Conn property of the main Application object. In it's turn, this new object of kDBConnection class is getting a link-back to the main Application object in it's construction method using the following code:

$this->Application =& kApplication::Instance();


Note that a link to database object can also be stored as a separate Conn property in other objects that tightly connected to database and can make often database calls. Good examples are objects of kDBBase class and his inheritors kDBItem and kDBList classes. This done for better performance:

function kDBBase()
{
	parent::kBase();
	$this->Conn =& $this->Application->GetADODBConnection();
}

Thus, once initialization is complete, the access to the database can be done virtually from any place:

$all_tables = $this->Conn->Query('SHOW TABLES');


Creation of Factory Object and Registering New Classes

There is a code inside of kApplication::Init() method:

$this->Factory = new kFactory();

Factory object is one of the key objects in the entire Application. It's designated to keep track of other objects that already been created and return a link to it in case if one is requested by the Application. It's obvious that object of kFactory class is created before any other standard objects.

In-Portal wides uses Late Initialization approach. Objects are created only when they are needed or required by someone. kFactory

class provides a functionality when Late Initialization is done automatically as long as proper classes are registered and will be used in creation of its objects. Class Registration is quick and low resource operation which simply saves in properties (array format) of Factory object the following data:
  • pseudo-name of class:
  • path on the file-system to actual class
  • list of other classes that must be defined before this class

Right after creation of Factory object system will continue registering other base classes critical to the application. This is done through the following method:

$this->RegisterDefaultClasses();

Note that any of these Default classes registered via kFactory class can be replaced at later point of initialization based on your application needs.

Translated from (revision 1033)