Linkgenerator frage

Anmerkungen, Fragen und Hinweise zur Konfiguration dürfen in diesem Forum gepostet werden. // Notes, questions, and hints on the configuration can be posted here.
welworx
Beiträge: 620
Registriert: 27.09.2010, 19:29:44

Linkgenerator frage

Beitrag von welworx » 01.11.2011, 15:21:18

Hi,

ich stehe grade vor dem problem, dass ich an einer stelle in einer applikation einen parameter aus dem url abfangen will und anschließend den Parameter daraus entfernen will, damit er nicht mehr darin vorhanden ist und bei allen anderen erzeugten links nicht mehr vorhanden ist.

Klar könnte ich das bei allen links im linkgenerator einfach null setzten, nur bin ich auf der suche nach einer eleganteren Lösung ;)

LG Werner
Zuletzt geändert von welworx am 01.11.2011, 21:53:45, insgesamt 1-mal geändert.

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

Re: Linkgenerator frage

Beitrag von dr.e. » 01.11.2011, 15:34:12

Möchtest du diesen Parameter IMMER aus der URL entfernen? Falls ja, würde ich einen eigenen Input-Filter schreiben und in die Chain hängen, der das für dich erledigt. Den Wert kannst du dann ja in ein allgemeingültig verwendetes Model o.ä. schreiben und an konkreter Stelle wieder abgreifen.
Viele Grüße,
Christian

welworx
Beiträge: 620
Registriert: 27.09.2010, 19:29:44

Re: Linkgenerator frage

Beitrag von welworx » 01.11.2011, 15:46:37

Das ziel ist, anhand des parameters ein objekt in einer liste anzuhängen. wenn dies getan wurde, muss er aber raus, da sonst der linkgenerator den parameter immer einbaut und somit das objekt jedesmal angehängt wird.

habe das derzeit so realisiert dass ich einen eigenen taglib habe der mit der onparsetime methode sich den parameter schnappt und dann arbeitet. Das ganze über einen inputfilter zu machen wäre aber natürlich die elegantere methode .. oder überhaupt über eine action. daran hab ich nicht gedacht. Welche Variante ist die elegantere? Wie kann ich den parameter null setzten? Die Methode fromCurrent des Linkgenerators verwendet den aktuellen url, der in der registry hinterlegt ist und auch nicht verändert werden kann. Darin ist das add parameter enthalten den ich loswerden will ;)

Wird der inputfilter vor oder nach der action ausgeführt?

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

Re: Linkgenerator frage

Beitrag von dr.e. » 01.11.2011, 20:02:42

Hallo Werner,

du kannst eine Url ja nicht nur über die statischen Methoden from*() erzeugen, sondern auch über den Konstruktor. Diese Variante sehe ich hier als die bessere an. Was den Parameter angeht, so kannst du diesen dann entweder über eine Liste von Parametern verwalten, die von einem Filter oder einer Action definiert wird (z.B. in einem UrlParameterModel, das in einem Filter bzw. einer Action generiert wird und das genau so für dich vornimmt) oder die Klasse Url überschreiben und deine eigene from*()-Methode definieren. Dann kannst du per MyUrl::fromCurrentUrlWithoutSpecialParameter() und dem zugehörigen LinkScheme deine Url generieren.
Welche Variante ist die elegantere?

Action und Filter sind gleichbedeutend. Action ist eher Modul-spezifisch, Filter sind für die komplette Applikation gedacht.
Wie kann ich den parameter null setzten?
Entweder direkt per mergeQuery() oder eben wie oben beschrieben mit einer eigenen from*()-Methode.
Wird der inputfilter vor oder nach der action ausgeführt?
Siehe http://adventure-php-framework.org/Seit ... Einleitung. Filter werden immer vor den Actions und nach den Actions ausgeführt.
Viele Grüße,
Christian

welworx
Beiträge: 620
Registriert: 27.09.2010, 19:29:44

Re: Linkgenerator frage

Beitrag von welworx » 02.11.2011, 00:01:46

danke für die antwort.

da ich gerne so sachen wie die taglibs für die link generierung verwenden möchte ist das mit der eigenen from*() methode nicht möglich.

Wie könnte man hier am besten vorgehen?

LG Werner

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

Re: Linkgenerator frage

Beitrag von dr.e. » 03.11.2011, 00:09:32

Hallo Werner,

doch natürlich. Erweiterst du die Url-Klasse um deine eigene Implementierung, kannst du das in der Taglib schon nutzen. Musst eben dann die gewünschten Parameter aus dem o.g. Container beziehen und in der Taglib die Funktionalität entsprechend abbilden.
Viele Grüße,
Christian

welworx
Beiträge: 620
Registriert: 27.09.2010, 19:29:44

Re: Linkgenerator frage

Beitrag von welworx » 03.11.2011, 00:14:07

Hi,

steh grad irgendwie ein bisserl an. Hast du ein bsp für mich?

LG Werner

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

Re: Linkgenerator frage

Beitrag von dr.e. » 03.11.2011, 09:02:39

Hallo Werner,

in der Taglib könnte deine Implementierung so aussehen:

Code: Alles auswählen

public function transform() {
   $model = Singleton::getInstance('UrlParameterModel');
   $params = $model->getParameters();
   unset($params['foo']);
   $url = new Url(null, null, null, null, $params);
   return LinkGenerator::generateUrl($url);
} 
Dies setzt voraus, dass alle bisherigen Parameter entweder in einem Filter oder einer Action in das UrlParameterModel gesetzt werden.

Hilft dir das?
Viele Grüße,
Christian

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

Re: Linkgenerator frage

Beitrag von Megger » 03.11.2011, 11:37:20

Ich glaube er meint die bereits bestehenden Taglibs 'html_taglib_a' und 'html_taglib_link'

Du wirst aber wahrscheinlich nicht drumherum kommen dir eigene Taglibs zu schreiben. Selbst bei einer Lösung über eine Action oder den Inputfilter bleibt der Parameter ja dann vorhanden (außer du verwendest immer das gleiche Url Object, d.h. in z.B. einer Action holst du dir die Url per fromCurrent() und entfernst deinen Parameter, mit diesem Objekt kannst du dann immer weiterarbeiten, allerdings kannst du auch dabei nicht die Taglibs nutzen.
Ich glaube ohne eigene Anpassungen kannst du entweder den einen oder den anderen Weg gehen, beide gleichzeitig eher nicht.
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

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

Re: Linkgenerator frage

Beitrag von dr.e. » 03.11.2011, 23:44:56

Das ist natürlich auch eine Idee. Sofern die Link-Generierung in einem Controller genutzt werden soll, müsste man das wie oben beschrieben auslagern.
Viele Grüße,
Christian

welworx
Beiträge: 620
Registriert: 27.09.2010, 19:29:44

Re: Linkgenerator frage

Beitrag von welworx » 06.11.2011, 05:19:07

0k verstehe ..... ich hatte gehofft das es eine möglichkeit gibt mit der ich die taglibs nicht verändern muss und keine eigenen schreiben brauch ... Das anpassen/ableiten dieser ist nicht so ein problem, aber da die ja auch weiterentwickelt werden ist das auf dauer ein wenig sinnlose arbeit ;) .. daher wäre ich für eine allgemeinere lösung :D

was haltet ihr davon eine komponente zu schaffen die alle inputvariablen enthält?

Das hätte in meinen augen folgende vorteile:

1.) Man könnte einfach werte daraus manipulieren (löschen, entfernen, verändern)
2.) es erhöht die wiederverwendbarkeit von vielen taglibs, da man unerwünscht url parameter oder so einfach entfernen könnte
3.) Man könnte mehrere inputfilter anwenden.
4.) Man könnte für seine applikation vlt sogar whitelist filter erstellen die nur gewisse parameter überlassen
5.) Man könnte von haus aus filter anbieten die externe urls als parameter rauswerfen (um zb xss zu verhindern)
6.) selbiges um sql injection code zu identifizieren und zu entfernen

Vermutlich am einfachsten wäre das ganze realisierbar wenn man das ganze in die registry schreiben würde ...

LG Werner

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

Re: Linkgenerator frage

Beitrag von dr.e. » 06.11.2011, 13:38:00

Hallo Werner,

für diese Art der Manipulation eines Requests sind Input-Filter gedacht. Diese können seit 1.13/1.14 sehr einfach in die InputFilterChain eingehangen werden um eine Veränderung des Requests oder eines Status zu erreichen.

Ich tue mir nur etwas schwer, dafür eine allgemeingültige Implementierung auszudenken, denn solche Manipulationen sind meist Applikations-spezifisch und eben nicht generisch. In deinem Fall könnte man sicher den Namen des Parameters konfigurieren, sofern es aber an die Übersetzung eines URL-Layouts geht, so lässt sich dafür nur schwer etwas wiederverwendbares zu formulieren.

Ich gebe dir jedoch Recht, eine Lösung über eine Action oder einen Filter ist definitiv ratsamer als zig Stellen anzupassen - schon alleine aus Gründen der Faulheit. :)
Viele Grüße,
Christian

welworx
Beiträge: 620
Registriert: 27.09.2010, 19:29:44

Re: Linkgenerator frage

Beitrag von welworx » 06.11.2011, 16:45:12

Das mit den filtern ist mir schon klar, auch wenn ich noch nicht so ganz damit zu recht komme, was vermutlich aber einfach daran liegt dass ich mich noch nicht so gut damit beschäftigt habe.

Dass das ganze Applikationsspezifisch ist ist klar.

Was hältst du einfach von der idee, dass man alle input variablen in der registry speichert. Stell mir das so vor, dass man zb die post, get usw erst durch die filter durchjagt, sofern welche vorhanden, und dann in ein array in die registry einträgt.

Damit kann man dann relativ leicht von überall in der Applikation auf die Parameter zugreifen und sie bei bedarf auch verändern. Weiters wäre es so möglich, dass man die filter auch missbraucht um zb eine liste alle inputvariablen in eine logdatei zu schreiben, was einem sicher helfen würde wenn man mehrere module miteinander verwendet und nicht genau weiß welche parameter die verwenden.

Als weiteren schritt müsste man dann halt die methode from url umschreiben, da die ja den aktuellen url verwendet und nur die gesetzten parameter entfernt. Hier sollte man dann gleich automatisch die parameter die in dem GEt Array der registry auf null gesetzt wurden entfernen. Damit ist das ganze dann wunderbar mittels verschiedenen timeings beeinflussbar.

Was sagst du dazu?

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

Re: Linkgenerator frage

Beitrag von dr.e. » 06.11.2011, 17:24:02

Hallo Werner,

ich würde hier nicht von der PHP-Standard-Vorgehensweise abweichen, sondern $_GET, $_POST und $_REQUEST weiter nutzen - auch mit einem eigenen Filter.
Als weiteren schritt müsste man dann halt die methode from url umschreiben, da die ja den aktuellen url verwendet und nur die gesetzten parameter entfernt.
Warum? Du kannst doch jederzeit Url::fromString() nutzen und jede Art von Input (z.B. aus $_SERVER/$_REQUEST/Registry/...) als Argument übergeben.
Hier sollte man dann gleich automatisch die parameter die in dem GEt Array der registry auf null gesetzt wurden entfernen. Damit ist das ganze dann wunderbar mittels verschiedenen timeings beeinflussbar.
Wie soll das aussehen? Ehrlich gesagt verstehe ich dsen Gedanken noch nicht so ganz.
Viele Grüße,
Christian

welworx
Beiträge: 620
Registriert: 27.09.2010, 19:29:44

Re: Linkgenerator frage

Beitrag von welworx » 06.11.2011, 18:02:42

ich würde hier nicht von der PHP-Standard-Vorgehensweise abweichen, sondern $_GET, $_POST und $_REQUEST weiter nutzen - auch mit einem eigenen Filter.
ok, das mit der registry wäre vermutlich eh nur verwirrend ...

Ok ich versuch ein wenig anders aufzuzeigen wo ich das problem sehe:

Die fromString methode holt sich den (Registry::retrieve('apf::core', 'CurrentRequestURL') um den url zu erzeugen.

Diese Variable wird im pagecontroller gleich zu beginn in die registry geschrieben und kann nicht manipuliert werden.


Weiters werden dann die übermittelten parameter entfernt/verändert/hinzugefügt.

Man kann das also nur durch aktives setzten der parameter das Ergebnis beeinflussen.

Es wäre hier also schon sehr praktisch, wenn die funktion automatisch alle parameter des $_GET Arrays verarbeitet. Damit wäre es möglich, dass man irgendwo einfach $_GET['add']=null setzten kann und somit die variable raus fliegt. Klar was ich meine?

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast