Wie kann ich das XML eines Formulars dynamisch aus PHP generieren?


10

Ich muss eine Seite / ein Formular basierend auf der Liste der Elemente des Benutzers erstellen. Der Benutzer kann eine Liste von Elementen angeben, die eine Textbeschreibung des Elements enthalten, und angeben, ob es sich um einen Feldtyp textoder einen listFeldtyp handelt. ( Stellen Sie sich eine Liste der Geräte vor, die ausgecheckt werden können, und die Liste der zu überprüfenden Elemente variiert je nach Gerätetyp. Es gibt sicherlich einige gemeinsam genutzte Elemente, die jedoch vom Gerätetyp, Modell usw. abweichen. ) Anstatt einfach eine vorhandene XML-Datei aus dem models\forms\Ordner zu laden und damit auszuführen, können im laufenden Betrieb ein neues Feldset und eine Reihe neuer Felder hinzugefügt werden.

Wenn ja,

  1. Wie wird das erreicht?
  2. Wo wäre der richtige Ort dafür, damit MVC es so behandelt, als wäre es in der "Standard" -Form XML?
  3. Wie kann eine Liste dieser Felder für die Anzeige in der Ansicht am besten abgerufen werden?

models \ myform.php

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

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

Antworten:


4

Ich habe mit jFormund Methoden gearbeitet setField()und getFieldset()die Felder gesetzt und abgerufen, aber Joomla hat Fehler geworfen. Beim Versuch, ein listJoomla hinzuzufügen, konnte das XML erst analysiert werden, als ich option_on="Yes"und hinzugefügt habe option_off="Yes". ( Ich bin nicht sicher, was / warum diese notwendig sind, aber mit ihnen funktioniert der folgende Code ).

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

Ansichten / 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);
    }

}

controller / 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*/
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.