拡張機能(エクステンション)を作りたい。作り方

Joomla Extension Directory Joomla
プラグイン総数7393 (2015/8/22)

Joomlaの拡張機能は、WordPressと比べると検索しやすいです。

Joomla Extension Directory

プラグイン総数7363 (2015/8/22)

標準で絞込みと検索が出来ます。

反面、拡張機能が総数で7,363個とWordPressの39,622個と比べると、数の違いは歴然としています。WordPressも同じですが、古いバージョン用の拡張機能も含まれていますので現バージョン(3.x)用のプラグインは3,789個です。

ちょっと辛いです。簡単に作れるのだったら、自分で作ってみたいと思います。

プラグインの作り方

公式ドキュメントに、プラグインの作り方が載っています。

J3.x:Creating a Plugin for Joomla - Joomla! Documentation

必要なものは、インストールに使うXMLファイル、拡張機能のメインPHPファイル、と後は中身です。

インストールファイル

インストール用のXMLファイルは、プラグイン名.xmlに指定されています。

公式ドキュメントに出ている例を見ると、作るのはそれほど大変そうではありません。インストールに加えて、設定の管理も基本はこれで大丈夫そうです。(個別にデータベース上にテーブルを作る場合を除く)

<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="search">
  <name>plg_search_categories</name>
  <author>Joomla! Project</author>
  <creationDate>November 2005</creationDate>
  <copyright>Copyright (C) 2005 - 2013 Open Source Matters. All rights reserved.</copyright>
  <license>GNU General Public License version 2 or later; see LICENSE.txt</license>
  <authorEmail>admin@joomla.org</authorEmail>
  <authorUrl>www.joomla.org</authorUrl>
  <version>3.1.0</version>
  <description>PLG_SEARCH_CATEGORIES_XML_DESCRIPTION</description>
  <files>
    <filename plugin="categories">categories.php</filename>
    <filename>index.html</filename>
  </files>
  <languages>
    <language tag="en-GB">en-GB.plg_search_categories.ini</language>
    <language tag="en-GB">en-GB.plg_search_categories.sys.ini</language>
  </languages>
  <config>
    <fields name="params">
 
      <fieldset name="basic">
        <field name="search_limit" type="text"
          default="50"
          description="JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC"
          label="JFIELD_PLG_SEARCH_SEARCHLIMIT_LABEL"
          size="5"
        />
 
        <field name="search_content" type="radio"
          default="0"
          description="JFIELD_PLG_SEARCH_ALL_DESC"
          label="JFIELD_PLG_SEARCH_ALL_LABEL"
        >
          <option value="0">JOFF</option>
          <option value="1">JON</option>
        </field>
 
        <field name="search_archived" type="radio"
          default="0"
          description="JFIELD_PLG_SEARCH_ARCHIVED_DESC"
          label="JFIELD_PLG_SEARCH_ARCHIVED_LABEL"
        >
          <option value="0">JOFF</option>
          <option value="1">JON</option>
        </field>
      </fieldset>
 
    </fields>
  </config>
</extension>

ファイル内でindex.htmlも含まれています。これは、インデックス表示されるのを防ぐためのものです。

メインPHPファイル

<?php
// no direct access
defined( '_JEXEC' ) or die;
 
class plg<PluginGroup><PluginName> extends JPlugin
{
  /**
   * Load the language file on instantiation. Note this is only available in Joomla 3.1 and higher.
   * If you want to support 3.0 series you must override the constructor
   *
   * @var    boolean
   * @since  3.1
   */
  protected $autoloadLanguage = true;
 
  /**
   * Plugin method with the same name as the event will be called automatically.
   */
   function <EventName>()
   {
    /*
     * Plugin code goes here.
     * You can access database and application objects and parameters via $this->db,
     * $this->app and $this->params respectively
     */
    return true;
  }
}
?>

クラスJPluginを拡張する形でプラグインを作ります。クラス名は決まっていて上の例の場合には、plg_search_categoriesです。

JPluginに定義されているイベントが起こったときに呼ばれる関数を作っていきます。

標準イベント

Joomlaの標準的なイベントが起こると関数が呼ばれる仕組みですが、強制的にイベントを起こす方法も用意されています。

$dispatcher = JDispatcher::getInstance();
$results = $dispatcher->trigger( '<EventName>', <ParameterArray> );

イベントを起こした際には、$resultsにはイベントの結果実行されたプラグイン関数の結果が配列として返るようです。(配列の形式は試していないのでわかりません・・)

非標準イベント

Joomlaで定義されていないイベントを使うようなプラグインを作った場合には、明示的にプラグインを読み込んでおかないと、イベントの起動ができません。

Joomla! API
The Joomla! CMS 3.10 API Documentation

この関数を使って、

// Note JDispatcher is deprecated in favour of JEventDispatcher in Joomla 3.x however still works.
JPluginHelper::importPlugin('content');
$dispatcher = JDispatcher::getInstance();
$dispatcher->trigger('onContentPrepare', array('some.context', &$article, &$params, 0));

読み込んでからイベント起動すれば良いようです。’content’のところはプラグインのグループで、特定のプラグインを読み込みたいときには第2引数を指定します。(指定方法がplg_content_pluginなのか、pluginだけなのかはわかりません)

作ってみたい

プラグイン作成はそれほど難しくなさそうです。中身さえ作れれば。

コメント

タイトルとURLをコピーしました