web-dev-qa-db-fra.com

Comment générer dynamiquement un formulaire XML à partir de PHP?

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,

  1. Comment cela est-il accompli?
  2. Où serait le bon endroit pour le faire afin que MVC le traite comme s'il se trouvait sous la forme "standard" XML?
  3. Comment récupérer au mieux une liste de ces champs à afficher dans la vue?

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);
10
GDP

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*/
4
GDP