Anfängerfragen

Hier dreht sich alles um die auf der Webseite veröffentlichten Tutorials. // This forum is all about the APF tutorials.
jprangenberg
Beiträge: 410
Registriert: 16.08.2010, 22:14:54

Anfängerfragen

Beitrag von jprangenberg » 19.08.2010, 23:42:08

Hallo an alle,

ich brauche dringend Hilfe, da ich sonst verzweifle.

Ich möchte gerne 2 Sachen haben:
1. Registrierung
2. News die ausgelesen werden

Ich möchte wenn die Url "?site=news" ist, dass die News ausgelesen wird und bei "?site=register" das Registrierungsformular angezeigt wird.
1) Wie lese ich aus der URL den "site" Parameter aus und zeige diesen an?
2) Wie lege ich das mit der "Registrierung" und den "News" an?

Vllt: sites/register/pres/.... und sites/news/pres ????

Bitte helft mir!!!

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

Re: Anfängerfragen

Beitrag von dr.e. » 20.08.2010, 12:25:15

Hallo xe0n,

lass uns das mal step-by-step aufbauen. Zunächst habe ich verstanden, dass du im Inhaltebereich einer Seite sowohl Daten aus einer Datenbank als auch feste Bestand-Teile einbinden möchtest. Wenn du keine eigene Taglib schreiben möchtest, sieht eine einfache Lösung wie folgt aus:

1) Haupt-Template deiner Seite:

Code: Alles auswählen

<html>
<head>
</head>
<body>
   <!-- header bereich -->

   <!-- content bereich -->
   <core:importdesign 
      namespace="..."
      incparam="site"
      namespace="[site = content]"
   />

   <!-- footer bereich -->
</body>
<html>
Mit dem Tag <core:importdesign /> bindest du weitere Templates ein, genau wie das auch mit der loadDesign()-Methode in der index.php passiert. Da wir hier das Attribut incparam auf "site" setzen, wird das einzubindende Template über den Url-Parameter "site" bestimmt. Lautet der Parameter in der Url also "register" wird das so benannte Template eingebunden, falls er "news" lautet die news. Ist der Parameter nicht vorhanden oder leer, wird das Template "content" (=Standard-Fall) eingebunden.

Wenn du nun also sowohl dynamische Datenbank-Inhalte als auch andere Inhalte ausgeben möchtest, kannst du deine Urls wie folgt aufbauen:
  • ?site=register: Zeigt die Registrierungs-Seite an (Template register.html)
  • ?site=register: Zeigt die News-Seite an (Template news.html)
  • ?site=content&id=123: Zeigt dynamischen Inhalt mit der ID 123 an.
  • ?id=123: verkürzte Schreibweise von 3)
2) Template content.html:
Im Content-Template platzierst du nun den Controller aus einem der anderen Threads und gibst dort die Inhalte aus der Datenbank aus. Das klappt ja auch schon.

3) Template register.html:
Hier platzierst du nun dein Formular im Template und in einem weiteren zugehörigen Controller die Logik für die Formular-Behandlung (z.B. in der DB anlegen). Ein einfaches Formular geht wie folgt:

Template:

Code: Alles auswählen

<@controller namespace="..." file="register_controller" class="register_controller" @>
<core:addtaglib namespace="tools::form::taglib" prefix="html" class="form" />
<html:form name="register" method="post">
   E-Mail: 
   <form:text name="email" />
   <br />
   Password: 
   <form:password name="pass" />
   <br />
   <br />
   <form:button name="send" value="register" />
   <form:addvalidator
      class="TextLengthValidator"
      control="email|pass"
      button="send"
   />
</html:form>
Controller:

Code: Alles auswählen

class register_controller extends base_controller {

   public function transformContent(){
      $form = &$this->__getForm('register');
      if($form->isSent() && $form->isValid()){
         $email = $form->getFormElementByName('email')->getAttribute('value');
         $pass = $form->getFormElementByName('pass')->getAttribute('value');

         // ...registrierung ausführen
          
      } else {
         $form->transformOnPlace();
      }
   }

}

3) Template news.html:
Hier gibst du analog zu den Inhalten aus de DB die News aus.

Damit solltest du weiter kommen.
Viele Grüße,
Christian

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

Re: Anfängerfragen

Beitrag von dr.e. » 20.08.2010, 12:28:57

Nachtrag:
1) Wie lese ich aus der URL den "site" Parameter aus und zeige diesen an?
Das macht die Taglib für dich. Hierzu nutzt sie einfach die PHP-Mechanismen und greift auf $_REQUEST zu.
2) Wie lege ich das mit der "Registrierung" und den "News" an?

Vllt: sites/register/pres/.... und sites/news/pres ????
Das ist dir überlassen. Sofern es sich um eine komplette siete handelt, würde ich das so aufziehen:

Code: Alles auswählen

sites/
       <Kurzbezeichung>/
                                  pres/
                                         content/ <-- alles, was die Ausgabe von dynamischem Content betrifft
                                                     templates/
                                                     controller/
                                         news/ <-- alles, was die Ausgabe von News betrifft
                                                     templates/
                                                     controller/
                                         register/ <-- alles, was die Registrierung betrifft
                                                     templates/
                                                     controller/
Viele Grüße,
Christian

jprangenberg
Beiträge: 410
Registriert: 16.08.2010, 22:14:54

Re: Anfängerfragen

Beitrag von jprangenberg » 20.08.2010, 19:04:10

Code: Alles auswählen

<core:importdesign 
      namespace="..."
      incparam="site"
      namespace="[site = content]"
   />
Und woher nimmt der sich dann das Template?

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

Re: Anfängerfragen

Beitrag von Screeze » 21.08.2010, 14:07:58

das gibst du mit dem namespace-attribut an.
wenn es unter

Code: Alles auswählen

apps/
        sites/pres/templates
liegt, lautet der namespace "sites::pres::templates"

jprangenberg
Beiträge: 410
Registriert: 16.08.2010, 22:14:54

Re: Anfängerfragen

Beitrag von jprangenberg » 21.08.2010, 15:48:15

Ihr versteht mich null :-P

Code: Alles auswählen

sites/
       <Kurzbezeichung>/
                                  pres/
                                         content/ <-- alles, was die Ausgabe von dynamischem Content betrifft
                                                     templates/
                                                     controller/
                                         news/ <-- alles, was die Ausgabe von News betrifft
                                                     templates/
                                                     controller/
                                         register/ <-- alles, was die Registrierung betrifft
                                                     templates/
                                                     controller/
Das ist meine Strucktur.

User ruft auf "?site=news":
Dann soll alles geladen werden was in /news ist

User ruft auf "?site=register":
Registrierformular aus /register soll aufgerufen werden

jprangenberg
Beiträge: 410
Registriert: 16.08.2010, 22:14:54

Re: Anfängerfragen

Beitrag von jprangenberg » 21.08.2010, 17:06:50

Screeze hat geschrieben:das gibst du mit dem namespace-attribut an.
wenn es unter

Code: Alles auswählen

apps/
        sites/pres/templates
liegt, lautet der namespace "sites::pres::templates"
Das ist mir schon klar. Nur den Namespace muss ich hardcodiert reinschreiben.

Code: Alles auswählen

sites/
       <Kurzbezeichung>/
                                  pres/
                                         news/ <-- alles, was die Ausgabe von News betrifft
                                                     templates/
Soweit bin ich.
Meine Index in dem APF Ordner sieht so aus:

Code: Alles auswählen

<?php
    // Logger Fehler beheben!
    date_default_timezone_set('Europe/Berlin');
    
    // PageController einbinden
    require_once('./apps/core/pagecontroller/pagecontroller.php');

    // Seite erzeugen
    $page = new Page();

    // Template laden
    $page->loadDesign('sites::pres','website');

    // Seite transformieren und ausgeben
    echo $page->transform();
?>
Das Template "website":

Code: Alles auswählen

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>

    <!-- header bereich -->

   <core:importdesign
      namespace="sites::pres::register::templates"
      incparam="site"
      template="[site = register]"
   />

   <!-- footer bereich -->
  </body>
</html>
Wenn "?site" angegeben wird, würde ja ein Template aus dem register/templates Ordner geladen!
Möchte nun aber gerne, das bei "?site=news" in "news/templates" geschaut wird. Wie mach ich das?


EDIT:
-------------------------

Code: Alles auswählen

sites/
       <Kurzbezeichung>/
                                  pres/
                                         news/ <-- alles, was die Ausgabe von News betrifft
                                                     controller/
                                        content/ <-- alles, was die Ausgabe von News betrifft
                                                     templates/
Habe es nun so gelöst, dass alle Seiten wie register.html und new.html etc. alle in content/templates kommen.
Diese sprechen dann einfach Ihren Controller aus dem jeweiligen Ordner register/controller etc. an.

Ist das so eine gute Lösung?

Ich finde nur, dass dann der Ordner Content völlig überladen und nicht mehr übersichtlich ist ...

jprangenberg
Beiträge: 410
Registriert: 16.08.2010, 22:14:54

Re: Anfängerfragen

Beitrag von jprangenberg » 22.08.2010, 20:54:09

Screeze hat sich lange mit mir unterhalten und mir über Teamviewer etwas gezeigt. Funktioniert nun super! =)

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

Re: Anfängerfragen

Beitrag von dr.e. » 23.08.2010, 11:25:03

Hallo xe0n,

freut mich, dass es nun klappt. Ich nehme an, ihr habt das zusammen über <generic:importdesign /> oder <fcon:importdesign /> gelöst?
Viele Grüße,
Christian

jprangenberg
Beiträge: 410
Registriert: 16.08.2010, 22:14:54

Re: Anfängerfragen

Beitrag von jprangenberg » 23.08.2010, 12:11:56

Nein, wir haben eine eigene Taglib geschrieben. Ähnlich wie die "core:importdesign". URL: ?module=register&template=register.

Modul = pres/register
Template = pres/register/register.html

Diese bindet er dann ein. Was haltet Ihr davon?

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: Anfängerfragen

Beitrag von Megger » 23.08.2010, 12:34:18

Ich würde http://adventure-php-framework.org/Seit ... design-Tag verwenden

Code: Alles auswählen

<generic:importdesign  modelnamespace="sites::biz"  modelfile="ApplicationModel"  modelclass="ApplicationModel"  modelmode="SESSIONSINGLETON"  namespaceparam="namespace"  templateparam="template" />
Im ApplicationModel kannst du dann ein Default Wert hinterlegen

Code: Alles auswählen

class ApplicationModel extends APFObject {
    public function ApplicationModel() {
         $this->__Attributes['namespace'] = 'sites::pres::templates';
         $this->__Attributes['template'] = 'main';
    }
}
http://adventure-php-framework.org/Seit ... ut-Klassen
Darüber steuern wir nun die Ausgabe

Code: Alles auswählen

class DemoAction extends AbstractFrontcontrollerAction {  
    function run(){
        $ApplicationModel = $this->__getServiceObject('sites::biz','ApplicationModel','SESSIONSINGLETON');
        switch($this->__Input->getAttribute('site')) {
            case 'register':
                 $ApplicationModel->setAttribute('namespace','sites::register::pres::templates');
                $ApplicationModel->setAttribute('template','register');
                 break;
            case 'news':
                $ApplicationModel->setAttribute('namespace','sites::news::pres::templates');
                $ApplicationModel->setAttribute('template','news');
                 break;
        }  
    } 
} 

class DemoInput extends FrontcontrollerInput {  
     function DemoInput(){  
         $this->__Attributes['site'] = $_REQUEST['site']; 
     }
}
Die Action registrierst du dann als permanente Action für den Frontcontroller und kannst so deine Seite per ?site=register bzw. ?site=news aufrufen
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

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

Re: Anfängerfragen

Beitrag von Screeze » 23.08.2010, 12:36:55

es sollte aber möglich sein verschiedene templates innerhalb des selben moduls, also
pres/register/templates/register.html
pres/register/templates/anything.html
etc
aufzurufen.

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: Anfängerfragen

Beitrag von Megger » 23.08.2010, 12:43:21

OK, dass ist ja auch kein Problem, dann machst du den Aufruf mit ?module=register&template=register bzw. ?module=register&template=anything
Anhand von module setzt du in der Action den Namespace und anhand des template setzt du das Template

Code: Alles auswählen

class DemoAction extends AbstractFrontcontrollerAction { 
    function run(){
        $ApplicationModel = $this->__getServiceObject('sites::biz','ApplicationModel','SESSIONSINGLETON');
        switch($this->__Input->getAttribute('module')) {
            case 'register':
                 $ApplicationModel->setAttribute('namespace','sites::register::pres::templates');
                 break;
            case 'news':
                $ApplicationModel->setAttribute('namespace','sites::news::pres::templates');
                 break;
        } 
       switch($this->__Input->getAttribute('template')) {
            case 'register':
                $ApplicationModel->setAttribute('template','register');
                 break;
            case 'anything':
                  $ApplicationModel->setAttribute('template','anything');
                 break;
            case 'news':
                $ApplicationModel->setAttribute('template','news');
                 break;
        } 
    }
}

class DemoInput extends FrontcontrollerInput { 
     function DemoInput(){ 
         $this->__Attributes['module'] = $_REQUEST['module'];
         $this->__Attributes['template'] = $_REQUEST['template'];
     }
}
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

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

Re: Anfängerfragen

Beitrag von Screeze » 23.08.2010, 12:48:26

und genau so haben wirs gemacht, nur mit einer eigenen html:importmodule taglib, geht genausoschnell und erzeugt weniger overhead meiner meinung nach ;)

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: Anfängerfragen

Beitrag von Megger » 23.08.2010, 12:52:05

Da könntest du Recht haben :D
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast