Seite 2 von 17
Verfasst: Fr 7. Jan 2005, 11:50
von timo
hmm komisch, bei mir wird gar nichts ersetzt...hast du einen snapshot aus der 4.5er serie genommen?
Verfasst: Fr 7. Jan 2005, 11:54
von stese
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.
Verfasst: Fr 7. Jan 2005, 11:58
von timo
okay, den Fehler habe ich gefunden.
Änderungen: Leerzeichen werden mit "_" ersetzt, die Umlaute werden jetzt ordentlich ersetzt.
Verfasst: Fr 7. Jan 2005, 12:00
von stese
leerzeichen bitte mit einem normalen - ersetzen, weil _ in suchmaschinen nicht als worttrenner erkannt werden
beispiel: eine suchmaschine findet aus
hier_ist_text = hieristtext
hier-ist-text = hier ist text
genauso sollten einige andere zeichen noch übersetzt werden:
/ -> -
& -> -
+ -> -
etc ...
Verfasst: Fr 7. Jan 2005, 12:04
von timo
ok, habe ich auch geändert.
Alle anderen Zeichen werden entfernt. Hast du noch weitere Zeichen?
Verfasst: Fr 7. Jan 2005, 12:08
von stese
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);
Verfasst: Fr 7. Jan 2005, 12:13
von timo
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:
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);
}
Die Funktion werde ich aber bei Gelegenheit nochmal umbauen, ist ein wenig unschön, daß jedes Zeichen einzeln geprüft wird.
Verfasst: Fr 7. Jan 2005, 12:27
von stese
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.
Verfasst: Fr 7. Jan 2005, 12:41
von timo
ähm ganz einfach...die front_content.php nimmt den parameter path - und über diesen wird aufgelöst.
über folgenden Parameter:
Code: Alles auswählen
/* If true, use the field "urlname" for resolving. "name" otherwise */
$cfg["urlpathresolve"] = false;
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.
Verfasst: Fr 7. Jan 2005, 15:04
von cyaneo
timo hat geschrieben:Aber was der Site-Implementor immer noch selbst machen muß und nie abbgekommen wird: mod_rewrite entsprechend seinen Wünschen einrichten.
Eine Idee wäre, wenn man eine vorgefertigte .htaccess beifügt (bei MD-Pro z.B. ist das sehr hilfreich)
Verfasst: Fr 7. Jan 2005, 15:05
von timo
cyaneo hat geschrieben:Eine Idee wäre, wenn man eine vorgefertigte .htaccess beifügt (bei MD-Pro z.B. ist das sehr hilfreich)
Keine schlechte Idee...
problemchen
Verfasst: Di 18. Jan 2005, 16:47
von martin2002
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:
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
... 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)
Problem mit der Erweiterung in 4.4.5
Verfasst: Di 15. Feb 2005, 13:09
von AKesler
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
Verfasst: Mi 16. Feb 2005, 12:16
von stese
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:
Code: Alles auswählen
// replace umlaut with websafe characters
$str_new_name = preg_replace($arr_original, $arr_replace, $str_original_name);
durch diese ersetzen:
Code: Alles auswählen
// replace umlaut with websafe characters
$str_new_name = @preg_replace($arr_original, $arr_replace, $str_original_name);
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.
Verfasst: Mi 16. Feb 2005, 13:09
von timo
Ich vermute, daß die Funktion preg_replace einfach einen falschen RegExp-Suchstring bekommt...schaut da einfach mal nach...