[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/seourls/event/listener.php on line 213: Undefined array key "FORUM_NAME"
Externe Links > neue Seite - REDAXO Forum
Hallo,

Wir haben in letzter Zeit festgestellt, dass die Kommunikation via Slack viel schneller und zielführender ist als ein Beitrag im Forum. Aufgrund der neuen und besseren Möglichkeiten der Kommunikation haben wir uns entschlossen das Forum nur noch als Archiv zur Verfügung zu stellen. Somit bleibt es weiterhin möglich hier nach Lösungen zu suchen. Neue Beiträge können nicht mehr erstellt werden.

Wir empfehlen, für deine Fragen/Probleme Slack zu nutzen. Dort sind viele kompetente Benutzer aktiv und beantworten jegliche Fragen, gerne auch von REDAXO-Anfängern! Slack wird von uns sehr intensiv und meistens "rund um die Uhr" benutzt :-)
Selbst einladen kannst Du dich hier: https://redaxo.org/slack/
Benutzeravatar
Solander
Beiträge: 115
Registriert: 15. Apr 2007, 00:58
Wohnort: Konstanz
Kontaktdaten: Website

Externe Links > neue Seite

25. Okt 2007, 18:26

Hallo,

der Titel sagt eigentlich schon alles. Mein Auftraggeber will, dass externe Links in einer neuen Seite geöffnet werden. Ist das irgendwie mit textile umzusetzten?

Benutzeravatar
Koala
Beiträge: 1612
Registriert: 3. Okt 2005, 13:20

25. Okt 2007, 19:58

Mit Hilfe eines kleinen Hacks und etwas JavaScript geht das.
Ich habe gerade etwas dazu fertig gestellt.
Bereite die Daten nur noch schnell auf und werd sie dann veröffentlichen.
<?php print $Footer; ?>

Sven

Ich würde ja die Welt verändern,
doch der Quellcode ist mir zu absurd!


REX 5 :: Tricks und Tipps
REX 5 :: Modulesammlung

Wiki zu Redaxo 3 und 4 (!nur noch im Webarchiv!)

Benutzeravatar
Koala
Beiträge: 1612
Registriert: 3. Okt 2005, 13:20

25. Okt 2007, 22:36

Die Implementierung für verlinkte Grafiken hat mich etwas aufgehalten.
Hier nun die Lösung:

Wiki::Textile - Hyperlinks in neuem Fenster öffnen

Getestet mit REDAXO 4.0 und Textile-AddOn 1.0 (gehöhrt zum Redaxopacket).
<?php print $Footer; ?>

Sven

Ich würde ja die Welt verändern,
doch der Quellcode ist mir zu absurd!


REX 5 :: Tricks und Tipps
REX 5 :: Modulesammlung

Wiki zu Redaxo 3 und 4 (!nur noch im Webarchiv!)

chris-b
Beiträge: 84
Registriert: 23. Aug 2006, 11:54
Kontaktdaten: Website

26. Okt 2007, 08:12

Hallo Sven

ich hab mich ja noch nicht wirklich mit R4 auseinandergesetzt und von Textile kenn ich nur den Namen und dass es eine Alternative zu TinyMCE ist. Aber wenn ich Deine Lösung (den im Wiki beschriebenen Hack) richtig verstehe, wird die Umsetzung u.a. durch ein in das Template einzubindende JS realisiert.

Die eigentliche Lösung des Problems ist also in das Frontend geschoben. Und da wird dann statt dass Redaxo direkt reinen HTML-Code erzeugt (<a href=... target="_blank">) erst noch JS zwischengeschoben.

Ich krieg immer Anfälle wenn ich auf Webseiten stoße, die mit Java Sachen realisieren, die mit Bordmitteln (HTML/CSS) bereits gelöst sind.

Gibt es überhaupt eine realistische Chance, so ein Problem mit Textile ohne JS im Frontend zu lösen?

Danke und Gruß
Christoph

Thorsten
Beiträge: 29
Registriert: 21. Nov 2005, 13:44

26. Okt 2007, 08:55

