Contao Open Source CMSのAPIの変更

バージョン3.4から3.5

StringUtilクラス

StringクラスはPHP 7と互換性がないため、StringUtilと名前を変更しました。Stringクラスは後方互換の理由で利用できますが、非推奨の扱いで将来のバージョンで削除されます。

PHPのバージョン

PHPの最低のバージョンを5.3.7から5.4.0としました。

DataContainer

DataContainerクラスを抽象クラスにしましたが、これは問題になることはありません。というのも、コンストラクターは従来からprotectとしていたためです。また、メソッドのgetPalette()save()も抽象メソッドとして追加し、すべての子のクラスで実装する必要があります。(既にDC_のクラスではそうなっています。)

バージョン3.3から3.4

PHPのバージョン

Contao 3.4では、新しいBlowfishモードを使用して潜在的な高次ビット攻撃に対処しています。このため、PHPの最低のバージョンは5.3.2から5.3.7に上げました。

バージョン3.2から3.3

processFormDataフック

"processFormData"フックの最初の引数に$_SESSION['FORM_DATA']の代わりに$arrSubmittedを渡すようになりました。これは実際にはバグ修正で、今までの単に現在のフォームの項目の代わりに、セッションに保持されているすべてを渡します。

しかし、この変更は後方互換性を損なうことを意味します、なぜなら以前の実装では$arrDataを変更してフォームの項目が追加できたからです。

public function myProcessFormData(&$arrData, …) {
    $arrData['new_field'] = 'new_value';
}

バージョン3.3では、代わりに$_SESSION['FORM_DATA']に追加しなければなりません:

public function myProcessFormData($arrData, …) {
    $_SESSION['FORM_DATA']['new_field'] = 'new_value';
}

バージョン3.1から3.2

Controller::addImageToTemplate()

Contao 3.2.2より前は、addImageToTemplate()メソッドは画像のURLやリンク先の"href"属性が既に設定されている場合でも上書きしていました。これは"href"属性にイベントの詳細のURLを入れている、イベントのテンプレートで問題となりました。

このため、"href"属性が設定されている場合はその代わりに、addImageToTemplate()メソッドでは画像のURLやリンク先を"imageHref"属性に入れるようにしました。しかし、イベントの画像を描画するevent_*のテンプレートをカスタマイズしている場合に調整が必要となります。これはコアのテンプレートには影響しないことに注意してください。

バージョン3.2.2より前での使い方:

<h2><a href="<?php echo $this->href; ?>Event title</a></h2>
<p><a href="<?php echo $this->href; ?>"><img src="..."></a></p>

バージョン3.2.2以降の新しい使い方:

<h2><a href="<?php echo $this->href; ?>Event title</a></h2>
<p><a href="<?php echo $this->imageHref; ?>"><img src="..."></a></p>

buttons_callback

Contao 3.0で導入した"buttons_callback"によって、複数のレコードを選択したときに独自のボタンを追加できました。この機能をContao 3.2では強化して、選択するボタンだけではなく、任意のボタンのセットの変更や既存のボタンの削除もできます。

このために既存の"buttons_callback"を使用するように決めました、なぜなら本質的に同じことのために別のフックを追加するのは合理的ではありません。しかし、この決定は後方互換性を崩すことを意味します、それはフックのAPIを次のように変更しなければならないからです。

Contao 3.0と3.1での使い方:

$GLOBALS['TL_DCA']['tl_page']['edit'] => array
(
    'buttons_callback' => array
    (
        array('tl_page', 'addAliasButton')
    )
);

/**
 * Buttonのコールバック
 * @return string
 */
public function addAliasButton()
{
    return '<input...';
}

Contao 3.2以降の新しい使い方:

// ボタンを「複数を変更」の表示に追加
$GLOBALS['TL_DCA']['tl_page']['select'] => array
(
    'buttons_callback' => array
    (
        array('tl_page', 'addAliasButton')
    )
);

// 「項目を編集」の画面にボタンを追加
$GLOBALS['TL_DCA']['tl_page']['edit'] => array
(
    'buttons_callback' => array
    (
        array('tl_page', 'addAliasButton')
    )
);

/**
 * Buttonのコールバック
 * @param array
 * @return array
 */
public function addAliasButton($arrButtons)
{
    // 保存のボタンをアンセット
    unset($arrButtons['edit']);

    // 独自の"alias"ボタンを追加
    $arrButtons['alias'] = '<input … >';

    // ボタンの配列を返す
    return $arrButtons;
}

"buttons_callback"を使用している場合は、忘れずに機能拡張を適切に調整してください。

Model::save()

Contao 3.0と3.1の両方では、Model::save()メソッドにtrueを渡して、同じデータベースのレコードの2つのモデルを作成できました。しかし、これは、あるエッジケースでデータの紛失を招く可能性があったので、モデルレジストリを実装してデータベースのレコードに1つのモデルだけが存在することを保証しました。

ところが、レジストリはモデルを複製するためにcloneコマンドの使用が必要となり、そのため引数の$blnForceInsertを削除しなければなりませんでした。独自の機能拡張でこれを使用していた場合は、対応するコードの調整が必要ないか確認してください。

Contao 3.0と3.1での使い方:

$objPage = PageModel::findByPk(1);
$objPage->title = 'New page title';
$objPage->save(true);

Contao 3.2以降の新しい使い方:

$objPage = PageModel::findByPk(1);
$objCopy = clone $objPage;
$objCopy->title = 'New page title';
$objCopy->save();

Contao 3.4.5に付属のUPGRADE.mdの翻訳です。