Verze pro tisk
Školení, která pořádám
Často je potřeba vytvořit speciální verzi stránky pro tisk. Podle mě je nejelegantnější zařídit to přes speciální tiskový styl, používám to koneckonců i na těchto stránkách. Dá se namítnout, že uživatel může chtít vytisknout stránku přesně tak, jak vypadá, a když z ní v tiskovém stylu např. ořízneme navigaci, tak tu stránku už uvidí jinak. Zadavatel webu také může chtít speciální tiskovou verzi třeba kvůli náhledu před tiskem (přestože prohlížeče tuto funkci již obsahují).
Jak tedy na to, když je potřeba vytvořit zvláštní stránku pro tisk? Já do svých skriptů vkládám soubor design.inc.php
, který obsahuje dvě funkce – page_header
a page_footer
. Přímo se nabízí umístit vytvoření tiskové verze do tohoto souboru:
<?php
function page_header($title) {
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="cs">
<head>
<title><?php echo htmlspecialchars($title); ?></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<?php
if (!isset($_GET["print"])) {
// hlavička stránky zobrazovaná pouze na obrazovce
}
}
function page_footer() {
if (!isset($_GET["print"])) {
// patička stránky zobrazovaná pouze na obrazovce
}
?>
</body>
</html>
<?php
}
?>
Na každou stránku pak stačí umístit odkaz ve tvaru:
<?php
$suffix = (strpos($_SERVER["REQUEST_URI"], "?") === false ? "?" : "&") . "print=1";
echo "<a href='$_SERVER[REQUEST_URI]$suffix'>verze pro tisk</a>";
?>
Kód může být např. součástí patičky, každopádně by měl být obalen if (!isset($_GET["print"]))
. Pro automatické zahájení tisku lze použít JavaScript window.print()
. Pokud má být na stránce odkaz na tisk při použití tiskového stylu (realizovaný zmiňovanou metodou), je vhodné ho také vypsat JavaScriptem, protože jinak se sice zobrazí, ale nebude funkční.
Diskuse
lukas:
opravdu je vhodne delat funkce typu
function()
{
?>
ahoj tady html
<?
}
Kartacek:
Jeste se tak naucit syntaxy...
Tomáš Pokorný:
Taky si myslím. Na kratsi retezce sice radsi pouziji echo, ale pro delsi html je preruseni v pohode. Teoreticky rychlejsi a daleko lepe se to edituje.
lukas:
tak jsem to nemyslel, spis zda by nemel byt soubor header.html a footer.html kde by byly tyto kusy kodu a vkladaly se nez delat funkce ktera neco vypisuje a nevraci...
nevim skoly zatim nemam
Tomáš Pokorný:
Je spoustu možností jak takové veci řešit. A také spoustu okolnosí, které můžou programátora nutit udělat to určitým způsobem. Pokud to spňuje fukcionalitu, editovatelnost a potřebnou rychlost, tak není co řešit.
Jakub Vrána :
Funkce mají tu výhodu, že jim mohu předat parametry a jejich proměnné nekolidují s okolím. Představte si následující kód:
<?php
$row = mysql_fetch_assoc(mysql_query("SELECT * FROM stranky WHERE id = '$_GET[id]'"));
$NADPIS = $row["nadpis"];
include "hlavicka.php";
echo $row["stranka"];
?>
Pokud hlavicka.php sama používá proměnnou $row, máme tu problém, např.:
...<title><?php echo $NADPIS ?></title>...
<?php
$result = mysql_query("SELECT id, nadpis FROM stranky");
while ($row = mysql_fetch_assoc($result)) {
// ...
}
?>
lukas:
http://forum.builder.cz/read.php?20,224884,225018#msg-225018
plodna diskuse, vyplynulo z toho, ze pro oddeleni logiky od kodu nema funkce nic tisknout, v tomto prispevku zaznela veta typu
<?php
function display_header()
{
?>
<head><title>..</title></head>
<?php
}
?>
coz snad nemuze napsat ani zacatecnik
Jakub Vrána :
Vlastní kód od výsledného výstupu je oddělen právě tou funkcí. To, jestli oddělení zařizuje include "hlavicka.html", page_header() nebo echo page_header() je naprosto lhostejné, každý z těchto způsobů má ale své plus a mínus:
include "hlavicka.html" možnou kolizi proměnných, o které jsem se zmiňoval
echo page_header() nutnost HTML značky vypisovat v kódu, což zanedbatelně snižuje výkon a znatelně snižuje přehlednost
page_header() může zmást tím, že něco vypisuje, v tom případě by bylo vhodné přejmenovat funkci např. na print_page_header()
Z těchto tří nevýhod se mi zdá nejmenší třetí, proto považuji za vhodné ji použít.
P.S. Na základě špatného pochopení faktů uvedených někým jiným není vhodné označovat ostatní za začátečníky.
Jakub Podhorský:
nevím já osobně používám jenom funkce(metody...v tomhle případě je to v podstatě jedno) aby vykonávali jenom nějakou činnost a ne přímo vypisovali HTML kód zdá se mi to takový proti logice ale to je jenom můj názor hlavně když to udělá to co má :)
SQi:
Sám řešení výpisu HTML ve funkci používám, nevidím nelogiku.
mr.tee:
Sice pozdě, ale přece..
Není náhodou již nějaký pátek standardem, že když už jde stránka do tiskárny tak se tiskne stylovaná podle css stylu pro tisk(pokud je definován..)? Tudíž tvořit speciální stránku pro tisk je imho blbost.. Když stačí jen přidat další css styl:
<link type="text/css" rel="stylesheet" href="./print.css" media="print" />
Pak jen elementům, které nechci tisknout, nastavím ve stylu display:none; a je to.. stránka vypadá jako obvykle, jen se vytiskne podle toho stylu pro tisk
mr.tee:
Aha.. Jsem slepota slepá a neumím pořádně číst.. tímto se omlouvám.. Mnohem snazši je podle mě stejnak přehodit styl za tiskový..
Diskuse je zrušena z důvodu spamu.