Fragekatalog - Teil 1

Das Forum soll der Ablage von Lösungen für immer wieder auftauchende Problemstellungen dienen. // This forum contains solutions to problems that frequently occur.
ugly
Beiträge: 16
Registriert: 09.02.2011, 23:29:20

Fragekatalog - Teil 1

Beitrag von ugly » 09.02.2011, 23:42:32

Hallo zusammen,

Ich habe vor etwa 1 Monat mit PHP angefangen und bin seit diesem Zeitpunkt wirklich davon begeistert ... :P

Im Verlaufe der Zeit habe ich dann immer wieder den Begriff APF gehört und wurde neugierig. Die Tutorials & Konfigurationen habe ich viele durchgelesen, oder zumindest die wichtigsten. Ich musste aber feststellen, dass vieles an meine Grenzen ging, da ich vorher nicht objektorient programmiert habe.

vorher = letzter Monat :)

Wenn es euch nichts ausmacht, würde ich euch gerne ein paar Fragen stellen:

Momentan habe ich folgenden Code:

Code: Alles auswählen

ini_set('html_errors','off'); 

require_once('../../../APF/apps/core/pagecontroller/pagecontroller.php');

// Connection Manager einbinden
import('core::database','ConnectionManager');

// Connection Manager verwenden (Instanz erzeugen)
$cM = &$this->__getServiceObject('core::database','ConnectionManager');
$driver = &$cM->getConnection('MySQL');

$page = new Page();
$page->setContext('projectone');

$page->loadDesign('sites::Positionlog::pres::templates','website');

echo $page->transform();


Meine Fragen an euch:

1) Wenn ich das richtige gelesen & umgesetzt habe, sollte doch diese index-Datei, auf meine Datenbank zugreifen, welche ich in der Datei "Default_connections.ini definiert habe? :)

2) Die Datenbank ist online und ein Table wurde wie hier im Tutorial erstellt:

CREATE TABLE demopage_content ( PageID tinyint(5) NOT NULL auto_increment, PageURLName varchar(50) NOT NULL default '', PageTitle varchar(50) NOT NULL default '', PageContent text NOT NULL, PRIMARY KEY (PageID), UNIQUE KEY PageURLName (PageURLName), KEY PageTitle (PageTitle) ) ENGINE=MyISAM;


Wobei ich ehrlich gesagt immer noch nicht rausgefunden habe, was mit KEY PageTitle (PageTitle) gesagt werden will.

3) Im Tutorial stehen für den Table demopage_content, unter anderem folgende Attribute:


PageURLName
PageTitle
PageContent


Mir ist zwar klar was in jedes Feld reinkommt, aber leider nicht wie es dargstellt werden muss.

Bsp:

PageURLName --> komplette URL oder nur den GET-Teil à la page=Startseite?
PageTitle --> Dateiname? :)
PageContent --> kompletter HTML-Code, mit allen Tags?


Ist das allgemein, nicht ein bisschen mühsam - gerade in der Entwicklungszeit, wo man regelmässig die Ergebnise überprüfen möchte? Sobald man eine Änderung an der Seite vornimmt, so muss man das ganze neu in die Datebank importieren?^^

Ich hoffe ich nehme euch nicht euren letzten Nerv. Bin für jede schriftliche Hilfe dankbar. Nehme auch gerne Bücher, Tutorial & Dokumentationsempfehlung an.

Danke im voraus und Gruss
ugly

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

Re: Fragekatalog - Teil 1

Beitrag von dr.e. » 10.02.2011, 00:54:50

Hallo ugly,

herzlich wollkommen im APF-Forum! :ugeek: Hab deinen Post erst jetzt gesehen, Antwort gibts morgen Vormittag. Vielleicht soviel:

Ich musste aber feststellen, dass vieles an meine Grenzen ging, da ich vorher nicht objektorient programmiert habe.

Das ist kein Problem, ich bin sicher, wir bekommen dich fit. Einarbeitung in ein neues Tool ist immer mit etwas Mehraufwand verbunden, aber ich garantiere dir, du wirst mit dem APF viel Spass haben.

1) Wenn ich das richtige gelesen & umgesetzt habe, sollte doch diese index-Datei, auf meine Datenbank zugreifen, welche ich in der Datei "Default_connections.ini definiert habe? :)

Die Methode __getServiceObject() ist nur innerhalb eines Controllers bzw. einer Klasse, die von APFObject erbt verfügbar. Den Zugriff auf deine Datenbank solltest du daher wie im Tutorial beschrieben in einen Controller kapseln und im Template referenzieren. Als weiterführendes Beispiel kannst du dir mal die Sandbox (http://files.adventure-php-framework.org/1.13-RC1/download/apf-demopack-1.13-RC1-2010-12-10-1416-php5.zip) herunterladen. Dort findest du noch ein paar Code-Zeilen mehr, bei denen du dir die Definition von Controllern abschauen kannst.

Mehr gibt's morgen.
Viele Grüße,
Christian

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

Re: Fragekatalog - Teil 1

Beitrag von dr.e. » 10.02.2011, 10:36:27

Hallo ugly,

Wobei ich ehrlich gesagt immer noch nicht rausgefunden habe, was mit KEY PageTitle (PageTitle) gesagt werden will.

Das ist einfach ein Index auf den Titel der Seite. Dieser kann beispielsweise dazu genutzt werden um über die Titel einer Seite zu suchen. Für das Statement zum Auslesen der Seiten ist der Schlüssel unerheblich.

PageURLName --> komplette URL oder nur den GET-Teil à la page=Startseite?
PageTitle --> Dateiname? :)
PageContent --> kompletter HTML-Code, mit allen Tags?

Der PageURLName ist nur der Inhalt eines Parameters. Im Tutorial ist das "Seite". Gibst du also ?Seite=Hallo-Welt an, so wird ein Inhalt gesucht, dessen Feld PageURLName den Wert Hallo-Welt beinhaltet. Der PageTitle soll den Titel des HTML-Dokuments darstellen, also das, was zwischen <title>...</title> im Quelltext steht. PageContent ist der komplette HTML-Code des Inhaltsbereichs.

Ist das allgemein, nicht ein bisschen mühsam - gerade in der Entwicklungszeit, wo man regelmässig die Ergebnise überprüfen möchte? Sobald man eine Änderung an der Seite vornimmt, so muss man das ganze neu in die Datebank importieren?^^

Das kommt auf den Ansatz an. Wenn du die Inhalte grundsätzlich in Dateien pflegen möchtest, bietet sich die im Kapitel Inhalte aus Text-Dateien beschriebene Vorgehensweise an. Ist deine Datenbank die zentrale Quelle, in der du auch die Inhalte pflegst (z.B. mit einem CMS), dann ist das Auslesen der Inhalte direkt von dort die bessere Idee. Um deine Frage also vollständig zu beantworten sollten wir kurz besprechen, was du genau vor hast. Ich denke, dann lässt sich das einfacher für dich klären.

Ich hoffe ich nehme euch nicht euren letzten Nerv. Bin für jede schriftliche Hilfe dankbar. Nehme auch gerne Bücher, Tutorial & Dokumentationsempfehlung an.

Fragen ist immer erlaubt! :) Also keine Scheu, wir beantworten alles.
Viele Grüße,
Christian

ugly
Beiträge: 16
Registriert: 09.02.2011, 23:29:20

Re: Fragekatalog - Teil 1

Beitrag von ugly » 10.02.2011, 21:47:30

dr.e. hat geschrieben:Hallo ugly,

Wobei ich ehrlich gesagt immer noch nicht rausgefunden habe, was mit KEY PageTitle (PageTitle) gesagt werden will.

Das ist einfach ein Index auf den Titel der Seite. Dieser kann beispielsweise dazu genutzt werden um über die Titel einer Seite zu suchen. Für das Statement zum Auslesen der Seiten ist der Schlüssel unerheblich.

PageURLName --> komplette URL oder nur den GET-Teil à la page=Startseite?
PageTitle --> Dateiname? :)
PageContent --> kompletter HTML-Code, mit allen Tags?

Der PageURLName ist nur der Inhalt eines Parameters. Im Tutorial ist das "Seite". Gibst du also ?Seite=Hallo-Welt an, so wird ein Inhalt gesucht, dessen Feld PageURLName den Wert Hallo-Welt beinhaltet. Der PageTitle soll den Titel des HTML-Dokuments darstellen, also das, was zwischen <title>...</title> im Quelltext steht. PageContent ist der komplette HTML-Code des Inhaltsbereichs.

Ist das allgemein, nicht ein bisschen mühsam - gerade in der Entwicklungszeit, wo man regelmässig die Ergebnise überprüfen möchte? Sobald man eine Änderung an der Seite vornimmt, so muss man das ganze neu in die Datebank importieren?^^

Das kommt auf den Ansatz an. Wenn du die Inhalte grundsätzlich in Dateien pflegen möchtest, bietet sich die im Kapitel Inhalte aus Text-Dateien beschriebene Vorgehensweise an. Ist deine Datenbank die zentrale Quelle, in der du auch die Inhalte pflegst (z.B. mit einem CMS), dann ist das Auslesen der Inhalte direkt von dort die bessere Idee. Um deine Frage also vollständig zu beantworten sollten wir kurz besprechen, was du genau vor hast. Ich denke, dann lässt sich das einfacher für dich klären.

Ich hoffe ich nehme euch nicht euren letzten Nerv. Bin für jede schriftliche Hilfe dankbar. Nehme auch gerne Bücher, Tutorial & Dokumentationsempfehlung an.

Fragen ist immer erlaubt! :) Also keine Scheu, wir beantworten alles.


Du wirst mich vielleicht jetzt auslachen, aber gerne würde ich ein eher grosses Projekt à la einer vereinfachten Form von Facebook erstellen.

Es hat definitiv nur sehr wenig mit einem sozialen Netzwerk zu tun, aber ich denke Facebook beschreibt etwa den Aufbau meiner Website am besten .. ^^

Habe mir das ZIP-File runtergeladen und werds mir mal zu Gemüte führen - danke dir für deine Hilfe, selten solch eine tolle Unterstüzung erlebt .. :D

Falls ich wieder Fragen habe - werd ich mich wieder melden .. ;)

gruss
ugly

ugly
Beiträge: 16
Registriert: 09.02.2011, 23:29:20

Re: Fragekatalog - Teil 1

Beitrag von ugly » 10.02.2011, 21:52:31

Da hätte ich schon die erste Frage ... :)

Macht es Sinn, nur die Userdaten aus einer Datenbank zu lesen/speichern und die sonstige Website in kleine Stücke zerlegen (header, body, footer) etc., um anschliessend so eine dynamische Seite erzeugen? :D

Vor folgendem Problem stehe ich noch:

Meine index.php Datei

Code: Alles auswählen

ini_set('html_errors','off'); 

require_once('../../../APF/apps/core/pagecontroller/pagecontroller.php');

$page = new Page();
$page->setContext('Positionlog');

$page->loadDesign('sites::Positionlog::pres::templates','positionlog');

echo $page->transform(); 


Mein Haupt-Template für User welche noch nicht eingeloggt sind:

Würdet du das evetuell anderst strukturieren? Im Tutorial habe ich gesehen, dass er einfach die DIV-Inhalte lädt. Bei meiner Seite wird es wahrscheinlich dann so sein, dass der footer + Navi immer die selbe ist. Deswegen habe ich es mal so umgesetzt.

P.S Bei der Startseite (als nicht angemeldeter User) gibt es noch keine Navi .. :)

Haupttemplate:

Code: Alles auswählen

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
       "http://www.w3.org/TR/html4/loose.dtd">
<html id="positionlog" language="de">
<head>
<title>PositionLog</title>
    <core:importdesign namespace="sites::Positionlog::pres::templates" template="css_ohnelogin" />
</head>
<body>
    <core:importdesign namespace="sites::Positionlog::pres::templates" template="body_ohnelogin" />
    <core:importdesign namespace="sites::Positionlog::pres::templates" template="footer" />   
</body>


Jetzt ist es so, dass ich im oben abgebildeten Teil ein Registrierungsformular mit E-Mail Valdierung und zusätzlich noch ein Login-Formular habe. Der User registriert sich und meldet sich nachher an.

Stimmt alles mit der Datenbank überrein, wird folgender Code ausgeführt:

Code: Alles auswählen

        $_SESSION["username"] = $username;
        echo "Login erfolgreich.<a href=\"../Positionlog/index.php\\"> Weiter</a>";


Anschliessend gelangt er wieder zur Index-Datei, bei welcher er wieder bei der genau gleichen Seite landet.

Meine Frage:

Wie kann ich es einrichten, dass wenn der User sich einloggt und mit einem $_GET Parameter zur Index Datei gelangt, er nicht mehr auf die gleiche Seite weitergeleitet wird?

Code: Alles auswählen

$page->loadDesign('sites::Positionlog::pres::templates','positionlog');


Hier müsste man doch irgendwie sagen können - falls $_GET[page] = login, dann öffne eine komplett neue Seite ä la:

Code: Alles auswählen

$page->loadDesign('sites::Positionlog::pres::templates',login');


Danke dir schon im voraus. Ich weiss deine Mühe echt zu schätzen :)

Gruss
Ugly

Coach83
Beiträge: 269
Registriert: 13.05.2010, 17:33:12
Kontaktdaten:

Re: Fragekatalog - Teil 1

Beitrag von Coach83 » 11.02.2011, 09:15:54

Wenn ich Dich richtig verstehe und du nur eine Unterscheidung willst, ob ein User eingeloggt ist oder nicht, dann würde das Problem so lösen:
Du erstellst eine index.html die via

Code: Alles auswählen

$page->loadDesign('sites::Positionlog::pres::templates','index');
in der Bootstrap-Datei immer geladen wird.
In dieser index kannst du dann 2 verschiedene templates definieren.
z.B.

Code: Alles auswählen

<@controller namespace="sites::Positionlog::pres::documentcontroller" file="index_controller" class="index_controller" @>

<html:template name="login">
  <template:addtaglib namespace="tools::template::taglib" prefix="template" class="importdesign" />
  <template:importdesign namespace="sites::Positionlog::pres::templates" template="login" />
</html:template>

<html:template name="seite">
  <template:addtaglib namespace="tools::template::taglib" prefix="template" class="importdesign" />
  <template:importdesign namespace="sites::Positionlog::pres::templates" template="seite" />
</html:template>


Im Documentcontroller index_controller.php reicht dann eine einfache Unterscheidung, ob der Benutzer eingeloggt ist oder nicht. Wenn er eingeloggt ist, dann suchst du das Template

Code: Alles auswählen

$template = $this->__getTemplate('seite');
und transformierst es, ansonsten das Template

Code: Alles auswählen

$template = $this->__getTemplate('login');
suchen und transformieren.

Code: Alles auswählen

$template->transformOnPlace();


Wenn Deine Navigation und der Footer immer der Gleiche sind, dann kannst Du diese einfach in der index.html einfügen. Aber so wie sich das anhört (mit Registrierungsformular etc.) würde ich das ins Template login.html auslagern.

Zur DB-Speicherung würde ich sagen, dass es darauf ankommt was Du willst. Ich habe meinen Header und Footer als einfaches HTML-Template eingebunden. Den Inhalt der jeweiligen Seite lade ich jedoch stets aus der DB (z.B. Artikel, Neuigkeiten, Benutzerinfos etc.).

Jetzt bin ich mal auf die Kritiken der Anderen gespannt :-).

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

Re: Fragekatalog - Teil 1

Beitrag von dr.e. » 11.02.2011, 10:28:00

Hallo zusammen,

der Ansatz von Coach ist absolut nicht verkehrt. Ich persönlich würde die Unterscheidung zwar über eine eigene Taglib realisieren, die abfragt, ob der User eingeloggt ist oder nicht und dann entsprechend die Templates einbindet, die skizzierte Lösung ist aber ebenso zielführend.

Mir stellt sich jedoch die Frage, ob der Unterschied wirklich so groß ist zwischen eingeloggt und nicht eingeloggt. Man könnte doch den Status auch auf granularere Ebene unterscheiden? Falls nicht, ist das Haupt-Template zu nutzen eine valide Option. Eine Alternative wäre noch das model based view concept. Hier hast du bereits ein Tag, das du per View-Model steuern kannst.
Viele Grüße,
Christian

ugly
Beiträge: 16
Registriert: 09.02.2011, 23:29:20

Re: Fragekatalog - Teil 1

Beitrag von ugly » 12.02.2011, 00:56:15

Danke dir für diese Antwort - echt toll .. :)

Folgende Fragen sind mir beim lesen aufgetaucht:

hier hast du zwei mal name = "login" + template="login"? Warum wird das gemacht? Das geht für mich irgendwie nicht auf. Ist das erste eine Art überschrift für das ganze Template? Ich persönlich würde eben gerne für die Startseite (ohne Login), drei Templates (css,body,footer) includen.

sieht das dann so aus?

Code: Alles auswählen

<html:template name="überschrift">
  <template:addtaglib namespace="tools::template::taglib" prefix="template" class="importdesign" />
  <template:importdesign namespace="sites::Positionlog::pres::templates" template="css" />
  <template:importdesign namespace="sites::Positionlog::pres::templates" template="body" />
  <template:importdesign namespace="sites::Positionlog::pres::templates" template="footer" />
</html:template>


oder eher:

Code: Alles auswählen

<@controller namespace="sites::Positionlog::pres::documentcontroller" file="index_controller" class="index_controller" @>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html:template name="css_ohnelogin">
  <template:addtaglib namespace="tools::template::taglib" prefix="template" class="importdesign" />
  <template:importdesign namespace="sites::Positionlog::pres::templates" template="css_ohnelogin" />
</html:template>

<html:template name="startseite">
  <template:addtaglib namespace="tools::template::taglib" prefix="template" class="importdesign" />
  <template:importdesign namespace="sites::Positionlog::pres::templates" template="startseite" />
</html:template>

<html:template name="footer">
  <template:addtaglib namespace="tools::template::taglib" prefix="template" class="importdesign" />
  <template:importdesign namespace="sites::Positionlog::pres::templates" template="footer" />
</html:template>


Zuerst lade ich den Dokument, anschliessend lade ich den DOC-Type (gibt es da eine elgantere Lösung, anstatt einfach oben reinzukopieren? - habe es oben reinkopiert, weil es ja über dem HTML-Tag ist.

index_controller.php

Code: Alles auswählen

<?php

if ( !isset ($_SESSION["username"]))
{
    header ("Location: ../Positionlog/index.php");
}

$template = $this->__getTemplate('css_ohnelogin');
$template = $this->__getTemplate('startseite');
$template = $this->__getTemplate('footer');


?>


Ich bin mir zimlich sicher das ich wahrscheinlich 80% im dokument_controller File vergessen habe, da die Seite bei einem Aufruf via XAMP eine Fehlermeldung ausgibt. Für mich aber unverständlich, da von startseite.html die templates von index.controller.php geöffnet werden sollen ... :|

P.S Was denkt ihr zu der Benutzerautentifizierung? Ist die zu gebrauchen?

Sorry wenn ich euch auf die Nerven gehe, leider haben mir die Tutorials nicht weitergeholfen. Bei den Tutorials finde ich auch ein bisschen schade, dass man den Text (Code) nur ohne Formatierung kopieren kann .. :P

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

Re: Fragekatalog - Teil 1

Beitrag von dr.e. » 12.02.2011, 15:36:46

Hallo ugly,

Danke dir für diese Antwort - echt toll .. :)

Immer gerne! :)

hier hast du zwei mal name = "login" + template="login"? Warum wird das gemacht? Das geht für mich irgendwie nicht auf. Ist das erste eine Art überschrift für das ganze Template?

Das Konzept von Coach beruht auf der Idee, dass in einem Haupt-Template per Controller gesteuert entweder das Templete

Code: Alles auswählen

<html:template name="login">
  ...
</html:template>

oder

Code: Alles auswählen

<html:template name="seite">
   ...
</html:template>

ausgegeben werden. Bei der Adressierung von Templates innerhalb eines Controllers ist der Inhalt des name-Attributs relevant. Im Controller kannst du dann an Hand einer Logik entscheiden, welches der Templates ausgegeben werden kann. Das funktioniert dann wie in Coach's Post beschrieben, in dem du dir das gewünschte Template ziehst und es per $template->transformOnPlace() transformierst (=darstellst).

Innerhalb des Templates wird nun per

Code: Alles auswählen

<template:addtaglib namespace="tools::template::taglib" prefix="template" class="importdesign" />
<template:importdesign namespace="sites::Positionlog::pres::templates" template="login" />

ein weiteres Haupt-Template importiert - quasi das eigentliche Haupt-Template für den eingeloggten und nicht eingeloggten Zustand. Dies passiert mit Hilfe des <template:importdesign />-Tags, den Coach für diesen Zweck implementiert hat. Der Code ist denkbar einfach, da du 1:1 den Code von <core:importdesign /> nutzen kannst:

Code: Alles auswählen

class template_taglib_importdesign extends core_taglib_importdesign {
}

Diese Klasse muss nun in der Datei template_taglib_importdesign.php unter /apps/tools/template/taglib abgelegt werden.

Mit dieser Vorgehensweise erreichst du eine Unterscheidung von eingeloggtem und nicht eingeloggtem Zustand auf Ebene des Haupt-Templates.

Ich persönlich würde eben gerne für die Startseite (ohne Login), drei Templates (css,body,footer) includen.

Sofern sich dein Layout für eingeloggt und nicht eingeloggt nicht zu sehr unterscheiden, kannst du die Unterscheidung auch auf höherer Ebene treffen (deshalb auch meine Frage). In diesem Fall kannst du in deinem Haupt-Template einfach per <core:importdesign /> deine drei Templates inkludieren. CSS kannst du sogar direkt im Haupt-Template definieren. Zur Erleichterung gibt es eine sehr gute Erweiterung von Ralf unter http://forum.adventure-php-framework.org/de/viewtopic.php?f=11&t=207. Dein Haupt-Template kann dann z.B. so aussehen (sinngemäß aus der Sandbox entnommen):

Code: Alles auswählen

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
   <head>
      <title>...</title>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      <link rel="stylesheet" href="./css/styles.css" type="text/css" media="all" />
   </head>
   <body>
      <div id="wrapper">
         <div id="header">
            <h1><img src="..." alt="..." /></h1>
         </div>
         <div id="navi">
            <core:importdesign
               namespace="sandbox::pres::templates"
               template="navi"
               />
         </div>
         <div id="content">
            <core:importdesign
               namespace="sandbox::pres::templates"
               template="content"
               />
         </div>
         <div id="footer">
            <core:importdesign
               namespace="sandbox::pres::templates"
               template="footer"
               />
         </div>
      </div>
   </body>
</html>


sieht das dann so aus? [..] oder eher:

Ich würde sagen besser so, denn das CSS ist ja quasi statisch:

Code: Alles auswählen

    <@controller namespace="sites::Positionlog::pres::documentcontroller" file="index_controller" class="index_controller" @>

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">

    <core:importdesign namespace="sites::Positionlog::pres::templates" template="css_ohnelogin" />

    <html:template name="startseite">
      <template:addtaglib namespace="tools::template::taglib" prefix="template" class="importdesign" />
      <template:importdesign namespace="sites::Positionlog::pres::templates" template="startseite" />
    </html:template>

    <html:template name="footer">
      <template:addtaglib namespace="tools::template::taglib" prefix="template" class="importdesign" />
      <template:importdesign namespace="sites::Positionlog::pres::templates" template="footer" />
    </html:template>

Sofern dein Footer ebenfalls für beide Varianten gleich ist, kannst du diesen wie das CSS auch direkt einbinden oder sogar direkt ins Haupt-Template schreiben - ist performanter.

Zuerst lade ich den Dokument, anschliessend lade ich den DOC-Type (gibt es da eine elgantere Lösung, anstatt einfach oben reinzukopieren? - habe es oben reinkopiert, weil es ja über dem HTML-Tag ist.

Ich bin mir nicht sicher, ob ich dich richtig verstehe, aber dein Haupt-Template kannst du dir als das HTML-Grundgerüst vorstellen, das deine Seite haben soll. Alle dynamischen Elemente kannst du entweder durch Einbinden von Sub-Templates erreichen oder Platzhalter im (Haupt-)Template einfügen, die du per Controller setzt. Idealerweise definierst du also so viel statische Inhalte wie es deine Anforderungen zulassen.


Ich bin mir zimlich sicher das ich wahrscheinlich 80% im dokument_controller File vergessen habe, da die Seite bei einem Aufruf via XAMP eine Fehlermeldung ausgibt. Für mich aber unverständlich, da von startseite.html die templates von index.controller.php geöffnet werden sollen ... :|

Wie lautet denn die Fehlermeldung? Vermutlich, dass in index_controller.php keine Klasse index_controller gefunden werden kann. Falls es das ist, musst du dort

Code: Alles auswählen

class index_controller extends base_controller {

   public function transformContent() {

      if (!isset($_SESSION['username'])) {
         header('Location: ../Positionlog/index.php');
      }

      $this->__getTemplate('css_ohnelogin')->transformOnPlace();
      $this->__getTemplate('startseite')->transformOnPlace();
      $this->__getTemplate('footer')->transformOnPlace();
   }

}

schreiben.

P.S Was denkt ihr zu der Benutzerautentifizierung? Ist die zu gebrauchen?

Ich würde mich nicht auf den Benutzer-Namen alleine verlassen, sondern auf weitere Indikatoren wie Passwort oder einen Security-Token, der während des Login erzeugt wurde.

Sorry wenn ich euch auf die Nerven gehe, leider haben mir die Tutorials nicht weitergeholfen. Bei den Tutorials finde ich auch ein bisschen schade, dass man den Text (Code) nur ohne Formatierung kopieren kann .. :P

Fragen kostet nichts, deswegen stell deine Fragen ruhig. Ich bin mir sicher, wie können sie alle beantworten. Die Code-kopier-Geschichte ist nicht schön - richtig - ich habe nur noch keine Möglichkeit gefunden, die Formatierung beibehalten zu können. Ich bemühe mich aber um eine Lösung. Falls du Netbeans nutzt, kannst du per SHIFT + ALT + F den Code ganz einfach nach dem Kopieren reformatieren.
Viele Grüße,
Christian

ugly
Beiträge: 16
Registriert: 09.02.2011, 23:29:20

Re: Fragekatalog - Teil 1

Beitrag von ugly » 12.02.2011, 17:16:15

Hey dr.e,

Muss dir bzw. euch nochmals ein Kompliment machen - habe noch kein Forum erlebt, in welchem die Leute soviel Aufwand in ihre Posts gesteckt haben. Das obwohl ich ihn diversen Foren mit ca. 25"000 Posts unterwegs bin ... :D

Das mit dem Code und der Kopier-Geschichte war nur ein Hinweis, ich hab es auch so überlebt .. :)

Nochmals zum auf deinen Posts zurückzukommen - ich habe momentan folgedes umgesetzt:

1) Beim Template-Code wird der Tag HTML immer verwendet. Ich vermute stark, dass dieser nun nicht in meinen Template-Dateien vorkommen darf? Sprich wird eigentlich nur der Teil von header to header und body to body included?

Meine Dateien sehen momentan von der Gestaltung folgendermassen aus:

index.php

Code: Alles auswählen

<?php

ini_set('html_errors','off');

require_once('../../../APF/apps/core/pagecontroller/pagecontroller.php');

$page = new Page();
$page->setContext('Positionlog');

$page->loadDesign('sites::Positionlog::pres::templates','startseite');

//echo $page->transform(); 
$page->transformOnPlace()

?>


startseite.html

Code: Alles auswählen

<@controller namespace="sites::Positionlog::pres::documentcontroller" file="index_controller" class="index_controller" @>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html:template name="nicht_eingeloggt">
    <template:addtaglib namespace="tools::template::taglib" prefix="template" class="importdesign" />
    <template:importdesign namespace="sites::Positionlog::pres::templates" template="header_ohnelogin" />
    <template:importdesign namespace="sites::Positionlog::pres::templates" template="css_ohnelogin" />
    <template:importdesign namespace="sites::Positionlog::pres::templates" template="body_ohnelogin" />
    <template:importdesign namespace="sites::Positionlog::pres::templates" template="footer" />
</html:template>


header.html

Code: Alles auswählen

<head>
<title>PositionLog</title>


css_ohnelogin.html

Code: Alles auswählen

<link rel="stylesheet" type="text/css" href="../libs/CSS_ohnelogin.css" media="screen">
<link rel="stylesheet" type="text/css" href="../libs/formular.css" media="screen">
</head>


body_ohnelogin.html

Code: Alles auswählen

<body>
..
...
..


footer.html (sieht immer gleich aus)

Code: Alles auswählen

  <div id="footer">
      <div id="footer_links">
           <span id="copyright" class="l_float">titel</span>
           <ul id="footer_list">
            <li><a href="">1</a></li>
            <li><a href="">2</a></li>
            <li><a href="">3</a></li>
            <li><a href="">4</a></li>
            <li><a href="">5</a></li>
            <li><a href="">6</a></li>
            </ul>
      </div>
    </div>
  </div>
</body>


Wenn wir nochmals rekapitualieren, sollte ich doch nun ein Haupt-Template mit dem Namen "nicht_eingeloggt" haben. In dieses wiederum werden vier weitere Templates eingebunden.

2) Muss dieses Haupt-Template auch im Ordner template erstellt werden? Für mich scheint es eher eine Art Namen für eine Gruppierung von den Unter-Templates zu sein :P

Sollte ich mich nicht täuschen reicht es für mich zwei Haupt-Templates zu haben. Eines für den einloggten und ein anderes für den nicht einloggten User. Aus dem Grund da beim einloggten User der Header + Navi und der footer im der selbe ist.

Du hast mir etwas von einer Klasser gesagt, welche ich nun unter C:\Apache\xampp\APF\apps\tools\templates\taglib\importdesign.php erstellt habe.

Code: Alles auswählen

<?php
class template_taglib_importdesign extends core_taglib_importdesign
{

}
?>


Hier kommen alle meine selber definierten Tags rein?

Auch den index_controller.php habe ich wie von dir beschrieben abgeändert

Code: Alles auswählen

<?php
class index_controller extends base_controller {

   public function transformContent() {

      if (!isset($_SESSION['username']))
      {     
        // Benutzer ist einloggt (momentan wird nichts geladen)
      }
       // Benutzer ist nicht eingeloggt
      $this->__getTemplate('header_ohnelogin')->transformOnPlace();
      $this->__getTemplate('css_ohnelogin')->transformOnPlace();
      $this->__getTemplate('body_ohnelogin')->transformOnPlace();
      $this->__getTemplate('footer')->transformOnPlace();

   }
}
?>


Ich mal die Templates für den eingeloggten User weggelassen, da ich zuerst mal das ganze Konzept mit dem Template laden verstehen & umsetzten möchte :roll: .


Fehlermeldung:


Uncaught exception!
Exception-ID: a6b7ffa1e8d2e508b131a542fcdbed41
Type: IncludeException
Message: [import()] The given module (C:/Apache/xampp/APF/apps/tools/template/taglib/template_taglib_importdesign.php) cannot be loaded!
Number: 256
File: C:\Apache\xampp\APF\apps\core\pagecontroller\pagecontroller.php
Line: 178


Wie ich vermute will er von der Datei "importdesign.php", die Datei "template_taglib_importdesign.php" aufrufen. Diese existiert bei mir nicht. Muss ich diese erstellen bzw. für was ist diese Zuständig?

Sorry wenn ich euch dermassen zuspame, ihr könnt euch mit dem Antworten gerne Zeit lassen, ich erwarte nicht dass ihr täglich meinen Roman an Problemen durchlest .. ;)

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

Re: Fragekatalog - Teil 1

Beitrag von Screeze » 12.02.2011, 17:41:05

Hi,
ich kann nicht auf alles Bezug nehmen, da ich glaube ich noch nicht ganz verstanden hab wie du deine Struktur aufbauen möchstest, aber bei ein paar Punkten kann ich dir villeicht schonmnal helfen:

Ich fang mal unten an:
Wie ich vermute will er von der Datei "importdesign.php", die Datei "template_taglib_importdesign.php" aufrufen. Diese existiert bei mir nicht. Muss ich diese erstellen bzw. für was ist diese Zuständig?

Nicht ganz richtig.

Mit diesem code im template, versuchst du deine taglib zu laden:

Code: Alles auswählen

<template:addtaglib namespace="tools::template::taglib" prefix="template" class="importdesign" />

