zurück zur Startseite
  


Zurück XHTMLforum > Webentwicklung (außer XHTML und CSS) > Serveradministration und serverseitige Scripte
Seite neu laden PHP für den Druck: Link-URLs als Fußnoten ausgeben

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 15.10.2009, 00:54
Benutzerbild von AndreasB
Erfahrener Benutzer
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 29.11.2005
Beiträge: 1.391
AndreasB wird schon bald berühmt werden
Standard PHP für den Druck: Link-URLs als Fußnoten ausgeben

Per CSS
Code:
@media print { a[href^="http"]:after { content:" ("attr(href)")"; } }
kann man Links beim Druck direkt hinter dem Linktext ausgeben lassen.

Aber das stört den Lesefluss. Hässlich ist es allemal.

Besser wäre die Ausgabe der Links als Fußnoten.

Hinter jedem Link müsste dann, per PHP generiert, ein Fußnotenverweis stehen (fortlaufende Nummern in eckigen Klammern als seiteninterner Link).

Weiß jemand von einem solchen Skript?
Was haltet ihr von der Idee?
__________________

Mit Zitat antworten
Sponsored Links
  #2 (permalink)  
Alt 15.10.2009, 02:18
Benutzerbild von Pr0g
(^.^)
XHTMLforum-Mitglied
 
Registriert seit: 23.08.2005
Ort: Düsseldorf
Beiträge: 535
Pr0g wird schon bald berühmt werden
Standard

Hab mal nen kleines Beispiel gebastelt, meinst du es so in der Art?
PHP-Code:
<?php

// Links ermitteln
function get_link_references($content) {

  
// Linkliste muss global sein, damit auch die Callback Funktion Zugriff drauf
  // haben kann!
  
global $_glr_links;
  
$_glr_links = array();

  
// Callbackfunktion für die Linksuche
  
function _link_callback($data) {
    global 
$_glr_links;

    
// Link in die Liste einfügen
    
$_glr_links[] = array(
      
'id'   => count($_glr_links) + 1,
      
'url'  => $data[2],
      
'name' => $data[4]
    );

    
// HTML Code mit Linkverweis zurückgeben
    
return $data[0] . ' [' count($_glr_links) . ']';
  }

  
// Links suchen und mit Linkverweis ausstatten
  
$pattern '/<a(.*?)href="(.*?)"(.*?)>(.*?)<\/a>/is';
  
$content preg_replace_callback($pattern'_link_callback'$content);

  
// Daten zurückgeben
  
return array(
    
'content' => $content,
    
'links'   => $_glr_links
  
);
}


// Seiteninhalt aus Datenbank oder so
$content = <<< HTML_CONTENT
Dies ist ein Text mit ganz vielen Links für eine <a href="http://google.de">Suchmaschiene</a>, einer <a href="http://de.wikipedia.org">Enzyklop&auml;die</a> und einem <a href="http://youtube.com">Videoportal</a>...
HTML_CONTENT;

// Links finden, etwa bei der Druckansicht
$data get_link_references($content);

// Inhalt ausgeben
echo '<h1>Inhalt</h1>'
   
$data['content'];

// Links ausgeben
echo '<h1>Links</h1>'
   
'<ul>';
   
foreach (
$data['links'] as $link) {
  echo 
'<li>[' $link['id'] . ']: <a href="' $link['url'] . '">' $link['url'] . '</a> (' $link['name'] . ')</li>';
}

echo 
'</ul>';

?>
__________________
Mit Zitat antworten
Sponsored Links
  #3 (permalink)  
Alt 15.10.2009, 12:28
Benutzerbild von AndreasB
Erfahrener Benutzer
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 29.11.2005
Beiträge: 1.391
AndreasB wird schon bald berühmt werden
Standard

Zitat:
Zitat von Pr0g Beitrag anzeigen
Hab mal nen kleines Beispiel gebastelt, meinst du es so in der Art? [...]
Erstmal herzlichen Dank für den Entwurf.
Da ich nicht programmieren kann, kann ich zum Code nichts sagen.

Ich habe das Ziel jetzt mal sehr genau formuliert und auch den HTML-Code (vor dem Parsen, nach dem Parsen) als Beispiel aufgeführt:
Linkziele beim Druck ausgeben

Wird jetzt klar, was ich meine?

Das Skript soll für jederman absolut einfach einsetzbar sein. Ohne Datenbank oder Ähnliches.

Es geht ja darum, einen Usability-Mangel einer Standard-Aufgabe zu knacken: den Ausdruck von Webseiten.
__________________

Mit Zitat antworten
  #4 (permalink)  
Alt 15.10.2009, 23:19
Benutzerbild von Pr0g
(^.^)
XHTMLforum-Mitglied
 
Registriert seit: 23.08.2005
Ort: Düsseldorf
Beiträge: 535
Pr0g wird schon bald berühmt werden
Standard

Nur mit einer einzigen Zeile, welche einen PHP Code einbindet wirst du es wohl nicht schaffen, da der eigentliche Inhalt dem Script erstmal zugänglich gemacht werden muss.

Was man machen könnte. Zu Beginn der Datei einen PHP Code einbinden. Dieser startet dann einen Ausgabepuffer mit dem gearbeitet wird. Das würde gehen, doch auch da ist zumindest am Ende des Dokuments noch eine Zeile notwendig um den Puffer wieder auszugeben.
__________________
Mit Zitat antworten
  #5 (permalink)  
Alt 15.10.2009, 23:44
{ display: random;}
XHTMLforum-Kenner
 
Registriert seit: 08.09.2004
Ort: Stuttgart
Beiträge: 5.034
andir ist ein wunderbarer Anblickandir ist ein wunderbarer Anblickandir ist ein wunderbarer Anblickandir ist ein wunderbarer Anblickandir ist ein wunderbarer Anblickandir ist ein wunderbarer Anblick
Standard

Andreas, deine Idee ist sehr gut, PrOG, dein Ansatz ebenfalls, funktioniert!

Ich kann selbst nichts proggen mein Namensvetter offenbar auch nicht , daher folgende Anregung:

Was bei Dir jetzt HTML-Content heißt, muss eine Referenz auf die aufrufende Datei enthalten. Ich stelle mir das so vor:

Bei Aktivieren eines Druck-Buttons oder Schriftzugs wird, sagen wir, eine "druck.php" aufgerufen. Diese macht folgendes:

1. Ermitteln der aufrufenden Seite, also jene, die gedruckt werden soll (referrer-url als Variable?)
2. Auslesen des Contentbereichs
a) Bei Datenbanklösungen wohl mit Hilfe der Content-ID oder wie immer das gelöst ist.
b) bei "statischen Webseiten" mit Start-Stop-Zeichen, etwa in Form von "startcontent" und "endcontent", jeweils in HTML-Kommentare verpackt.

Der Inhalt wird mittels fopen() (nur als Beispiel)ausgelesen und dann von deinem Skript ausgewertet.
Dass das geht, davon gehe ich aus nur weiß ich nicht, wie.
Kannst Du eine Funktion vorschlagen für das Auslesen von statischem Content (mit Start-Stopp-Zeichen) ? *** ganz lieb guck***
Weitere Frage: Die php-Anfrage erzeugt wohl einen http-request. Beeinflusst dieser die Performance (eher nicht, meiner Vermutung nach) oder das Logfile?

Vorteil dieser Methode wäre, dass die ganzen Dinge, die man sonst per print.css ausblenden/rausschmeißen muß wie Navigation oder Header, von vorneherein nicht da wären....

Edit II: Noch ein Andreas Willkommen im Club
__________________
Grüsse Andreas- auch mal wieder da...

Design isn't about the tools, it's about creating the best experience for the user. A design should be based on usability, accesibility, aesthetics, but never on floats, lists or background images. ( by Cameron Adams)
Wiedergelesen: > hier und hier

[Foren-Links] Dein Post? Klar, DAS vorher gelesen? Hilft. ## User-Landkarte

Geändert von andir (15.10.2009 um 23:49 Uhr) Grund: Typo
Mit Zitat antworten
  #6 (permalink)  
Alt 16.10.2009, 00:11
Benutzerbild von AndreasB
Erfahrener Benutzer
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 29.11.2005
Beiträge: 1.391
AndreasB wird schon bald berühmt werden
Standard

Zitat:
Zitat von Pr0g Beitrag anzeigen
Nur mit einer einzigen Zeile, welche einen PHP Code einbindet wirst du es wohl nicht schaffen, da der eigentliche Inhalt dem Script erstmal zugänglich gemacht werden muss.
Hhmm.
Alles was ich hier sage, bitte unter dem Vorbehalt werten, dass es von einem Nicht-Programmierer kommt.

