Собственное приложение на основе платформы Joomla!

Все больше людей удивляются, на что способна платформа Joomla. Данная статья будет входить в руководство для новичков по разработке на Joomla!, который выйдет в формате pdf очень скоро.

История

Со времен Mambo/Joomla! в пакете CMS существуют файлы mambo.php и joomla.php. В In Joomla! 1.0 эти файлы содержат 6,153 строк кода. Эти файлы включают в себя еще файлы, так что они действительно слишком огромны. Они были хранилищем кода для стандартных и сторонних разрешений.

Эти файлы увеличивались в размере и со временем превратились в jPlatform – что-то вроде операционной системы для Joomla, а CMS служила приложением, работающим в ней.
С выходом Joomla! 1.6 платформу отделили от CMS.
Платформа Joomla! – это фреймворк, в котором работает Joomla! CMS.
Идея отделения платформы родилась после запуска Joomla! 1.0 в 2005 году и потребовалось почти шесть лет для того, чтобы внедрить ее. Она изменяет представление разработчиков, архитекторов и провайдеров услуг о том, как будет работать в будущем.
Требования многих организаций выходят за рамки стандартных возможностей пакета Joomla! CMS. Взять к примеру интегрированную систему электронной коммерции, сложные деловые каталоги или систем резервирования.

Рассмотрим ситуацию в деталях.

Нумерация

Нумерация – это то, что больше всего смутило меня при первом опыте, но я нашел довольно простое решение.
Схема нумерации платформы состоит из года за которым следует порядковый номер. Таким образом, 11.1 был первым релизом в 2011 году, следующим был 11.2. Первый релиз в 2012 году имел номер 12.1.

Цикл релизов

Каждые три месяца будет выходить новая версия платформы Joomla!

Содержание пакета

Пакет платформы состоит за файлов, хранящийся в папке /libraries и /media и у него нет графического интерфейса.
Исходный код платформы хранится в версии Git системы контроля GitHub.

Плюсы и минусы отделения платформы

  1. У разработчиков появилась возможность использовать платформу независимо от CMS.
    Это означает, что в будущем появится выбор между различными CMS во главе с платформой Joomla!. Joomla – единственная система, предоставляющая такую возможность. Есть одна стандартная CMS от проекта Joomla!, но все остальные (например, Molajo) можно использовать, взяв платформу Joomla! за основу.
  2. У разработчиков появилась возможность дорабатывать и добавлять возможности намного быстрее.
    Раньше это было сложно, т.к. в ядре Joomla! не хватало части кода. В платформе Joomla!, хранящейся на GitHub, можно легко внедрить свой код в главную ветку.
  3. Трехмесячный цикл релизов.
    С таким графиком релизов возможно добавлять в платформу возможности намного быстрее, чем в CMS. Это полезно для разработчиков расширений, которые могут добавлять необходимые функции для своего расширения.
  4. Все больше разработчиков интересуются проектом. Появляются более крупные корпорации, которые раньше не были в этом заинтересованы.
    Это важный пункт и он сработает, когда команда отвечающая за платформу начнет принимать новых участников.

Использование платформы Joomla

Для начала нужно скачать ее. Здесь можно найти текущую версию.

Далее нужно будет извлечь файл в публичную директорию вебсервера (htdocs) и создать папку для ваших приложений (cli).

В папке /docs можно найти документацию и стандарты кодирования для платформы. Формат файлов – docbook и просматривать их немного сложно. У Elkuku есть публичный фильтр для документации. Оттуда можно скачать файлы в формате pdf.

Протестируйте конфигурацию

У платформы Joomla! нет графического интерфейса в браузере (GUI), как у Joomla! CMS, так что придется использовать командную строку (CLI) для начала работы.
В зависимости от используемой операционной системы и от LAMP-стека, возможно установить PHP корректно. Можно проверить и ввести в командной строке php -version (Terminal в OSX, Command Prompt в Windows, Shell во всех ..ix системах). Я использую OSX и MAMP и в результате все выглядит так:

web hagengraf$ php -version
PHP 5.3.6 with Suhosin-Patch (cli) (built: Sep  8 2011 19:34:00)
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies

Hello World

Для простоты начнем с примера «привет всем». Создайте файл hello.php и поместите его в /cli (Listing 1).

<?php
// TODO Do we need this statement?
define( '_JEXEC', 1 );
// Import of necessary class file
require_once ( '../libraries/import.php' );
// Load JCli class
jimport( 'joomla.application.cli' );
// Extend JCli class
class HelloWorld extends JCli
{
// overwrite method
public function execute( )
{
// print something
$this->out( 'Hello World' );
}
} // TODO ... how to describe the next statement easily :)
// First try: Call of the static method execute in the derived class HelloWorld?
JCli::getInstance( 'HelloWorld' )->execute( );
?>

Listing 1: hello.php

Задайте вашему новому приложению php команду hello.php. Результат будет выглядеть так:

cli hagengraf$ php hello.php
Hello World
cli hagengraf$

По правде говоря, меня порадовало, то что я увидел.

Сделаем еще один пример.

Последние твиты

У вас есть аккаунт на Twitter? Создадим интерактивное приложение с помощью платформы Joomla! и прочитаем последние твитты. (listing 2)

<?php
define('_JEXEC', 1);
require_once '../libraries/import.php';
jimport('joomla.application.cli');
class TwitterFeed extends JCli
{

//Get Latest Tweet
function latest_tweet( $username, $count = 5 )
{
$url = "http://twitter.com/statuses/user_timeline/$username.xml?count=$count";
$xml = simplexml_load_file( $url ) or die( "could not connect" );
$text = '';
foreach( $xml->status as $status )
{
$text .= $status->text . '

';
}
return $text;
}

public function execute()
{
$this->out( 'What is your twitter handle?' );
$username = $this->in( );

$this->out( 'How many tweets to view?' );
$count = $this->in( );

$tweet = $this->latest_tweet( $username, $count );
$this->out( $tweet );
}

protected function fetchConfigurationData()
{
return array();
}
}

Listing 2: twitter.php

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

cli hagengraf$ php twitter.php
What is your twitter handle?
hagengraf
How many tweets to view?
5
Did you know? Member for 8 years 7 weeks :) http://t.co/L8tzB2kz #drupal #wordpress

@brianronnow can you give me the wrong link, then I will update it

@brianronnow oh sorry :) the correct answer is 243 pages

@brianronnow the last update was 2 days before JDay Denmark

Мы успешно продвигаемся.

Управление оставляет желать лучшего, но ведь есть и свои плюсы – можно смотреть твитты в командной строке.

Веб-приложение

Отличие первого примера от приложения, которое работает в браузере – это использование кода HTML. Если распечатать код, его можно передать через веб-страницу в браузере.

В первом приложении мы хотели показать основной путь к приложению и актуальную дату. В браузере это будет выглядеть так:

My Web Application

The current URL is http://localhost/jplatform/
The date is 2011-11-21 15:03:11

Для испытания нам понадобятся два файла - index.php и application.php в папке /includesfolder. Для того, чтобы создать одно веб-приложение на основе платформы Joomla!, нужно поместить файл index.php в корень директории платформы, а файл application.php в новую папку под названием /includes.

- build

- docs

- includes

-- application.php

- libraries

- media

- tests

index.php

Listing 3. Структура приложения

Файл index.php состоит из следующих предложений (Listing 3). Код собирается из нескольких частей платформы, а в конце ваше приложение запускается с помощью команды $app->render();

<?php

if (file_exists(dirname(__FILE__) . '/defines.php'))
{
include_once dirname(__FILE__) . '/defines.php';
}

// Define some things. Doing it here instead of a file because this
// is a super simple application.
define('JPATH_BASE', dirname(__FILE__));
define('JPATH_PLATFORM', JPATH_BASE . '/libraries');
define('JPATH_MYWEBAPP',JPATH_BASE);

// Usually this will be in the framework.php file in the
// includes folder.
require_once JPATH_PLATFORM.'/import.php';

// Now that you have it, use jimport to get the specific packages your application needs.
jimport('joomla.environment.uri');
jimport('joomla.utilities.date');

//It's an application, so let's get the application helper.
jimport('joomla.application.helper');
$client = new stdClass;
$client->name = 'mywebapp';
$client->path = JPATH_MYWEBAPP;

JApplicationHelper::addClientInfo($client);

// Instantiate the application.
// We're setting session to false because we aren't using a database
// so there is no where to store it.
$config = Array ('session'=>false);

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

// Render the application. This is just the name of a method you
// create in your application.php
$app->render();
?>

Listing 3. index.php

Найдем код для приложения в listing 4.

<?php
// no direct access
defined('JPATH_PLATFORM') or die;
final class JMyWebApp extends JApplication
{
/**
* Display the application.
*/
public function render()
{
echo '<h1>My Web Application</h1>';
echo 'The current URL is '.JUri::current().'<br/>';
echo 'The date is '. JFactory::getDate('now');
}
}
?>

Listing 4: /includes/application.php

Если вы привыкли к Joomla! CMS, то можете использовать части кода, которые знаете для того, чтобы создать свое приложение. Мне понадобилось три примера со страницы документации Joomla!

В итоге, я собрал нечто новое на основе кода Joomla! и был доволен.

Множество веб-приложений

Но представьте, что нужно несколько приложений на платформе Joomla!. Для такого случая понадобится дополнительный файл bootstrap.php (listing 5) и такая структура директории:

- build
- docs
- libraries
- media
- tests
- cli <- only if you have cli apps
- web <- the folder for the web apps
-- myapp <- the folder of one app
--- includes
---- application.php
--- index.php
-- anotherapp <- the folder of another app
--- includes
---- application.php
--- index.php
- bootstrap.php

Файл bootstrap.php состоит из одной строки кода и нужен для того, чтобы указать приложению путь к папке библиотеки Joomla!. В первом примере мы сделали одно приложение (myapp) на одной платформе Joomla. Если это вам пдходит, можно остановиться.

<?php
require dirname(dirname(__FILE__)).'/jplatform/libraries/import.php';

Listing 5: bootstrap.php

Ссылки

На GitHub есть много примеров. Они основываются на примере со множественными приложениями. Можно скачать, извлечь и проделать все операции с примерами в вашей папке платформы Joomla!.

Оригинальная статья