dabei gibt namespace den pfad an, wo es sich befindet, und prefix sowie class geben den Namen der Taglib, sowie den Dateinamen, unter welcher es diese Taglib suchen soll, an. Dieser wird zusammengesetzt aus:
{Prefix}_taglib_{class}.php (die { } geben jetzt mal die dynamischen elemente aus den attributen der obigen Taglib an)
Du musst also lediglich den Dateinamen ändern von "importdesign.php" in "template_taglib_importdesign.php".

Ein Tipp für die Einbindung deiner css dateien noch:
Dies über extra templates zu regeln ist recht umständlich, v.a. wenn die Strukturen größer und verzweigter werden, wirds irgendwann nurnoch kompliziert.
Deshalb habe ich dem APF die extension "HtmlHeader" spendiert, die inzwischen so ziemlich alle Anfordernugen abdecken sollte.
Eine kleine Doku findest du unter http://wiki.adventure-php-framework.org ... rweiterung Diese scheint mir aber nichtmehr ganz vollständig zu sein, evtl. hilft hier aber folgender Thread ab dem verlinkten Post weiter: viewtopic.php?f=11&t=207&start=45#p3540
Über diese Extension kannst du zu jedem beliebigen zeitpunkt, in jedem Template oder Controller problemlos zusätzliche JS/CSS-Dateien oder Metatags etc. in den Head-bereich des html einfügen, und musst dich nichtmehr selbst drum kümmern dass es auch wirklich dort landet.
Allerdings wärs mal interessant zu wissen welche APF-version du verwendest, denn in der aktuellen test-version sind Änderungen enthalten, bei denen ich aktuell nicht weis inwiefern die beachtet werden müssen, aber da kann Christian genaueres sagen.

Soweit grad erstmal von mir ;)

Grüße
Ralf

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

Re: Fragekatalog - Teil 1

Beitrag von dr.e. » 12.02.2011, 19:44:14

Hallo ugly,

Ralf hat den entscheidenen Hinweis zur Benennung der Taglib- oder Klassen-Dateien gegeben. Es wird vorausgesetzt, dass die Datei identisch zur Klasse benannt ist. Ich habe dir unter http://media.adventure-php-framework.org/support/ugly-first-steps-1.13-RC2-2011-02-12-1150-php5.zip ein Package zusammengestellt, das bei dir lokal laufen sollte. Es zeigt ein Haupt-Template und zwei Unter-Templates, die einfach mit dem <core:importdesign />-Tag eingebunden sind. Mit genau diesem Tag kannst du an beliebigen Stellen weitere Templates einbinden. Damit steht deine Struktur quasi schon.

Verwirrend ist an dieser Stelle vielleicht, dass Coach das anders gelöst hast. Er braucht diese Struktur, da er im Controller entscheiden möchte, was er anzeigen will. Für den Einstieg ist das aber erst mal nicht notwendig, da du zunächst mit Standard-Mitteln eine Struktur schaffen kannst, wie ich sie dir im ZIP verpackt hab. Nun kannst du Stück für Stück das HTML aufbauen, das du brauchst um deine Seite zu realisieren. Im Template content.html kommt nun alles das rein, was den Inhalt der Seite ausmacht. Wenn du noch ein Menü hast, baust du in startseite.html einfach das HTML-Gerüst auf und includest an der richtigen Stelle einfach ein navi.html.

Hoffe unsere zwei Poste helfen dir weiter.
Viele Grüße,
Christian

ugly
Beiträge: 16
Registriert: 09.02.2011, 23:29:20

Re: Fragekatalog - Teil 1

Beitrag von ugly » 13.02.2011, 12:19:00

@ Ralf:

Danke dir! Habe die Datei gleich mal umbenannt und es ist eine neue Fehlermeldung gekommen. Diese aber scheint sich eher lösbar anzuhören.

Das mti dem CSS werd ich mir auch anschauen - hört sich interessant an.

@ dr.e

Danke dir für den Link, aber leider funktioniert er bei mir nicht .. :P

gruss
alex
Zuletzt geändert von ugly am 13.02.2011, 12:29:38, insgesamt 1-mal geändert.

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

Re: Fragekatalog - Teil 1

Beitrag von Screeze » 13.02.2011, 12:28:44

Also mir funktioniert er... ich lass das http:// mal weg, dann kannst dus kopieren

wiki.adventure-php-framework.org/Html-Header_Erweiterung

forum.adventure-php-framework.org/viewtopic.php?f=11&t=207&start=45#p3540

ugly
Beiträge: 16
Registriert: 09.02.2011, 23:29:20

Re: Fragekatalog - Teil 1

Beitrag von ugly » 13.02.2011, 12:30:42

Sorry hatte gerade bissel Probleme mit dem Edit-Button - meinte den Link von dr.e, aber danke dir Ralf .. :)

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast