Как стать автором
Обновить

Введение в Joomla Framework — пишем простое Web приложение

Время на прочтение3 мин
Количество просмотров12K
Доброго времени суток,

Введение

Пишу под Joomla уже около полутора лет и всегда начинал с готового пакета Joomla CMS. Разрабатывал расширения под него и в ус не дул. Периодически встречал в инете упоминания про какой-то Joomla Framework, но не видел ничего с его использованием помимо всем известной CMS и ее дополнений. Ситуация получается забавная, не CMS написаный на Framework, а Framework написанный под CMS. Что же это такое?

Документация

В поисках Quick Start Guide зашел на сайт Joomla!Platform, и обнаружил там статью описывающую создание Stand Alone Application. Это не совсем то, что мне надо. Зато там же обнаружилась ссылка на пару примеров. Вот от них я и решил отталкиваться.

Старт

Распаковываем папку libraries из архива с платформой в корень нашего сайта. Рядом кладет распакованную myWebApp. Не совершая никаких дополнительных телодвижений запускаем.

Fatal error: Class 'JLog' not found in Z:\home\jframework.local\www\libraries\joomla\environment\request.php on line 572

а в стеке видим функцию JRequest::clean( )
Обидно. Но, вспоминаем о том, что в новых версиях CMS Joomla на каждом шагу (спасибо PhpStorm) напоминание о том, что JRequest @deprecated и в новой версии платформы будет убран. Скачиваем предыдущую версию платформы (11.1), заменяем папку libraries и вуаля. Работает.

А что внутри?

Не наша WebApp состоит из двух файлов:
/index.php
/includes/application.php


стартуем мы так:
define('_JEXEC', 1);
define('DS', DIRECTORY_SEPARATOR);

// Автор аппликации извиняется что не убрал это в отдельный файл

define('JPATH_BASE', dirname(__FILE__));
define('JPATH_PLATFORM', JPATH_BASE . '/libraries');
define('JPATH_MYWEBAPP',JPATH_BASE);

// подключаем необходимый минимум
require_once JPATH_PLATFORM.'/import.php';

// И еще кое-что в помощь
jimport('joomla.environment.uri');
jimport('joomla.utilities.date');

//Задаем конфигурацию

jimport('joomla.application.helper');
$client = new stdClass;
$client->name = 'mywebapp';
$client->path = JPATH_MYWEBAPP;

JApplicationHelper::addClientInfo($client);

// Получаем инстанс JApplication
$config = Array ('session'=>false);

$app = JFactory::getApplication('mywebapp', $config);

// и запускаем единственную функцию что у нас есть
$app->render();


второй файл application.php
defined('JPATH_PLATFORM') or die;

final class JMyWebApp extends JApplication
{
public function render()
{
echo 'My Web Application';
echo 'The current URL is '.JUri::current().'<br/>'; // это из импорта в помощь
echo 'The date is '. JFactory::getDate('now'); // это из импорта в помощь
}
}


Вот собственно и все, но как-то совсем не интересно. Давай-те добавим простое логирование. Для этого в конструкторе класса зададим логгер:

function __construct()
{
$options = array(
'logger' => 'formattedtext',
'text_entry_format' => '{DATE}' . chr(9) . '{TIME}' . chr(9) . '{PRIORITY}' . chr(9) . '{CATEGORY}' . chr(9) . '{MESSAGE}',
'text_file_path' => JPATH_BASE,
'text_file' => 'log.php'
);
$category = array('myApp');
Jlog::addLogger($options, JLog::ALL, $category);
}


теперь можно логировать
JLog::add('Test message!', JLog::ALERT, 'myApp');

Попробуем поработать с базой данных. Для этого надо ее задать. Покопавшись немного в коде находим, что по умолчанию конфиг будет браться из папки libraries. В ней и находим config.example.php, как кстати. Переименовываем его в config.php и убираем из него лишние настройки, оставляя только DB.
class JConfig
{
public $dbtype = 'mysql';
public $host = 'localhost';
public $user = 'root';
public $password = '';
public $db = 'j16';
public $dbprefix = 'test_';
}

не забываем переименовать JConfigExample в JConfig

Попробуем поработать с JTable, Joomla ORM так сказать.
Создаем в базе таблицу с двумя столбцами
CREATE TABLE `test_test` (
'id' int(8) NOT NULL auto_increment,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;


Создаем в корне папку tables и в ней файл test.php
defined('JPATH_PLATFORM') or die;
class TableTest extends JTable
{
var $id;
var $name;
function __construct( &$_db )
{
parent::__construct( '#__test', 'id', $_db );
}
}


не забываем подключить
require_once JPATH_BASE . '/tables/test.php';

в функцию render добавляем
$db = & JFactory::getDbo();
$test = new TableTest($db);
$test->name = 'First name';
$test->store();


после запуска видим ошибку Fatal error: Class 'JTable' not found in...
значит надо импортнуть. Плюс строчка в файле index.php, туда же к остальным импортам:
jimport('joomla.database.table');
После запуска видим, что в базе, в таблице появилась новая запись.

Заключение

Отсюда уже не так и далеко до разработки веб приложений с использованием парадигмы MVC. Осталось только подключить JModel, JView, JController и вперед.
Теги:
Хабы:
Всего голосов 32: ↑15 и ↓17-2
Комментарии11

Публикации

Ближайшие события