web-dev-qa-db-fra.com

Comment changer les valeurs de formulaire envoyées par un module?

Je viens de coder un module dans J! 3.7 qui devrait générer automatiquement les valeurs des champs facultatifs en fonction d'une autre valeur de champ requise lors de l'enregistrement. Je sais que je peux vérifier les valeurs à l'aide d'une classe de règles, mais je n'ai pas eu la chance d'écraser les champs de formulaire et je pense que ce n'est tout simplement pas possible de cette façon. Malheureusement, je n'ai trouvé aucune documentation à ce sujet. J'utilise un sous-formulaire pour que les choses se compliquent un peu. Dans mon test () - fonction

$input->get( 'params.gmcp_content.gmcp_content0.gmcp_lng' ); // returns 8.4368239

renvoie la valeur attendue qui a été entrée manuellement et enregistrée correctement avant d'avoir un scénario de test. J'ai donc essayé de définir la valeur:

$input->set( 'params.gmcp_content.' . $key . '.gmcp_lng', $lng );

Mais cela n'a pas fonctionné. Ceci non plus:

$form->setValue( 'params.gmcp_content.' . $key . '.gmcp_lng', null, $lng );

Lorsque je vide le tableau de publications, cela ressemble à ceci:

Array
(
    [jform] => Array
        (
            [title] => Locations
            [params] => Array
                (
                    [gmcp_content] => Array
                        (
                            [gmcp_content0] => Array
                                (
                                    [gmcp_contact_id] => 2
                                    [gmcp_lat] => 49.3161506 // entered manually for testing
                                    [gmcp_lng] => 8.4368239 // entered manually for testing
                                )
                            [gmcp_content1] => Array
                                (
                                    [gmcp_contact_id] => 1
                                    [gmcp_lat] => 
                                    [gmcp_lng] => 
                                )
                        )
...
)

Alors, comment puis-je manipuler les données de formulaire avant que les paramètres du module ne soient enregistrés dans la base de données?

2
Rico

Si vous parlez d'un fichier de définition de module contenant des options de module, vous ne pouvez pas utiliser grand chose dans le fichier en utilisant framework it-self. Mais vous pouvez le faire de 3 autres manières.

Dans l'interface utilisateur par Java Script

Créez simplement une classe de champs personnalisée qui inclura Java Script dans l'en-tête du document et qui effectuera un remplissage de données exemple en cliquant sur le bouton Enregistrer/Appliquer. Voici un court tutoriel sur création d'un champ de formulaire Joomla! Personnalisé . Il requiert de votre part une connaissance de PHP, de Joomla Framework et de Java Script, mais il vous offre la plupart des possibilités. S'il ne s'agit que de modifier les paramètres en fonction d'autres valeurs d'entrée dans le formulaire. C'est la meilleure option.

Dans le module assistant

Si vous n'avez pas besoin que les données modifient le comportement du système (par exemple, en sélectionnant une présentation, bootstrap size ou la mise en cache), vous pouvez modifier les données lorsqu'elles sont récupérées dans votre assistant de module (ou directement dans votre module). fichier principal). Vous devriez l’utiliser si vous devez modifier les données transférées au module en fonction des valeurs de la base de données ou d’autres extensions. Ainsi, les paramètres du module ne contiennent que les paramètres et le traitement est effectué par le module lui-même.

En tant que plugin séparé

Comme @Rico l'a souligné, il est également possible d'utiliser un plugin à partir de extension group et de onExtensionBeforeSave event. Si vous devez installer le module et le plugin à la fois, utilisez le type d'extension Package. Des détails sur la création d'un paquet peuvent être trouvés ici . C'est le dernier recours. Cela fait le travail mais crée également un problème si une source de données change. Ensuite, vous devrez également mettre à jour le module (au moins ouvrir et sauvegarder).

2
Artur Stępień

Après une longue série de luttes, j’ai trouvé au moins un moyen qui a finalement fonctionné pour ma situation. Je devais coder un plugin, ce qui me semble très contre-intuitif et surdimensionné ... Ce que je n'aime pas avec cette solution, c'est qu'elle n'est pas "fournie" avec le module, ce qu'elle devrait être. En tout cas voici ma solution:

// IMPORTANT:
// in your "myplugin.xml": "group" must be "extension":
// <extension version="3.1" type="plugin" group="extension" method="upgrade">
// in your "myplugin.php": class name must start with "PlgExtension"

class PlgExtensionMyPlugin extends JPlugin {

    public function onExtensionBeforeSave( $context, &$table, $isNew ) {

        // not the right context
        if( $context !== 'com_modules.module' ) {
            return true;
        }
        // not the right module
        if( $table->module !== 'mod_mymodule' ) {
            return true;
        }

        // get the params of the module
        $params = json_decode( $table->params );


        // ... process $params in some way


        // build params json string and assign new params value to module reference
        $table->params = json_encode( $params );

        return true;
    }
}

N'oubliez pas d'activer votre plugin après l'avoir installé.

0
Rico