Skip to content

Latest commit

 

History

History
156 lines (121 loc) · 6.24 KB

Index.md

File metadata and controls

156 lines (121 loc) · 6.24 KB

Tipps und Tricks

Unit-Testing

FormAction

Bei einem FormAction Test, muss für gewöhnlich die MKFORMS TS Konfig geladen werden. Dazu folgenden Aufruf setzen bevor das eigene TS geladen wird:

tx_mklib_util_TS::loadConfig4BE(
   'mkforms','mkforms','/static/ts/setup.txt',array(),true
);

Außerdem muss noch der Testmode gesetzt werden.

Wenn es nicht nötig ist das der ganze Rendering Prozess durchlaufen wird, dann einfach die Konfig für das XML entfernen. Dann wird eine Fehlermeldung zurückgegeben.

processForm

Wenn man diese Funktion testen möchte, dann muss folgendes gemacht werden bevor handleRequest aufgerufen wird. Die Formdaten müssen in $_POST geschrieben werden mit AMEOSFORMIDABLE_SUBMITTED=AMEOSFORMIDABLE_EVENT_SUBMIT_FULL. Ein Beispiel findet sich in tx_mkforms_tests_action_FormBase_testcase. Evtl. sollte noch der CSRF Schutz deaktiviert werden für Tests.

fillForm

siehe tx_mkforms_tests_action_FormBase_testcase

Ajax-Calls

Wichtig bei Ajax-Calls ist vor allem die Parameterübergabe an den Server. Hier gibt es spezielle Parameterwerte um die richtigen Daten zu übergeben. So sieht grundsätzlich ein Button aus, der einen Ajax-Request startet:

<renderlet:BUTTON name="btn_beuser" label="Edit BE User" >
   <onclick
      runat="ajax"
      params="rowInput::uid, btnparam::editBeUser"
      cache="false"
      exec="cb1.btnUserEdit_click()"
   />
</renderlet:BUTTON>

Folgende Prefixe sind von Ameos vorgegeben:

  • rowData:: - Zugriff auf einen Datensatz im Widget Lister. Hier kann also in jeder Zeile ein Button mit einem Event auf diesen Datensatz eingebaut werden
  • rowInput:: - Zugriff auf einen Wert im aktuellen Formular. Alternativ kann man auch direkt den Namen des Widgets angeben. Siehe unten.
  • sysEvent. - Funktion noch unbekannt
  • [absWidgetName] - Wenn man nur den absoluten Namen eines Widget angibt, dann wird dessen Wert übertragen.
  • [absBoxName__] - Wenn man nur den absoluten Namen eines BOX-Widgets angibt, dann werden alle Widgets innerhalb dieser Box übertragen.

Nochmal zur Klarheit: Diese Angaben werden letztendlich auf Client-Seite per Javascript ausgewertet. Der Server stellt sie nur in einem Format bereit, damit der Client weiß, was am Ende genau übertragen werden soll. Somit wird bei Ajax-Call letztendlich der aktuelle Wert des entsprechenden Widgets übertragen.

Action URL

Wenn ein Formular in Zusammenspiel mit einem Pagebrowser verwendet wird, kann es zu Problemen mit der Action URL kommen. Folgendes Szenario:

Ein Formular wird für eine Suche verwendet. Hat man nun Suchergebnisse für 3 Seiten und schickt auf der 3. Seite die Suche mit einem neuen Suchbegriff ab, der nur Treffer für 1 Seite zurück liefert, würden angeblich keine Ergebnisse gefunden, was auch logisch ist. Man ist in diesem Moment auf der 3. Ergebnisseite, hat aber nur Treffer für die 1. Ergebnisseite.

Daher gibt es die Möglichkeit in Formularen in folgenden Pfad "/meta/form/" das Attribut "action" auf "current" zu setzen. Damit wird immer die URL der aktuellen Seite ohne zusätzliche Parameter angegeben.

Mit einer aktuellen rn_base Version ist das nicht mehr notwendig bei Pagebrowsern. Diese erkennen selbstständig ob die geforderte Seite valide ist. Wenn nicht, wird die erste angezeigt womit dieser Fehler nicht mehr auftreten kann.

includeXml

Beispiel für ein XML, welches seine Elemente aus einem anderen XML zieht. Dabei werden manche Felder überschrieben.

<mkforms version="1.0.10">
   <meta>
      <includeXml
         path="EXT:mkexample/forms/xml/gameForm.xml"
         xPath="/formidable/meta/" />
      <form formid="gameForm" disableButtonsOnSubmit="false"/>
   </meta>
   <control>
      <renderer:TEMPLATE>
         <template>
            <includeXml
               path="EXT:mkexample/forms/xml/gameForm.xml"
               xPath="/formidable/control/renderer/template/" />
            <path>EXT:mkexample/forms/html/gameFormFacebook.html</path>
         </template>
      </renderer:TEMPLATE>
      <datahandler:RAW>
         <includeXml
            path="EXT:mkexample/forms/xml/gameForm.xml"
            xPath="/formidable/control/datahandler" />
      </datahandler:RAW>
   </control>
   <elements>
      <renderlet:BOX name="gameFormData" mode="fieldset" class="" defaultWrap="false">
         <childs autowrap="false">
            <includeXml
               path="EXT:mkexample/forms/xml/gameForm.xml"
               xPath="/formidable/elements/renderlet[name=gameFormData]/childs/renderlet" />
            <renderlet:RADIOBUTTON name="choice" addNoLabelTag="true" validateForDraft="true">
               <validators>
                  <validator:STANDARD>
                     <required message="LLL:msg_form_gamechoice_required"/>
                  </validator:STANDARD>
               </validators>
            </renderlet:RADIOBUTTON>
         </childs>
      </renderlet:BOX>
      <includeXml
         path="EXT:mkexample/forms/xml/gameForm.xml"
         xPath="/formidable/elements/renderlet[name=captchaLabel]" />
   </elements>
</mkforms>

Mehrfaches abschicken eines Formulars verhindern (Doppelklick)

  • disableButtonsOnSubmit - Buttons werden nach einem Submit deaktiviert (Default = true)
<meta>
   <form formid="mkexample" class="fields1colums" action="current" disableButtonsOnSubmit="false"/>
   ...
  • displayLoaderOnSubmit - Zeigt den Loader bei einem Submit (Default = false)
<meta>
   <form formid="mkexample" class="fields1colums" action="current" displayLoaderOnSubmit="true"/>
   ...

Subtemplates im HTML verwenden

Damit wiederkehrende Templateteile bequem an einer Stelle gepflegt werden können, können rn_base Subtemplates verwendet werden. Dazu folgendes in einem HTML Template einbinden:

<!-- ### INCLUDE_TEMPLATE EXT:myext/Resources/Private/Forms/Html/Includes/mySubTemplate.html@MYSUBPART ### -->

Das dazugehörige Subtemplate könnte so aussehen:

###MYSUBPART###
   {mySubTemplateWidget}
###MYSUBPART###