web-dev-qa-db-fra.com

Remplacer le module XML s'affiche correctement mais ne sauvegarde pas les données. Pourquoi?

J'ai créé un plugin système avec la méthode onContentPrepareForm() pour charger un formulaire d'options de module entier et le formulaire se charge correctement, mais ne sauvegardera pas les données saisies.

Le codage

/plugins/system/dropmods/dropmods.php

public function onContentPrepareForm($form, $data) 
{
  if( $form->getName() == 'com_modules.module' && $data->module == 'mod_stuff' ) {
    JForm::addFormPath(__DIR__.'/mods/');
    $form->loadFile('mod_stuff', false);
  }
}

Le formulaire de remplacement mod_stuff.xml

<?xml version="1.0" encoding="UTF-8"?>
<form>
<fields name="params">
    <fieldset name="basic">
        <field type="textarea" name="thetextarea" label="Write Stuff" />
        <field type="text" name="thetext" label="Just Write" />
    </fieldset>
</fields>
</form>

Le manifeste du module XML mod_stuff.xml

modules/mod_stuff

Le manifeste sert simplement d'élément pour enregistrer le module, mais tous les fichiers proviennent du plugin. Le processus d'installation du plug-in crée le dossier de module et les registres à la DB _extensions tableau

<?xml version="1.0" encoding="utf-8"?>
<extension type="module" version="3.1" client="site" method="upgrade">
    <name>mod_stuff</name>
    <author>The author</author>
    <creationDate>July</creationDate>
    <copyright>Copyright here</copyright>
    <license>GNU General Public License stuff</license>
    <authorEmail></authorEmail>
    <authorUrl></authorUrl>
    <version>1.0</version>
    <description>the detail</description>
</extension>

mod_stuff.php

modules/mod_stuff

<?php defined('_JEXEC') or exit('stuff');

include JPATH_PLUGINS.'/system/dropmods/mods/mod_stuff.php';

Ce qui a fonctionné

Si j'utilise une méthode de sous-formulaire dans le fichier manifeste du module modules/mod_stuff/mod_stuff.xml Pour charger le fichier de remplacement, les données sauvent correctement, mais le processus de sous-formule crée un nom d'objet parent supplémentaire settings et cela pose un peu de défi.

<config>
    <fields name="params">
        <fieldset name="basic">
            <field 
            type="subform" 
            name="settings" 
            formsource="plugins/system/dropmods/mods/mod_stuff.xml" 
            hiddenLabel="true" 
            />
        </fieldset>
    </fields>
</config>

ce qui est nécessaire pour permettre au formulaire de remplacement du plugin pour enregistrer les données?

1
Nadal

Il y a une quirk lorsque vous utilisez onContentPrepareForm événement. Les données peuvent ne pas toujours être disponibles et parfois, il peut être un tableau au lieu d'un objet. Vous pouvez le confirmer en inspectant PHP journal d'erreur. Vous devriez trouver des entrées comme celles-ci:

PHP AVERTISSEMENT: tentative de lecture de la propriété "module" sur la matrice en C:\wamp\www\joomla-cms-3\plugins\system\exemple\exemple\exemple.php à la ligne 31

PHP Avertissement: Propriété non définie: STDCLASS :: $ Module en C:\Wamp\www\joomla-cms-3\plugins\system\exemple\exemple\exemple.php à la ligne 31

Pour contourner le problème, obtenez des données de l'entrée si elle n'est pas définie et la jette à l'objet:

$data = (object) ($data ?: $this->app->input->get($form->getFormControl(), [], 'array'));
2
Sharky