Du bist nicht angemeldet. Der Zugriff auf einige Boards wurde daher deaktiviert.

#1 05. Dezember 2013 10:27

Klenkes
Server-Pate
Ort: 89428 Syrgenstein
Registriert: 17. Dezember 2010
Beiträge: 1.437

ListIt: Pretty-URL, Detail-URL und die Seitenhierarchie

Folgendes Szenario:

Nützliches (Sectionheader)
  - Rezepte (Contentpage)

URL: /nuetzliches/rezepte.php

Nun rufe ich mein ListIt2Rezepte hier als Summary auf, und möchte meine Details der Rezepte gerne mit der korrekten URL haben:
URL: l/nuetzliches/rezepte/peppermint-colada/22.php

Dazu müsste ich in den Einstellungen von LisIt unter URL-Pefix nuetzliches/rezepte eingeben, doch dann kann die Detailansicht nicht mehr geladen werden. Die URL ändert sich, aber die Summaryansicht bleibt.
Trage ich rezepte ein, ist die Detail-URL /rezepte/peppermint-colada/22.php funktiert die Detailansicht, aber das darüber liegende /nuetzliches/ fehlt.

Dabei ist es egal was ich in das Feld URL-Prefix eintrage, solange es keine Hierarchie mit / enthält.

Die htaccess ist beim Rewrite schon ganz abgespeckt bis auf:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?page=$1 [QSA]

Bisher hatte ich ListIt nur für Summaryansichten verwendet und noch nie die Detailansichten gebraucht. Merkwürdig...

Übersehe ich hier etwas?


CMSMS 1.11.9
ListIt2 1.4

Offline

#2 10. April 2014 16:17

PatriziaF
kennt CMS/ms
Ort: Altheim/Österreich
Registriert: 19. Januar 2011
Beiträge: 153
Webseite

Re: ListIt: Pretty-URL, Detail-URL und die Seitenhierarchie

hast du da eigentlich eine lösung dazu gefunden?

ich möchte gerne die nummer hinten nicht haben ;-)

Offline

#3 02. Februar 2016 11:23

rage_all
kennt CMS/ms
Ort: Augsburg
Registriert: 09. März 2011
Beiträge: 288

Re: ListIt: Pretty-URL, Detail-URL und die Seitenhierarchie

Mal den alten Thread wieder aus dem Keller holen...  big_smile

Ich sitze auch gerade über einem Projekt, wo es wenigstens cool wäre, die Nummer am Ende durch ein beliebiges Wort zu ersetzen, z.B.

  • gruppe1/eintrag1/60.htm » gruppe1/eintrag1/tolleurl.htm

  • gruppe1/eintrag2/60.htm » gruppe1/eintrag2/tolleurl.htm

  • gruppe1/eintrag3/60.htm » gruppe1/eintrag3/tolleurl.htm

  • gruppe2/eintrag1/60.htm » gruppe2/eintrag1/tolleurl.htm

Wird das in der .htaccess erstellt / aufgebaut / geändert (da hab ich vor etlichen Jahren mal was in der Art gemacht, aber finde die alte Datei nicht mehr...) oder im Modul? Ich glaube, die Nummer ist wichtig für das Modul, um herauszufinden, ob es sich um das Summary-Template, Detail-Template, etc. handelt - aber das müsste doch drehbar sein?

Vielen Dank für Eure Ideen!

Offline

#4 02. Februar 2016 15:03

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.437

Re: ListIt: Pretty-URL, Detail-URL und die Seitenhierarchie

Wie Du selbst erkannt hast:

Ich glaube die Nummer ist wichtig für das Modul um herauszufinden ob es sich um das Summary-Template, Detail-Template, etc. handelt

wird die URL genau deshalb nur vom Modul generiert. Du kannst mit .htaccess keine Pretty-URLs modellieren. Du kannst sie nur in "Un-Pretty" ändern, wenn sie beim Server eingehen.

Mit .htaccess kannst Du also lediglich festlegen, wie der Server eine irgendwie vom Modul generierte URL zu interpretieren hat.

D.h. aus dieser URL

wird dann durch .htaccess intern sowas wie z.B.

index.php?mact=News,cntnt01,default,0&cntnt01category=gruppe1&cntnt01articleid=eintrag1&cntnt01returnid=60

(ist ein fiktives Beispiel, also nagelt mich jetzt nicht darauf fest)

Damit könnte das CMS bzw. das Modul dann auch etwas anfangen.
Aber dazu müsste man unzählige Regeln erstellen. Für jedes Modul, für jede Modulaktion ...

Deshalb macht CMSms beim URL-rewriting folgendes:
Mit Hilfe dieser Regel in der .htaccess-Datei

RewriteRule ^(.+)$ index.php?page=$1 [QSA]

wird aus eingehenden URLs wie z.B.

das hier:

index.php?page=gruppe1/eintrag1/60.htm

Eine solche Seite gibt es im CMS natürlich nicht. Damit das trotzdem funktioniert, können Module beim CMS sogenannte Routen registrieren, die dem CMS sagen, was bei einer nicht existierenden Seite tatsächlich ausgeführt werden soll. Erst wenn vom CMS keine passende Route bzw. vom Modul kein passender Artikel gefunden wird, wird ein "404-Page not found"-Fehler zurückgegeben.
(Sollte eine Seite dennoch die gleiche URL haben, wie die Route eines Moduls, dann hat das Modul Vorrang. D.h. man wird die Seite nie unter ihrer eigenen URL aufrufen können - unabhängig davon, ob der Modul-Artikel existiert oder nicht.)

Soviel zur Theorie.

In der Praxis bedeutet dies, Du musst im PHP-Code des Moduls sowohl den Teil ändern, der diese Routen registriert, als auch alle Zeilen, in denen Links generiert werden. Das ist eine Menge Arbeit. Denn dass man das nur mit dieser URL-Pefix-Option hinbekommt, wage ich zu bezweifeln. (Glücklicherweise nutzt ListIt zum Generieren von Pretty-Links eine eigene zentrale Funktion, sodass man das nur an einer einzigen Stelle ändern müsste.)

Schau Dir dazu mal in Deiner ListIt2-Instanz die Datei "ListIt2[InstanzName].module.php" an. Speziell die Funktion "InitializeFrontend()". Dort steht sowas:

	// Archive
	$this->RegisterRoute('/'.$this->prefix.'\/archive\/(?P<filter_year>[0-9]+?)\/(?P<filter_month>[0-9]+?)\/(?P<returnid>[0-9]+)$/', array('action' => 'default'));
	//$this->RegisterRoute('/'.$this->prefix.'\/archive\/(?P<filter_year>[0-9]+?)\/(?P<filter_month>[0-9]+?)$/', array('action' => 'default', 'returnid' => $summarypage));
	$this->RegisterRoute('/'.$this->prefix.'\/archive\/(?P<filter_year>[0-9]+?)\/(?P<returnid>[0-9]+)$/', array('action' => 'default'));
	//$this->RegisterRoute('/'.$this->prefix.'\/archive\/(?P<filter_year>[0-9]+?)$/', array('action' => 'default', 'returnid' => $summarypage));
		
	// Pagination
	$this->RegisterRoute('/'.$this->prefix.'\/page\/(?P<pagenumber>[0-9]+?)\/(?P<pagelimit>[0-9]+)\/(?P<returnid>[0-9]+)$/', array('action' => 'default'));
	$this->RegisterRoute('/'.$this->prefix.'\/page\/(?P<pagenumber>[0-9]+?)\/(?P<returnid>[0-9]+)$/', array('action' => 'default'));
		
	// Hierarchy view		
	$this->RegisterRoute('/'.$this->prefix.'\/(?P<category>.+?)\/(?P<id_hierarchy>[0-9.]+)\/(?P<item>.+?)\/(?P<returnid>[0-9]+)$/', array('action' => 'detail'));
	$this->RegisterRoute('/'.$this->prefix.'\/(?P<category>.+?)\/(?P<id_hierarchy>[0-9.]+)\/(?P<returnid>[0-9]+)$/', array('action' => 'default', 'subcategory' => $subcategory));	
		
	// Singular		
	$this->RegisterRoute('/'.$this->prefix.'\/(?P<item>.+?)\/(?P<returnid>[0-9]+)\/(?P<detailtemplate>.+?)$/', array('action' => 'detail'));
	//$this->RegisterRoute('/'.$this->prefix.'\/(?P<item>.+?)\/(?P<detailtemplate>[a-zA-Z_-]+?)$/', array('action' => 'detail', 'returnid' => $detailpage));
	$this->RegisterRoute('/'.$this->prefix.'\/(?P<item>.+?)\/(?P<returnid>[0-9]+)$/', array('action' => 'detail'));	
	//$this->RegisterRoute('/'.$this->prefix.'\/(?P<item>.+?)$/', array('action' => 'detail', 'returnid' => $detailpage));

Da müsstest Du dich nur für das Registrieren der Routen durcharbeiten.

Und passend dazu müsstest Du in der Funktion "CreatePrettyLink()" in "ListIt2.module.php" für jede Aktion den Pretty-Link entsprechend abändern. Was allerdings bedeutet, dass andere ListIt-Instanzen nicht mehr richtig funktionieren würden, ohne die Routen dort auch nochmal von Hand zu ändern. Also sollte man vor dem Erstellen einer ListIt-Instanz, das Modul hinsichtlich der URLs grundlegend überarbeiten, damit alle Instanzen davon profitieren.

Irgendeine zumindest für den Webseitenbesucher völlig nichtssagende Information wird dabei aber immer im Link erhalten bleiben müssen. Wie z.B. die Return-ID oder die Template-ID etc. - also Sachen, die mit dem eigentlichen Inhalt zwar nichts zu tun haben, ohne die CMSms aber nicht weiß, wie der Inhalt angezeigt werden soll.

Die wirklich relevanten Informationen (Modul/Aktion/Artikel-ID) wirst Du damit aber auch nicht wirklich pretty hinbekommen. Denn die müssen im Link so bleiben wie sie sind. D.h. was Du versuchst, ist, die Informationen in der URL, die für den Webseitenbesucher absolut nichtssagend sind, mit Informationen zu ergänzen, die für das CMS absolut nichtssagend sind. Du willst also Datenmüll in die URL reinbringen, nur damit sie hübscher aussieht. Dabei wird sie dadurch aber unnötig komlexer, als sie ist. D.h. Du hast am Ende eine URL die alles, aber nur nicht pretty ist. Die ist dann ein Mischmasch aus für den Besucher nichtssagenden IDs und irgendwelchen für das CMS irrelevanten Schlagworten. (".../News/12/60/irgendwasTollesAberVölligSinnloses.html") Wäre ich eine Suchmaschine und würde davon Wind bekommen, würdest Du ratzfatz aus dem Index fliegen. Das ist im Prinzip klassischer Suchmaschinen-Spam. Das ist auch ein Grund, warum Keywords in der URL bei Suchmaschinen kaum noch Beachtung finden. Also kannst Du es auch sein lassen. Die Informationen in URLs sind nicht für den Webseitenbesucher gedacht. Die sind für den Server bzw. für das CMS.
(Dazu sei allerdings noch gesagt, dass Dich keine Suchmaschine wegen einem einzigen Keyword in der URL absägen würde, aber mir geht's erstmal nur ums grobe Prinzip.)

Was Du da vorhast, ist z.B. der Pretty-Trick beim CGUserDirectory-Modul. Dein "tolleurl.html" was Du da gerne am Ende stehen haben willst, hat absolut null Funktion. Das ist "junk". Zumindest für das CMS (wird im PHP-Code sogar explizit so genannt roll ). Ich könnte denselben Artikel auch mit "ganzBöseSchlagworteDieDichFürImmerAusDemGoogleIndexKicken.html" am Ende verlinken. Würde trotzdem funktionieren.
(Das Peinliche an dieser Stelle ist, dass selbst in einer regulären Seiten-URL für CMSms nur das Alias/die ID am Ende zählt. Alles andere - der komplette Pfad dorthin - ist Datenmüll. Da kann ich reinschreiben was ich will.)

Wenn Du wirklich tolle Pretty-URLs haben willst, musst Du das Modul komplett umschreiben. Es darf dann nicht mehr nach IDs in der Datenbank gesucht werden, sondern nach den Pfaden in der URL: "Kategorie+Subkategorie+...+Titel". Gleichzeitig müsste beim Erstellen von Artikeln darauf geachtet werden, dass kein Artikel mit dem gleichen Titel in derselben Kategorie erstellt werden kann. Weiterhin dürfen Parameter, die nichts mit der Referenzierung des Artikels zu tun haben (wie z.B. Return-ID oder Template-ID etc.) nicht mehr dynamisch sein (d.h. nicht mehr im Link mitgeschleift werden). Es müsste stattdessen dann für diese Parameter eine Einstellung im Modul bzw. für jeden Artikel einzeln geben, oder die Smarty-Parameter, müssen in einer Session gespeichert werden, damit diese Parameter auch seitenübergreifend erhalten bleiben, ohne im Link stehen zu müssen o.ä.

Glaub mir, richtige Pretty-URls sind mit einer ganze Menge mehr Arbeit verbunden, als einfach nur für das CMS sinnlose Schlagworte an den Link dranzuhängen, nur um es Deinem Kunden als "pretty-URL" verkaufen zu können. Denn die Suchmaschinen fallen darauf schon lange nicht mehr rein. Und dem Webseitenbesucher ist damit auch nicht wirklich geholfen, nur weil am Ende der Titel des Artikels steht. Denn die wirklich relevanten Informationen sind ja nicht die, die dem Besucher etwas sagen. Es sind die Ziffern in der URL (Artikel-ID, Return-ID, Template-ID), die generell niemandem außer dem CMS etwas sagen.


Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)

Offline

#5 02. Februar 2016 16:26

rage_all
kennt CMS/ms
Ort: Augsburg
Registriert: 09. März 2011
Beiträge: 288

Re: ListIt: Pretty-URL, Detail-URL und die Seitenhierarchie

Hu.  yikes
Okay, argumentativ ist dem wohl nichts mehr hinzuzufügen...
Vielen Dank für Deine Zeit und die ausführliche Erklärung - bestimmt kommen noch weitere 'Nachfragen' hierzu die hiermit wohl endgültig referenziert sind.

Die Infos die ich bislang bekommen hab gingen mehr in die Richtung "kannst Du schon machen, aber dann biste halt Kacke", bzw. aus älterer Zeit (2013) sogar ein Statement in Richtung von "wird in einer der nächsten Versionen gefixt" (forum.cmsmadesimple.org/viewtopic.php?f=7&t=67456) - wenn auch natürlich mit etwas anderen Details (CG-Module) drumherum.

Ich zeig dem Kunden Deine Antwort, falls er sie nicht aus meinem Mund glauben sollte. Dass eine Zahl in der URL stehen würde habe ich schon vorher gesagt und dass es unverhältnismäßig teuer werden könnte die loszuwerden ... entweder ich popel im try-and-error-Verfahren eine Woche daran herum oder jemand mit richtig viel Ahnung einen Tag ... die Kosten bleiben vermutlich annähernd dieselben.
Zu guter Letzt ist jede Änderung an den Kern-Dateien problematisch beim nächsten Update. Mir ist lieber ich hab alles auf Template-Ebene und bin auf "Vanille"-Code.

Und der Ganze Aufwand am Ende auch noch ohne einen echten Ertrag zu leisten? Ja, das ist eher bescheuert - da hast Du völlig Recht.

Dann widme ich mich lieber mal in der Zeit den Kategorien. Ich hab hier was in der Form von
Deutschland(Fillialen) » Bundesland » Stadt
So soll das sowohl grafisch als auch URL-mäßig abgebildet werden, wenn möglich. Bislang hab ich nur domain.de/fillialen/stadt/60.htm - sprich das Bundesland fehlt noch. Ich muss aber dazu sagen, dass ich mich noch nie wirklich mit ListIt2 auseinandergesetzt habe. Die Speisekarte war das erste richtige Projekt damit und da war eine Detailseite nicht nötig, bzw. sogar unerwünscht.
Und jetzt bin ich auch erst die erste Stunde drüber, also schau ich mal wie weit ich komme und melde mich mit einem konkreten Problem wenn eins kommt.  smile

Wieder einmal vielen Dank für Deine Zeit und einleuchtende Erklärung!

Offline