Як я можу динамічно генерувати XML форми з PHP?


10

У мене є вимога створити сторінку / форму на основі списку елементів користувача. Користувач може вказати перелік елементів, у яких є текстовий опис елемента, а також, чи це тип поля textчи listполя. ( Уявіть перелік обладнання, яке можна перевірити, і перелік предметів для перевірки залежить від типу обладнання. Звичайно, є деякі спільні предмети, але вони залежать від типу обладнання, моделі тощо ). Таким чином, замість того, щоб просто завантажувати наявний XML-файл із models\forms\папки та працювати з ним, можна на ходу додати новий набір полів та ряд нових полів.

Якщо так,

  1. Як це досягнуто?
  2. Де було б правильне місце для цього, щоб MVC ставився до нього як до «стандартної» форми XML?
  3. Як найкраще отримати список цих полів для відображення у Перегляді?

моделі \ myform.php

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

контролери / 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);

Відповіді:


4

Я працював з jFormметодами setField()і getFieldset()встановлював і витягував поля, але Joomla кидав помилки. Під час спроби додати listJoomla не вдалося розібрати XML, поки я не додав option_on="Yes"і option_off="Yes". ( Я не впевнений, що / для чого це потрібно, але з ними працює нижченаведений код ).

моделі \ 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);
    }

}

контролери / 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*/
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.