Seite 1 von 1

Dynamische Formulare mit dem kitFramework

Verfasst: Mi 29. Okt 2014, 17:55
von shadowcat
Dieses Posting richtet sich an Entwickler und wird ggfs. irgendwann mal in ein Wiki o.ä. übertragen.

Ich bastele gerade an meiner ersten Erweiterung und versuche da sowas wie 'meinen' FormBuilder hinein zu basteln, nur eben mit den Möglichkeiten von Silex und der dortigen FormFactory. Ziel ist es, die Formulare samt Pflichtfeldern etc. in der config.<Erweiterung>.json zu definieren und aus dieser Konfigurationsdatei heraus dynamisch zu erzeugen.

Beispiel (Auszug aus der .json Datei):

Code: Alles auswählen

  "pattern": {
    "form": {
      "create": {
        "fields": [
          { "name": "name", "required": true },
          { "name": "foldername", "required": true },
          { "name": "vendor", "required": true },
          { "name": "copyright", "required": true },
        ]
      }
    }
  }
Auslesen und den Formbuilder füllen ("dummy" ist hier der Name der Erweiterung):

Code: Alles auswählen

        self::$config = $this->app['utils']->readJSON(THIRDPARTY_PATH.'/dummy/config.dummy.json');

        // just shorter
        $fields = self::$config["pattern"]["form"]["create"]["fields"];

        // get form builder
        $form = $this->app['form.factory']->createBuilder('form');

        // populate the form
        foreach($fields as $field)
        {
            $form->add(
                $field['name'],
                (isset($field['type']) ? $field['type'] : NULL),
                array(
                    'attr'       => array('class'=>'form-control','style'=>'width:40em;'), // input field
                    'label_attr' => array('class'=>'col-sm-2 control-label'), // label
                )
            );
        }

        return $this->app['twig']->render($this->app['utils']->getTemplateFile(
            '@thirdParty/dummy/Template',
            'admin/create.form.twig'),
            array(
                'toolbar' => $this->getToolbar('create'),
                'form' => $form->getForm()->createView()
            ));
Der Formularteil im Template:

Code: Alles auswählen

    {{ form_start(form,{'attr':{'role':'form'}}) }}
        <fieldset>
            <legend>{{ 'Legend here'|trans }}</legend>
            {{ form_errors(form) }}
            {{ form_widget(form) }}
        </fieldset>
    {{ form_end(form) }}
Nicht suchen, hier steckt weder eine Frage noch ein vollständiges How-To drin. :D Ich wollte einfach erst mal irgendwo festhalten, was ich bisher gemacht habe.

Re: Dynamische Formulare mit dem kitFramework

Verfasst: Fr 31. Okt 2014, 14:11
von shadowcat
Der Formbuilder ist als Helper in kfBasic gewandert. Beispiel für ein generiertes Formular samt Fehlermeldungen:
2014-10-31_140915.png
2014-10-31_140915.png (18.71 KiB) 2901 mal betrachtet
Der dazugehörige Teil aus der .json Datei:

Code: Alles auswählen

  "pattern": {
    "form": {
      "create": {
        "action": "_self",
        "method": "post",
        "fields": [
          {
            "name": "extname",
            "required": true,
            "label_attr":  { "title": "This is the name of the new extension. Use CamelCase here. Examples: miniShop, kitCommands", "data-toggle": "tooltip" },
            "constraints": { "Length": {"min": 5, "minMessage": "The name should have at least 5 letters"} }
          },
          { "name": "foldername", "required": true },
          { "name": "vendorname", "required": true },
          { "name": "vendorurl" },
          { "name": "vendoremail", "constraints": { "Email": { "message": "The eMail address is not valid" } } },
          { "name": "copyright", "required": true },
          {
            "name": "shortdesc",
            "constraints": { "Length": {"min": 10, "minMessage": "The short description should have at least 10 letters"} }
          },
          {
            "name": "longdesc",
            "type": "textarea",
            "constraints": { "Length": {"min": 15, "minMessage": "The description should have at least 15 letters"} }
          }
        ]
      }
    }
  },
Beispielfunktion zum Generieren des Formular:

Code: Alles auswählen

    private function ControllerGetForm()
    {
        self::$config = $this->app['utils']->readJSON(THIRDPARTY_PATH.'/extensionCreator/config.extensioncreator.json');
        return \phpManufaktur\Basic\Control\Forms\Helper::build($this->app,self::$config);
    }
Ausgabe der Fehler:

Code: Alles auswählen

            $this->setAlert(
                \phpManufaktur\Basic\Control\Forms\Helper::getErrorsAsString($form),
                array(),
                self::ALERT_TYPE_WARNING
            );