web-dev-qa-db-ja.com

コンポーネントのメニュー編集フォームにフィールドを動的に追加します

コンポーネントのメニューエディターの編集ビューに、通常のように静的に定義するのではなく、パラメーターをその場で静的に定義するのではなく、パラメーターを追加したいと考えています(説明: https://docs.joomla.org/J3.x: Developing_a_MVC_Component/Adding_a_variable_request_in_the_menu_type )。

プラグインを作成してonContentPrepareFormを実装しました。プラグイン内で、「params」という名前のフィールドのxmlを作成して、このデータがメニューの[params]列に格納されるようにします。

パラメータはフォーム上で問題なく表示されますが、データは保存されません。私はJForm joomlaコードの腸を介してこれを追跡しましたが、JFormフレームワークが動的に追加されたすべてのカスタムフィールドを破棄していることがわかりました。

*具体的に(これは私が助けを必要とするところです)*JModelForm :: validate()がJForm :: validate()を呼び出し、JForm :: findFieldsByGroup()を呼び出します。この最後の呼び出しにより、カスタムフィールドが削除されます。 validate()の最初の呼び出しをコメント化すると、カスタムフィールドのデータが保存されます。

これは、XMLをオンザフライで追加する方法を示す私のプラグインのサンプルです。

public function onContentPrepareForm( $form, $data)
{
$option = JFactory::getApplication()->input->get('option');
$view = JFactory::getApplication()->input->get('view');

$modifyForm = false;

// check if this is a menu item for my component
if($option == 'com_menus' && $view == 'item' && array_key_exists('component_id', $data))
{
$myComponent = JComponentHelper::getComponent('com_mycomponent');
if($data['component_id'] == $myComponent->id)
{   
$modifyForm = true;
}
}

if($modifyForm)
{
            $testXml = '<fields name="params">
                            <fieldset name="basic" label="FIELDSET-LABEL">
                                <field name="test-field" type="list" label="test-field-label" description="test-field-description">
                                <option value="">Default</option>
                                <option value="0">Zero</option>
                                <option value="1">One</option>
                                </field>
                            </fieldset>
                    </fields>';
            $xmlElement = new SimpleXMLElement($testXml);
            $form->setField($xmlElement);
} 
} 
1
Aaron Hudon

同じ質問が尋ねられた Joomlaの@ajhuddyによって注意したいだけです!一般的な開発メールリストとそれが答えを持っています。

****解決済み****

(回答に導いてくれたHannesに感謝)

$form->getName()が変更したいフォームに評価される場合にのみフォームに変更を加えることは、プラグインのonContentPrepareForm部分で重要であるようです。

1
Dmitry Rekun