Advanced Mod Rewriting Contenido 4.4.4

timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo » Fr 7. Jan 2005, 11:50

hmm komisch, bei mir wird gar nichts ersetzt...hast du einen snapshot aus der 4.5er serie genommen?

stese
Beiträge: 1040
Registriert: Fr 3. Dez 2004, 17:47
Wohnort: München
Kontaktdaten:

Beitrag von stese » Fr 7. Jan 2005, 11:54

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.

timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo » Fr 7. Jan 2005, 11:58

okay, den Fehler habe ich gefunden.

Änderungen: Leerzeichen werden mit "_" ersetzt, die Umlaute werden jetzt ordentlich ersetzt.

stese
Beiträge: 1040
Registriert: Fr 3. Dez 2004, 17:47
Wohnort: München
Kontaktdaten:

Beitrag von stese » Fr 7. Jan 2005, 12:00

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 ...

timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo » Fr 7. Jan 2005, 12:04

ok, habe ich auch geändert.

Alle anderen Zeichen werden entfernt. Hast du noch weitere Zeichen?

stese
Beiträge: 1040
Registriert: Fr 3. Dez 2004, 17:47
Wohnort: München
Kontaktdaten:

Beitrag von stese » Fr 7. Jan 2005, 12:08

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);

timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo » Fr 7. Jan 2005, 12:13

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.

stese
Beiträge: 1040
Registriert: Fr 3. Dez 2004, 17:47
Wohnort: München
Kontaktdaten:

Beitrag von stese » Fr 7. Jan 2005, 12:27

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.

timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo » Fr 7. Jan 2005, 12:41

ä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.

cyaneo
Beiträge: 76
Registriert: Mi 5. Jan 2005, 19:42
Wohnort: Das findet ihr sowieso nicht, weils so klein ist...
Kontaktdaten:

Beitrag von cyaneo » Fr 7. Jan 2005, 15:04

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)
**************************************************
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.
**************************************************

timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo » Fr 7. Jan 2005, 15:05

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...

martin2002
Beiträge: 41
Registriert: Fr 31. Okt 2003, 02:16
Wohnort: Potsdam
Kontaktdaten:

problemchen

Beitrag von martin2002 » Di 18. Jan 2005, 16:47

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

Code: Alles auswählen

href="{link}"
erkannt. ich habs so erweitert, dass um das = auch mehrere leerzeichen und tabs stehen können (siehe code)
Planung ist die Ersetzung des Zufalls durch den Irrtum ;-)

AKesler
Beiträge: 23
Registriert: Di 15. Jun 2004, 11:51
Kontaktdaten:

Problem mit der Erweiterung in 4.4.5

Beitrag von AKesler » Di 15. Feb 2005, 13:09

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

stese
Beiträge: 1040
Registriert: Fr 3. Dez 2004, 17:47
Wohnort: München
Kontaktdaten:

Beitrag von stese » Mi 16. Feb 2005, 12:16

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.

timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo » Mi 16. Feb 2005, 13:09

Ich vermute, daß die Funktion preg_replace einfach einen falschen RegExp-Suchstring bekommt...schaut da einfach mal nach...

Gesperrt