Grundlegende Verständnisprobleme

Das Forum soll der Ablage von Lösungen für immer wieder auftauchende Problemstellungen dienen. // This forum contains solutions to problems that frequently occur.
Antworten
Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Grundlegende Verständnisprobleme

Beitrag von dave » 07.02.2011, 19:42:25

Hallo zusammen! ;)

1.: Das Adventure PHP Framework fasziniert mich total. Es ist echt nicht schlecht, was sich die Autoren da geleistet haben, Hut ab!

2.: Ich arbeite zum ersten mal mit einem Framework. Bei meinen Arbeiten und Projekten zuvor habe ich mich immer selbst um die Erstellung der Seiten mit Templates und Co. gekümmert. Jedoch sind die Anwendungen meist nicht sicher genug ... daher möchte ich für mein nächstes grosses Projekt ein fertiges Framework einsetzen.

3.: Los gehts mit meinen Problemchen :)

Ordnerstruktur:

Code: Alles auswählen

apps/
  sites/
    design1/
      pres/
        documentcontroller/
        templates/
          menu/
Im Ordner templates habe ich nun zwei Dateien:

Code: Alles auswählen

start.html
content.html
Über die start.html werden weitere Template-Dateien im Ordner menu über den Tag <core:importdesign /> eingebunden. Soweit ist alles wunderbar :shock:

Für den Inhalt gibt es ein zusätzliches Template content.html, welches ebenfalls über das Tag <core:importdesign /> eingebunden wird. Soweit ist hoffwentlich noch alles klar bei euch :) .


In der content.html verwende ich folgendes Tag, um Inhalte zu ändern:

Code: Alles auswählen

<@controller namespace="sites::design1::pres::documentcontroller" file="content_v1" class="content_v1" @>
. Damit binde ich mir die content_v1.php, welche im Ordner documentcontroller liegt, ein. Dort erstelle ich eine Datenbankverbindung. Die Datenbankverbindung klappt auch wunderbar, dank der Tutorials 8-) .

In der content.html gibt es neben vielen DIVs fürs Design noch einen weiteren Tag, besser Platzhalter:

Code: Alles auswählen

<html:placeholder name="content_test" />
Damit möchte ich nun ein Wort aus der Datenbank an genau dieser Stelle anzeigen.

Mein Problem: Das Wort kommt zwar, aber sämtliche DIVs und feste Tetxe sind weg. Damit passt mein Design leider auch nicht mehr. Den Inhalt übergebe ich folgendermassen:

Code: Alles auswählen

$this->setPlaceHolder('content_test', $this->__Content = $data['titel']);
Wieso ist das Template content.html plötzlich leer? Ich will doch nur den Platzhalter ersetzen und nicht das gesamte Template.

Sicherheitshalber nochmal das ganze PHP-Script content_v1.php:

Code: Alles auswählen

// include MySQLHandler
import('core::database', 'MySQLxHandler');
import('tools::request', 'RequestHandler');

// document controller class to display dynamic content
class content_v1 extends base_controller {

   public function transformContent(){

      $cM = &$this->__getServiceObject('core::database','ConnectionManager');
      $SQL = &$cM->getConnection('database-1');

      // URL-Parameter beziehen
      $page = RequestHandler::getValue('Seite','Startseite');

      // Parameter gegen SQL-Injections absichern
      $page = $SQL->escapeValue($page);

      // Inhalt der Seite auslesen
      $select = 'SELECT id,titel
                 FROM test
                 
                 LIMIT 1';
				 //WHERE PageURLName = \''.$page.'\'
      $result = $SQL->executeTextStatement($select);
      $data = $SQL->fetchData($result);

      // Inhalt der Seite ausgeben
	  $this->setPlaceHolder('content_test', $this->__Content = $data['titel']);

   }

// end class
}
Die SQL-Abfrage sieht zwar doof aus, passt aber. Habe das aus dem Tutorial ein wenig bearbeitet ;). Das Wort aus der DB kommt auch, aber alles andere aus dem Template ist weg, verschluckt.



Ausserdem:
Wie kann ich Verlinkungen am einfachsten erzeugen? Wenn ich im Menü etwas anklicke, möchte ich eine andere PHP-Datei im Ordner documentcontroller ausführen. Wie mache ich das am besten/einfachsten?

