web-dev-qa-db-ja.com

コアコンポーネントモデルフォームXMLのオーバーライド

記事のリンクのフィールドタイプを、入力テキストから内部メニュー項目のあるドロップダウンリストに変更します。最小限の作業でこれを行うための便利な方法を探しています。

XMLを別の場所に配置して単純なオーバーライドを作成する方法がある場合、どこにも見つかりません。とにかくこれは可能ですか?

そうでなければ、何が最善のアプローチでしょうか?

3
FFrewin

より標準的なアプローチは、XMLが処理された後、モデルを離れて変更を加える前に、プラグインを使用してJFormオブジェクトをキャッチすることでしょう。その関数の例は次のようになります:

function onContentPrepareForm($form, $data)
{
    if (!($form instanceof JForm))
    {
        $this->_subject->setError('JERROR_NOT_A_FORM');
        return false;
    }

    // Check we are manipulating a valid form.
    $name = $form->getName();
    if (!in_array($name, array('com_content.article')))
    {
        return true;
    }

    $form->loadFile('__PATH_ALTERNATE_XML_FILE__');

    return true;
}

loadFileにはデフォルトで$resetフラグはtrueに設定されているため、同じ名前のフィールドがある場合、それらを新しいバージョンで置き換える必要があります。これは正規表現のように機能しないため、新しい部分だけでなく、フィールド全体を定義する必要があります。ただし、更新の影響を受けない場所(プラグインフォルダーなど)に個別のファイルを保持するのは簡単です。

また、明らかでない場合は、これをcontentプラグインにすることをお勧めします。

5
David Fritsch

xml-overrides-pluginは、きちんと聞こえます( Form XML Override )。私が正しく理解している場合は、のurla-フィールドを変更したいですか?最も簡単な方法は、おそらくmenu-field-type( SQL field type )の代わりにsql-field-typeを使用することだと思います。フィールド定義は次のようになります。

<fields name="urls" label="COM_CONTENT_FIELD_URLS_OPTIONS">
    <field name="urla" type="sql" validate="url"
    filter="url" label="COM_CONTENT_FIELD_URLA_LABEL"
    description="COM_CONTENT_FIELD_URL_DESC" 
    key_field="url" value_field="title"
    query="select concat('index.php?Itemid=', cast(id as char)) url, 
    concat(repeat('    ', (level-1)), menutype,'-',title) as title
    from #__menu where client_id=0 and id != 1 order by menutype, lft"
    ><option value="">-- Select internal menu --</option></field>
</fields>

これにより、すべてのサイトメニュー項目が一覧表示され、各メニュー項目のURLが返されます。このようにして、urla(またはurlbまたはurlc)-フィールドは受け入れられた値を返します。

2
jonasfh

私はこれを正確に行うプラグインを見つけました:XMLオーバーライドを許可します。プラグインJEDページはこちら: フォームXMLオーバーライド

しかし、私はまだこれを行うためのカスタム方法を探しています。

更新:

プラグインをテストしましたが、うまく機能しました。ただし、リンクのテキスト入力フィールドを使用可能なメニュー項目のリストに置き換えるという私の具体的なアイデアは、メニュー項目リストが提供するデータのタイプをフィールドに保存しないため、理想的ではありませんでした。この特定のニーズについては、これを別の方法で行う必要があります。

1
FFrewin