Ein Einfaches Formular erstellen.

Hier dreht sich alles um die auf der Webseite veröffentlichten Tutorials. // This forum is all about the APF tutorials.
Antworten
SpellBinder
Beiträge: 6
Registriert: 03.11.2008, 19:32:22

Ein Einfaches Formular erstellen.

Beitrag von SpellBinder » 04.11.2008, 20:27:35

Hallo ich schon wieder.
Ich verstehe es einfach nicht und mit der Doku komm ich nicht so richtig klar.
Aufbauend auf dem TUT Webseite erstellen, versuche ich nun eine Seite mit Formularen aufzubauen.

Folgender Code:
index.php

Code: Alles auswählen

<?php
echo "FirstForm";
//            C:\ xampp\ htdocs\ Robert\ APFTest\ FirstForm\ core\ pagecontroller
include_once("C:\\xampp\\htdocs\\Robert\\APFTest\\FirstForm\\core\\pagecontroller\\pagecontroller.php");
$Page = new Page('Meine erste APF Seite');
$Page->loadDesign('sites::FirstForm::pres::templates','start');
echo $Page->transform();  
?>
start.html

Code: Alles auswählen

<html>
	<head>
		<title>TestWebSite</title>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
	</head>
	<body>
		<core:importdesign namespace="sites::FirstForm::pres::templates" template="menu" />
	</body>
</html>
menu.html

Code: Alles auswählen

<input type="text" value="EIN_START_TEST"/>
<br/>
  <core:addtaglib namespace="tools::form::taglib" prefix="html" class="form" />
  <html:form name="ErstesForm" method="get" action="">
<!-- Kein Ahnung wie es nun weitergeht -->
  </html:form>
<br/>
<input type="text" value="EIN_ENDE_TEST"/>

<!-- Das hier möchte ich darstellen -->
<!-- Später soll das Ziel sein das mit neuen Texten und Links zu versorgen-->
<!-- 
	<div/>
	<form id="menuForm"/>
		<h2>MenuForm</h2>
  		<a href="">Startseite</a>
  		<br />
  		<a href="">Impressum</a>
		</form>
	</div>
-->
Für Euch sicher ne Lachnummer, für mich unlösbar. :cry:
Ich habe das Konzept noch nicht verstanden.

In pseudocode bekomm ich es hin.

Code: Alles auswählen

Dim form as new form
form.Name="EinForm"
form.Style.Margin.left=20px
for i as integer =0 to 1
  dim m as new menu
  m.Name="TEXT" + i
  m.Style.Border.Width=1
  form.add(m)
next
from.show
Gruß Robert

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Ein Einfaches Formular erstellen.

Beitrag von dr.e. » 05.11.2008, 09:33:49

Hallo SpellBinder,

die Definition von Formularen erfolgt ähnlich der Definition in purem HTML. Dabei gibt es einige Freiheitsgrade und einige Einschränkungen. Grundsätzlich hast du schon mal verstanden, wie der Rahmen des Formulars definiert wird:

Code: Alles auswählen

  <core:addtaglib namespace="tools::form::taglib" prefix="html" class="form" />
  <html:form name="ErstesForm" method="get" action="">
<!-- Kein Ahnung wie es nun weitergeht -->
  </html:form>
Das addtaglib-Tag wird benötigt, damit der Parser im aktuellen Template das html:form-Tag kennt. Anschließend kannst du innerhalb des html:form-Tags beliebige form:*-Tags verwenden um dein Formular zu definieren. Beispiel: möchtest du ein Formular für eine Suchanfrage mit einem Button definieren, so reich folgendes:

Code: Alles auswählen

<core:addtaglib namespace="tools::form::taglib" prefix="html" class="form" />
<html:form name="ErstesForm" method="get" action="">
  <form:text name="search" style="width: 200px;" maxlength="30"/>
  <form:button name="searchButton" />  
</html:form>
Um das Formular darzustellen definierst du einfach im Template, in dem das Formular dargestellt werden soll einen Controller (siehe http://adventure-php-framework.org/Seite/006-Controller), der dir das Formular ausgibt:

Code: Alles auswählen

class myDocumentController extends baseController
{

   function transformContent(){
      $Form = &$this->__getForm('ErstesForm');
      $Form->transformOnPlace();
   }

} 
Die gewählte Vorgehensweise bewirkt, dass das Formular an seiner Definitionsstelle ausgegeben wird. Möchtest du es an einer anderen Stelle ausgeben, so solltest du in deinem Template einen Platzhalter der Form

Code: Alles auswählen

<html:placeholder name="FormPlaceHolder" />
definieren und deinen Controller wie folgt ändern:

Code: Alles auswählen

class myDocumentController extends baseController
{

   function transformContent(){
      $Form = &$this->__getForm('ErstesForm');
      $this->setPlaceHolder('FormPlaceHolder',$Form->transformForm());
   }

} 
Um weitere Formular-Tags hinzuzufügen, kannst du dir mal die verfügbaren Tags unter http://adventure-php-framework.org/Seit ... s#2-4-Form ansehen.
Ich habe das Konzept noch nicht verstanden.
Das Konzept bei den Formularen ist identisch zu den übrigen Taglibs (z.B. html:template). Die Tags werden vom Parser erkannt und aus diesen wird jeweils ein neues Kind-Objekt im DOM-Baum des aktuellen (Template-)Knotens erstellt auf den du dann im Controller zugreifen kannst. Die GUI-Schicht des APF ist ein kompletter und konsistenter Baum, den du wie auch immer manipulieren kannst.

Konkret bei den Formularen bedeutet das, dass diese dir über den Namen im Controller als echte Objekte mit jeweils Kind-Objekten für die enthaltenen Tags zur Verfügung stehen. Das Formular-Objekt selbst besitzt die unter http://adventure-php-framework.org/Seit ... Formularen beschriebenen Methoden, mit denen das Objekt selbst transformiert (=Erzeugen der Ausgabe) oder entsprechend anderes manipuliert werden kann (siehe http://adventure-php-framework.org/Seit ... -Formulare). Bei der Definition des Formulars hast du die Möglichkeit allen erdenklichen HTML-Code mit dem Tags zu mischen um so dein Formular zu definieren.

Ich hoffe, damit kommst du erst mal weiter. Falls nicht, versuche ich dir gerne nochmal ein Beispiel zu basteln. :)
Viele Grüße,
Christian

Benutzeravatar
fliegermichl
Beiträge: 114
Registriert: 29.01.2008, 11:51:45
Wohnort: Echzell

Re: Ein Einfaches Formular erstellen.

Beitrag von fliegermichl » 05.11.2008, 11:35:58

Hallo zusammen,

damit hatte ich anfangs auch Schwierigkeiten. Ich hatte angenommen, daß die template Dateien so ausgegeben werden, wie ich diese erstelle. Aber dem ist nicht so.

Der Pagecontroller erstellt zuerst aus allen Templatedateien und deren Bestandteilen wie <html:template> oder <html:form> Objekte, welche er in einer Document Klasse speichert. Diese Documentklasse hat in der Eigenschaft __Children baumförmig alle Unterobjekte, welche wiederum Document Objekte sind. Formulare, Templates und dergleichen werden ebenfalls in diesem Documentobjekt vorgehalten und können später in der Methode documentController::transformContent() zur Ausgabe gebracht werden.

Wenn kein Documentcontroller mit dem <@controller ...> Tag definiert wird, so wird standardmäßig nur das nach html transformiert, was nicht in einem dieser speziellen Tags stand außer <core:importdesign>

Der Vorteil dieser Vorgehensweise ist, daß ich verschiedene Templates für unterschiedliche Zwecke, welche aber zur Erfüllung einer Aufgabe gedacht sind, in einer Datei speichern kann und mit dem Controllercode festlegen kann, welche(s) Formular(e) oder welche(s) Template(s) letztendlich in der HTML Ausgabe erscheinen und auch wo.

an der Baumstruktur läßt sich zu diesem Zeitpunkt aber nichts mehr ändern. Diese Documentcontroller machen letztlich nur noch feintuning für die Ausgabe.

Mit Christians Dokumentation ist es so, daß wenn man einen Zusammenhang verstanden hat und dann die Dokumentation liest, stellt man fest, daß das stimmt. Wenn man es aber noch nicht verstanden hat, ist es manchmal schwer dahinter zu kommen.

Viele Grüße
Michl

SpellBinder
Beiträge: 6
Registriert: 03.11.2008, 19:32:22

Re: Ein Einfaches Formular erstellen.

Beitrag von SpellBinder » 05.11.2008, 19:06:34

@ Dr.E
Vielen Dank für die fülle an Infos!
Zumindest weis ich nun was in der Docu mit DocumentenController gemeint ist. ;)
Ich werden versuchen deinen Hinweisen nach zu gehen und melde mich wenn es wieder hakt bzw wenn es klappt.

@ fliegermichl
Danke für deinen Zuspruch!
Die Doku scheint Jemand geschrieben zu haben der sehr sehr tief in der Materie steckt! ;)

Gruß Robert

SpellBinder
Beiträge: 6
Registriert: 03.11.2008, 19:32:22

Re: Ein Einfaches Formular erstellen.

Beitrag von SpellBinder » 05.11.2008, 20:16:49

OK, ich gebe gleich auf!
Könnte mir Jemand ein einfaches lauffähiges Beispiel geben aus dem ersichtlich ist wie es geht.
Mit der Doku und den Erklärungen komme ich nicht weiter.
Wahrscheinlich denke ich zu kompliziert.
Folgendes Szenarion:
Index.php
startcontroller.php
startForm.html

Im startForm.html ist das Form

Code: Alles auswählen

<input type="text" value="EIN_START_TEST"/>
<br/>
  <core:addtaglib namespace="tools::form::taglib" prefix="html" class="form" />
  <html:form name="ErstesForm" method="get" action="">
	<form:button name="EinButton"/>
  </html:form>
<br/>
<input type="text" value="EIN_ENDE_TEST"/>
Im startController.php ist der DocController

Code: Alles auswählen

<?php
class menu extends baseController
{
function transformContent()
{
    $Form = $this->__getForm('ErstesForm');
	$Form->transformOnPlace();
}
}
?>
Und in der index.php steht

Code: Alles auswählen

<?php
echo "FirstForm";
//            C:\ xampp\ htdocs\ Robert\ APFTest\ FirstForm\ core\ pagecontroller
include_once("C:\\xampp\\htdocs\\Robert\\APFTest\\FirstForm\\core\\pagecontroller\\pagecontroller.php");
//'C:\xampp\htdocs\Robert\APFTest\FirstForm\sites\FirstForm\pres\documentcontroller'
include("C:\\xampp\\htdocs\\Robert\\APFTest\\FirstForm\\sites\\FirstForm\\pres\\documentcontroller\\startcontroller.php");
$Page = new Page('Meine erste APF Seite');
$Page->loadDesign('sites::FirstForm::pres::templates','start');
$form = new menu;
$form->transformContent();

echo $Page->transform();  
?>
Was offensichtlich Kappes ist da es nur so Errors hagelt.

Ich möchte nun beim Start der Seite ein Form haben das einen Button mit der Bezeichnug "EinButton" enthällt.

Das kann doch nicht so kompliziert sein oder ich bin zu .... für diese Welt.

Einen entnevten Gruß Robert

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Ein Einfaches Formular erstellen.

Beitrag von dr.e. » 05.11.2008, 21:12:19

Hallo Robert,

warum definierst du dein Formular nicht einfach so:

Code: Alles auswählen

<@controller namespace="sites::FirstForm::pres::documentcontroller" file="startcontroller" class="menu" @>
<core:addtaglib namespace="tools::form::taglib" prefix="html" class="form" />
<html:form name="ErstesForm" method="get" action="">
  <form:button value="EinButton" name="EinButton" style="border: 1px solid black; background-color: gray;"/>
</html:form>
Als Controller kann dir weiterhin

Code: Alles auswählen

class menu extends baseController
{
   function transformContent()
   {
     $Form = $this->__getForm('ErstesForm');
     $Form->transformOnPlace();
   }
}
dienen. In deiner index.php brauchst du eigentlich nur folgendes (sofern das obige der Inhalt des Templates start.html) ist:

Code: Alles auswählen

include_once("C:/xampp/htdocs/Robert/APFTest/FirstForm/core/pagecontroller/pagecontroller.php");
$Page = new Page('Meine erste APF Seite');
$Page->loadDesign('sites::FirstForm::pres::templates','start');
echo $Page->transform();  
?>
Um die Transformation des Formulars musst du dich in der index.php nicht kümmern, das ist nur innerhalb des Controllers relevant. Die Bootstrap-Datei dient nur dazu das PageController-Objekt Page zu erzeugen, ein Template zu laden und die Seite zu transformieren. Der Rest der Logik steckt entweder in den verwendeten Tags oder in deinem DocumentController.

Versuchs mal so! ;-)
Viele Grüße,
Christian

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Ein Einfaches Formular erstellen.

Beitrag von dr.e. » 05.11.2008, 21:15:16

Hallo nochmal,

ich sehe grade, dass du dein Template startForm.html genannt hast. In diesem Fall musst du im loadDesign() dieses im zweiten Parameter auch so adressieren.

Solltest du immer noch nicht funktionieren, bastel ich dir nochmal ein Beispiel, das wirklich läuft! ;-)

Viele Grüße,
Christian
Viele Grüße,
Christian

SpellBinder
Beiträge: 6
Registriert: 03.11.2008, 19:32:22

Re: Ein Einfaches Formular erstellen.

Beitrag von SpellBinder » 06.11.2008, 19:07:39

Hallo Christian!
Ich habe deinen Code 1:1 übernommen, und es geht.
Da es nun läuft war ich in der Lage es zu analisieren:
Ich versuch mal zu beschreiben was passiert:
index.php wird aufgerufen.
Die lädt die Page.
Diese wieder rum lädt "startForm".
In startForm wird erst mal die Klasse menu geladen die aus dem startController kommt.
Danach wird das TagLib der eigendlichen Form hinzugefühgt.
Nun kommt man wieder in der index.php an und dort wird dann $Page->Transform aufgerufen.
Dies führt dann dazu das daß aus der Klasse menu im startController die Funktion transromContet() aufgerufen wird.
Diese wieder rum holt sich nun das Form und wandelt es um!
Die Seite wird angezeigt.

Ich habe also ne Klasse die ich nie Instanziert habe (menu) benutzt.

War das so richtig wieder gegeben?

Gruß Robert

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Ein Einfaches Formular erstellen.

Beitrag von dr.e. » 07.11.2008, 09:16:04

Hallo SpellBinder,

deine Analyse ist richtig, ich verfeinere das mal ein wenig:
  • In der index.php wird das Page-Objekt instanziiert.
  • Mit dem Aufruf der loadDesign() wird ein initiales Template geladen und geparst.
  • Beim parsen wird nachgesehen, ob das Template eine DocumentController-Anweisung und weitere bakannte Tags beinhaltet.
  • Sind Controller-Anweisungen da, werden diese extrahiert und die Informationen für die Transformation vorbereitet.
  • Sind bekannte Tags vorhanden, werden diese analysiert und als Kind-Objekte in den aktuellen DOM-Knoten eingehangen.
  • Beim Parsen eines Tags wird die für die Tag-Definition relevante TagLib-Implementierung (PHP-Klasse) instanziiert und ihr werden die Attribute und der Inhalt des Tags mitgegeben. Anschließend wird die Methode onParseTime() aufgerufen, die du in einer TagLib selbst implementieren kannst (siehe TagLibs erstellen). Innerhalb dieser Methode wird dann üblicherweise auch wieder der Inhalt analysiert, bekannte Tags als Kinder erzeugt usw.
  • Nach dem Parsen innerhalb eines Knotens werden die Kinder in den Objektbaum eingehangen und es wird die onAfterAppend() aufgerufen. In diesem Stadium "kennen" sich die einzelnen Knoten über die $this->__ParentObject- und $this->__Children-Referenzen. Hier kannst du nun in einer TagLib Operationen platzieren, bei denen ein Vater-Knoten oder ein dem Vater benachbarter Knoten relevant ist.
  • Nach Abschluss der loadDesign() steht ein kompletter APF DOM Baum zur Verfügung, der aus einer vom Entwickler direkt beeinflussten Anzahl an Knoten und deren Informationen besteht.
  • Der Aufruf von $Page->transform() wird der DOM Baum rekursiv durchlaufen und transformiert. Dabei ist jedes Element für seine Transformation selbst zuständig. Da viele Knoten üblicherweise von der Klasse Document ableiten funktionirt das so: zunächst wird nachgesehen, ob für den aktuellen Knoten ein DocumentController gewünscht ist. Falls ja, wird die dazu notwendige Klasse eingebunden, ihr werden die nötigen Referenzen und Attribute mitgegeben und anschließend die transformContent() aufgerufen. Du musst dich an dieser Stelle also nicht um die Erszellung und Verwendung der Klasse kümmern, das regelt der PageController selbst.
  • Nach dem Ausführen des Controllers wird die Liste der Kinder durchlaufen und diese werden ebenso durch den Aufruf der transform()-Methode transformiert. Diese steuern dann selbst, wie die Transformation aussehen soll. Wichtig ist immer, dass transform() den transformierten Inhalt des Knotens zurückgeben muss, da dieser vom aufrufenden Knoten verarbeitet wird.
  • Nachdem alle Knoten transformiert wurden steht der fertige HTML-Inhalt zur Ausgabe per echo zur Verfügung.
Das klingt sicher zunächst kompliziert, bei der Implementierung von eigenen TagLibs musst du dir dabei jedoch einfach immer bewusst machen, was du beeinflussen möchtest. Bei der Verwendung von "fertigen" TagLibs (z.B. <core:importdesign />) ist das bereits für dich umgesetzt. Hier werden z.B. einfach die enthaltenen Kinder genauso behandelt wie direkt im Root-Knoten. Damit kannst du quasi unendlich tief schachteln.
Viele Grüße,
Christian

Benutzeravatar
fliegermichl
Beiträge: 114
Registriert: 29.01.2008, 11:51:45
Wohnort: Echzell

Re: Ein Einfaches Formular erstellen.

Beitrag von fliegermichl » 07.11.2008, 09:55:23

Hallo Christian,

exakt obige Ausführung sollte meiner Ansicht nach ziemlich am Anfang in die Dokumentation einfliessen.
Weil auch mir dieser Ablauf lange unklar war.

Die Vorgehensweise an sich ist genial und bietet dem Entwickler jedwede Möglichkeit vor, während und nach dem Aufbau der Seite Einfluß darauf zu nehmen.

Gruß
Michl

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Ein Einfaches Formular erstellen.

Beitrag von dr.e. » 07.11.2008, 10:23:51

Hallo Michl,

das habe ich in der Diskussion mit die auch erkannt. ;-) Ich arbeite aktuell schon an einem Ablauf-Diagramm, das den obigen Text nochmal bildlich einrahmt (wie beim FrontController) und werde ihn möglichst schnell in die Dokumentation einarbeiten.

Viele Grüße,
Christian
Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast