#1 Drucken von einzelnen Forum-Beiträgen von Wolfgang 17.12.2008 16:42

avatar

Hallo Florian,
ist es möglich einzelne Forum-Beiträge ausdrucken zu lassen?

Ich habe ein Script gefunden, dass einem Drucker-Button im Browser entspricht.
Hier wird allerdings die komplette Seite ausgedruckt.

Frage:
Kann man ein Beitrag mit einem Druck-Anfang (Marke) und einem Druck-Ende (Zielanker) markieren, wodurch das Script den Druckbereich erkennt?
Oder besteht die Möglichkeit einen bestimmten Bereich mit der Maus zu markieren und diesen dann auszudrucken?
Oder welche Möglichkeiten gibt es?


Hier das Script:

<script language="JavaScript" type="text/javascript">
function tmt_print() {
if (document.all) {
var OLECMDID_PRINT = 6;
var OLECMDEXECOPT_DONTPROMPTUSER = 2;
var OLECMDEXECOPT_PROMPTUSER = 1;
var WebBrowser = "<OBJECT ID='WebBrowser1' WIDTH=0 HEIGHT=0 CLASSID='CLSID:8856F961-340A-11D0-A96B-00C04FD705A2'></OBJECT>";
document.body.insertAdjacentHTML("beforeEnd", WebBrowser);
WebBrowser1.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_PROMPTUSER);
WebBrowser1.outerHTML = "";
} else {
self.print();
}
}
</script>



Hier der Link zum Auslösen:

<a href="#" onClick="javascript:print(this.document)">Drucken</a>




Mit besten Dank im Voraus
Gruß
Wolfgang



#2 RE: Drucken von einzelnen Forum-Beiträgen von florian-zier 19.12.2008 20:11

avatar
Wolfgang!

Zitat von Wolfgang
Kann man ein Beitrag mit einem Druck-Anfang (Marke) und einem Druck-Ende (Zielanker) markieren, wodurch das Script den Druckbereich erkennt?

Solche Markierungen wären evtl. durch ein weiteres Skript möglich, ist aber umständlich.

Zitat von Wolfgang
Oder besteht die Möglichkeit einen bestimmten Bereich mit der Maus zu markieren und diesen dann auszudrucken?

Diese Möglichkeit besteht in den gängigsten Webbrowsern.
Datei -> Drucken... - dann "Markierung" anstatt "Alles"

Zitat von Wolfgang
Oder welche Möglichkeiten gibt es?


Es gibt eigentlich eine einfache Möglichkeit, nur bestimmte Elemente drucken zu lassen.
Ein Muster-Beispiel wäre meine Homepage.
Dazu ist auch ein eigener Webspace nötig (oder sonstiger Datei-Hoster).

Wie vielleicht schon bekannt, werden externe Style-Sheets folgendermaßen eingebettet:
<link rel="stylesheet" type="text/css" href="style.css" />


Zusätzlich gibt es nun das Attribut "media":
<link rel="stylesheet" type="text/css" href="style.css" media="all" />

Dieser Artikel beschäftigt sich mit den Angaben, die "media" unterstützen kann.

Durch das neue Attribut kann eine zweite CSS-Datei definiert werden, welche die Style-Eigenschaften für den Druck enthält:
<link rel="stylesheet" type="text/css" href="style.css" media="all" />
<link rel="stylesheet" type="text/css" href="print.css" media="print" />

In dieser neuen Datei sollten nun z.B. alle nicht zu druckenden Elemente (DIVs, SPANs, etc. ...) ausgeblendet und evtl. auch der Rahmen um den zu druckenden Inhalt entfernt oder eben gesetzt werden.

Um nicht einen eigenen Webspace bemühen zu müssen, ist es wahrscheinlich durch diese alternative Einbaumethode möglich, die CSS-Datei im Forum direkt zu hacken und diese dann um Print-Angaben zu ergänzen.
#3 RE: Drucken von einzelnen Forum-Beiträgen von Wolfgang 02.02.2009 18:45

avatar


Hallo Florian,
ich habe hier einiges versucht, aber nicht hinbekommen.
Wenn es funktioniert, bekomme ich immer die ganze Seite.. Seiten ausgedruckt.

Wie währe es denn, wenn man den Druckbereich auf den reinen Beitrag "{{message:text}}" beschränkt.
Aber wie bindet man "{{message:text}}" in das Script ein .

Hast Du hier eine Lösung?

Gruß
Wolfgang

#4 RE: Drucken von einzelnen Forum-Beiträgen von florian-zier 11.02.2009 21:32

avatar

Hallo Wolfgang,
ich habe nun einmal eine noch nicht ganz fertige Version hier im Forum eingebaut.
Rechts oben bei den Beiträgen (Flat-Ansicht) gibt es nun einen Druckbutton.
Im Firefox funktioniert es schon ganz gut.
Nur der IE spielt wieder nicht so ganz mit.
Aber für heute ist nun Schluss.

Mit den CSS-Angaben funktioniert es wohl doch nicht so ganz, sorry für die Falsch-Angabe.
Zumindest wäre es, wenn überhaupt, wohl doch ziemlich kompliziert und umständlich.
Die JavaScript-Funktion window.print() druckt nur die gesamte Seite, bzw. sie ruft eigentlich nur den Druck-Dialog auf.
Die im Moment beste und einzige Möglichkeit ist wohl, das Gewollte zu extrahieren, in eine neue Seite einzufügen und diese dann auszudrucken.

Beachte:
Möglicherweise blockiert ein Popup-Blocker das sich öffnende Fenster.

#5 RE: Drucken von einzelnen Forum-Beiträgen von Wolfgang 11.02.2009 23:37

avatar

Hallo Florian,
erst mal ein großes Dankeschön .

Im FF funktioniert es wirklich super.

Gruß
Wolfgang

#6 RE: Drucken von einzelnen Forum-Beiträgen von florian-zier 12.02.2009 21:33

avatar

Wolfgang,
ich habe nun in Firefox UND IE gute Test-Ergebnisse erzielt.
Testen kannst du es wieder rechts oben in der Flat-Ansicht.

Ich habe Prototypen einer Style- und Script-Unterstützung eingebaut, die im Moment aktiv sind.
Wahrscheinlich lassen sich diese aber nicht mehr (viel) verbessern.
Im Firefox lässt sich die Seite im Style der Foren-CSS darstellen.
Der IE bietet eine etwas nicht vollendete Skript-Unterstützung an.
Spoiler sind anfangs z.B. aufgeklappt, durch Klicken kann man sie dann aber zur normalen Funktionsweise bewegen.
Style im IE und Scripts im Firefox sind jedoch nicht möglich gewesen. Da haben die Browser wohl unterschiedliche Ansichten.

Insgesamt gibt es eine ganze Palette eigener Anpassungen.
Es kann z.B. nur der Text selbst, oder aber auch Username und Titelzeile (wie im Moment) dazu gedruckt werden.
Der Druck-Dialog kann nach dem Seitenaufruf automatisch aufgerufen werden.
Und es lässt sich ein eigener Fehlertext bei fehleranfällign Aktionen (z.B.: Button an falscher Position) setzen.


Den Quelltext werde ich bald nachposten.
Anbei aber noch die Frage, ob die eigenen Anpassungen oben im Skript vorgenommen werden, oder im Funktionsaufruf durch den Button integriert werden sollen.
Beim Funktionsaufruf durch den Button kann das selbe Skript z.B. in Flat anders als in Threaded ausgeführt werden, nur der Aufruf durch den Button muss verändert werden.
Falls ich vorher keine Rückmeldung habe, poste ich einfach einen Quelltext, bei dem das Skript flexibel durch den Funktionsaufruf im Button ist.

#7 RE: Drucken von einzelnen Forum-Beiträgen von florian-zier 13.02.2009 11:22

avatar
Hallo Wolfgang,
ich habe gerade zwischendurch noch ein wenig Zeit gefunden und das Skript zum Einbau umgeschrieben.
Der Aufruf wird nun im Button/Link festgelegt.