In dem von mir sehr geschätzten fertig bereitstehenden Skript für das Erzeugen eines Inhaltsverzeichnisses *
macht sich das Skript auch den Inhalt zugänglich.
Ist vielleicht aus diesem Skript etwas verwendbar?

* Es entstand übrigends auch durch ein Konzept, welches ich ausgearbeitet hatte. Nach etwa einem Jahr entdeckte ein Programmierer (Stefan Fröhlich) die Idee und sie gefiel ihm.
Heraus kam das IMHO hervorragende, sehr einfach und dennoch vielseitig nutzbare Skript.
Der Anwender muss nix tun, als einen Verweis auf's Include einfügen. Fertig.

@Andir
Freut mich, dass Dir die Idee gefällt.

Mir schwebt aber tatsächlich vor, dass das Skript seinen Nutzen entfaltet, wenn der Nutzer den Standardweg für den Druck geht.
Einfach über das Menü des Browsers.

Es gibt noch einen Grund, warum ich an dem Konzept hänge.
Das Skript soll Leuten dienen, die (wie wir) nicht programmieren können, jedoch HTML+CSS beherrschen.
"pimp2print" sollte völlig ohne PHP-Kenntnisse nutzbar sein. 1 Minute Lesen "So wird es eingefügt" sollte genügen.

In einer künftigen Evolutionsstufe (also in etwa 42 Jahren beherrschen hoffentlich Browser solche grundlegenden Fähigkeiten wie "Links beim Druck vernünftig ausgeben".
__________________

Mit Zitat antworten
  #7 (permalink)  
Alt 16.10.2009, 01:30
Benutzerbild von Pr0g
(^.^)
XHTMLforum-Mitglied
 
Registriert seit: 23.08.2005
Ort: Düsseldorf
Beiträge: 535
Pr0g wird schon bald berühmt werden
Standard

Hmpf, ich hab vorhin vom Puffer geredet und gemeint man müsste am Ende noch eine Zeile benötigen um die Rückgabe des Puffers anzustoßen...gar nicht dran gedacht, dass dies zum Ende sowieso automatisch geschieht -.-

Hab das Script nochmal angepasst:
a.php
PHP-Code:
<html>
<head>
<style type="text/css" media="screen">
.linknummer, .linkziele{ display: none; }
</style>
<?php include 'b.php'?>
</head>
<body>

<p>Lorem<a href="http://ipsum.de">ipsum</a>doloret.</p>
<p>Adipisit<a href="http://sed.de">sed</a>consectutur.</p>
<p>Ut<a href="#enim">enim</a>minimim.</p>

</body>
</html>
b.php (ich mag inc als Extension für ein PHP Script nicht^^):
PHP-Code:
<?php

// Links ermitteln
function get_link_references($content) {

  
// Linkliste muss global sein, damit auch die Callback Funktion Zugriff drauf
  // haben kann!
  
global $_glr_links;
  
$_glr_links = array();

  
// Callbackfunktion für die Linksuche
  
function _link_callback($data) {
    global 
$_glr_links;

    
// Eigenen Server anfügen
    
if (strpos($data[2], 'http://') === false) {
      
$data[2] = 'http://' $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . '/' $data[2];
    }

    
// Link in die Liste einfügen
    
$_glr_links[] = $data[2];

    
// HTML Code mit Linkverweis zurückgeben
    
return $data[0] . '<span class="linknummer">{' count($_glr_links) . '}</span>';
  }

  
// Links suchen und mit Linkverweis ausstatten
  
$pattern '/<a(.*?)href="(.*?)"(.*?)>(.*?)<\/a>/is';
  
$content preg_replace_callback($pattern'_link_callback'$content);

  
// Linkliste erzeugen
  
$link_list '<div class="linkziele">' "\n"
             
'  <h4 id="linkziele">Linkziele</h4>' "\n"
             
'  <ol>' "\n";
  foreach (
$_glr_links as $url) {
    
$link_list .= '    <li>' $url '</li>' "\n";
  }
  
$link_list .= '  </ol>'
              
'</div>';

  
// Linkliste vor </body> setzen
  
$content str_replace('</body>'$link_list '</body>'$content);

  return 
$content;
}

// Puffer starten mit Callback
ob_start('get_link_references');
?>
__________________
Mit Zitat antworten
  #8 (permalink)  
Alt 16.10.2009, 02:50
Benutzerbild von AndreasB
Erfahrener Benutzer
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 29.11.2005
Beiträge: 1.391
AndreasB wird schon bald berühmt werden
Standard

Zitat:
Zitat von Pr0g Beitrag anzeigen
Hab das Script nochmal angepasst: [...]
Ganz herzlichen Dank.

Ich habe ein Testcase geschrieben: http://borumat.de/html/pimp2print

Sieht schon gut aus.

Der seiten-interne Link
Code:
http://borumat.de/html/#sed
stimmt nicht. Es muss heißen:
Code:
http://borumat.de/html/pimp2print#sed
Ähnlich sieht es bei den site-internen Links aus.

Fällt Dir dazu eine Lösung ein?

Du schreibst: "Linkliste muss global sein"
Hat das eventuell Auswirkung auf andere Skripte, die auf die gleiche Seite angewendet werden?
Muss man irgendwas Besonderes beachten, wenn Dein Skript mit anderen zusammen benutzt wird?

Zwei Issues konnte ich noch entdecken:

1
Man kann bestimmte Links per Print-CSS (display:none) ausblenden.
Im Testcase: ul.nav
Das Skript berücksichtigt erwartungsgemäß auch diese Links beim Zählen. So ergeben sich "Lücken".
Und die URLs erscheinen in der Liste der Linkziele, obwohl sie unerwünscht sind.

2
Bei manchen Typen von Links, im Testcase sind es Fußnotenverweise, möchte man im Druck, dass sie nicht als Link erscheinen.
Auch bei solchen Typen von Links möchte man weder, dass sie den Zähler hochsetzen, noch dass sie in der Liste "Linkziele" aufgeführt werden.

Gibt es einen Weg, das Skript "CSS auswerten zu lassen"?

Wie auch immer man die zwei Aufgaben löst: ich denke, dass es sehr wichtig ist, Links auf elegante Weise von der Behandlung durch das Skript ausschließen zu können.

Eine Bitte bezüglich des Markups:
Es ist besser, wenn SPAN class="linknummer" innerhalb des A-Elementes stünde und nicht dahinter.
Könntest Du das Skript bitte entsprechend anpassen? Danke.

Eure Meinung zu einem Detail des Markups interessiert mich noch:
Halte ihr es für nützlich, wenn die Linkziele statt als OL als UL mit den Nummern in geschweiften Klammern aufgeführt werden? Generierten Inhalt unterstützen ja Browser nicht zuverlässig. Und für die Nummern in OL ist es eh unmöglich, sie per content-before und content-after mit geschweiften Klammern auszustatten.
__________________


Geändert von AndreasB (16.10.2009 um 10:45 Uhr)
Mit Zitat antworten
  #9 (permalink)  
Alt 16.10.2009, 11:58
Benutzerbild von David
auch, ja!
XHTMLforum-Kenner
 
Registriert seit: 08.11.2007
Beiträge: 2.626
David ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer Anblick
Standard

wäre diese Aufgabe nicht eher was für JavaScript?
__________________
github | http://dnaber.de
Mit Zitat antworten
Sponsored Links
  #10 (permalink)  
Alt 16.10.2009, 12:48
Benutzerbild von AndreasB
Erfahrener Benutzer
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 29.11.2005
Beiträge: 1.391
AndreasB wird schon bald berühmt werden
Standard

Zitat:
Zitat von David Beitrag anzeigen
wäre diese Aufgabe nicht eher was für JavaScript?
Ich halte den Zweck (hohe Qualität der Druckausgabe) für zu hochrangig, also ihn von einer willkürlichen Einstellung im Client abhängen zu lassen.
__________________

Mit Zitat antworten
Sponsored Links
Antwort

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
CSS Navigationsproblem thesecretboy CSS 0 12.04.2007 09:12
Problem mit komplexem Menü Chellisa CSS 2 09.01.2007 18:16
PHP: der Mailfunktion einen Link mitsenden NEOX Serveradministration und serverseitige Scripte 2 31.10.2006 13:11
Sidebarlänge dem Content anpassen?! Pumpkin CSS 2 14.03.2006 18:21
xhtml 1.0 nicht Valid wegen Php link? Finrod (X)HTML 3 04.08.2005 16:19


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:57 Uhr.