Mein grundlegendes Problem ist die objektorientierte Programmierung. :oops: Ich habe das leider nie wirklich gelernt sondern alles nur selbst angeeignet. Ich dachte auch, ich wäre relativ fir in der Programmierung, hier bin ich aber voll am versagen ;). Mit Sachen wie $this-> kann ich leider nur wenig anfangen. Auf was bezieht sich denn dieses $this-> immer? :?


Vielen Dank für eure Unterstützung und macht weiter so!

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

Re: Grundlegende Verständnisprobleme

Beitrag von Screeze » 07.02.2011, 20:09:24

Hi, und willkommen im APF-Forum!
1.: Das Adventure PHP Framework fasziniert mich total. Es ist echt nicht schlecht, was sich die Autoren da geleistet haben, Hut ab!
Da stimm ich dir zu, v.a. christian (dr.e) hat gute arbeit geleistet, von uns anderen stammen ja meist nur kleinste Teile ;)
2.: Ich arbeite zum ersten mal mit einem Framework. Bei meinen Arbeiten und Projekten zuvor habe ich mich immer selbst um die Erstellung der Seiten mit Templates und Co. gekümmert. Jedoch sind die Anwendungen meist nicht sicher genug ... daher möchte ich für mein nächstes grosses Projekt ein fertiges Framework einsetzen.
So gings mir auch, bis vor etwa 1,5 Jahren, dann kam ich genau wie du zum APF - und es hat sich gelohnt ;)

3.: Los gehts mit meinen Problemchen :)
Du bist schon ziemlich weit, lediglich ein Klitzekleiner Fehler ruft das genannte Verhalten hervor:

Code: Alles auswählen

$this->setPlaceHolder('content_test', $this->__Content = $data['titel']);
Ich analysiere die Zeile mal zuerst so, wie sie aktuell dort steht:
Du setzt als Inhalt des Templates ($this->__Content) dein Wort aus der db (der alte inhalt wird überschrieben!). Anschließend wird dieser Inhalt an den Platzhalter übergeben. Das ersetzt vermutlich garnichtsmehr, weil du auch den Platzhalter überschrieben hast ;)

Korrekt würde die Zeile lauten:

Code: Alles auswählen

$this->setPlaceHolder('content_test', $data['titel']);
Du übergibst einfach als 2. Parameter den wert, der anstelle des Platzhalters erscheinen soll, mehr braucht es nicht, dann klappt es auch :)
Wieso ist das Template content.html plötzlich leer? Ich will doch nur den Platzhalter ersetzen und nicht das gesamte Template.
Genau das tust du jedoch indem du $this->__Content einen neuen wert zuweist ;)
Ausserdem:
Wie kann ich Verlinkungen am einfachsten erzeugen? Wenn ich im Menü etwas anklicke, möchte ich eine andere PHP-Datei im Ordner documentcontroller ausführen. Wie mache ich das am besten/einfachsten?
Hier musst du das Pferd von hinten aufrollen:
im APF führst du keine documentcontroller aus über einen Link, sondern du lädst ein Template, welches (evtl.) einen documentcontroller läd.

In deinem Fall würde ich daher entweder dem documentcontroller des content templates die logik geben, anhand eines url-parameters den du in den Links übergibst ein anderes Template einzubinden, oder du benutzt einen der :importdesign tags dafür, diese können ebenfalls parameterabhängig versch. templates und deren controller einbinden.

Zur generierung der Links steht dir folgendes zu Verfügung:
http://adventure-php-framework.org/Seite/036-Links
Mein grundlegendes Problem ist die objektorientierte Programmierung. :oops: Ich habe das leider nie wirklich gelernt sondern alles nur selbst angeeignet. Ich dachte auch, ich wäre relativ fir in der Programmierung, hier bin ich aber voll am versagen ;). Mit Sachen wie $this-> kann ich leider nur wenig anfangen. Auf was bezieht sich denn dieses $this-> immer? :?
Aller Anfang ist schwer, aber mit etwas Lektüre bekommst du das recht schnell raus denke ich, wenn du bisher schon so weit gekommen bist, sollte das Verständnis nicht das Problem darstellen denke ich ;)
$this bezieht sich innerhalb eines Objekts immer auf das objekt selber. Der Documentcontroller z.b. ist ein objekt. Jedes $this innerhalb von Funktionen im documentcontroller bezieht sich also auf den controller selber.
kleines beispiel:

Code: Alles auswählen

class foo {
    public $bar = 'abc';

    public function a(){
        echo $this->bar; // $this bezieht sich auf das objekt, "bar" ist eine eigenschaft des objekts, oben mit "abc" definiert, also ausgabe: abc
    }
    public function b(){
        $this->a(); // hier wird die methode a() des aktuellen objekts aufgerufen, die wiederum "abc" ausgibt.
    }
}
Google einfach mal nach ein paar Tutorials, villeicht weis Christian auch ein gutes für den Einstieg, ich weis grad keins aus dem FF, aber es finden sich mit Sicherheit ein paar gute.

Grüße
Ralf

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

Re: Grundlegende Verständnisprobleme

Beitrag von dave » 07.02.2011, 22:06:22

Nabend Ralf,


Danke für die schnelle und ausführliche Antwort! Hammer! :o

Ich habe das mit dem Ersetzen des Platzhalters sofort mal probiert und es klappt wunderbar. Ohne dem zweiten $this-> ergibt das sogar für mich Sinn!

Und auch den LinkHandler habe ich mal schenll ausprobiert und es ist ja wirklich wahnsinnig einfach. Man muss die Verschachtelung nur einmal verstanden haben. Endlich gibt es nach einer Woche Einarbeitungszeit sichtbare Ergebnisse. Bin schon leicht am Verzweifeln gewesen :). Bei jedem anderen Framework hätte ich sofort aufgegeben!


Und anhand des kleinen Beispiels habe ich das sogar vom Prinzip her mit dem $this-> verstanden. Jetzt werde ich mal weitersehen. Die nächsten Fragen lassen bestimmt nicht lange auf sich warten ...

Vielen Dank aber erstmal!

Dave


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

Re: Grundlegende Verständnisprobleme

Beitrag von dave » 01.03.2011, 20:14:34

Es gibt in diversen anderen Threads ja mittlerweile die Diskussion über die Speichermethoden der Passwörter und zwischenzeitlich ist auch kurzzeitig eine Diskussion darüber entstanden, wie das APF mit den Daten von Usern, die diese eingeben können, umgeht.

Was ich nochmal wissen möchte:
Werden sämtliche Formulareingaben bereits vollautomatisch "gefiltert" (also Sobderzeichen "unschädlich" gemacht) oder muss ich dieses erst durch Filter in den Formularen bzw. Controllern anschmeissen?

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

Re: Grundlegende Verständnisprobleme

Beitrag von Screeze » 01.03.2011, 20:23:30

Wie ich hier als Bug gemeldet habe, werden die Daten momentan automatisch unschüdlich gemacht - gegen XSS, nicht gegen SQL-Injection und co.
AAABER
Das werden wir mit 1.14 wieder ändern.

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

Re: Grundlegende Verständnisprobleme

Beitrag von dave » 01.03.2011, 20:25:58

Ok, ich bin da einfach ein wenig verwirrt worden und wollte daher einfach nochmal Klarheit haben. Danke dir! :)

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

Re: Grundlegende Verständnisprobleme

Beitrag von Screeze » 01.03.2011, 20:29:27

Du solltest also wenn du eingaben vom user nimmst schon jetzt ein htmlentities einbauen. Mit dem 4. parameter auf false stellst du sicher dass bereits maskierte zeichen nicht doppelt maskiert werden, somit hast du momentan keine probleme - und mit 1.14 ändert sich für dich garnichts.

Code: Alles auswählen

$maskiert = htmlentities($eventuellmaskiert, ENT_QUOTES, 'UTF-8', false);

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

Re: Grundlegende Verständnisprobleme

Beitrag von dave » 01.03.2011, 20:32:12

Wow, vielen Dank!! :o

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

Re: Grundlegende Verständnisprobleme

Beitrag von Screeze » 01.03.2011, 20:44:37

Achso ja, nochmal zur verdeutlichung: Normalerweise sollten die werte in der DATENBANK o.ä. als klartext kommen (sql injections mit escapeValue() verhindern trotzdem nicht vergessen!) nur bei der ausgabe an den client sollten diese maskiert werden.

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast