¿Cómo puedo generar dinámicamente el XML de un formulario desde PHP?

10

Tengo un requisito para generar una página / formulario basado en la lista de elementos del usuario. Como es, el usuario puede especificar una lista de artículos que tienen una descripción textual del artículo, y si se trata de una texto de listtipo de campo. ( Imagine una lista de equipos que se pueden retirar, y la lista de elementos para verificar varía según el tipo de equipo. Ciertamente, hay algunos elementos compartidos, pero varían según el tipo de equipo, modelo, etc. ). Entonces, en lugar de simplemente cargar un archivo XML existente de la models\forms\carpeta y ejecutarlo, se puede agregar un nuevo conjunto de campos y una serie de nuevos campos sobre la marcha.

Si es así,

  1. ¿Cómo se logra eso?
  2. ¿Dónde sería el lugar correcto para hacerlo para que MVC lo trate como si estuviera en el formato "estándar" XML?
  3. ¿Cuál es la mejor manera de recuperar una lista de esos campos para mostrar en la Vista?

modelos \ myform.php

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

controladores / 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
fuente

Respuestas:

4

Estaba trabajando con jFormmétodos setField()y getFieldset()para establecer y recuperar los campos, pero Joomla estaba arrojando errores. Al intentar agregar un listJoomla no pude analizar el XML hasta que agregué option_on="Yes"y option_off="Yes". ( No estoy seguro de qué / por qué son necesarios, pero con ellos, el siguiente código funciona ).

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

}

controladores / 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
fuente