Das Skript besteht aus einer Funktion, die innerhalb der Head-Tags eingefügt werden muss:
<script language="javascript" type="text/javascript">
function PrintMessage(me, ForenNr, PrintDialog, ActivateStyles, ActivateScripts, MessageOnly, pButton, Tabellenrand, Ebenen, optionalScriptJS, Fehlertext) {
//Bsp. zum Aufruf:
//PrintMessage(this, 123484, true, true, true, false, true, 2, 7, 'http://server.de/extern/scripts.js', 'Fehler beim Erstellen der Druckvorschau!');
var SelectBorders = me;
for (i=1; i<Ebenen; i++) {
SelectBorders = SelectBorders.parentNode;
}
try {
var abort = 0;
MessageText = SelectBorders;
do {
MessageText = MessageText.nextSibling;
abort++;
} while(MessageText.nodeName.toLowerCase() != "TR".toLowerCase() && abort < 100);
if (abort >= 100) {
alert(Fehlertext);
return;
}
}
catch(e) {
alert(Fehlertext);
return;
}
var KlonBorder = SelectBorders.cloneNode(true);
var KlonMessage = MessageText.cloneNode(true);
var ParaString = 'toolbar=yes,location=no,directories=yes,status=no,menubar=yes,scrollbars=yes,resizable=yes'; //WIDTH=800,HEIGHT=600
newWin = window.open('','PrintMessage', ParaString);
newWin.document.clear();
newWin.document.open();
// newWin.document.writeln('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">');
// newWin.document.writeln('<html xmlns="http://www.w3.org/1999/xhtml">');
newWin.document.writeln('<html>');
newWin.document.writeln('<head>');
newWin.document.writeln('<title>PrintMessage</title>');
if (ActivateStyles == true) {
newWin.document.writeln('<link rel="stylesheet" type="text/css" href="http://'+ForenNr+'.homepagemodules.de/style.css">');
}
if (ActivateScripts == true && (navigator.userAgent.toLowerCase()).indexOf("MSIE".toLowerCase()) > -1) {
newWin.document.writeln('<'+'scr'+'ipt type="text/Javascript" src="http://'+ForenNr+'.homepagemodules.de/script.js"><'+'/scr'+'ipt>');
if (optionalScriptJS != "") {
newWin.document.writeln('<scr'+'ipt language="JavaScript" src="'+optionalScriptJS+'" type="text/javascript"></scr'+'ipt>');
}
}
newWin.document.writeln('</head>');
newWin.document.writeln('<body>');
newWin.document.writeln('</body>');
newWin.document.writeln('</html>');
newWin.document.close();
// newWin.document.focus();
var newTable = document.createElement("table");
newTable.setAttribute("border", Tabellenrand);
newTable.setAttribute("align", "center");
if (MessageOnly == false) {
newTable.appendChild(KlonBorder);
}
newTable.appendChild(KlonMessage);
if ((navigator.userAgent.toLowerCase()).indexOf("MSIE".toLowerCase()) > -1) {
// newWin.document.body.innerHTML = newTable.outerHTML;
newWin.document.body.insertAdjacentHTML("BeforeEnd", newTable.outerHTML);
}
else {
newWin.document.getElementsByTagName("body")[0].appendChild(newTable);
}
if (pButton == false) {
newWin.document.getElementById("printButton").style.display = "none";
}
if (PrintDialog == true) {
newWin.print();
}
}
</script>





In den Template-Elementen Thread-Flat und Thread-Threaded erfolgt der Einbau:
als Link...:
<a href="#" onClick="PrintMessage(this, 123484, true, true, true, false, true, 2, 7, 'http://server.de/extern/scripts.js', 'Fehler beim Erstellen der Druckvorschau!');" id="printButton" name="printButton">Drucken</a>

...oder Button:
<button id="printButton" type="button" name="printButton" onMouseDown="PrintMessage(this, 123484, true, true, true, false, true, 2, 7, 'http://server.de/extern/scripts.js', 'Fehler beim Erstellen der Druckvorschau!');">Drucken</button>




Die geeignetste Stelle erscheint mir vor oder nach der Stelle mit dem Antwort-Link rechts oben:
{{openlink.start}}{{global_quote_answer==true.start}}<a href="{{message:quotelink}}"{{can_reply==false.start}} onClick="return hpm_openDialog('{{message:quotelink}}');"{{can_reply==false.end}}>{[thread_message_quote]}</a> &middot; {{global_quote_answer==true.end}}<a href="{{message:replylink}}"{{can_reply==false.start}} onClick="return hpm_openDialog('{{message:replylink}}');"{{can_reply==false.end}}>{[thread_message_reply]}</a>{{openlink.end}}
{{closelink.start}}{[thread_message_reply_close]}{{closelink.end}}
{{thread_open==1.openlink.closelink}}





Der Funktionsaufruf:
PrintMessage(me, ForenNr, PrintDialog, ActivateStyles, ActivateScripts, MessageOnly, pButton, Tabellenrand, Ebenen, optionalScriptJS, Fehlertext)




Beispiele (Variable = BspWert; //Kommentar):

ForenNr = 123484;					// Foren-Nummer
PrintDialog = true; // Druck-Dialog automatisch öffnen
ActivateStyles = true; // Aktiviert Stylesheets des Forums (nicht IE)
ActivateScripts = true; // Aktiviert Scripts des Forums (nur IE)
MessageOnly = false; // Nur den Textinhalt ausgeben
pButton = true; // Drucken-Button angezeigt lassen
Tabellenrand = 2; // Randstärke der neu generierten Tabelle
Ebenen = 7; // 7: Ebene des Beitrag-Rahmens (User-Info/Titel)
optionalScriptJS = 'http://server.de/extern/scripts.js' // otionale Script-Url (ansonsten '')
Fehlertext = 'Fehler beim Erstellen der Druckvorschau!' // Text bei Fehler

Die Variable Ebenen gibt an, wie viele Knoten nach oben gesprungen werden müssen, um den Rahmen des Beitrages zu erhalten.
Wird der Button in der Titelzeile (evtl. auch unter der User-Info) eingebaut, dann ist der Wert 7.
Der 7. Knoten nach oben ist ein "TR", in welchem die "TD"s für User-Info und Titelzeile liegen.
Je nach Einbauposition muss der Wert sonst verändert werden.
Er garantiert keine völlige Flexibilität, ermöglicht aber evtl. dennoch die Position leicht zu verändern.
Das Skript springt von diesem "TR" automatisch zum nächsten, welches den Beitragstext enthält.
Nun wird ein neues Tabellen-Tag generiert, in welchem die beiden "TR"s wieder eingeordnet werden um eine gewohnte Darstellung zu erzeugen.
Besitzt die Variable "MessageOnly" den Wert "true", dann wird darauf verzichtet, User-Info und Titelzeile in die neu generierte Tabelle aufzunehmen.

#8 RE: Drucken von einzelnen Forum-Beiträgen von 69magic 24.03.2009 18:58

avatar

Hallo Florian,

eine sehr interessante Funktion. Ich habe versucht sie in mein Test-Forum einzubauen, hat aber leider nicht funktioniert. Ich komme lediglich bis zum

Fehler beim Erstellen der Druckvorschau!

Das habe ich gemacht:

Im Template Obere Leiste habe ich das Script eingebaut und die Foren-Nr. geändert.
Im Template Thread Flat habe ich den Aufruf eingebaut und auch die Foren-Nr. geändert.

Was habe ich übersehen ?

Gruß
Klaus

#9 RE: Drucken von einzelnen Forum-Beiträgen von florian-zier 25.03.2009 16:49

avatar
Hallo 69magic,
es könnte verschiedene Gründe haben,warum es nicht funktioniert.
Ich werde versuchen, den Fehler etwas einzugrenzen.
Falls es dann immer noch nicht funktioniert, poste mal bitte den Link zum Testforum und ob es in mehreren (& welchen) Browsern vorkommt.

Anmerkung:
Im Skript muss eigentlich nicht die Foren-Nummer eingetragen/verändert werden.
Wenn es dabei um die Zeile nach "Bsp. zum Aufruf" geht, dann ist das nur ein auskommentiertes Beispiel, welches sowieso nicht ausgeführt wird.

• Ist ein Doctype im Forum gesetzt? (Wenn ja, funktioniert's dann ohne?)
Es ist manchmal schwer, Skripte für die HPM-Foren zum Laufen zu bekommen.
Meistens ist kein Doctype gesetzt und deshalb sind die Skripte auch so, dass sie ohne funktionieren können)
• Ist das eigentliche Skript wirklich zwischen den Head-Tags?
(inkl. "<script type=...")

• Versuche mal im Funktionsaufruf "ActivateStyles" und "ActivateScripts" mit "False" zu übergeben.
• Evtl. stören andere eingebaute Skripte im Forum
• Stimmt der Wert der Variable "Ebenen"?
Der Button/Link muss rechts oben bei antworten in der gleichen Tabellenzelle sitzen.
(Standard-Wert für Ebenen: 7, Template stark verändert?)
Die Position in der Zelle sollte aber egal sein. (Vor oder nach edit, Zitat, antworten, ...)
In der linken Spalte hat es, glaube ich, auch funktioniert, also unter Usernamen und Userbild.
Bei veränderter Einbau-Position oder stark verändertem Template ist es u.U. möglich,
das Skript mit dem Verändern des Variablen-Werts wieder lauffähig zu bekommen.
• Übergebe testweise keinen bzw. leeren Wert für "optionalScriptJS"


Evtl. hilft es auch, die Anleitung nochmals zu befolgen.
Vielleicht fallen beim erneuten Durcharbeiten etwaige Fehlerquellen auf.

Ansonsten wünsche ich noch viel Glück beim weiteren herumprobieren!
#10 RE: Drucken von einzelnen Forum-Beiträgen von 69magic 25.03.2009 18:40

avatar

Hallo Florian,

danke für Deine Mühe. Ich hatte leider eine dumme Vorgehensweise gewählt. Jetzt habe ich alle Templates auf Standard zurückgesetzt und es funktioniert.

Hätte ich gleich machen sollen, dann hätte ich Dich nicht belästigen müssen. Ich habe in meinen Foren die Buttons Antworten, Zitieren etc. unterhalb vom Beitrag, daher hat es anscheinend nicht funktioniert.

Jetzt muss ich nur noch herausfinden, warum es in meinem aktiven Template nicht geht.

Gruß
Klaus

#11 RE: Drucken von einzelnen Forum-Beiträgen von florian-zier 25.03.2009 19:13

avatar

Hallo 69magic, das passt schon!

Um nochmal auf das Problem zurückzukommen.
Es wird an der Tabellenstruktur liegen, wenn in deinem aktiven Template die Links unterhalb des Beitrages eingefügt worden sind.

Das Skript "springt" zwischen den HTML-Tags hoch und weiter.
Die Variable "Ebenen" bietet zwar eine Anpassungsmöglichkeit, jedoch nur in sehr geringem Umfang.
Wenn die Struktur verändert worden ist, dann funktionieren diese "Sprünge" eben nicht mehr.
Daran wird es liegen.

#12 RE: Drucken von einzelnen Forum-Beiträgen von 69magic 26.03.2009 08:59

avatar

Hallo Florian,

der Aufruf funktioniert jetzt auch mit meinem abgeänderten Template "Thread Flat".

Ich musste die Anzahl der Ebenen auf 3 reduzieren. Allerdings sieht die Druckausgabe noch nicht so aus, wie die Message auf meinem Bildschirm. Ich werde mich wohl das Script auf meine Bedürfnisse abändern müssen. Dürfte nach Deiner tollen Vorlage nicht so schlimm werden.

Gruß
Klaus

Xobor Forum Software von Xobor
Einfach ein eigenes Forum erstellen
Datenschutz