Skip to content
Snippets Groups Projects
forms.php 6.50 KiB
<?php
require('admin.inc.php');
require_once(INCLUDE_DIR."/class.dynamic_forms.php");

$form=null;
if($_REQUEST['id'] && !($form=DynamicForm::lookup($_REQUEST['id'])))
    $errors['err']=__('Unknown or invalid dynamic form ID.');

if($_POST) {
    $fields = array('title', 'notes', 'instructions');
    $required = array('title');
    $max_sort = 0;
    $form_fields = array();
    switch(strtolower($_POST['do'])) {
        case 'update':
            foreach ($fields as $f)
                if (in_array($f, $required) && !$_POST[$f])
                    $errors[$f] = sprintf(__('%s is required'),
                        mb_convert_case($f, MB_CASE_TITLE));
                elseif (isset($_POST[$f]))
                    $form->set($f, $_POST[$f]);
            $form->save(true);
            $names = array();
            foreach ($form->getDynamicFields() as $field) {
                $id = $field->get('id');
                if ($_POST["delete-$id"] == 'on' && $field->isDeletable()) {
                    if ($_POST["delete-data-$id"]) {
                        DynamicFormEntryAnswer::objects()
                            ->filter(array('field_id'=>$id))
                            ->delete();
                    }
                    $field->delete();
                    // Don't bother updating the field
                    continue;
                }
                if (isset($_POST["type-$id"]) && $field->isChangeable())
                    $field->set('type', $_POST["type-$id"]);
                if (isset($_POST["name-$id"]) && !$field->isNameForced())
                    $field->set('name', $_POST["name-$id"]);
                # TODO: make sure all help topics still have all required fields
                if (!$field->isRequirementForced())
                    $field->set('required', $_POST["required-$id"] == 'on' ?  1 : 0);
                if (!$field->isPrivacyForced())
                    $field->set('private', $_POST["private-$id"] == 'on' ?  1 : 0);
                foreach (array('sort','label') as $f) {
                    if (isset($_POST["$f-$id"])) {
                        $field->set($f, $_POST["$f-$id"]);
                    }
                }
                if (in_array($field->get('name'), $names))
                    $field->addError(__('Field variable name is not unique'), 'name');
                if (preg_match('/[.{}\'"`; ]/u', $field->get('name')))
                    $field->addError(__('Invalid character in variable name. Please use letters and numbers only.'), 'name');
                // Subject (Issue Summary) must always have data
                if ($form->get('type') == 'T' && $field->get('name') == 'subject') {
                    if (($f = $field->getField(false)->getImpl()) && !$f->hasData())
                        $field->addError(__('The issue summary must be a field that supports user input, such as short answer'),
                            'type');
                }
                if ($field->get('name'))
                    $names[] = $field->get('name');
                if ($field->isValid())
                    $form_fields[] = $field;
                else
                    # notrans (not shown)
                    $errors["field-$id"] = __('Field has validation errors');
                // Keep track of the last sort number
                $max_sort = max($max_sort, $field->get('sort'));
            }
            break;