記事のリンクのフィールドタイプを、入力テキストから内部メニュー項目のあるドロップダウンリストに変更します。最小限の作業でこれを行うための便利な方法を探しています。
XMLを別の場所に配置して単純なオーバーライドを作成する方法がある場合、どこにも見つかりません。とにかくこれは可能ですか?
そうでなければ、何が最善のアプローチでしょうか?
より標準的なアプローチは、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
プラグインにすることをお勧めします。
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)-フィールドは受け入れられた値を返します。
私はこれを正確に行うプラグインを見つけました:XMLオーバーライドを許可します。プラグインJEDページはこちら: フォームXMLオーバーライド
しかし、私はまだこれを行うためのカスタム方法を探しています。
プラグインをテストしましたが、うまく機能しました。ただし、リンクのテキスト入力フィールドを使用可能なメニュー項目のリストに置き換えるという私の具体的なアイデアは、メニュー項目リストが提供するデータのタイプをフィールドに保存しないため、理想的ではありませんでした。この特定のニーズについては、これを別の方法で行う必要があります。