Bug: CMS_LINK Problem 4.4.1
Bug: CMS_LINK Problem 4.4.1
vielleicht bin ich ja heute etwas schlecht drauf, hab da aber 2 kleine probleme.
irgendwie schaffe ich es nicht einen gesetzten link wieder zu entfernen. wenn keiner eingetragen ist erscheint trotzdem der link auf das standard client root verzeichnis... tritt mit dem orginal CMS_LINK in con_type auf.
ist dies so beabsichtigt ? denke nicht...
Zwei Möglichkeiten:
1.
$tmp = $cfgClient[$client]["path"]["htmlpath"].$tmp;
ersetzen durch
$tmp = "http://".$tmp;
oder
2. die module welche bilder mit links verwenden ändern bei abfrage
if ("CMS_LINK[1]" != "http://")
in
if ("CMS_LINK[1]" != "Pfad des Client Verzeichnisses")
ich denke die erste variante ist empfehlenswert.
ne aktualisierte version findet ihr hier: http://contenido.de/forum/viewtopic.php?t=2101
weiters die änderung bei externer link wird nur übernommen wenn kein interner link ausgewählt ist (tritt vermutlich auch auf bei pdf, andere medien)
tja und dann noch ne frage: schon meinen letzten eintrag bei http://contenido.de/forum/viewtopic.php?p=9279#9279 gelesen ?
irgendwie schaffe ich es nicht einen gesetzten link wieder zu entfernen. wenn keiner eingetragen ist erscheint trotzdem der link auf das standard client root verzeichnis... tritt mit dem orginal CMS_LINK in con_type auf.
ist dies so beabsichtigt ? denke nicht...
Zwei Möglichkeiten:
1.
$tmp = $cfgClient[$client]["path"]["htmlpath"].$tmp;
ersetzen durch
$tmp = "http://".$tmp;
oder
2. die module welche bilder mit links verwenden ändern bei abfrage
if ("CMS_LINK[1]" != "http://")
in
if ("CMS_LINK[1]" != "Pfad des Client Verzeichnisses")
ich denke die erste variante ist empfehlenswert.
ne aktualisierte version findet ihr hier: http://contenido.de/forum/viewtopic.php?t=2101
weiters die änderung bei externer link wird nur übernommen wenn kein interner link ausgewählt ist (tritt vermutlich auch auf bei pdf, andere medien)
tja und dann noch ne frage: schon meinen letzten eintrag bei http://contenido.de/forum/viewtopic.php?p=9279#9279 gelesen ?
-
- Beiträge: 6284
- Registriert: Do 15. Mai 2003, 18:32
- Wohnort: Da findet ihr mich nie!
- Kontaktdaten:
mein Vorschlag:
Wenn der Link leer ist, wird nichts zurückgegeben, ansonsten ein HTTP-Präfix davor.
Code: Alles auswählen
/**
* CMS_LINK
*/
global $cfgClient;
global $client;
$tmp = urldecode($a_content["CMS_LINK"][$val]);
/* internal link */
if ( is_numeric($tmp) ) {
if ($contenido)
{
$tmp = $sess->url("front_content.php?idcatart=$tmp");
} else {
$tmp = "front_content.php?idcatart=$tmp";
}
} else {
if ($tmp != "")
{
if ((substr($tmp,0,6) != "mailto") && (substr($tmp,0,4) != "http"))
{
$tmp = "http://".$tmp;
}
} else {
$tmp = "http://";
}
}
tuts auch...
anmerkung:
ich hab mir die anderen cms_typen etwas angesehen
eine abfrage mit ($contenido) gibts dort nicht -> die wurden alle mit ($edit) geschrieben...
bei deiner variante wäre ein "../anyfile.html" nicht möglich -> würde zu http://../anyfile.html werden (ist zeitweise ganz praktisch)
was hälts du von meiner variante ? siehe oben...
anmerkung:
ich hab mir die anderen cms_typen etwas angesehen
eine abfrage mit ($contenido) gibts dort nicht -> die wurden alle mit ($edit) geschrieben...
bei deiner variante wäre ein "../anyfile.html" nicht möglich -> würde zu http://../anyfile.html werden (ist zeitweise ganz praktisch)
was hälts du von meiner variante ? siehe oben...
-
- Beiträge: 6284
- Registriert: Do 15. Mai 2003, 18:32
- Wohnort: Da findet ihr mich nie!
- Kontaktdaten:
nächster Vorschlag:
Wenn ein www. davor sitzt, wird auch das http-Protokoll angenommen, ansonsten wird der Link mit dem Pfad durchgereicht.
Code: Alles auswählen
/**
* CMS_LINK
*/
global $cfgClient;
global $client;
$tmp = urldecode($a_content["CMS_LINK"][$val]);
/* internal link */
if ( is_numeric($tmp) ) {
if ($contenido)
{
$tmp = $sess->url("front_content.php?idcatart=$tmp");
} else {
$tmp = "front_content.php?idcatart=$tmp";
}
} else {
if ($tmp != "")
{
if ((substr($tmp,0,6) != "mailto") && (substr($tmp,0,4) != "http"))
{
if ($substr($tmp,0,4) == "www.")
{
$tmp = "http://".$cfgClient[$client]["path"]["htmlpath"].$tmp;
}
}
} else {
$tmp = "http://";
}
}
eine aktualisierte version sollte es auf alle fälle noch in die 4.4.2 schaffen 
leere seite - als ergebnis + meldung im error.log
PHP Fatal error: Call to undefined function: () in e:\contenido_4.4.2\contenido\includes\functions.con.php(1383) : eval()'d code on line 24
ähm
1. nimm das $ bei zeile 24 raus...
2. mit korrigiertem $ krieg ich als url: http://http://localhost/cms/www.com.com
bringts irgendwie nicht...
die erste version
nimmt keine relativen links zb: anyfile.html bringt als url: ttp://anyfile.html ähm ja
nimm mal die -> die schluckt bis auf https alles:
abgesehen davon sind die url syntax (mehrzahl davon würd mich auch intressieren) festlegbar...
jede erdenkliche art von relativen links ist möglich
anker setzen wäre auch denkbar...
und wenn kein wert übergeben wird -> nur http:// zurückgeliefert
nur relative links müssten dann so aussehen ./anyfile.html -> ergibt
http://host/clienturl/anyfile.html
ich geb ja zu ./ ist nicht so elegant -> aber alle urls beginnen auch nicht mit www.
vielleicht 'ne kombination aus beiden möglichkeiten...

beim setzen eines links mit zb: www.com.comtimo hat geschrieben:ad. nächster Vorschlag
leere seite - als ergebnis + meldung im error.log
PHP Fatal error: Call to undefined function: () in e:\contenido_4.4.2\contenido\includes\functions.con.php(1383) : eval()'d code on line 24
ähm
1. nimm das $ bei zeile 24 raus...
2. mit korrigiertem $ krieg ich als url: http://http://localhost/cms/www.com.com
bringts irgendwie nicht...
die erste version
nimmt keine relativen links zb: anyfile.html bringt als url: ttp://anyfile.html ähm ja
nimm mal die -> die schluckt bis auf https alles:
abgesehen davon sind die url syntax (mehrzahl davon würd mich auch intressieren) festlegbar...
jede erdenkliche art von relativen links ist möglich
anker setzen wäre auch denkbar...
und wenn kein wert übergeben wird -> nur http:// zurückgeliefert
nur relative links müssten dann so aussehen ./anyfile.html -> ergibt
http://host/clienturl/anyfile.html
ich geb ja zu ./ ist nicht so elegant -> aber alle urls beginnen auch nicht mit www.
Code: Alles auswählen
/**
* CMS_LINK
*/
global $cfgClient;
global $client;
$tmp = urldecode($a_content["CMS_LINK"][$val]);
/* internal link */
if ( is_numeric($tmp) ) {
$tmp = "front_content.php?idcatart=". $tmp."&client=".$client."&lang=".$lang;
if ($edit) $tmp = $sess->url("$tmp");
} else {
if (!((substr($tmp,0,7) == "http://") |
(substr($tmp,0,7) == "mailto:") |
(substr($tmp,0,6) == "ftp://") |
(substr($tmp,0,3) == "../") |
(substr($tmp,0,2) == "./") |
(substr($tmp,0,1) == "/") |
(substr($tmp,0,1) == "#")) ) {
$tmp = "http://".$tmp;
}
}
-
- Beiträge: 6284
- Registriert: Do 15. Mai 2003, 18:32
- Wohnort: Da findet ihr mich nie!
- Kontaktdaten:
Ich hab das gestern mal zusammengeschrieben:
Wie ist deine Meinung dazu?- Wenn Inhalt numerisch ist, spezifiziert dies die Artikel-ID (idcatart)
- Wenn Inhalt textual ist und keine Protokollspezifikation enthält (z.b. http://), wird automatisch HTTP davor gesetzt, sofern der Link mit "www" beginnt (ermöglicht relative Links)
- Wenn Inhalt textual ist und eine Protokollspezifikation enthält (z.b. http://), wird der Link "as-is" zurückgegeben
- Wenn Inhalt leer, wird nur "http://" zurückgegeben (zur Kompatibilität mit alten Modulen)
guten morgen 
jetzt kommen wir aber zu dem lustigen part... (wenn du den link as-is zurück gibts wäre er relativ !!)
aber ne richtig saubere lösung wäre es zu überprüfen ob der string einer url entspricht (ich glaub ich hab mal ne funktion gesehen in contenido die genau das macht)
hier noch ein link dazu
http://www.zend.com/zend/spotlight/php- ... ation1.php
und das komplette script
http://www.zend.com/codex.php?id=453&single=1
ich schreib mein modul nochmals um...

okay, das wird auch so gemacht, der unterschied von meiner zu deiner version ist das bei mir $lang und $client mitübergeben wird... da gabs mal eine fehlermeldung nach dem wechsel der sprache...- Wenn Inhalt numerisch ist, spezifiziert dies die Artikel-ID (idcatart)
so wie du das umgesetzt hast wird der link aber absolut in die db geschrieben -> "http://".$cfgClient[$client]["path"]["htmlpath"]. wobei du das erste "http://" streichen musst,da der nächste teil nochmals ein http:// hinzufügt...- Wenn Inhalt textual ist und keine Protokollspezifikation enthält (z.b. http://), wird automatisch HTTP davor gesetzt, sofern der Link mit "www" beginnt (ermöglicht relative Links)
jetzt kommen wir aber zu dem lustigen part... (wenn du den link as-is zurück gibts wäre er relativ !!)
diese protokolle sollten aber alle definiert werden (ftp, http, mailto, gopher telnet...) ...ist okay- Wenn Inhalt textual ist und eine Protokollspezifikation enthält (z.b. http://), wird der Link "as-is" zurückgegeben
aber ne richtig saubere lösung wäre es zu überprüfen ob der string einer url entspricht (ich glaub ich hab mal ne funktion gesehen in contenido die genau das macht)
hier noch ein link dazu
http://www.zend.com/zend/spotlight/php- ... ation1.php
und das komplette script
http://www.zend.com/codex.php?id=453&single=1
okay- Wenn Inhalt leer, wird nur "http://" zurückgegeben (zur Kompatibilität mit alten Modulen)
ich schreib mein modul nochmals um...
okay ich hab jetzt ne neue version für CMS_LINK
hier der CODE:
diese version nimmt so ziemlich alles... relative, absolute, anker
und nur wenn $tmp gleich "www." oder $tmp leer ist wird ein http:// davor gesetzt... (jedoch subdomains zB search.aon.at werden noch immer ohne http:// angezeigt...)
bekannte protokoll typen werden dieser prüfung gar nicht unterzogen... und es ist kombatibel mit den alten modulen
zusätzlich könnte man dann noch überprüfen lassen ob der link noch ne gültigkeit hat bzw ob der server überhaupt vorhanden ist... aber das wäre vermutlich zuviel des guten (nicht mehr existente links als unavailable zu kennzeichnen)
tests mal...
hier der CODE:
Code: Alles auswählen
/**
* CMS_LINK
*/
global $cfgClient;
global $client;
$tmp = urldecode($a_content["CMS_LINK"][$val]);
/* internal link */
if ( is_numeric($tmp) ) {
$tmp = "front_content.php?idcatart=". $tmp."&client=".$client."&lang=".$lang;
if ($edit) $tmp = $sess->url("$tmp");
} else {
if (!preg_match('/^(http|https|ftp|mailto|telnet|gopher):\/\/((?:[a-zA-Z0-9_-]+\.?)+):?(\d*)/', $tmp)) {
// it's a relative link, or an absolute link with unsupported protocol
if (substr($tmp,0,4) == "www." || $tmp == "") { // only check if it could be a domainname
$tmp = "http://".$tmp;
}
}
}
und nur wenn $tmp gleich "www." oder $tmp leer ist wird ein http:// davor gesetzt... (jedoch subdomains zB search.aon.at werden noch immer ohne http:// angezeigt...)
bekannte protokoll typen werden dieser prüfung gar nicht unterzogen... und es ist kombatibel mit den alten modulen
zusätzlich könnte man dann noch überprüfen lassen ob der link noch ne gültigkeit hat bzw ob der server überhaupt vorhanden ist... aber das wäre vermutlich zuviel des guten (nicht mehr existente links als unavailable zu kennzeichnen)
tests mal...
-
- Beiträge: 6284
- Registriert: Do 15. Mai 2003, 18:32
- Wohnort: Da findet ihr mich nie!
- Kontaktdaten:
Klingt gut. Der Benutzer, der Links pflegt, muß eben über URI's bescheid wissen (eventuell baue ich dann noch einen Hinweis beim Link pflegen ein).emergence hat geschrieben: diese version nimmt so ziemlich alles... relative, absolute, anker
und nur wenn $tmp gleich "www." oder $tmp leer ist wird ein http:// davor gesetzt... (jedoch subdomains zB search.aon.at werden noch immer ohne http:// angezeigt...)
Grüße,
Timo
eine änderung gibts noch...
um ganz korrekt zu sein...
die zwei variablen zu beginn sind drausen (da sie nicht !! benötigt werden)
zusätzlich hab ich das mailto rausgenommen da die syntax dort sowieso eine andere ist -> mailto:any@name.com (und nicht mailto://any@name.com)
an der verhaltensweise ändert sich nichts
Code: Alles auswählen
/**
* CMS_LINK
*/
$tmp = urldecode($a_content["CMS_LINK"][$val]);
/* internal link */
if ( is_numeric($tmp) ) {
$tmp = "front_content.php?idcatart=". $tmp."&client=".$client."&lang=".$lang;
if ($edit) $tmp = $sess->url("$tmp");
} else {
if (!preg_match('/^(http|https|ftp|telnet|gopher):\/\/((?:[a-zA-Z0-9_-]+\.?)+):?(\d*)/', $tmp)) {
// it's a relative link, or an absolute link with unsupported protocol
if (substr($tmp,0,4) == "www." || $tmp == "") { // only check if it could be a domainname
$tmp = "http://".$tmp;
}
}
}
die zwei variablen zu beginn sind drausen (da sie nicht !! benötigt werden)
zusätzlich hab ich das mailto rausgenommen da die syntax dort sowieso eine andere ist -> mailto:any@name.com (und nicht mailto://any@name.com)
an der verhaltensweise ändert sich nichts
ich weiss es nicht genau, aber sollte dieser teil nicht in der 4.2.2 schon zu finden sein ?
dieses code schnippsel gehört in die tabelle con_type bei type cms_link
spalte code eingefügt... (ersetzt den beinhalteten code komplett)
die seiten im frontend müssten dann nur noch via &force=1 neu erzeugt werden...
versuch das mal dann schaun wir weiter...
dieses code schnippsel gehört in die tabelle con_type bei type cms_link
spalte code eingefügt... (ersetzt den beinhalteten code komplett)
die seiten im frontend müssten dann nur noch via &force=1 neu erzeugt werden...
versuch das mal dann schaun wir weiter...