当我第一次编写播客套件时,播客这个概念还是相当新的。我以com_syndicate为基础,向RSS生成器中添加了封装,然后增加了一个后端来帮助人们管理文件。我的想法是保持代码非常简单:套件的第一版甚至没有数据库表来跟踪剧集。一切都是(并且仍然是)建立在文章之上的薄薄一层。
随着时间的推移,播客的需求发生了变化,套件也随之改变。苹果公司加入了这场游戏,开始通过iTunes订阅播客。而iTunes需要几个额外的自定义标签来处理RSS。除了在组件中添加一个用于处理iTunes元数据的数据库表之外,别无他法。
另一个需要改变的地方是通过人们使用套件的方式揭示的。尽管播客的目的是订阅,以便您的便携式媒体播放器自动填充新剧集,但许多人询问“我的网站上播放器在哪里?”套件最初只弹出“立即下载!”的文件链接,但人们想要在网站上播放剧集。为此,我添加了一个免费的基于Flash的MP3播放器。我还可以添加自定义HTML的选项,以便可以使用任何播放器。
最后,Joomla! 1.5版本发布了。即使启用了传统模式,播客套件也拒绝在1.5上安装。尽管可能可以通过调整套件现有版本来实现,但代码确实需要重写。一个经常请求的功能是能够为多个播客创建订阅。我知道1.5中的模型-视图-控制器特性非常适合这一点。
虽然我看到了很多改进代码的空间,但编写代码的时间却很紧张。幸运的是,我得到了帮助!普林斯顿大学对他们UChannel网站的新版本套件感兴趣。他们让我联系了Dan Li,他在今年夏天自愿抽出时间帮助实现了Podcast Suite 1.5。Dan对Joomla!完全陌生,但他直接跳进去开始工作了。
有一双新鲜的眼睛提高了代码和UI的质量,也加快了开发速度。知道有另一个程序员在等待我的反馈和SVN提交,让我更有动力优先处理套件任务。我知道添加更多的代码是在帮助Dan写更多的代码,这反过来又会激励我添加更多的代码,形成了一个非常有成效的循环!如果你一直独自编程,当你开始和另一个人一起编程时,你会对结果感到惊讶!
除了我们计划添加的功能外,Joomla! 1.5还为我们提供了更多的机会。偏好面板功能与Views的结合在创建多个可配置的feed时节省了很多时间。在开发过程中,Nicolas Boseret自愿使用新的语言特性将组件界面翻译成法语。我们还为从Joomla! 1.0版本升级的用户创建了一些与com_migrator组件配合的代码。以下是一些技术方法...
偏好面板
1.5版本组件的一个非常受欢迎的添加是参数工具栏按钮。你怎么得到这个按钮?只需在你构建工具栏的地方添加这段代码
JToolBarHelper::preferences('com_yourcomponent');
当点击这个工具栏按钮时,一个窗口将出现在管理屏幕的顶部,显示config.xml中定义的参数以及保存和取消按钮。
在Joomla!的旧版本中,你将不得不手动加载XML文件,将其传递到某个对象的成员函数中,然后构建一个屏幕,最后渲染参数。然后你还需要构建一个函数来处理参数的保存。Joomla! 1.5用一行代码就消除了所有这些!如果你的组件有很多配置选项,在为1.5版本构建时,请认真考虑使用此功能。在代码的其他地方,参数可以这样检索
$params =& JComponentHelper::getParams('com_yourcomponent');
然后你可以使用 $params->get('parameternameyouwant', 'default'); 获取参数值。
迁移数据
如果你有将从Joomla! 1.0升级并耐心等待你的1.5扩展的用户,请为他们提供一个迁移路径。在大多数情况下,与你的组件关联的数据库表将是迁移的最重要部分。
Sam Pasamio的com_migrator组件允许用户将现有安装的数据迁移到1.5。它有一个插件系统,你可以添加PHP代码将旧数据转换为你的新组件的架构。尽管你可能会继续使用相同的表架构,但你仍然需要编写PHP插件来处理这个问题。
幸运的是,你可以查看/administrator/com_migrator/plugins文件夹中的现有插件作为示例。在bannerclient.php中的插件简单地将所有内容复制到新表中。如果你没有更改架构,这是一个很好的参考。Podcast Suite的插件删除了一个字段并添加了一个新字段,该字段用每个epsisode的文件信息进行了填充。
最后,你还需要创建一个.sql文件,该文件将放在/administrator/com_migrator/tables中。迁移过程需要这个文件,因为当1.5核心安装完成时,你的数据将被添加到数据库中。然而,当你为你的主组件包创建安装文件时,请确保在你的CREATE TABLE语句中使用IF NOT EXISTS子句。迁移的用户仍然需要在1.5网站上安装你的组件以完成迁移,而新用户需要创建表。
注意,这些文件没有自动安装程序:它们必须被手动复制到 /administrator/com_migrator/tables 和 /administrator/com_migrator/plugins 目录下。我只是将它们一起打包在 .zip 文件中,并在下载链接附近加上一条注释,说明这些文件必须手动复制。
国际化
在 1.5 版本中,管理国际化界面变得更加容易。Joomla! 终于内置了管理此功能的能力。您不必确定界面应该显示哪种语言;这现在是通过 Joomla! 自身来完成的。如果首选语言不可用,它将默认为英语。您可以通过以下方式在界面中国际化字符串
echo JText::_('EXTENSION_EXAMPLE');
然后在语言文件中翻译该字符串。默认的语言文件位于 /administrator/language/en-GB(后端)和 /language/en-GB(前端)。您需要创建的文件名将是 en-GB.com_nameofyourcomponent,en-GB.mod_nameofyourmodule 或 en-GB.plg_nameofyourplugin,这取决于扩展类型。您的翻译将如下所示
EXTENSION_EXAMPLE=extension example
对于其他语言,首先安装 Joomla! 核心语言包。然后您将在 /administrator/language 和 /language 下找到新语言的文件夹。对于其他语言,使用相同的文件格式
EXTENSION_EXAMPLE=extension example in another language
另外请注意,如果您使用的是 Joomla! 核心中已经翻译的短语,这个短语可以在您的组件中重用。将您的文本传递到 JText::_(),它会为您处理。
如果 JText::_() 无法找到您传入的文本,它将简单地输出它。虽然这是一个很好的默认行为,但它可能很难验证您的语言文件中是否包含所有定义。为此,您需要开启语言调试。为此,转到后端的全局配置屏幕,点击系统,将调试语言设置为是,然后点击保存。启用语言调试后,您应该会看到通过 JText 传递的文本周围的点。在当前语言文件中没有定义的文本的情况下,您会看到周围有问号。通过更改用户的语言来检查每种语言。
SVN
如果您还没有将项目放入 SVN 仓库,现在是开始的好时机。使用 SVN 不仅可以让您轻松跟踪代码的更改,而且在多人共同开发扩展时非常有帮助。尽管有一定的学习曲线,但好处很快就会超过学习和努力的时间。一旦您对 SVN 变得熟悉,提交代码就会上瘾!看着其他编码者的更改随着合并而流入也非常令人满足。
使用 SVN 进行模块开发是最直接的:在项目的主干目录中创建一个名为 mod_nameofyourmodule 的文件夹,然后将此文件夹检出到 Joomla! 安装中的 /modules 目录。当您向 mod_nameofyourmodule 目录添加文件时,请确保也通过 SVN 客户端添加它们,然后在文件更改时提交。
对于组件,过程有所不同。由于在 /components 中有前端,在 /administrator/components 中有后端,您需要在主干目录中创建两个文件夹:admin 和 site。当您检出这些文件夹时,您需要将它们检出为 com_nameofyourcomponent 而不是 'admin' 和 'site'。将前端检出到 /components,将后端检出到 /administrator/components。
使用SVN开发插件是最棘手的。问题在于插件是通过单个PHP文件处理的,而SVN则控制整个文件夹。为了解决这个问题,将文件夹检出到一个与Joomla!安装位置不同的位置,然后手动复制文件。虽然这在提交代码时不幸地增加了一个额外步骤,但你仍然可以获得版本控制的所有其他好处。
如果你查看Podcast Suite的SVN仓库,你会发现在我开始使用它进行项目时,我本可以使用一些建议的。如果你点击trunk,你会注意到四个文件夹。组件文件夹有'admin'和'front'(而不是'site')。当你构建安装包时,通常将前端文件夹代码命名为'site'。
要跟随我们编写的代码,将trunk/component/admin检出至administrator/components/com_podcast,将trunk/component/front检出至components/com_podcast。从trunk/mod_podcast检出模块代码到modules目录。最后,将trunk/plugin检出到一个Joomla!核心之外的文件夹,然后复制文件和'podcast'文件夹到/plugins/content。你需要手动在jos_plugins、jos_components和jos_modules表中创建条目。
尽管版本控制具有强大的功能和组织性,但SVN并不是万能的;你仍然需要与你正在编写代码的每个人保持频繁的沟通。你沟通得越多,代码就会变得越好。重复的努力也会减少。