Come posso generare dinamicamente l'XML di un modulo da PHP?


10

Ho l'obbligo di generare una pagina / modulo in base all'elenco di articoli dell'utente. Così com'è, l'utente può specificare un elenco di elementi che hanno una descrizione testuale dell'articolo e se si tratta di un tipo di campo texto list. ( Immagina un elenco di attrezzature che è possibile estrarre e l'elenco di elementi da controllare varia in base al tipo di attrezzatura. Esistono sicuramente alcuni elementi condivisi, ma variano in base al tipo di attrezzatura, al modello, ecc .). Quindi, anziché semplicemente caricare un file XML esistente dalla models\forms\cartella ed eseguirlo, è possibile aggiungere al volo un nuovo set di campi e una serie di nuovi campi.

Se è così,

  1. Come viene realizzato?
  2. Dove sarebbe il posto giusto per farlo in modo che MVC lo tratti come se fosse nel formato XML "standard"?
  3. Il modo migliore per recuperare un elenco di quei campi da visualizzare nella vista?

modelli \ myform.php

$form = $this->loadForm('com_mycomponent.myform', 'myform', array('control' => 'jform', 'load_data' => $loadData));

controllori / 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);

Risposte:


4

Stavo lavorando con jFormmetodi setField()e getFieldset()per impostare e recuperare i campi, ma Joomla stava lanciando errori. Durante il tentativo di aggiungere un listJoomla non è stato possibile analizzare l'XML fino a quando non ho aggiunto option_on="Yes"e option_off="Yes". ( Non sono sicuro di cosa / perché siano necessari, ma con loro funziona il codice seguente ).

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

}

controllori / 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*/
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.