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

10

J'ai une obligation de générer une page / formulaire basé sur la liste d'éléments de l'utilisateur. En l'état, l'utilisateur peut spécifier une liste d'éléments qui ont une description textuelle de l'élément, et s'il s'agit d'un type de champ textou list. ( Imaginez une liste d'équipements pouvant être extraits, et la liste des éléments à vérifier varie selon le type d'équipement. Il y a certainement des éléments partagés, mais ils varient selon le type d'équipement, le modèle, etc. ). Ainsi, au lieu de simplement charger un fichier XML existant à partir du models\forms\dossier et de l'exécuter, 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 est-ce accompli?
  2. Où serait le bon endroit pour le faire afin que MVC le traite comme s'il était au format XML "standard"?
  3. Comment récupérer au mieux la liste de ces champs à afficher dans la vue?

models \ 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);
PIB
la source

Réponses:

4

Je travaillais avec les jFormméthodes setField()et getFieldset()pour définir et récupérer les champs, mais Joomla lançait des erreurs. En essayant d'ajouter un listJoomla, je n'ai pas pu analyser le XML jusqu'à ce que j'ajoute option_on="Yes"et option_off="Yes". ( Je ne sais pas ce que / pourquoi ils sont nécessaires, mais avec eux, le code ci-dessous fonctionne ).

models \ 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);
    }

}

controllers / 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*/
PIB
la source