Jak mogę dynamicznie generować XML formularza z PHP?

10

Mam wymaganie, aby wygenerować stronę / formularz na podstawie listy elementów użytkownika. Jak to, że użytkownik może określić listę elementów, które mają tekstowy opis pozycji i czy jest to textalbo listtyp pola. ( Wyobraź sobie listę sprzętu, który można sprawdzić, a lista elementów do sprawdzenia różni się w zależności od rodzaju sprzętu. Z pewnością niektóre elementy są wspólne, ale różnią się w zależności od typu sprzętu, modelu itp .). Tak więc zamiast po prostu ładować istniejący plik XML z models\forms\folderu i uruchamiać go z nim, można na bieżąco dodawać nowy zestaw pól i serię nowych pól.

W takim razie,

  1. Jak to się osiąga?
  2. Gdzie byłoby to właściwe miejsce, aby MVC traktowało go tak, jakby był w „standardowej” formie XML?
  3. Jak najlepiej pobrać listę tych pól do wyświetlenia w widoku?

modele \ myform.php

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

kontrolery / 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);
PKB
źródło

Odpowiedzi:

4

Pracowałem z jFormmetodami setField()i getFieldset()ustawiałem i odzyskiwałem pola, ale Joomla zgłaszała błędy. Podczas próby dodania listJoomla nie był w stanie przeanalizować XML, dopóki nie dodałem option_on="Yes"i option_off="Yes". ( Nie jestem pewien, co / dlaczego są one konieczne, ale z nimi działa poniższy kod ).

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

}

kontrolery / 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*/
PKB
źródło