使用 Joomla! 平台编写自己的应用
几天前,Joomla! 平台 11.3 版本发布。越来越多的人对 Joomla! 平台是什么感到好奇。以下文章是即将发布的《Joomla! 开发入门指南》的一章,该指南将尽快以免费 PDF 的形式发布。Joomla! 平台这个术语相当新颖。它是在 2011 年 1 月发布 Joomla! 1.6 时引入的。
历史
自从 Mambo/Joomla! 以来,CMS 包中就有名为 mambo.php 和 joomla.php 的文件。
在 Joomla! 1.0 中,这些文件包含 6,153 行代码。这些文件还包含一些其他文件,它们只是“很大”。它们是核心和第三方扩展使用的代码的库。
文件越变越大,随着时间的推移,它变成了 jPlatform,它是 Joomla 的一种操作系统,而 CMS 则是运行在其上的应用程序。
从 Joomla! 1.6 开始,平台与 CMS 分离。
Joomla! 平台是 Joomla! CMS 运行的框架。
这种分离的想法是在 2005 年 Joomla! 1.0 发布后产生的,它花费了近六年的时间来实现。它将改变开发者、架构师和服务提供商未来处理 Joomla! 的方式。
许多公司和组织都有超出基本 Joomla! CMS 包提供的功能的要求。想想集成的电子商务系统、复杂的企业目录或预订系统。
让我们更仔细地看看。
编号
当我第一次听说它时,最让我困惑的是编号。但我找到了一个非常简单的答案。
平台的编号方案由年份编号后面跟着一个序列号组成,所以 11.1 是 2011 年的第一个版本。下一个版本是 11.2。
2012 年的第一个版本将编号为 12.1。
发布周期
每三个月将发布一个新的 Joomla! 平台版本。
包内容
平台软件包包括存储在文件夹 /libraries 和 /media 中的文件,并且没有图形用户界面。
平台源代码存储在 Git 版本控制系统 GitHub。
- 代码:https://github.com/joomla/joomla-platform
- 成员:https://github.com/joomla/joomla-platform/network/members
分离的优势和好处
- 它允许开发者在独立于 CMS 的情况下使用 Joomla 平台。
这意味着在未来,您将能够在 Joomla! 平台上选择不同的 CMS。这真的很革命!Joomla! 是世界上唯一提供这种功能的系统。
虽然 Joomla! 项目仍提供了一个核心 CMS,但像 Molajo 这样的其他项目也可以将 Joomla! 平台作为基础。 - 它允许开发者更快地贡献/添加功能。
过去,一个好的代码不总是被包含在 Joomla! 核心中,这非常令人沮丧。由于 Joomla! 平台存储在 GitHub 上,因此很容易为您的目的进行分支,并且也很容易将您的代码集成到主分支中。 - 3 个月发布周期
在这个较短的发布周期中,将功能添加到平台中比添加到 CMS 中要快得多。这对扩展开发者来说非常有用,他们可以添加其扩展所需的必要核心功能。 - 它鼓励更多开发者的招募,包括大型企业,否则他们可能不会做出贡献。
这一点至关重要,并且当负责平台的团队开始接受这些新面孔时,它将发挥作用!
使用 Joomla 平台
首先,您必须下载平台。
您可以在 GitHub 上找到最新版本(https://github.com/joomla/joomla-platform)。
之后,您必须在您的公共 web 服务器目录(htdocs)中提取文件,并为您的应用程序创建一个文件夹(cli)。
在 /docs 文件夹中,您将找到平台的文档和编码标准。文件以 docbook 格式,查看它们有点棘手。Elkuku 提供了一个公共过滤器,您可以下载文档作为 pdf(http://elkuku.github.com/joomla-platform/)。
测试您的环境
Joomla! 平台在浏览器中不提供图形用户界面(GUI),就像 Joomla! CMS 一样,所以我们必须使用命令行界面(CLI)进行我们的第一步。
根据您使用的操作系统和 LAMP 栈,PHP 可能没有正确安装。您可以通过在命令行界面(Terminal 在 OSX,命令提示符 在 Windows,Shell 在所有 ..ix 系统中)中输入命令 php -version 来检查。我使用 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 world 示例开始。创建一个名为 hello.php 的文件,并将其放入 /cli(列表 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( ); ?>
列表 1:hello.php
使用命令 php hello.php 执行您闪亮的新应用程序,结果将如下所示
cli hagengraf$ php hello.php Hello World cli hagengraf$
老实说,当我第一次看到结果时我很高兴,但它并没有让我感到震惊 :).
让我们再举一个例子
你的最后一条推文
你有Twitter账号吗?让我们使用Joomla!平台创建一个交互式应用程序,并读取最后一条推文(清单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(); } } JCli::getInstance('TwitterFeed')->execute();
清单2:twitter.php
当你使用php twitter.php启动应用程序时,它会要求你输入Twitter用户名和想查看多少条推文。然后它会显示推文!
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
我们越来越高级了 :)
操作仍然有一种像80年代的电影《战争游戏》的感觉,但是嘿,它使用了Twitter,要求输入,并在命令行上显示推文——哇!
一个Web应用程序
我们第一个例子与在浏览器中运行的应用程序之间的区别在于使用了HTML代码。如果我们打印出HTML代码,它可以通过浏览器渲染成网页。
在我们的第一个Web应用程序中,我们只想显示应用程序的基本路径和实际日期。浏览器中的输出应该是这样的
我的Web应用程序
当前URL是http://localhost/jplatform/
日期是2011-11-21 15:03:11
为了尝试这个,我们需要两个文件,一个位于includes文件夹中的index.php文件和一个application.php文件。如果你想在Joomla!平台的基础上创建一个单一 Web应用程序,你必须将index.php放在Joomla!平台的根目录中,将application.php放在一个名为includes的新文件夹中。
- build - docs - includes -- application.php - libraries - media - tests index.php
index.php包含以下语句(清单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(); ?>
清单3:index.php
你可以在清单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'); } } ?>
清单4:/includes/application.php
如果你熟悉Joomla! CMS,你可以使用你已知的所有片段来构建自己的应用程序。
我从Joomla!文档页面(http://docs.joomla.org/How_to_create_a_stand-alone_application_using_the_Joomla!_Platform)中的三个示例中获取了这些示例,最后我被基于Joomla!代码构建全新事物的可能性所震撼。
多个Web应用程序
在我们的第一个例子中,我们在一个Joomla!平台上安装了一个精确的Web应用程序(myapp)。如果你觉得这样很好,那就没问题。想象一下,你想在同一个Joomla!平台安装上运行多个应用程序。为此,你需要一个额外的bootstrap.php文件(清单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文件由一行代码组成,这是必要的,以便向你的Web应用程序展示通往Joomla!库文件夹的道路。
<?php require dirname(dirname(__FILE__)).'/jplatform/libraries/import.php';
清单5:bootstrap.php
更多资源
在GitHub上有一个地方收集了示例(https://github.com/joomla/joomla-platform-examples)。
它们是根据我上面描述的多个应用程序结构准备的。
你可以下载、解压缩并在你的Joomla!平台文件夹中执行这些示例。
发表在Joomla社区杂志上的一些文章代表了作者对特定主题的个人观点或经验,可能与Joomla项目官方立场不一致
通过接受,您将访问 https://magazine.joomla.net.cn/ 之外的第三方外部服务
评论