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 ? "?" : "&amp;") . "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í.

Jakub Vrána, Dobře míněné rady, 22.8.2005, diskuse: 14 (nové: 0)

Diskuse

lukas:

opravdu je vhodne delat funkce typu
function()
{
?>
ahoj tady html
<?
}

ikona Jakub Vrána OpenID:

Není to nic proti ničemu.

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.

ikona Jakub Vrána OpenID:

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

ikona Jakub Vrána OpenID:

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ý..

Mr. Bee:

Nic proti, ale tenhle článek na intervalu mi přijde užitečnější.

http://interval.cz/clanky/formatovani-dokument…-pomoci-css-1/

Diskuse je zrušena z důvodu spamu.

avatar © 2005-2024 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.