web-dev-qa-db-fra.com

Ajouter dynamiquement des champs à la fiche de modification de menu du composant

Je cherche à ajouter des paramètres à la vue d'édition de l'éditeur de menu de mon composant à la volée au lieu de les définir de manière statique comme vous le feriez normalement (comme décrit: https://docs.joomla.org/J3.x: Developing_a_MVC_Component/Adding_a_variable_request_in_the_menu_type ).

J'ai créé un plugin et implémenté onContentPrepareForm. Dans le plugin, je construis xml pour les champs avec le nom "params" afin que ces données soient stockées dans la colonne [params] du menu.

Les paramètres sont affichés parfaitement sur le formulaire, mais les données ne sont pas enregistrées. Je l’ai tracé dans les entrailles du code JForm JForm et il s’avère que le cadre JForm ignore tous les champs personnalisés qui ont été ajoutés dynamiquement.

* Spécifiquement (et c'est là que j'ai besoin d'aide) * JModelForm :: validate () appelle JForm :: validate () appelle JForm :: findFieldsByGroup () . Ce dernier appel élimine mes champs personnalisés. Si je commente le premier appel à validate (), les données de mes champs personnalisés sont stockées.

Voici un exemple de mon plugin montrant comment ajouter le XML à la volée.

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

Je voulais juste noter que la même question a été posée par @ajhuddy dans Joomla! Développement général maillist et il a une réponse.

**** RESOLU ****

(Merci Hannes de m'avoir conduit à la réponse)

Il semble être essentiel dans la partie onContentPrepareForm du plug-in de ne modifier le formulaire que si $form->getName() correspond au formulaire que vous souhaitez modifier.

1
Dmitry Rekun