Hi Solander,
hier noch mal eine nicht ganz xml saubere Lsg.
Den Code der Klasse (class.textile.inp.php) wie folgt anpassen (function flink Codezeile 765-788)

Code: Alles auswählen

  function fLink($m)
  {
    list(, $pre, $atts, $text, $title, $url, $slash, $post, $tail) = $m;

    $atts = $this->pba($atts);
    $atts .= ($title != '') ? ' title="' . $this->encode_html($title) . '"' : '';

    if (!$this->noimage)
      $text = $this->image($text);

    $text = $this->span($text);
    $text = $this->glyphs($text);

    $url = $this->shelveURL($url.$slash);

    $out = '<a href="' . $url . '"' . $atts . $this->rel . ' target="blank" >' . trim($text) . '</a>' . $post;

    if (($pre and !$tail) or ($tail and !$pre))
      $out = $pre.$out.$tail;

    // $this->dump($out);
    return $this->shelve($out);

  }


Achtung: durch das Einfügen des target="blank" wird das Ergebnis zwar Richtig interpretiert ist aber nicht mehr xml valide. Desweiteren werden ALLE externen Links in einem neuen Fenster geöffnet. - dafür ohne JS.

Gruß Thorsten

Benutzeravatar
Peter.Bickel
Beiträge: 1856
Registriert: 25. Jan 2005, 21:17
Wohnort: Schleswig-Holstein
Kontaktdaten: Website

26. Okt 2007, 10:23

Ich mach's immer so (s.u., ganz zu Beginn ins Template schreiben). Die Lösung ist nicht von mir, ich hab das irgendwo aus dem Forum oder dem Downloadbereich, weiß aber nicht mehr, wo.

Auch hier wird JS verwendet, aber ich bevorzuge diesen Weg definitiv angesichts der Tatsache, dass target=_blank nicht Xhtml-valide ist. Erstens kenne ich niemanden, der JS ausgeschaltet hat, und zeitens bekommt der die Links dann halt nicht im neuen, sondern im gleichen Fenster - ist ja nicht schlimm. Bei mir wird auch noch eine Klasse "extern" zugewiesen, so dass man externe Links mit CSS kennzeichnen kann.

Gegenüber Thorstens Ansatz hat meine Lösung de Vorteil, dass man nicht im Core rumfummeln muss (Updatefähigkeit).

Code: Alles auswählen

<?
// -------------------------------------------------------
// Kennzeichnung Externe Links
if (!$REX['REDAXO'])
 rex_register_extension('OUTPUT_FILTER', 'rex_external_links');
	
 function rex_external_links($params) {
  $content = $params['subject'];
		
  // hier via regEx alle absoluten, externen Linkadressen heraussuchen
		preg_match_all("/<a[^>]*(href\s*=\s*(\"|')(http(s)?|ftp(s)?|telnet|irc)(?=:\/\/).*?(\"|'))[^>]*>(.*?)<\/a>/ims",$content,$matches);

  // doppelte links rausschmeissen
  $matches[1] = array_unique($matches[1]);

  // hier jetzt alle gefundenen durchgehen und erweitern
  if ( isset ($matches[0][0]) and $matches[0][0] != '') {
   for ($m = 0; $m < count ($matches[0]); $m++) {
    $external_link = "";

    // hier jetzt anhängen: javascript für neues Fenster, class für Kennzeichnung
    $external_link .= $matches[1][$m].' onclick="window.open(this.href); return false;" class="extern"';

    // alte Links mit den modifizierten ersetzen:
    if(strpos($matches[0][$m],'onclick="window.open(this.href); return false;"') === false) {
     $content = str_replace($matches[1][$m],$external_link,$content);
    }
   }
  }
  return $content;
 }
?>
Grüße,
Peter.

Benutzeravatar
Solander
Beiträge: 115
Registriert: 15. Apr 2007, 00:58
Wohnort: Konstanz
Kontaktdaten: Website

26. Okt 2007, 21:41

pbickel: dein Teil habe ich auch schon versucht, aber irgendwie wurden dann alle Links (auch die Seiteninternen) in einem neuen Fenster geöffnet..

@ die anderen, danke, werde ich mal versuchen!

Benutzeravatar
Peter.Bickel
Beiträge: 1856
Registriert: 25. Jan 2005, 21:17
Wohnort: Schleswig-Holstein
Kontaktdaten: Website

27. Okt 2007, 10:06

Solander hat geschrieben:pbickel: dein Teil habe ich auch schon versucht, aber irgendwie wurden dann alle Links (auch die Seiteninternen) in einem neuen Fenster geöffnet..
Sollte aber nicht passieren; bei mir klappt das. Es sei denn, Du hast Deine Navigationen so programmiert, dass Du http mit reingsetzt hast.

Viele Grüße,
Peter.

Benutzeravatar
Koala
Beiträge: 1612
Registriert: 3. Okt 2005, 13:20

31. Okt 2007, 14:11

chris-b hat geschrieben:Die eigentliche Lösung des Problems ist also in das Frontend geschoben. Und da wird dann statt dass Redaxo direkt reinen HTML-Code erzeugt (<a href=... target="_blank">) erst noch JS zwischengeschoben.
Zwei Dinge sollte man dazu beachten.
1. egal welche der Lösungen hier eingesetzt werden, sie sind alle nicht XHTML-Strict tauglich (Textile selbst hat sich aber zum Ziel gesetzt, eben diesem Standard gerecht zu werden)
2. hast du die Wahl, den Code leicht wartbar zu halten (durch Verwendung der JS-Variante) oder bei Updates die Änderungen ständig neu in den Code einbringen zu müssen (siehe Antwort von Thorsten)

chris-b hat geschrieben:Ich krieg immer Anfälle wenn ich auf Webseiten stoße, die mit Java Sachen realisieren, die mit Bordmitteln (HTML/CSS) bereits gelöst sind.
... und ich krieg immer Anfälle wenn jemand JavaScript mit java verwechselt (auch wenn es nicht so gemeint war) :-(
Der Vorteil der JS-Variante liegt aber eindeutig darin, dass sie selbst bei abgeschaltetem JS in behindertgerecht eingerichteten Browsern (mit XHTML-Strict geforderter Einstellung) ohne Probleme funktionieren wird (hoffe ich zumindest).
<?php print $Footer; ?>

Sven

Ich würde ja die Welt verändern,
doch der Quellcode ist mir zu absurd!


REX 5 :: Tricks und Tipps
REX 5 :: Modulesammlung

Wiki zu Redaxo 3 und 4 (!nur noch im Webarchiv!)

Benutzeravatar
Peter.Bickel
Beiträge: 1856
Registriert: 25. Jan 2005, 21:17
Wohnort: Schleswig-Holstein
Kontaktdaten: Website

31. Okt 2007, 14:41

Sehe ich genauso.
Es wäre nicht weiter schwierig, in den Redaxokern einen Schalter einzubauen, über den man einstellen könnte, dass alle externen Links in einem neuen Fenster geöffnet werden oder nicht. Aber wozu, wenn diese Option nicht mehr vom W3-Konsortium unterstützt wird, also aussterben wird?

Die Ersetzung bei der Frontend-Ausgabe ist m.E. die flexibelste Lösung. Und wenn Du keine XHTML-konforme JS-Lösung bevorzugst, kannst Du ja meine Funktion so umformulieren, dass ein target=_blank statt des JS-Aufrufs ausgegeben wird.

Auch eine Verwendung des Output-Filter-Addon wäre übrigens denkbar.

Viele Grüße,
Peter.

Benutzeravatar
Thomas.Blum
Entwickler
Beiträge: 5063
Registriert: 24. Aug 2004, 22:11
Wohnort: Dresden
Kontaktdaten: Website

31. Okt 2007, 17:32

Hej,
pbickel hat geschrieben:Aber wozu, wenn diese Option nicht mehr vom W3-Konsortium unterstützt wird, also aussterben wird?
sie wird momentan nicht unterstützt aber im Konsortium wird darüber schon noch diskustiert.

vg Thomas

Zurück zu „Allgemeines [R4]“