Formular einbinden für Anfänger

Hier dreht sich alles um die auf der Webseite veröffentlichten Tutorials. // This forum is all about the APF tutorials.
Antworten
UweF
Beiträge: 4
Registriert: 19.11.2010, 13:25:16

Formular einbinden für Anfänger

Beitrag von UweF » 19.11.2010, 13:57:19

Hallo,

ich sitze seit gestern vor einer neuen APF Installation und versuche verzweifelt ein kleines Such-Formular einzubauen.

Das habe ich bis jetzt gemacht:

1. unter apps/modules habe ich einen neuen Ordner "search" angelegt. Darin gibt es drei Subordner in folgender Struktur

Code: Alles auswählen

apps
     |--modules
               |--search
                        |--pres
                               |- templates
                               |- documentcontroller
Der Ordner templates enthält eine Datei "search.html" mit folgendem Code

Code: Alles auswählen

<core:addtaglib namespace="tools::form::taglib" prefix="html" class="form" /> 
  <html:form name="Search"> <form:text name="searchterm" /> 
  <form:button name="search" value="GO" /> 
</html:form>
Der Ordner documentcontroller enthält eine Datei "search_v1_controller.php" mit folgendem Code

Code: Alles auswählen

<?php
class search_controller extends base_controller {
    public function transformContent() {
        $form = &$this->__getForm('Search');
        $this->setPlaceHolder('SearchFormPlaceHolder',$Form->transformForm());
    }
}
?>
Die Testwebsite heisst "1" und deren Templates habe ich abgelegt unter:

Code: Alles auswählen

apps
     |--sites
               |--1
                    |--pres
                           |- templates
Im templates Ordner gibt es die Dateien "main.html" und "menu.html", dabei importiert main.html die menu.html

main.html:

Code: Alles auswählen

<html>
  <head>
    <title>Test</title>
    <meta http-equiv="Content-Type" content="text/html; charset=${encoding}" />
  </head>
  <body>
    <core:importdesign namespace="sites::1::pres::templates" template="menu" />
  </body>
</html>
menu.html

Code: Alles auswählen

<div>
  Search:<html:placeholder name="SearchFormPlaceHolder" />  
</div>
Wenn ich die Seite nun aufrufe ("http://localhost/APF-test/sites/1/index.php") sehe ich den statischen HTML-Teil (Header und das Wort "Search:" aus der menu.html), aber das Suchformular wird nicht angezeigt. Was ist falsch? Oder sind die Zusammenhänge ganz anders? :?:

Gerade für die Einarbeitung wäre es wichtig nicht nur Codebeispiele zu haben sondern auch die Zusammenhänge näher zu erläutern, also was kommt wohin (Ordner und Dateien).

Vielen Dank schon mal.

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: Formular einbinden für Anfänger

Beitrag von Screeze » 19.11.2010, 14:33:26

Hi.
Erstmal ein tipp: ich würde die vom apf ausgelieferten ordner, abgesehen vom config ordner, unangetastet lassen, sprich dort keine eigenen Dateien ablegen. Grund: Bei einem Update kannst du dann einfach die ordner drüberziehen, und überschreibst dabei nicht ausversehen deine eigenen. ich würde deshalb neben modules einen eigenen ordner für deine modules anlegen, z.b. "mymodules", und darin deine module ablegen.


Zu deinem Problem:

Ich vermute den Fehler in der "search.html", denn dort fehlt die taglib angabe, dass der controller zu der datei ausgeführt werden soll.
Hierzu musst du die datei so modifizieren:

Code: Alles auswählen

<@controller namespace="modules::search::pres::documentcontroller" file="search_v1_controller" class="search_v1_controller" @>

<core:addtaglib namespace="tools::form::taglib" prefix="html" class="form" />
  <html:form name="Search"> <form:text name="searchterm" />
  <form:button name="search" value="GO" />
</html:form>

UweF
Beiträge: 4
Registriert: 19.11.2010, 13:25:16

Re: Formular einbinden für Anfänger

Beitrag von UweF » 19.11.2010, 17:56:37

Hi Screeze,

danke erst mal für die schnelle Antwort.

Ich habe jetzt einen separaten Ordner "MyModules" für meine eigenen Sachen angelegt.

Darin befindet sich jetzt der Ordner "search" mit seinem Unterordner "pres" und darin wiederum die beiden Ordner "templates" und "documentcontroller".
Die "search.html" im templates - Ordner habe ich so geändert:

Code: Alles auswählen

<@controller namespace="MyModules::search::pres::documentcontroller" file="search_v1_controller" class="search_controller" @>

