J'ai l'obligation de générer une page/un formulaire en fonction de la liste d'éléments de l'utilisateur. En l'état, l'utilisateur peut spécifier une liste d'éléments contenant une description textuelle, qu'il s'agisse d'un type de champ text
ou list
. ( Imaginez une liste d’équipements pouvant être extraits et la liste d’articles à vérifier varie en fonction du type d’équipement. Il existe certes des éléments partagés, mais ils varient en fonction du type d’équipement, du modèle , etc. ). Ainsi, au lieu de simplement charger un fichier XML existant à partir de models\forms\
dossier et en cours d'exécution, un nouveau jeu de champs et une série de nouveaux champs peuvent être ajoutés à la volée.
Si c'est le cas,
modèles\myform.php
$form = $this->loadForm('com_mycomponent.myform', 'myform', array('control' => 'jform', 'load_data' => $loadData));
controllers/myform.php
// Get the user data.
$data = JFactory::getApplication()->input->get('jform', array(), 'array');
// Validate the posted data.
$form = $model->getForm();
if (!$form) {
JError::raiseError(500, $model->getError());
return false;
}
...
// Validate the posted data.
$data = $model->validate($form, $data);
...
// Attempt to save the data.
$return = $model->save($data);
Je travaillais avec jForm
et avec les méthodes setField()
et getFieldset()
pour définir et extraire les champs, mais Joomla renvoyait des erreurs. En essayant d’ajouter un list
, Joomla n’a pas pu analyser le code XML jusqu’à ce que j’ai ajouté option_on="Yes"
et option_off="Yes"
. ( Je ne suis pas sûr de ce qui est/pourquoi ce sont nécessaires, mais avec eux, le code ci-dessous fonctionne ).
modèles\myform.php
public function getForm($data = array(), $loadData = true)
{
// Get the form.
$form = $this->loadForm('com_mycomponent.mymodel', 'myform', array('control' => 'jform', 'load_data' => $loadData));
if (empty($form)) {
return false;
}
$element = new SimpleXMLElement('<fieldset name="myFieldset">
<field name="myfield1" type="list"
label="My List"
default="2"
option_on="Yes"
option_off="Yes">
<option value="1">Low</option>
<option value="2">Normal</option>
<option value="3">High</option>
</field>
<field name="myfield2" type="text" label="My field 1" class="inputbox" size="30" />
<field name="myfield3" type="text" label="My field 2" class="inputbox" size="30" />
</fieldset>');
$form->setField($element);
return $form;
}
views/myview/tmpl/default.php
$this->form->getFieldset('myFieldset'), true)
// Loop through these results and display them accordingly
$myFieldset = $this->form->getFieldset('myFieldset');
if(count($myFieldset)){
foreach($myFieldset as $field) {
$field_name = $field->getAttribute('name');
echo $this->form->getLabel($field_name);
echo $this->form->getInput($field_name);
}
}
contrôleurs/myview.php
// Get the user data.
$data = JFactory::getApplication()->input->get('jform', array(), 'array');
/* $data DOES contain my input fields*/
// The model/table doesn't contain columns for my custom fields, so the data to be saved has to be manipulated here to "go somewhere permanent".
// Validate the posted data.
$form = $model->getForm();
/* $form DOES contain my input fields*/