Einsteigerfreundliches Tutorial - Von 0 auf 100

Hier dreht sich alles um die auf der Webseite veröffentlichten Tutorials. // This forum is all about the APF tutorials.
Benutzeravatar
Kighlander
Beiträge: 35
Registriert: 11.07.2015, 16:55:44
Wohnort: Hilter aTW

Einsteigerfreundliches Tutorial - Von 0 auf 100

Beitrag von Kighlander » 13.07.2015, 14:31:25

Hallo und Danke erstmal für die herzliche Begrüßung hier im Forum.

Eine kurze Vorstellung meinerseits:

Ich heiße Kai (Mein Nickname ist eine Hommage an den Film "Highlander", nur dass ich das "H" gegen ein "K" getauscht habe und es dementsprechend so ausgesprochen wird: KAILÄNDER).
Ich bin 39 Jahre alt und hauptberuflich Disponent und Kraftfahrer in einer namenhaften Spedition in Osnabrück.

Als Nebengewerbe habe ich mein Hobby angemeldet, um so legal den einen oder anderen Euro nebenher verdienen zu können, indem ich kleinere Web-Projekte (hauptsächlich einfache Homepages auf
Basis von CM-Systemen).

Für ein eigenes, etwas umfangreicheres Projekt habe ich nach einem für mich ansprechendem Framework gesucht und bin schließlich hier hängen geblieben.
Nach dem Durcharbeiten des Tutorials "Download, Installation und erste Schritte" und "Erstellen einer Webseite" (letzteres ja nicht bis zum Schluss, darüber später mehr) habe ich schnelle
Erfolge für mich festgestellt und bin der Meinung, dass mich DIESES Framework dahin bringen wird, wo ich hin möchte.

Bis einschließlich dem Kapitel 5.1 (Inhalte aus Text-Dateien) habe ich das Tutorial "Erstellen einer Webseite" erfolgreich durchgearbeitet, weil es bis hierher auch immer sehr schlüssig
beschrieben wurde, was zu machen ist.

Für mein Projekt (und auch für dieses Tutorial, was ich gemeinsam mit Euch erarbeiten möchte) setzt es genau an DIESER Stelle ein.

Demzufolge sollten alle, die dieses Tutorial auch durcharbeiten wollen, auf genau DIESEN Stand sein.

Nun folgt meine Projektbeschreibung. Wie gesagt, es soll als Grundlage für viele Webprojekte Pate stehen, weil die meisten Projekte genau DIESE Anforderungen im Minimum erfordern.

Ziel: Eine Webplattform, wo sich User anmelden können, die dann von einem Admin in bestimmte Gruppen "einsortiert" werden können, aufgrund dessen diese User mit der Seite interagieren
können.
Anhand dessen sind folgende kleine Bausteine für das Projekt von nöten:

Code: Alles auswählen

    - Eine Benutzerverwaltung, die folgendes zulässt:
        - Registrieren
        - Ein- und Ausloggen
        - Passwort vergessen
        - Interaktion mit der Webseite gemäß seinem Zugriffslevel
        - Zusätzlich für einen "Master-User" (oder auch Admin) genannt:
            - Benutzer in Gruppen zuordnen
            - Benutzer löschen
            - Zusätzliche Funktionen ausüben, die ein normaler User nicht kann
    - Für den Admin:
        - Erstellen, ändern und löschen von Terminen für die User
    - Für die User:
        - An- und Abmelden zu den Terminen

Besondere Anforderungen an das Projekt:
    - Unterstützung des "Bootstrap-Framework" für die Ausgabe
    - Weitgehens Designneutral, damit andere dieses Projekt nach ihren Wünschen gestalten können (Stichwort: CSS)
Das ist also die Ausgangslage.

Nachdem also die beiden Tutorials durchgearbeitet wurden, sollten wir nun folgende Ordnerstruktur vorliegen haben, auf die wir aufbauen möchten:
(Für meine Zwecke nutze ich die Version der im Root-Verzeichnis liegende APF, weil aus eigener Erfahrung viele Hobby-Entwickler mit ihrem Webspace oder später mit dem Webspace ihrer Kunden
wenig die Chance haben, sich außerhalb des Webrootes zu bewegen.)

Code: Alles auswählen

MEINE_DOMAIN.TLD (Webroot)
|
---APF
|   |
|   ---core                     *
|   ---extensions               *
|   ---helloworld
|       |
|       ---helloworld.html
|   ---migration                *
|   ---modules                  *
|   ---tools                    *
|   ---.htaccess                **
---PAGE
|   |
|   ---content
|       |
|       ---impressum.html
|       ---kontakt.html
|       ---start.html
|   ---controller
|   ---templates
|       |
|       ---content.html
|       ---footer.html
|       ---main.html
|       ---navi.html
|   ---.htaccess                **
---css                          
|
---images                       
|
---js                           
|
---logs                         *
|
---index.php
Die mit EINEM * versehenden Verzeichnisse enthalten weitere Dateien und Verzeichnisse, die entweder nicht durch das Tutorial entstanden sind oder zum Betrieb des Frameworks gebraucht werden.
Die mit ZWEI * versehenden Dateien ".htaccess" sollten unbeding vorhanden sein und mit dem Inhalt aus dem Tutorial gefüllt werden (Punkto Sicherheit).

So, da ab HIER schon meine ersten Fragen auftauchen (Und ich bin mir sicher, dass ich da nicht der einzige bin), werde ich nun diese Fragen stellen und die mit den erfahrenden Usern hier
beantworten, so dass hieraus ein gutes Tutorial entsteht.

Im Tutorial "Erstellen einer Webseite" geht es im Kapitel 5.2 darum, dass Inhalte aus einer Datenquelle erfolgen sollen.
Genau DAS soll auch später ein Punkt dazu sein, dass einige Benutzergruppen solche Inhalte erstellen können (Quasi ein kleines Redaktionssystem).
Wie genau die Inhalte in die Datenbank gelangen, ist jetzt erstmal zweitrangig, im besten Fall kann man einfach sein myPhpAdmin aufrufen und selbst was eintragen, was später dargestellt
werden soll.

Ich habe an dieser Stelle nicht verstanden, wie ich die Verbindung zur Datenbank Schritt für Schritt aufbaue (und dementsprechend im Code einfüge bzw. ggf. neue Dateien erstelle).
Daher:
1. Wo kann ich meine Zugangsdaten für die Datenbank eintragen ?
2. Wie stelle ich die Verbindung zur Datenbank her ?
3. Wie kommen die Inhalte der Datenbank an die gewünschte Stelle im Template ?

In den Tutorials auf der Webseite gibt es immer wieder Querverweise zu den Einstellungen, Konfigurationen etc., die aber für Neulinge nicht sehr ersichtlich sind.

Das sind bis HIERHER erstmal die brennensten Fragen.
Sobald wir diese Einsteigerfreundlich hier erörtert haben, geht es mit diesem Tutorial weiter (Einbindung der Benutzerverwaltung)

Euer Kigh.
Das Vögel des Kummers und der Sorgen über Deinem Kopf kreisen, kannst Du nicht verhindern.
Du kannst aber verhindern, dass sie Nester auf Deinem Kopf bauen.
(Chin. Sprichwort)
---
Je mehr Selbstmörder, desto weniger Selbstmörder. :D
(Homer Simpson)

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: Einsteigerfreundliches Tutorial - Von 0 auf 100

Beitrag von dave » 13.07.2015, 16:48:09

Hallo Kai, schön dich kennen zu lernen :)

Die Ordnerstruktur sieht schon sehr gut aus. Damit lässt sich in jedem Fall arbeiten. Um es gleich vorweg zu nehmen: Die integrierte Benutzerverwaltung (Usermanagement) unterstützt derzeit noch keine "Passwort vergessen" Funktion. Diese möchte ich allerdings gerne nachreichen, sobald wir das Thema des mailSender abgeschlossen haben (http://tracker.adventure-php-framework. ... php?id=251).
Der Rest wird im groben und ganzen bereits vom Usermanagement unterstützt bzw. kannst du Funktionalitäten entsprechend für dich ausnutzen.

Kommen wir einmal zu deinen Fragen:
Kighlander hat geschrieben: 1. Wo kann ich meine Zugangsdaten für die Datenbank eintragen ?
Dazu wird eine Konfiguration für den ConnectionManager benötigt.
1. Benötigen wir dafür den Ordner config im Verzeichnis APF, sodass sich folgende Struktur ergibt:

Code: Alles auswählen

MEINE_DOMAIN.TLD (Webroot)
|
---APF
|   |
|   ---config
|   ---core
|   ---extensions    
|   ---helloworld
|       |
|       ---helloworld.html
|   ---migration  
|   ---modules   
|   ---tools  
|   ---.htaccess  
---PAGE
...
...
...
2. In diesem Ordner erstellen wir nun wieder Unterordner:
core/database/{CONTEXT}/
Die Struktur sollte dann folgend aussehen:

Code: Alles auswählen

MEINE_DOMAIN.TLD (Webroot)
|
---APF
|   |
|   ---config
|       |
|       core
|             |
|              database
|                      |
|                      {CONTEXT}
|   ---core
|   ---extensions
...
...
...
Was hats mit dem Context auf sich? Ich verweise dabei einfach mal auf das Thema Konfiguration der Doku (Sorry, aber Querverweise lassen sich nicht vermeiden): http://adventure-php-framework.org/Seit ... ons-Schema
Context: Der Context drückt die Verwendung einer Software (z.B. Modul) in einer umgebenden Anwendung (z.B. Webseite) aus. Da das APF für den Betrieb von beliebig vielen Installationen und Anwendungen aus einer Code-Basis ermöglichen möchte, kann der Context dazu genutzt werden, die Konfigurationen von Modulen innerhalb von mehreren Installationen zu unterscheiden.
Wie setze ich nun den Context? Ganz einfach! Ergänze deine index.php (auch gerne Bootstrap genannt) einfach mit folgendem:

Code: Alles auswählen

$fC->setContext('siteone');
bevor es zur Ausgabe durch

Code: Alles auswählen

$fC->start('PAGE\templates', 'main');
kommt. So sollte es dann aussehen:

Code: Alles auswählen

$fC = &Singleton::getInstance('APF\core\frontcontroller\Frontcontroller');
$fC->setContext('siteone');
echo $fC->start('PAGE\templates', 'main');
Damit erreichen wir, dass wir {CONTEXT} durch siteone in der Ordnerstruktur ersetzen können.

3. Nachdem wir nun die Ordnerstruktur für die Konfiguration fertig haben, können wir die eigentliche Konfigurationsdatei erstellen (Ich weiss, es ist ein langer Weg):
Der Dateiname für den ConnectionManager setzt sich, wie in der Doku beschrieben (http://adventure-php-framework.org/Seit ... figuration), folgend zusammen:
{ENVIRONMENT}_connections.ini
Wo kommt nun das {ENVIRONMENT} her? Dazu verweise ich wieder auf die Doku zur Konfiguration: http://adventure-php-framework.org/Seit ... ons-Schema
Environment: Das Merkmal Environment ermöglicht eine Unterscheidung der Konfiguration hinsichtlich der Umgebung, in der eine Software eingesetzt wird (z.B. Test- oder Produktions-Umgebung). Damit lässt sich die Installation einer Anwendung durch jeweils für die Umgebungen vorhandenen Konfigurationen ohne Code-Anpassung auf den Ziel-Umgebungen erledigen.
Ok, verstanden, und nun? Ganz einfach: Wenn du kein Environment explizit definierst, ist dieses immer DEFAULT ;). Das bedeutet, wir erstellen im Ordner
APF/config/core/database/siteone/ eine Datei mit dem Namen DEFAULT_connections.ini. Nur am Rande erwähnt: DAs APF arbeitete anfangs nur mit *.ini-Dateien als Konfiguration. Mittlerweile gibt's aber auch dafür Möglichkeiten, diese individuell zu gestalten :). Der Einfachheit bleiben wir beim Schema der INI-Dateien.

4. Wie sieht nun der Inhalt dieser INI aus? http://adventure-php-framework.org/Seit ... figuration

Code: Alles auswählen

[DB1-2]
Host = "localhost"
;Port = "3306"
;Socket = "/tmp/mysql.sock"
User = "Username"
Pass = "Passwort"
Name = "Datenbankname"

Type = "APF\core\database\MySQLiHandler"
; Der Debug-Modus kann dazu genutzt werden, das aktuell ausgeführte Statement auszugeben / true, false
DebugMode = "true"
; sets the charset of the connection, the result, and the database
Charset = "utf8"
; sets the collation of the connection and the database
Collation = "utf8_general_ci"
Hinweis: Ich habe einmal die Konfiguration aus meiner Applikation kopiert, da gibt's auch ein paar Kommentare. ";" sind Auskommentierungen, das bedeutet, dass diese Angaben nicht bearbeitet werden.

Der Sektionsname ([DB1-2]) dient nun zum Ansprechen dieser Einstellungen. Dazu später mehr. Im Grunde genommen sind wir damit mit deiner ersten Frage fertig. Ich weiss, es ist am Anfang erstmal ein ziemlicher Hammer, was da geleistet werden muss, nur um deine Zugangsdaten anzugeben. Da das APF allerdings noch sehr viel mehr Möglichkeiten bietet, wirst du schon bald die Vorteile dieser Konfiguration zu schätzen wissen.

Ergänzungen und Fehlerbeseitigungen gerne direkt im Post vornehmen, es kann sein, dass ich geistig nicht ganz auf der Höhe bin ;)
Zuletzt geändert von dave am 13.07.2015, 17:09:31, insgesamt 2-mal geändert.

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: Einsteigerfreundliches Tutorial - Von 0 auf 100

Beitrag von dave » 13.07.2015, 16:54:15

Deine zweite Frage
Wie stelle ich die Verbindung zur Datenbank her ?
lässt sich recht schnell beantworten:

Einfach

Code: Alles auswählen

use APF\core\database\ConnectionManager;
$cm = &$this->getServiceObject('APF\core\database\ConnectionManager');
$MySQL = &$cm->getConnection('DB1-2'); 
in deinem DocumentController verwenden.

Aber Moment mal, Document-was? Jedem Template kannst du einen DocumentController mitgeben, welcher dann zum Beispiel Daten aus der Datenbank holt (oder eben alles das macht, was PHP halt so kann).
Wende dich dafür aber am besten direkt wieder an das Tutorial: http://adventure-php-framework.org/Seit ... atenquelle. Dort ist alles weitere beschrieben. Ich könnte es nicht besser formulieren. Bei Unklarheiten einfach nachfragen :)

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: Einsteigerfreundliches Tutorial - Von 0 auf 100

Beitrag von dave » 13.07.2015, 17:04:51

Zu deiner dritten Frage:
Wie kommen die Inhalte der Datenbank an die gewünschte Stelle im Template ?
Dazu gibt es die Möglichkeit der Platzhalter.

In deinem Template kannst du an jeder beliebigen Stelle solche Platzhalter definieren. Siehe dazu auch die Doku zu den Templates: http://adventure-php-framework.org/Seit ... -Templates
Einfaches Beispiel:

Code: Alles auswählen

<html>
<head>
<title>Test</title>
</head>

<body>
PHP sagt: ${hello}
</body>
</html>
${hello} wird nun ersetzt. Wir benötigen dazu natürlich wieder unseren DocumentController. In der Methode transformContent einfach folgendes anwenden:

Code: Alles auswählen

$this->setPlaceHolder('hello', 'Hello World!');
Damit wird dann PHP sagt: Hello World auf den Monitor gezaubert. Ich hoffe es ist einigermassen verständlich ;)

Viel Erfolg schonmal! Und bei Fragen, immer her damit, bei den einfachen Sachen kann ich noch helfen, sollte es dann jedoch sehr spezifisch werden, bin ich auch raus :lol:. Aber ich bin mir sicher, dr.e übernimmt dann gerne.

Benutzeravatar
Kighlander
Beiträge: 35
Registriert: 11.07.2015, 16:55:44
Wohnort: Hilter aTW

Re: Einsteigerfreundliches Tutorial - Von 0 auf 100

Beitrag von Kighlander » 13.07.2015, 17:46:35

Hallo Dave.

(kleine Anmerkung am Rande: Tolle Homepage hast Du, gefällt mir ;) )

--- Part 1 ---

Okay, da ich ja vorhabe, ein Einstiegsgerüst für eine Webapplikation zu bauen, sollte nun die Ordnerstruktur etwas aufgeräumt werden. Ich vermute mal, dass der Ordner (und seine beinhaltenden Ordner/Dateien) "helloworld" im APF-Ordner nun überflüssig sind, also sollte man, wenn man mit seinem Projekt an diesem Punkt hier ist, diese auch entfernen, richtig ?

Des weiteren bin ich mir über den Begriff "PAGE" in meiner Ordnerstruktur nicht mehr ganz sicher. Ich habe diesen Namen aus dem Tutorial übernommen, vermute aber, dass man unter diesem Namen einen Arbeitstitel vergeben kann (Man beachte dann die Änderungen in der "index.php").

Ein wenig kann ich Deinen Erklärungen folgen, nur kommen im Bezug auf die Querverweise doch noch ein, zwei Fragen auf.

Der {CONTEXT} ist mir noch nicht so ganz schlüssig. Was ist genau damit gemeint ?

Wenn ich nun auf mein Projekt eingehe, worauf bezieht sich dieser Kontext ? Ist das der Name für ein Teil des Projektes ({CONTEXT} = db_connection) oder bezieht der sich auf das gesamte Projekt ({CONTEXT} = terminverwaltung) ?

Du hast den Kontext nun "siteone" genannt, von daher vermute ich, dass dieser Kontext für eine bestimmte dargestellte Inhaltsseite (z.B. für das Erstellen von Terminen) da ist. Für mein Tutorial-Projekt wäre das dann {CONTEXT} = create_appointment, sehe ich das so richtig ?
Wenn dem so ist, dann bräuchte man ja für jede "Unterseite", die eine Interaktion mit der Webseite bereitstellt, eine eigene Konfiguration ... :?: Das kann ich mir beim besten Willen nicht vorstellen, also bedarf es dem {CONTEXT} etwas mehr Erklärungsbedarf als in der Dokumentation beschrieben ;)

Der Einfachheit halber benutze ich bis zum besseren Verständnist "siteone", um voran zu kommen...

--- Part 1 done ---

--- Part 2 ---

Laut der Aussage in der Doku muss man die Datei content.html im Ordner PAGE/templates anpassen.
Meine content.html sieht immo so aus:

Code: Alles auswählen

<core:importdesign
   namespace="PAGE\content"
   template="[page=start]"
   incparam="page"
/>
Wo gehört das nun hin ?
Oben ? Mittenrein ? Untendrunter ?
:?: :?: :?:

Dann ist da ja die Rede von einem Dokumenten-Controller.
Der PHP Code ist zwar da, aber wie diese Datei heißt und wo sie hingehört, das muss ich dann wohl raten ? Da gibt es leider keinen Hinweis drauf.

--- Part 2 done ---

--- Part 3 ---

Der dritte Teil ist eigentlich (bis auf den komischen DocumentController) sehr schlüssig, für alle, die PHP verstehen, von daher braucht dieser erstmal keinen Redebedarf... (Ich werde auf das
$this->setPlaceHolder('hello', 'Hello World!');
später noch eingehen, denn da vermute ich eine SQL-Abfrage mit den darzustellenden Inhalten ;) )

--- Part 3 done ---

Sooo, damit ich weiter machen kann, warte ich auf antwort ;)

Euer Kigh...
Das Vögel des Kummers und der Sorgen über Deinem Kopf kreisen, kannst Du nicht verhindern.
Du kannst aber verhindern, dass sie Nester auf Deinem Kopf bauen.
(Chin. Sprichwort)
---
Je mehr Selbstmörder, desto weniger Selbstmörder. :D
(Homer Simpson)

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: Einsteigerfreundliches Tutorial - Von 0 auf 100

Beitrag von dave » 13.07.2015, 18:23:23

Part 1
"helloworld" kann für das Einstiegsgerüst raus, richtig.

"PAGE" kannst du benennen, wie es dir beliebt. Ich mache das zum Beispiel so:
- WEB für die normale Webseite in der Desktop-Variante
- MOBILE für eine kompakte, mobile Seite

Ich versuche dir den {CONTEXT} mal so zu erklären. Nehmen wir an, wir möchten anhand des APF mehrere Webseiten gleichzeitig ertsellen. Beispielsweise terminplaner.de und kighlander.de. Um diese beiden Applikationen voneinader trennen zu können, allerdings ein gemeinsames APF zu verwenden, ist die Trennung durch den Kontext notwendig. Denn es ist ja nihct sinnvoll, für jedes Projekt auf demselben Server ein neues APF zu nutzen.
Anhand der beiden gewünschten Projekte terminplaner.de und kighlander.de kannst du nun jeweils einen Kontxt vergeben: terminplaner und kighlander. Dadurch kannst du nun auch die notwenidigen Konfigurationen in ein und demselben APF voneinander unterscheiden und unterschiedliche Konfigurationen anlegen. So kannst du zum Beispiel für jede der Applikationen eine neue Datenbank-Verbindung einrichten.
Wenn ich nun auf mein Projekt eingehe, worauf bezieht sich dieser Kontext ? Ist das der Name für ein Teil des Projektes ({CONTEXT} = db_connection) oder bezieht der sich auf das gesamte Projekt ({CONTEXT} = terminverwaltung) ?
Auf das letztere, also terminverwaltung

dr.e wird darauf sicher noch etwas besser und verständlicher eingehen können.

Part 2
Es empfiehlt sich, den Aufruf des DocumentController immer an den Anfang des Templates zu setzen, sprich in die erste Zeile.
Der Name des DocumentController leitet sich aus dessen Aufruf ab: Rufst du einen DocumentController so auf:

Code: Alles auswählen

<@controller
   class="PAGE\controller\ContentController"
@>
heisst die Datei auch entsprechend ContentController.php und befindet sich im Verzeichnis PAGE/Controller/ (Übrigens hat sich hier der Aufruf deutlich vereinfacht gegenüber dem APF 1.x :)) Den Inhalt vom ContentController kannst du aus dem Tutorial übernehmen.

Part 3
Du kannst das natürlich auch so machen:

Code: Alles auswählen

$Statement = 'Hallo Welt!';
$this->setPlaceHolder('hello', $Statement);
Wie du den Platzhalter nun mit Daten füllst, bleibt dir überlassen.

Benutzeravatar
Kighlander
Beiträge: 35
Registriert: 11.07.2015, 16:55:44
Wohnort: Hilter aTW

Re: Einsteigerfreundliches Tutorial - Von 0 auf 100

Beitrag von Kighlander » 13.07.2015, 19:39:18

Sooo, zurück zum Thema.

Part 1 habe ich soweit verstanden, auch was das mit dem PAGE auf sich hat. Auch der CONTEXT erschließt sich mir nun deutlich, wunderbar ! ;)

Probleme machen nun noch Part 2 und 3.

Ich habe folgende Dateien nun hinzugefügt :
ContentController.php im Verzeichnis PAGE\controller

Meine Datei sieht nun exakt so aus wie im Tutorial mit einer Ausnahme:

Code: Alles auswählen

/**
    * @return DatabaseConnection
    */
   private function getConnection() {
      /* @var $cM ConnectionManager */
      $cM = & $this->getServiceObject('APF\core\database\ConnectionManager');
      return $cM->getConnection('kighlandersql2'); /*<--- einzige Änderung, damit die INI Datei passt*/
   }
Hier nun noch ein Auszug, wie meine Datenbank aussieht:

Code: Alles auswählen

--
-- Tabellenstruktur für Tabelle `pages`
--

CREATE TABLE IF NOT EXISTS `pages` (
  `page_id` varchar(10) NOT NULL,
  `page_content` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Daten für Tabelle `pages`
--

INSERT INTO `pages` (`page_id`, `page_content`) VALUES
('seite1', 'Das ist der Inhalt, der auf der SEITE1 zu sehen sein soll...'),
('seite2', 'Äquivalent ist das der Inhalt, der dann auf SEITE2 erscheint'),
('seite3', 'Zum Abschluss der Inhalt von der SEITE3...');

--
-- Indizes der exportierten Tabellen
--

--
-- Indizes für die Tabelle `pages`
--
ALTER TABLE `pages`
  ADD PRIMARY KEY (`page_id`);
Soviel dazu.
Wenn ich dem Tutorial nun glauben darf, sollte mir beim Klicken der Links "Seite 1", "Seite 2" und "Seite 3" der dementsprechende Inhalt angezeigt werden...
Tut es aber nicht, im gegenteil, ich erhalte eine Exception:

Code: Alles auswählen

Exception-ID: 156d0b0003db0be39bc133b407ccae2e

Type: APF\core\pagecontroller\IncludeException

Message: [APF\core\pagecontroller\ImportTemplateTag::loadContentFromFile()] Template "seite1" not existent in namespace "PAGE\content" (file: "./PAGE/content/seite1.html")! Please check your template code ( <094bc6846544142427e8bdca91fdf9c8 />).

Number: 256

File: /var/customers/webs/meine/domain/APF/core/pagecontroller/Document.php

Line: 859
Wenn ich diese Exception richtig deute, dann versucht APF den Inhalt immer noch nicht über die Datenbank anzuzeigen, sondern über Text-Dateien wie im Tutorial unter 5.1.

Also muss es ja irgendwo noch eine fehlende Ausgabe für diesen Fall geben, der nicht dokumentiert ist...

Damit ergibt sich die Frage, wo der Code aus Part 3 hinein gehört ? Ich denke mal nicht in die "content.html", was ja alleine schon wegen der Endung kein PHP zulassen sollte.
Das Vögel des Kummers und der Sorgen über Deinem Kopf kreisen, kannst Du nicht verhindern.
Du kannst aber verhindern, dass sie Nester auf Deinem Kopf bauen.
(Chin. Sprichwort)
---
Je mehr Selbstmörder, desto weniger Selbstmörder. :D
(Homer Simpson)

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: Einsteigerfreundliches Tutorial - Von 0 auf 100

Beitrag von dave » 13.07.2015, 20:05:52

Kighlander hat geschrieben: Wenn ich diese Exception richtig deute, dann versucht APF den Inhalt immer noch nicht über die Datenbank anzuzeigen, sondern über Text-Dateien wie im Tutorial unter 5.1.
Völlig korrekt.
Schau dir mal die Doku zum importdesign-Tag an: http://adventure-php-framework.org/Seit ... portdesign

Was im Moment passiert: Wie du schon richtig erfasst hast, wird über die Links "Seite 1", "Seite 2" und "Seite 3" der entsprechende Inhalt angazeigt. Über den importdesign-Tag wird nun ein neues Template, je nach geklicktem Link, eingebunden. Beim Link "Seite 1" wäre das das Template "seite1, beim Link "Seite 2" Template "seite2" usw.. Wenn du nun also jeweils ein neues Template mit den Namen "seite1.html", "seite2.html" und "seite3.html" erstellst und im Ordner "PAGE\content" einfügst, werden entsprechend die Inhalte aus den jeweiligen Dateien angezeigt.

Das ist allerdings etwas, das du ja gar nicht möchtest, du möchtest ja Datenbankinhalte. Also könntest du nun folgendes machen.

Du erstellst ein Template namens "seite1.html" (welches ja erfolgreich über den Link <a href="/?page=seite1">Seite 1</a> aufgerufen wird) im Ordner "PAGE\content" und rufst in diesem Template nun deinen DocumentController "ContentController" auf, indem du einfach folgendes in "seite1.html" einfügst:

Code: Alles auswählen

<@controller
   class="PAGE\controller\ContentController"
@>
Der Vorteil daran ist klar: Je nach Seite kannst du unterschiedliche Inhalte anzeigen. Seite 1 könnte zum Beispiel eine statische Seite sein, wobei gar keine Inhalte aus der Datenbank kommen müssen (Willkommensseite). Seite 2 könnte dann alle Inhalte der Datenbank auflisten und Seite 3 ein paar Infos zum System liefern. Somit hast du bereits eine einfache Navigation geschaffen.

Benutzeravatar
Kighlander
Beiträge: 35
Registriert: 11.07.2015, 16:55:44
Wohnort: Hilter aTW

Re: Einsteigerfreundliches Tutorial - Von 0 auf 100

Beitrag von Kighlander » 13.07.2015, 21:00:27

Endlich stellt sich ein erster richtig großer "AHAAAA" Effekt ein.

Großartig.

Ich habe nun meine Ordner-/Dateistruktur folgendermaßen ergänzt:

Code: Alles auswählen

---PAGE
|   |
|   ---content
|       |
|       ---impressum.html
|       ---kontakt.html
|       ---start.html
|       ---seite1.html
|       ---seite2.html
|       ---seite3.html
|   ---controller
|       |
|       ---ContentController.php
Mein ContentController sieht jetzt so aus:

Code: Alles auswählen

<?php

namespace PAGE\controller;

use APF\core\pagecontroller\BaseDocumentController;
use APF\core\database\ConnectionManager;
use APF\core\database\DatabaseConnection;

class ContentController extends BaseDocumentController {

   public function transformContent() {

      $conn = $this->getConnection();

      $pageId = $conn->escapeValue(
         self::getRequest()->getGetParameter('page', 'home')
      );

      $select = 'SELECT page_content
                 FROM pages
                 WHERE page_id = \'' . $pageId . '\'
                 LIMIT 1';
      $result = $conn->executeTextStatement($select);
      $data = $conn->fetchData($result);

      /*if($data !== false){
         $this->getDocument()->setContent($data['page_content']); // Diese drei Zeilen habe ich auskommentiert, weil diese nichts bewirkt hatten, weiß der Geier warum (ToDo: Sollte noch geklärt werden, warum NICHTS passiert ist)
      }*/

      $this->setPlaceHolder('meinInhalt', $data['page_content']); // Diese Zeile habe ich eingefügt, um die Daten aus der Datenbank darstellen zu lassen. Man beachte dazu den u.a. Code der Datei "seiteX.html"

   }

   /**
    * @return DatabaseConnection
    */
   private function getConnection() {
      /* @var $cM ConnectionManager */
      $cM = & $this->getServiceObject('APF\core\database\ConnectionManager');
      return $cM->getConnection('kighlandersql2'); /*Hier den Wert eintragen, den man in der "DEFAULT_connections.ini" gesetzt hat, damit die richtige Konfiguration geladen wird.  */
   }

}
Und so sehen nun die Seiten "seiteX.html" aus (Das "X" ist für die jeweilige Seite)

Code: Alles auswählen

<@controller
   class="PAGE\controller\ContentController"
@>
${meinInhalt}
Zur Erklärung (Nur damit ich es auch verstanden habe ;) ):
Der TAG <@controller ... @> wird gebraucht, um den passenden Controller zu laden und auszuführen.
Die Zeile ${meinInhalt} ist ein Platzhalter, der im Code des ContentController.php

Code: Alles auswählen

$this->setPlaceHolder('meinInhalt', $data['page_content']);
den Inhalt der Datenbank ersetzt.

Das war schon eine ganze Menge für heute, aber ein paar Fragen tun sich nun doch noch auf:
Der Inhalt der Datei seiteX.html ist ja in allen drei Fällen identisch. Da tut sich doch die Frage auf, wie man das automatisieren könnte. Rein Logisch würde ich nun denken, dass auch EINE Datei reicht...
Demzufolge müsste es auch einen Automatismus geben um das Navigationsmenü darstellen zu lassen.
Diese Fragen stelle ich mal so für morgen in den Raum und wir werden das bestimmt produktiv erörtern.

Für heute hab ich jedenfalls schon eine Menge dazu gelernt und hoffe, dass es nun auch für weitere Neulinge ein Anstoß ist, mit diesem Framework zu arbeiten.

Einen schönen Abend gewünscht,

Euer Kigh
Das Vögel des Kummers und der Sorgen über Deinem Kopf kreisen, kannst Du nicht verhindern.
Du kannst aber verhindern, dass sie Nester auf Deinem Kopf bauen.
(Chin. Sprichwort)
---
Je mehr Selbstmörder, desto weniger Selbstmörder. :D
(Homer Simpson)

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: Einsteigerfreundliches Tutorial - Von 0 auf 100

Beitrag von dave » 13.07.2015, 21:13:54

Wunderbar wenn es "klick" macht! :D
Soweit sind deine Ausführungen korrekt.

Und ja, das kann man auch irgendwie automatisieren. Stellt sich halt die Frage, was du genau machen möchtest. Wichtig ist eben, ein klar definiertes Ziel zu haben und nicht "planlos" drauf los zu arbeiten - frei nach dem Motto: Ich mache jetzt einfach mal etwas. Was willst du genau erreichen?

Übrigens:

Code: Alles auswählen

      /*if($data !== false){
         $this->getDocument()->setContent($data['page_content']); // Diese drei Zeilen habe ich auskommentiert, weil diese nichts bewirkt hatten, weiß der Geier warum (ToDo: Sollte noch geklärt werden, warum NICHTS passiert ist)
      }*/
Du wirst wahrscheinlich in deinem Template keine

Code: Alles auswählen

<section id="content">
  ...
</section>
definiert haben, daher bringt die Methode setContent() auch nichts. Aber keine Sorge, wie so oft führen viele Wege nach Rom und so habe ich das bisher auch noch nie genutzt.


Auf diesem Wege noch eine Zwischenfrage: Wie gut sind deine Kenntnisse in Sachen PHP und objektorientierter Programmierung? Ich bin für heute auch erstmal raus :geek:

Benutzeravatar
Paric
Beiträge: 45
Registriert: 25.08.2014, 08:51:04

Re: Einsteigerfreundliches Tutorial - Von 0 auf 100

Beitrag von Paric » 14.07.2015, 08:28:59

Hallo Kai,

willkommen im Forum auch von mir :)

Dann werde ich mal versuchen mein gefährliches Halbwissen in den Thread zu streuen. Vorweg, ich bin nicht in der Lage alles so toll und ausführlich darzulegen wie Dave, allerdings hoffe ich dennoch das ich mich irgendwie verständlich ausdrücken kann ;)

Zu allererst, mit dem Abschnitt:

Code: Alles auswählen

<core:importdesign
   namespace="PAGE\content"
   template="[page=start]"
   incparam="page"
/>
solltest Du in Deinem Fall nicht arbeiten. Dies ist lediglich dazu da, wenn man verschiedene Seiten (seite1.html, seite2.html,...) Mit identischem Header/Footer/Sitebar oder der gleichen aufbauen möchte. Allerdings möchtest Du ja, wenn ich das richtig verstanden habe, Deine Seiteninhalte komplett aus der Datenbank holen, richtig? Bringt den Vorteil mit, das du den Inhalt später in einem Admin-Bereich den Inhalt komfortabel bearbeiten kannst.

Gut, in Deinem Fall kannst Du das ganze getrost weglassen in Deiner content.html, und den Inhalt aus seite1.html, seite2.html,... dort einfügen.

Kommen wir nun zu Deinem ContentController. In Ihm musst Du natürlich nun auf die übergebenen Daten zugreifen können (indem Fall auf "page"). Dies geschieht über Methode "getRequest()"

Also sollte Dein ContentController ungefähr so aussehen:

Code: Alles auswählen

<?php

namespace PAGE\controller;

use APF\core\pagecontroller\BaseDocumentController;
use APF\core\database\ConnectionManager;
use APF\core\database\DatabaseConnection;

class ContentController extends BaseDocumentController {

   public function transformContent() {

      $conn = $this->getConnection();

      $pageId = $conn->escapeValue(
        $this->getRequest('page', 'home')
      );

      $select = 'SELECT page_content
                 FROM pages
                 WHERE page_id = \'' . $pageId . '\'
                 LIMIT 1';
      $result = $conn->executeTextStatement($select);
      $data = $conn->fetchData($result);

      $this->setPlaceHolder('meinInhalt', $data['page_content']); // Diese Zeile habe ich eingefügt, um die Daten aus der Datenbank darstellen zu lassen. Man beachte dazu den u.a. Code der Datei "seiteX.html"

   }

   /**
    * @return DatabaseConnection
    */
   private function getConnection() {
      /* @var $cM ConnectionManager */
      $cM = & $this->getServiceObject('APF\core\database\ConnectionManager');
      return $cM->getConnection('kighlandersql2'); /*Hier den Wert eintragen, den man in der "DEFAULT_connections.ini" gesetzt hat, damit die richtige Konfiguration geladen wird.  */
   }

} 
Ist nicht getestet, aber könnte durchaus funktionieren, bitte um Feedback :)

Nun stellt sich mir die Frage, was soll das denn bewirken?

Code: Alles auswählen

if($data !== false){
         $this->getDocument()->setContent($data['page_content']); // Diese drei Zeilen habe ich auskommentiert, weil diese nichts bewirkt hatten, weiß der Geier warum (ToDo: Sollte noch geklärt werden, warum NICHTS passiert ist)
      }
???
die Methode setContent() hat nichts mit dem Content Deiner Seite bis auf die zufällige Namensgleichheit gemein. :) Wozu diese Methode genau da ist weiß ich leider auch nicht, allerdings habe ich sie bisher auch noch nicht benötigt.

Beste Grüße,
Pit

Benutzeravatar
Kighlander
Beiträge: 35
Registriert: 11.07.2015, 16:55:44
Wohnort: Hilter aTW

Re: Einsteigerfreundliches Tutorial - Von 0 auf 100

Beitrag von Kighlander » 14.07.2015, 15:06:37

Sooo, ein neuer Tag, Hauptjob erledigt, nun geht's los mit dem interaktiven Tutorial ;)

Hallo Dave und Hallo Pit.... und Hallo allen, die das hier mitverfolgen ;)

Erstmal zu Dave:
Stellt sich halt die Frage, was du genau machen möchtest.
Ich verfolge mit diesem Thread eigentlich zwei Ziele:
1. Mir (und allen anderen Neulingen) einen einfachen und halbwegs sauberen Einstieg in das Framework, indem durch diesen Thread ein Grundgerüst entstehen soll, auf die man seine Webentwicklungen aufbauen kann.
2. Im Hintergrund arbeite ich weiter an meiner Selbstständigkeit, wofür ich eine Softwarelösung brauche, die ich nicht für teures Geld erkaufen möchte, sondern so gut es geht selbst erarbeiten möchte. Für mein konkretes Problem habe ich bisher keine fertige Lösung gefunden, nicht mal ansatzweise. Also wird sie kurzerhand selbst entwickelt. Details zu meinem privaten Projekt werde ich dann in einem konkreterem Thread in einem der dazugehörigen Unterforen posten, sobald es bei mir zu Fragen kommt.
Was willst du genau erreichen?
Wie gesagt, gaaaaaanz grob umrissen brauche ich eine Terminverwaltung, wo sich angemeldete User an- und abmelden können. Wenn man es genau nimmt, sind das auch Grundbausteine für viele Webprojekte, weswegen ich den Weg des interaktiven Tutorials gewählt habe. Und mal ehrlich, wenn ein solches Framework an einem konkretem Beispiel als an einem abstrakten dargestellt wird, dann sind die Lernerfolge eher gegeben, als wenn man sich durch Codeschnipsel arbeitet, die alle nicht in einem gemeinsamen Zusammenhang stehen.
Auf diesem Wege noch eine Zwischenfrage: Wie gut sind deine Kenntnisse in Sachen PHP und objektorientierter Programmierung?
Ich bin ein totaler Autodidakt, was alles mit Computern zusammenhängt. Zum Programmieren bin ich damals klassisch über Basic (Auf nem Schneider CPC) über Turbo-Pascal (Mein erster 386er) bis hin zur Webentwicklung (Seit PHP 4.x) gekommen. Ich habe mich in dieser Zeit fast ausschließlich prozedural orientiert (Wenn man vom Basic absieht, was ja noch Zeilenorientert war ;) ).
Über PHP besitze ich etliche Bücher/Nachschlagewerke aus dem Rheinwerk-Verlag (ehemals Galileo) und habe mir bisher das Wissen über Objektorientiertes Programmieren dort angeeignet. Aber genau da ist mein Problem, die sehr allgemein gehaltenen Klassen wie z.B. "class Mensch" oder "class Fahrzeug" haben mir etwas Theorie beigebracht, aber im Grunde ist das weitestgehend auch alles nichtssagend. Also habe ich mir viel fertigen Code im Netz angesehen, runtergeladen, ausprobiert, geändert, wieder ausprobiert und irgendwann sagt es halt: "AHAAAAA!" ;) Nur mit Frameworks habe ich mich bisher schwer getan, und das soll hiermit geändert werden.

Zu Pit:
willkommen im Forum auch von mir :)
Danke sehr :D
Zu allererst, mit dem Abschnitt:

Code: Alles auswählen

<core:importdesign
   namespace="PAGE\content"
   template="[page=start]"
   incparam="page"
/>
solltest Du in Deinem Fall nicht arbeiten.
Das habe ich vermutet...
Dies ist lediglich dazu da, wenn man verschiedene Seiten (seite1.html, seite2.html,...) Mit identischem Header/Footer/Sitebar oder der gleichen aufbauen möchte.
Wobei ich ja MÖCHTE, dass in meinem Template einige Sachen sich wiederholen.
Aber wenn ich das richtig verstehe, wird in meiner Ordnerstruktur dann der Ordner PAGE\content mit all seinen Dateien überflüssig, nicht? Denn die Ausgabe erfolgt ja nun in der content.html, welche sich im Ordner PAGE\templates befindet...
Jetzt werde ich mal eben einen Wunsch vorgreifen, der eigentlich noch nicht hier ins Tutorial gehört: Für mein Projekt brauche ich aber später nicht nur in der URL Parameter wie "?page=seiteX" sondern es sollen, je nach Seite, auch andere Stellen im Template durch Inhalte aus der Datenbank angezeigt werden.
Gut, in Deinem Fall kannst Du das ganze getrost weglassen in Deiner content.html, und den Inhalt aus seite1.html, seite2.html,... dort einfügen.
Funktioniert soweit ganz gut, nur dass ich in der Datenbank nur noch keine Inhalte für "Home", "Impressum" und "Kontakt" hinterlegt habe... aber das ist ja kein Problem !
Also sollte Dein ContentController ungefähr so aussehen: <?php

namespace PAGE\controller;

use APF\core\pagecontroller\BaseDocumentController;
use APF\core\database\ConnectionManager;
use APF\core\database\DatabaseConnection;

class ContentController extends BaseDocumentController {

public function transformContent() {

$conn = $this->getConnection();

$pageId = $conn->escapeValue(
$this->getRequest('page', 'home')
);

$select = 'SELECT page_content
FROM pages
WHERE page_id = \'' . $pageId . '\'
LIMIT 1';
$result = $conn->executeTextStatement($select);
$data = $conn->fetchData($result);

$this->setPlaceHolder('meinInhalt', $data['page_content']); // Diese Zeile habe ich eingefügt, um die Daten aus der Datenbank darstellen zu lassen. Man beachte dazu den u.a. Code der Datei "seiteX.html"

}

/**
* @return DatabaseConnection
*/
private function getConnection() {
/* @var $cM ConnectionManager */
$cM = & $this->getServiceObject('APF\core\database\ConnectionManager');
return $cM->getConnection('kighlandersql2'); /*Hier den Wert eintragen, den man in der "DEFAULT_connections.ini" gesetzt hat, damit die richtige Konfiguration geladen wird. */
}

}
Nicht ganz, folgende Zeile sieht bei mir nicht so aus:

Code: Alles auswählen

$pageId = $conn->escapeValue(
        $this->getRequest('page', 'home')
      );
sondern so:

Code: Alles auswählen

$pageId = $conn->escapeValue(
         self::getRequest()->getGetParameter('page', 'home')
      );
Dein Code löst bei mir eine Exception aus.
Nun stellt sich mir die Frage, was soll das denn bewirken?
Genau DAS habe ich mich auch gefragt und habe den Kram in meinem Code auch auskommentiert bzw. gelöscht, weil der nix getan hat (Jedenfalls ist mir nix aufgefallen).

---------------------------------------------------------------------------------

Sooo... Zurück zum Thema.
Blicken wir zurück:

Code: Alles auswählen

APF installiert und erste Schritte unternommen              ... check !
Sich mit dem Thema TEMPLATES bei APF auseinandergesetzt     ... check !
Eine Datenbankverbindung hergestellt                        ... check !
Daten aus der Datenbank auf der Webseite darstellen lassen  ... check !
Soweit, so gut.

Damit man aber nicht nur Daten aus der Datenbank auslesen kann, sondern auch diese erstellen und manipulieren kann, sollte das nächste Kapitel vielleicht sein, wie man Daten in eine Daten schreibt.
Daraus ergibt sich das Thema "Formularverarbeitung"...
Da werde ich mir mal eben in der Doku etwas umsehen und ich bin sicher, dass schnell ein paar Fragen dazu aufkommen werden :)

Bis dahin, Euer Kigh
Das Vögel des Kummers und der Sorgen über Deinem Kopf kreisen, kannst Du nicht verhindern.
Du kannst aber verhindern, dass sie Nester auf Deinem Kopf bauen.
(Chin. Sprichwort)
---
Je mehr Selbstmörder, desto weniger Selbstmörder. :D
(Homer Simpson)

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: Einsteigerfreundliches Tutorial - Von 0 auf 100

Beitrag von dave » 14.07.2015, 15:39:39

Daten in eine Datei schreiben? Kann man machen, aber Datenbank ist doch sinnvoller, wie ich finde. Wobei natürlich das Schreiben in eine Datei auch vom APF unterstützt wird.

Für die Formularauswertung gibt es in der Doku zwei Kapitel. Eines, welches alle Elemente beschreibt und eines, welches die Anwendungsmöglichkeiten aufzeigt. In der Doku sind nicht zu 100% alle Methoden erfasst, ein paar wenige findest du auch noch, wenn du dich ein wenig durch die Quellen des APF hangelst. Da du ja bereits Wissen im Bereich objektorientierter Programmierung mit bringst, hast du da einen Vorteil mir gegenüber. Ich bin damit einfach durch das APF eingestiegen und habe meine Zusammenhänge selbst gebildet ;)

Bei Fragen stehen wir natürlich weiterhin zur Verfügung. Ich muss allerdings gestehen, dass ich ab morgen bis zum Sonntag erstmal auf ein Festival fahre, daher hier erstmal nicht aushelfen kann. Aber den einen oder anderen ruhigen Moment werde ich sicher kurz an den Thread hier denken :)

Benutzeravatar
Kighlander
Beiträge: 35
Registriert: 11.07.2015, 16:55:44
Wohnort: Hilter aTW

Re: Einsteigerfreundliches Tutorial - Von 0 auf 100

Beitrag von Kighlander » 14.07.2015, 19:11:10

Daten in eine Datei schreiben?
Ich hatte mich verschrieben, ich wollte nicht schreiben:
..., wie man Daten in eine Daten schreibt.
sondern ..., wie man Daten in eine Datenbank schreibt.

Soo, ich habe das mit den Formularen erstmal etwas nach hinten geschoben, da mich eine meiner Fragen, die ich in meinem vorletzten Posting gestellt habe, mal näher betrachten wollte.
Der Inhalt der Datei seiteX.html ist ja in allen drei Fällen identisch. Da tut sich doch die Frage auf, wie man das automatisieren könnte. Rein Logisch würde ich nun denken, dass auch EINE Datei reicht...
Demzufolge müsste es auch einen Automatismus geben um das Navigationsmenü darstellen zu lassen.
Das habe ich mal versucht umzusetzen mit dem vorher gelernten.
Ich habe einen weiteren Controller erstellt, der dieses Mal NaviController heißt und in der Ordnerstruktur unter PAGE\controller\NaviController.php zu finden ist.
Analog zur Dokumentation des "(Document-)Controller" (Link) habe ich versucht, meine Links dynamisch erstellen zu lassen.

Leider wird aber immer nur EIN Element ausgegeben, und ich kann nicht herausfinden, warum die anderen beiden nicht angezeigt werden.

Hier mal die beiden Dateien, welche dazu benötigt werden:
PAGE\templates\navi.html

Code: Alles auswählen

<@controller
    class="PAGE\controller\NaviController"
@>
<ul>
   <html:placeholder name="site_navigation" />
</ul>

<html:template name="site-navigation-elements">
    <li><a href='?page=<html:placeholder name="site_target" />'><html:placeholder name="site_target" /></a></li>
</html:template>
PAGE\controller\NaviController.php

Code: Alles auswählen

<?php

namespace PAGE\controller;

use APF\core\pagecontroller\BaseDocumentController;
use APF\core\database\ConnectionManager;
use APF\core\database\DatabaseConnection;

class NaviController extends BaseDocumentController {
    
    public function transformContent() {
        
        $tmpl = $this->getTemplate('site-navigation-elements');
        
        $conn = $this->getConnection();
        
        $select = "SELECT page_id FROM pages";
        
        $result = $conn->executeTextStatement($select);
        
        $buffer = '';
        
        foreach($this->getPageId($conn, $result) as $nav_element) {
            $tmpl->setPlaceHolder('site_target', $nav_element);
            $buffer .= $tmpl->transformTemplate();
        }
        
        $this->setPlaceHolder('site_navigation', $buffer);
        
    }
    /**
    * @return DatabaseConnection
    */
    private function getConnection() {
        /* @var $cM ConnectionManager */
        $cM = & $this->getServiceObject('APF\core\database\ConnectionManager');
        return $cM->getConnection('kighlandersql2');
    }
    
    /**
     *  @return array page_id
     */
    private function getPageId($conn, $result){
        return $conn->fetchData($result);
    }
}
Seh ich nur den Wald vor lauter Bäumen nicht oder wo liegt hier der Fehler ???

MfG

Kigh...
Das Vögel des Kummers und der Sorgen über Deinem Kopf kreisen, kannst Du nicht verhindern.
Du kannst aber verhindern, dass sie Nester auf Deinem Kopf bauen.
(Chin. Sprichwort)
---
Je mehr Selbstmörder, desto weniger Selbstmörder. :D
(Homer Simpson)

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: Einsteigerfreundliches Tutorial - Von 0 auf 100

Beitrag von dave » 14.07.2015, 20:25:44

Mit welcher APF Version arbeitest du?

Ersetz mal bitte im Template

Code: Alles auswählen

<html:placeholder name="site_navigation" />
durch

Code: Alles auswählen

${site_navigation}
und

Code: Alles auswählen

<html:placeholder name="site_target" />
durch

Code: Alles auswählen

${site_target}
Ansonsten doofe Frage: Sind denn drei Einträge in deiner Datenbank vorhanden? ;)

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast