Bagaimana saya bisa menghasilkan XML formulir secara dinamis dari PHP?

10

Saya memiliki persyaratan untuk menghasilkan halaman / formulir berdasarkan daftar item pengguna. Seperti, pengguna dapat menentukan daftar item yang memiliki deskripsi teks dari item tersebut, dan apakah itu jenis textatau listbidang. ( Bayangkan daftar peralatan yang dapat diperiksa, dan daftar item yang akan diperiksa bervariasi berdasarkan jenis peralatan. Tentu saja ada beberapa item bersama, tetapi mereka berbeda dari jenis peralatan, model, dll .). Jadi, alih-alih hanya memuat file XML yang ada dari models\forms\folder dan menjalankannya, dapat set field baru dan serangkaian bidang baru ditambahkan dengan cepat.

Jika begitu,

  1. Bagaimana itu dicapai?
  2. Di mana tempat yang tepat untuk melakukannya sehingga MVC memperlakukannya seolah-olah itu dalam bentuk XML "standar"?
  3. Bagaimana cara terbaik untuk mengambil daftar bidang-bidang itu untuk ditampilkan di View?

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);
PDB
sumber

Jawaban:

4

Saya sedang bekerja dengan jFormdan metode setField()dan getFieldset()untuk mengatur dan mengambil bidang, tetapi Joomla melempar kesalahan. Saat mencoba menambahkan listJoomla tidak dapat menguraikan XML sampai saya menambahkan option_on="Yes"dan option_off="Yes". ( Saya tidak yakin apa / mengapa ini diperlukan, tetapi dengan mereka, kode di bawah ini berfungsi ).

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*/
PDB
sumber