<core:addtaglib namespace="tools::form::taglib" prefix="html" class="form" /> 
<html:form name="Search"> <form:text name="searchterm" /> 
   <form:button name="search" value="GO" /> 
</html:form>
Ich nehme an, die Angabe class="search_controller" muss immer den Namen der Klassendefinition aus der PHP-Controllerdatei (hier search_v1_controller.php) enthalten. In meinem Falle wäre das "class search_controller extends base_controller"

Der in der PHP-Controllerdatei definierte Alias für den Platzhalter "setPlaceHolder('SearchFormPlaceHolder',$Form->transformForm())" muss dann im Template als Wert für "name=" (<html:placeholder name="SearchFormPlaceHolder" />) verwendet werden - ist das korrekt?

Allerdings wird der Codeabschnitt für das definierte Suchformular aber immer noch nicht generiert. Eine Fehlermeldung oder einen Eintrag im Logfile sehe ich aber auch nicht. :(

Muss das neue Verzeichnis mit meinen Modulen etc. noch irgendwo deklariert werden oder wird das Vorhandensein automatisch erkannt?

Danke schon mal.

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: Formular einbinden für Anfänger

Beitrag von Screeze » 19.11.2010, 18:07:39

Hi,
Ich nehme an, die Angabe class="search_controller" muss immer den Namen der Klassendefinition aus der PHP-Controllerdatei (hier search_v1_controller.php) enthalten. In meinem Falle wäre das "class search_controller extends base_controller"
Korrekt erkannt.

Der in der PHP-Controllerdatei definierte Alias für den Platzhalter "setPlaceHolder('SearchFormPlaceHolder',$Form->transformForm())" muss dann im Template als Wert für "name=" (<html:placeholder name="SearchFormPlaceHolder" />) verwendet werden - ist das korrekt?
Hmm mir scheint du würfelst hier ein paar Dateien durcheinander ;) die benennung ist aber richtig.

Du kannst in einem controller nur auf Platzhalter zugreifen, die in der .html datei definiert sind, zu der der controller gehört.
Wenn ich mich nicht irre hast du in menu.html den platzhalter definiert, versuchst aber im search_controller (welcher in search.html eingebunden wird) darauf zuzugreifen.
Das klappt so nicht.
Stattdessen würde ich in menu.html statt eines platzhalters einfach ein core:importdesign verwenden, und im controller des formulars, das formular an Ort und Stelle ausgeben:

Code: Alles auswählen

<?php
class search_controller extends base_controller {
    public function transformContent() {
        $form = &$this->__getForm('Search');
        $form->transformOnPlace();
    }
}
?>
Davon abgesehen war noch ein tippfehler im search_controller, die variable hieß $form, du hast auf $Form (großes F) zugegriffen, das klappt unter windows glaube ich, spätestens auf einem linux server fliegts dir um die Ohren ;)

Ich hoffe ich hab diesmal nichts übersehen, falls es doch nicht klappt sag nochmal bescheid, am besten mit aktuellem quellcode dann.
Muss das neue Verzeichnis mit meinen Modulen etc. noch irgendwo deklariert werden oder wird das Vorhandensein automatisch erkannt?
Nein, die namespaces werden automatisch aufgelöst in die ordnerstruktur.
Danke schon mal.
Dafür ist ne community da ;)

UweF
Beiträge: 4
Registriert: 19.11.2010, 13:25:16

Re: Formular einbinden für Anfänger

Beitrag von UweF » 19.11.2010, 19:02:18

Ich habe jetzt Folgendes geändert:

In der "menu.html" habe ich an Stelle des Platzhalters nun das Template "search.html" aus "MyModuls\search\pres\templates" eingebunden

Code: Alles auswählen

<core:importdesign namespace="MyModuls::search::pres::templates" template="search" />
Im Template "search.html" steht:

Code: Alles auswählen

<@controller namespace="MyModuls::search::pres::documentcontroller" file="search_v1_controller" class="search_controller" @>

<core:addtaglib namespace="tools::form::taglib" prefix="html" class="form" /> 
<html:form name="Search"> <form:text name="searchterm" /> 
   <form:button name="search" value="GO" /> 
</html:form>
Die Controllerdatei "search_v1_controller.php" habe ich etwas abgeändert:

Code: Alles auswählen

<?php
class search_controller extends base_controller {
    public function transformContent() {
        $form = &$this->__getForm('Search');
        $form->transformOnPlace();
    }
}
?>
Nun wird das Formular auch eingebunden/aufgerufen. :D

Danke für die schnelle, unkomplzierte Hilfe!

Bis zum nächsten Mal, werde bestimmt noch ab und zu ein bisschen Hilfe brauchen. :oops:

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast