Advanced Mod Rewriting Contenido 4.4.4
ja den hier:
http://www.contenido.de/snapshots/conte ... 06.tar.bz2
ich hab z.b. eine Kategorie namens "Über den wolken" angelegt und da kommt im Alias "berdenWolken" raus - das is leider nich so gut.
Und wenn ich einen Artikel anlegen möchte, kann ich dort keinen Alias auswählen, wie es aber gerade bei vielen artikeln in einer Kategorie sehr sinnvoll ist.
und wie ich das ganze system nun dazu bringe, die urls auch schön zu schreiben hab ich noch nich rausgefunden - pathresolver var ist auf true gesetzt, aber die hat ja nix mit der umwandlung aus front_content.php in den schönen namen zu tun.
http://www.contenido.de/snapshots/conte ... 06.tar.bz2
ich hab z.b. eine Kategorie namens "Über den wolken" angelegt und da kommt im Alias "berdenWolken" raus - das is leider nich so gut.
Und wenn ich einen Artikel anlegen möchte, kann ich dort keinen Alias auswählen, wie es aber gerade bei vielen artikeln in einer Kategorie sehr sinnvoll ist.
und wie ich das ganze system nun dazu bringe, die urls auch schön zu schreiben hab ich noch nich rausgefunden - pathresolver var ist auf true gesetzt, aber die hat ja nix mit der umwandlung aus front_content.php in den schönen namen zu tun.
nein, ich glaube das wars. meine funktion schaut so aus:
Code: Alles auswählen
$arr_original = Array("/Ä/","/ä/","/Ö/","/ö/","/Ü/","/ü/","/ß/","/ /","/&/","/\//","/\\/","/\+/");
$arr_replace = Array("Ae","ae","Oe","oe","Ue","ue","ss","-","-","-","-","-");
// replace umlaut with websafe characters
$str_new_name = preg_replace($arr_original, $arr_replace, $str_original_name);
// remove non validating characters in urls
$str_new_name = preg_replace("/([^a-zA-Z0-9-_\.~])/i", "", $str_new_name);
-
- Beiträge: 6284
- Registriert: Do 15. Mai 2003, 18:32
- Wohnort: Da findet ihr mich nie!
- Kontaktdaten:
ja ich habe das ein wenig anders gelöst...
es gibt zusätzlich eine Funktion capiStrReplaceDiacritics, die alle Diakritiken (http://de.wikipedia.org/wiki/Diakritisches_Zeichen) entfernen soll (Stand Heute aber nur Umlaute im ISO-8859-1 Charset kann). Danach werden die von dir vorgeschlagenen Änderungen gemacht und am Schluß alles ersetzt, was nicht in A-Za-Z0-9 vorhanden ist:
Die Funktion werde ich aber bei Gelegenheit nochmal umbauen, ist ein wenig unschön, daß jedes Zeichen einzeln geprüft wird.
es gibt zusätzlich eine Funktion capiStrReplaceDiacritics, die alle Diakritiken (http://de.wikipedia.org/wiki/Diakritisches_Zeichen) entfernen soll (Stand Heute aber nur Umlaute im ISO-8859-1 Charset kann). Danach werden die von dir vorgeschlagenen Änderungen gemacht und am Schluß alles ersetzt, was nicht in A-Za-Z0-9 vorhanden ist:
Code: Alles auswählen
function capiStrCleanURLCharacters ($sString, $bReplace = false)
{
$sString = capiStrReplaceDiacritics($sString);
$sString = str_replace(" ", "-", $sString);
$sString = str_replace("/", "-", $sString);
$sString = str_replace("&", "-", $sString);
$sString = str_replace("+", "-", $sString);
$iStrLen = strlen($sString);
for ($i=0; $i < $iStrLen; $i++)
{
$sChar = substr($sString, $i, 1);
if (preg_match('/^[a-z0-9]*$/i', $sChar) || $sChar == "-" || $sChar == "_" || $sChar == ".")
{
$sResultString .= $sChar;
} else {
if ($bReplace == true)
{
$sResultString .= "_";
}
}
}
return ($sResultString);
}
Code: Alles auswählen
function capiStrReplaceDiacritics ($sString, $sourceEncoding = "ISO-8859-1", $targetEncoding = false)
{
/* If the target encoding isn't set, use source encoding */
if ($targetEncoding == false)
{
$targetEncoding = $sourceEncoding;
}
/* Replace regular german umlauts */
$sString = str_replace("ä", "ae", $sString);
$sString = str_replace("ö", "oe", $sString);
$sString = str_replace("ü", "ue", $sString);
$sString = str_replace("Ä", "Ae", $sString);
$sString = str_replace("Ö", "Oe", $sString);
$sString = str_replace("Ü", "Ue", $sString);
$sString = str_replace("ß", "ss", $sString);
/* TODO: Additional converting */
return ($sString);
}
ja die diakritischen zeichen haben mir auch kopfzerbrechen gemacht, daher hab ich die erstmal weggelassen, weil mir noch keine gute lösung auf die schnelle eingefallen ist, wie ich das sauber lösen kann.
nun musst du mir nur noch verraten, wie ich im aktuellen snapshop die modrewrite urls aktiviere, weil das hab ich bisher scheinbar übersehen.
nun musst du mir nur noch verraten, wie ich im aktuellen snapshop die modrewrite urls aktiviere, weil das hab ich bisher scheinbar übersehen.
-
- Beiträge: 6284
- Registriert: Do 15. Mai 2003, 18:32
- Wohnort: Da findet ihr mich nie!
- Kontaktdaten:
ähm ganz einfach...die front_content.php nimmt den parameter path - und über diesen wird aufgelöst.
über folgenden Parameter:
in der config.misc.php (bitte in der config.local.php überschreiben, damit die Werte bei einem Update bleiben) kannst du dann festlegen, daß das Feld "urlname" verwendet werden soll.
über folgenden Parameter:
Code: Alles auswählen
/* If true, use the field "urlname" for resolving. "name" otherwise */
$cfg["urlpathresolve"] = false;
-
- Beiträge: 76
- Registriert: Mi 5. Jan 2005, 19:42
- Wohnort: Das findet ihr sowieso nicht, weils so klein ist...
- Kontaktdaten:
Eine Idee wäre, wenn man eine vorgefertigte .htaccess beifügt (bei MD-Pro z.B. ist das sehr hilfreich)timo hat geschrieben:Aber was der Site-Implementor immer noch selbst machen muß und nie abbgekommen wird: mod_rewrite entsprechend seinen Wünschen einrichten.
**************************************************
Gruss
cyaneo
Zen Cart - The Art of e-Commerce
--------------------------------------------------------------------------------
Wenn jeder dem anderen helfen wollte, wäre allen geholfen.
--------------------------------------------------------------------------------
Ein Problem ist halb gelöst, wenn es klar formuliert ist.
**************************************************
Gruss
cyaneo
Zen Cart - The Art of e-Commerce
--------------------------------------------------------------------------------
Wenn jeder dem anderen helfen wollte, wäre allen geholfen.
--------------------------------------------------------------------------------
Ein Problem ist halb gelöst, wenn es klar formuliert ist.
**************************************************
-
- Beiträge: 41
- Registriert: Fr 31. Okt 2003, 02:16
- Wohnort: Potsdam
- Kontaktdaten:
problemchen
bei der version die stese für das url-rewriting verfasst hat sind mir ein paar probleme aufgefallen...
spaw entfernt ja bei relativen pfaden, die eingefügt werden das voranstehende "/" (wenn man eins hinschreibt)... was aber nötig ist, wenn man bei einer url: www.domain.de/kategorie/ z.b. auf den upload ordner zugreifen will (eg. /cms/upload/datei.jpg)
es wird also stattdessen /kategorie/cms/upload/datei.jpg aufgerufen, was ja so nicht existiert...
mal nen lösungsvorschlag:
... ist einzufügen in die front_content.php
achso ich hab nochwas eingebaut:
im original wurde nur erkannt. ich habs so erweitert, dass um das = auch mehrere leerzeichen und tabs stehen können (siehe code)
spaw entfernt ja bei relativen pfaden, die eingefügt werden das voranstehende "/" (wenn man eins hinschreibt)... was aber nötig ist, wenn man bei einer url: www.domain.de/kategorie/ z.b. auf den upload ordner zugreifen will (eg. /cms/upload/datei.jpg)
es wird also stattdessen /kategorie/cms/upload/datei.jpg aufgerufen, was ja so nicht existiert...
mal nen lösungsvorschlag:
Code: Alles auswählen
// stese edit - 050106 - mod_rewrite engine
ob_start();
eval("?>\n".$code."\n<?php\n");
$str_all = ob_get_contents();
ob_end_clean();
// mod rewrite is activated
if ( $cfg['mod_rewrite']['use'] == 1 ) {
// ok let it beginn, start mod rewrite class
$mr = new ModRewrite();
$str_all = preg_replace("/href[ ]*=[ ]*[\"|\']front_content\.php(.?|.+?)[\"|\']/ie", "'href=\"'.ModRewrite::build_new_url('\\1').'\"'", $str_all);
// edit by krelli
$matches = array();
preg_match_all("/(src[ ]*=[ ]*[\"|\']([^\"\']*)[\"|\'])|(<link[^>]*href[ ]*=[ ]*[\"|\']([^\"\']*)[\"|\'])/i",$str_all,$matches,PREG_SET_ORDER);
foreach ($matches as $match) {
if (substr($match[2],0,1)!="/")
$str_all = str_replace($match[2],"/".$match[2],$str_all);
}
// end-edit
}
print ($str_all);
// end edit stese
achso ich hab nochwas eingebaut:
im original wurde nur
Code: Alles auswählen
href="{link}"
Planung ist die Ersetzung des Zufalls durch den Irrtum
Problem mit der Erweiterung in 4.4.5
Ich habe die Erweiterung in der Versoin 4.4.5 implementiert und erhalte folgende Fehlermeldung beim Anlegen eines Artikels:
No ending delimiter '/' found in /srv/www/htdocs/test5/contenido/classes/class.modrewrite.php on line 39
Was kann hier das Problem sein?
Besten Gruß
Andreas
No ending delimiter '/' found in /srv/www/htdocs/test5/contenido/classes/class.modrewrite.php on line 39
Was kann hier das Problem sein?
Besten Gruß
Andreas
ja is mir auch schon aufgefallen - ist recht seltsam, da er das bemängelt aber trotzdem ausführt was er machen soll.
die für den fehler verantwortliche funktion ersetzt einen / durch ein - im websicheren namen, da ja ein / als verzeichnistrenner reserviert ist.
abhilfe schafft vorerst auf die schnelle, bis ich eine bessere lösung gefunden habe folgender kleiner kniff:
datei class.modrewrite.php öffnen (liegt in contenido/classes/), methode create_websafe_name() suchen und dann folgende zeile:
durch diese ersetzen:
weiteres kommt dann, wenn ich den fehler besser lokalisieren konnte und besser vorhersagen kann warum der auftritt, da es recht seltsam ist, dass er ja einen fehler ausspuckt, aber dennoch das korrekte ergebnis liefert.
die für den fehler verantwortliche funktion ersetzt einen / durch ein - im websicheren namen, da ja ein / als verzeichnistrenner reserviert ist.
abhilfe schafft vorerst auf die schnelle, bis ich eine bessere lösung gefunden habe folgender kleiner kniff:
datei class.modrewrite.php öffnen (liegt in contenido/classes/), methode create_websafe_name() suchen und dann folgende zeile:
Code: Alles auswählen
// replace umlaut with websafe characters
$str_new_name = preg_replace($arr_original, $arr_replace, $str_original_name);
Code: Alles auswählen
// replace umlaut with websafe characters
$str_new_name = @preg_replace($arr_original, $arr_replace, $str_original_name);