Como posso gerar dinamicamente o XML de um formulário a partir do PHP?

10

Eu tenho um requisito para gerar uma página / formulário com base na lista de itens do usuário. Como é, o usuário pode especificar uma lista de itens que têm uma descrição em texto do item e se é um tipo de campo textou list. ( Imagine uma lista de equipamentos que podem ser retirados e a lista de itens a serem verificados varia de acordo com o tipo de equipamento. Certamente existem alguns itens compartilhados, mas variam de acordo com o tipo de equipamento, modelo etc. ). Portanto, em vez de simplesmente carregar um arquivo XML existente da models\forms\pasta e executá-lo, um novo conjunto de campos e uma série de novos campos podem ser adicionados rapidamente.

Se então,

  1. Como isso é realizado?
  2. Onde seria o local correto para fazê-lo, para que o MVC o trate como se estivesse no XML "padrão"?
  3. Qual a melhor forma de recuperar uma lista desses campos para exibição na exibição?

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
fonte

Respostas:

4

Eu estava trabalhando com jFormmétodos setField()e getFieldset()para definir e recuperar os campos, mas o Joomla estava lançando erros. Ao tentar adicionar um listJoomla não foi possível analisar o XML até que eu adicionasse option_on="Yes"e option_off="Yes". ( Não sei o que / por que são necessários, mas com eles, o código abaixo funciona ).

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;
}

visualizações / 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
fonte