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.
/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);
}
}
<?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>
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>
modules/mod_stuff
<?php defined('_JEXEC') or exit('stuff');
include JPATH_PLUGINS.'/system/dropmods/mods/mod_stuff.php';
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?
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'));