Доброго времени суток,
Пишу под 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
стартуем мы так:
второй файл application.php
Вот собственно и все, но как-то совсем не интересно. Давай-те добавим простое логирование. Для этого в конструкторе класса зададим логгер:
теперь можно логировать
Попробуем поработать с базой данных. Для этого надо ее задать. Покопавшись немного в коде находим, что по умолчанию конфиг будет браться из папки libraries. В ней и находим config.example.php, как кстати. Переименовываем его в config.php и убираем из него лишние настройки, оставляя только DB.
не забываем переименовать JConfigExample в JConfig
Попробуем поработать с JTable, Joomla ORM так сказать.
Создаем в базе таблицу с двумя столбцами
Создаем в корне папку tables и в ней файл test.php
не забываем подключить
в функцию render добавляем
после запуска видим ошибку Fatal error: Class 'JTable' not found in...
значит надо импортнуть. Плюс строчка в файле index.php, туда же к остальным импортам:
После запуска видим, что в базе, в таблице появилась новая запись.
Отсюда уже не так и далеко до разработки веб приложений с использованием парадигмы MVC. Осталось только подключить JModel, JView, JController и вперед.
Введение
Пишу под 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 и вперед.