データコンテナ配列にカスタムフィールドを追加する方法

ここでは、メンバーテーブルに顧客番号を追加することにします。Contaoのテーブルにカスタムフィールドを追加するには、1つ以上のファイルの変更が必要となります。このため、カスタムモジュールをsystem/modules ディレクトリに作成することを推奨します。モジュールはアルファベット順に読み込まれることを忘れないでください。このためnews拡張の設定を上書きしたい場合は、機能拡張をcustomという名前にしてはなりません。

データベースの拡張

データベースの構成は、様々なContaoのモジュールのconfig/database.sqlファイルに保管されています。SQLファイルはデータベースに送ることはありませんが、Contaoの仕様と実際のデータベースのテーブルの間の比較を解釈するために使用します。したがって、他のモジュールで定義されているフィールドをdatabase.sqlファイルで変更できます。新しいフィールドを作成するために以下のコードを追加します:

CREATE TABLE `tl_member`(
  `customer_number` varchar(8) NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Contaoのインストールツールを使用して、データベースのテーブルを更新します。

DCAの拡張

作成するモジュールのフォルダーにdca/tl_member.phpを作って、新しいフィールドのメタデータを追加してContaoに処理方法を知らせます。

// パレットを変更
$GLOBALS['TL_DCA']['tl_member']['palettes']['default'] = str_replace
(
    'company',
    'customer_number,company',
    $GLOBALS['TL_DCA']['tl_member']['palettes']['default']
);

// フィールドのメタデータを追加
$GLOBALS['TL_DCA']['tl_member']['fields']['customer_number'] = array
(
    'label'     => &$GLOBALS['TL_LANG']['tl_member']['customer_number'],
    'exclude'   => true,
    'inputType' => 'text',
    'eval'      => array('mandatory'=>true, 'rgxp'=>'digit', 'maxlength'=>8)
);

上記のコードが理解できない場合、データコンテナ配列の章を読むとよいでしょう。

翻訳の追加

作成するモジュールのフォルダーにlanguages/en/tl_member.phpファイルを作って、新しいフィールドの英語のラベルを追加します:

$GLOBALS['TL_LANG']['tl_member']['customer_number'] = array
(
    'Customer number',
    'Please enter the 8-digit customer number.'
);

これで、メンバーモジュールに8桁の数字の顧客番号を入力できるようになります。フィールドが空だったり、数字以外の文字を含んでいると、Contaoは値を保存しないで代わりにエラーメッセージを表示します。


コメントの追加

Custom Theses Writingによるコメント | 2010年5月4日

多くの機関は、そのオンライン情報へのアクセスを制限しています。この情報を利用可能にすることで誰にでも役に立ちます。

zagによるコメント | 2010年6月20日

DCAを拡張しているコードには、<?php と ?> の部分の追加が必要です。PHPな人々には自明かもしれませんが、何が欠けているか解決するまでしばらくかかりました。

<?php if (!defined('TL_ROOT')) die('You can not access this file directly!');

// パレットを修正
$GLOBALS['TL_DCA']['tl_member']['palettes']['default'] = str_replace
(
    'company',
    'customer_number,company',
    $GLOBALS['TL_DCA']['tl_member']['palettes']['default']
);

// フィールドのメタデータを追加
$GLOBALS['TL_DCA']['tl_member']['fields']['customer_number'] = array
(
    'label'     => &$GLOBALS['TL_LANG']['tl_member']['customer_number'],
    'exclude'   => true,
    'inputType' => 'text',
    'eval'      => array('mandatory'=>true, 'rgxp'=>'digit', 'maxlength'=>8)
);

?>