Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: ZAJDAN 23. 10. 2015, 16:18:04

Název: Src v <img> pomocí PHP proměnné
Přispěvatel: ZAJDAN 23. 10. 2015, 16:18:04
Ahoj,
do proměné $svg jsem ziskal string, ketry budem obsah nasledujici souboru vytvořeného v php

Kód: [Vybrat]
$file=tempnam('/var/www/web1/pdf/tmp/', 'model_'.date(Y.m.d).'_').'.svg';
$handle = fopen($file, "w");
fwrite($handle, $svg);
fclose($handle);
toto fachčí, soubor se vytvoří a obsahuje to co má

chtěl bych teď tento soubor ve stejném php kodu použít jako zdroj v <img>
<img src= ". $file . ">

lze v tomto případě proměnou $file použít jako cestu k souboru?
Název: Re:src v <img> pomocí php proměné
Přispěvatel: Lol Phirae 23. 10. 2015, 16:38:04
Tahle rozhodně ne...
Název: Re:src v <img> pomocí php proměné
Přispěvatel: Kit 23. 10. 2015, 16:40:33
chtěl bych teď tento soubor ve stejném php kodu použít jako zdroj v <img>
<img src= ". $file . ">

lze v tomto případě proměnou $file použít jako cestu k souboru?

Nelze. Musíš použít cestu pro virtuální prostředí webového serveru. Často je však výhodnější generovat obsah dotyčného souboru až ve chvíli přístupu - nemusí pak fyzicky na disku vůbec existovat, resp. stačí, když bude v cache.
Název: Re:src v <img> pomocí php proměné
Přispěvatel: ZAJDAN 23. 10. 2015, 16:45:44
chtěl bych teď tento soubor ve stejném php kodu použít jako zdroj v <img>
<img src= ". $file . ">

lze v tomto případě proměnou $file použít jako cestu k souboru?

Nelze. Musíš použít cestu pro virtuální prostředí webového serveru. Často je však výhodnější generovat obsah dotyčného souboru až ve chvíli přístupu - nemusí pak fyzicky na disku vůbec existovat, resp. stačí, když bude v cache.

generovat obsah souboru, tak aby se fyzicky na disk vubec neulozil, by se mi zamlouvalo nejvic...nemas prosim nejakej priklad, kde bych se mohl inspirovat?
Název: Re:src v <img> pomocí php proměné
Přispěvatel: ZAJDAN 23. 10. 2015, 17:00:24
v pripade promene $svg je obsah souboru v podstate jen v pameti
az vise uvedenym zapisem 'fwrite' ho ulozim do souboru

ale jak do <img src=" "> nandat ze zdrojem je obsah promene $svg a ze se to ma reprezentovat jako datovy typ svg, na to jsem neprisel

Název: Re:src v <img> pomocí php proměné
Přispěvatel: to_je_jedno 23. 10. 2015, 17:03:00
co potrebujes tak to je:
- v prvnim skriptu jen vypsat <img src="/obrazek.php?date=YYYY-mm-dd">
- v druhem skriptu udelat ten obrazek  a poslat ho na vypis. v html sice bude obrazek.php, ale pomoci hlavicek prohlizeci reknes, ze je to svg
Název: Re:src v <img> pomocí php proměné
Přispěvatel: Kit 23. 10. 2015, 17:35:37
generovat obsah souboru, tak aby se fyzicky na disk vubec neulozil, by se mi zamlouvalo nejvic...nemas prosim nejakej priklad, kde bych se mohl inspirovat?

Tu část s generátorem dáš do dalšího skriptu, ke kterému uděláš REST API s příslušným přesměrováním od webserveru. Je však nutné kód
Kód: [Vybrat]
'model_'.date(Y.m.d).'_.svg'
upravit na něco, z čeho se požadovaný SVG dá vygenerovat a přitom nemusel URL složitě parsovat. Třeba i takhle jednoduše:
Kód: [Vybrat]
<img src="/model/$date">
Vzhledem k tomu, že to bude asi nějaký graf denního provozu, slovo "model" doporučuji nahradit něčím vhodnějším, například "graf". Nemám dostatek informací na to, abych ti mohl navrhnout lepší název.

Několik dalších řešení:
http://www.sitepoint.com/add-svg-to-web-page/ (http://www.sitepoint.com/add-svg-to-web-page/)
Do HTML5 můžeš SVG vkládat i inline, což by mohlo být v daném případě úplně nejjednodušší.
Název: Re:src v <img> pomocí php proměné
Přispěvatel: ZAJDAN 23. 10. 2015, 17:36:13
ve skutečnosti jde o tento proces:
(http://picpaste.com/pics/pass_svg-gIHA7l3j.1445614361.png)

to svg předávám takto,protože se odesílá jeho aktualní stav změněný pomocí interakce uživatele na webu
na generovaní PDF jsem použil knihovnu mPDF
Název: Re:src v <img> pomocí php proměné
Přispěvatel: ZAJDAN 23. 10. 2015, 17:48:11
http://picpaste.com/pics/pass_svg-gIHA7l3j.1445615268.png
Název: Re:src v <img> pomocí php proměné
Přispěvatel: Homo Buzerantus 24. 10. 2015, 19:16:35
Pokud ten obrázek není moc velký, můžeš použít data url, vygeneruješ "<img src="data:image/svg+xml;base64," a pak k tomu přidáš ten svg obrázek zakódovaný pomocí base64. Nebudeš muset ten obrázek nikam ukládat ani ho generovat v nějakém zvláštním kódu.
Název: Re:Src v <img> pomocí PHP proměnné
Přispěvatel: ZAJDAN 26. 10. 2015, 09:39:59
- v mém případě je to svg hodně objemné
- další bariera je to, že já ho potřebuju předat PHP knihovně mPDF, která ho dostane do výsledného PDF

běžné hodnoty proměných se tam takto dostanou, ale string obsahující svg/xml to nevyrenderuje ať se to vloží do jakéhokoliv tomu určenému tagu
Název: Re:Src v <img> pomocí PHP proměnné
Přispěvatel: to_je_jedno 26. 10. 2015, 11:05:19
pokud to neni lepeni na nejakym levnym hosting a mas tu moznost tak doporucuju vyprdnout se na cely mpdf a pouzit wkhtmltopdf. usetris si obrovskou spoustu prace.
Název: Re:Src v <img> pomocí PHP proměnné
Přispěvatel: ZAJDAN 26. 10. 2015, 11:28:51
ohledně toho wkhtmltopdf nemáš čirou náhodou zkučenost s podobným cílem jako já?
předat svg k rendrovaní PDF pomocí PHP proměné
Název: Re:Src v <img> pomocí PHP proměnné
Přispěvatel: Ondrej Nemecek 26. 10. 2015, 11:56:23
mimo http://wkhtmltopdf.org/ existuje ještě http://phantomjs.org/

mpdf moc nedoporučuju, je s tím ve výsledku dost práce a jsou potřeba kompromisy, protože to prostě nefunguje dokonale (i když je to asi nejpokročilejší knihovna pro daný účel a PHP)

vložení svg do html je samostatný problém, který by měl tazatel zvládnout nezávisle na generování pdf, jinak v tom bude plavat
Název: Re:Src v <img> pomocí PHP proměnné
Přispěvatel: ZAJDAN 26. 10. 2015, 13:30:46
je to škoda, protože všechno ostatní se mi s knihovnou mPDF dělá velmi dobře a vše funguje, jen ne to předání svg přes php proměnou
Název: Re:Src v <img> pomocí PHP proměnné
Přispěvatel: to_je_jedno 26. 10. 2015, 13:42:05
Zajdan:
- zkousel jsi to tam fouknout pres base64?
- kdyz to neposilas do pdf ale jako html na vystup tak to vidis v prohlizeci cajk a problem ma jen mpdf?
- jak vypada vysledek kdyz to posles do pdf? je problem jen v tom obrazku?

Ondrej Nemecek: osobne povazuji tcpdf za pokrocilejsi, ackoliv pracnejsi.
Název: Re:Src v <img> pomocí PHP proměnné
Přispěvatel: ZAJDAN 26. 10. 2015, 14:13:09
Zajdan:
- zkousel jsi to tam fouknout pres base64?
- kdyz to neposilas do pdf ale jako html na vystup tak to vidis v prohlizeci cajk a problem ma jen mpdf?
- jak vypada vysledek kdyz to posles do pdf? je problem jen v tom obrazku?

Ondrej Nemecek: osobne povazuji tcpdf za pokrocilejsi, ackoliv pracnejsi.

zkusil jsem:
<img src='data:image/svg+xml; <svg width='100' height='100'>  <circle cx='50' cy='50' r='40' stroke='green' stroke-width='4' fill='yellow' /></svg> ' />
<img src='data:image/svg+xml;  base64codeHere ' />
<img src='data:image/svg+xml; $svg ' />


mpdf nezpracuje ani jeden takovyto zpusob predani a ve vyslednem pdf je jen ikonecka pro 'neexistujici' zdroj
Název: Re:Src v <img> pomocí PHP proměnné
Přispěvatel: Jenda 26. 10. 2015, 18:44:20
Tak si to po sobě alespoň přečti. Jak asi vyhodnotíš ty apostrofy?
Název: Re:Src v <img> pomocí PHP proměnné
Přispěvatel: Jenda 26. 10. 2015, 18:46:18
A u toho druhého mu musíš ten encoding samozřejmě říct. Např. u PNG je to

src="data:image/png;base64,DATA"
Název: Re:Src v <img> pomocí PHP proměnné
Přispěvatel: ZAJDAN 26. 10. 2015, 19:33:02
Jendo nemej strach, ze jde o base64 jsem do zapisu uvedl a apostrofy tam mam u beznych obrazku standadne a funguje to....s jisteho duvodu je tam musim mit ,ale nechci to tady zbytecne rozvadet o dalsi tema
Název: Re:Src v <img> pomocí PHP proměnné
Přispěvatel: Antičobol 26. 10. 2015, 19:52:39
Jendo nemej strach, ze jde o base64 jsem do zapisu uvedl

Ja nevim, nebylo by dobre sem postnout ten kod, co ti skutecne nefunguje, misto toho, aby sis vymyslel nejaky jiny??? Uz tomu fakt nerozumim.

apostrofy tam mam u beznych obrazku standadne

Eh?
Název: Re:Src v <img> pomocí PHP proměnné
Přispěvatel: Kit 26. 10. 2015, 20:40:30
Proč místo značky img nepoužiješ značku svg?
Kód: [Vybrat]
<!DOCTYPE html>
<html>
<body>
<svg width='100' height='100'>
    <circle cx='50' cy='50' r='40' stroke='green' stroke-width='4' fill='yellow' />
</svg>
</body>
</html>
Název: Re:Src v <img> pomocí PHP proměnné
Přispěvatel: to_je_jedno 26. 10. 2015, 22:48:37
zkusil jsem:
<img src='data:image/svg+xml; <svg width='100' height='100'>  <circle cx='50' cy='50' r='40' stroke='green' stroke-width='4' fill='yellow' /></svg> ' />

no a tady mas s tema apostrofama evidentne chybu. protoze ten apostrof za width= ti uzavre ten co je pred data:image
Název: Re:Src v <img> pomocí PHP proměnné
Přispěvatel: progman 27. 10. 2015, 10:37:11
No, hlavne v parametre tagu nemozes mat dalsi tag... (v img src nemozes uviest <svg>), jedine ze by si pouzil CDATA (ak sa bavime o xhtml). Do SRC ma ist URI, pripadne este data v base64.

Mas tieto moznosti:
1. ako niekto spominal, v src uviest nejaky skript, napr. obrazok.php a tomu predat ako argument nejake id alebo nejaky string, na zaklade ktoreho bude schopny obrazok vygenerovat. Takze id zdroja, alebo rovno data toho obrazku. Implementacne relativne jednoduche a riesi to za teba vela veci (lahko nastavis/zrusi cachovanie, ak nema uzivatel zapnute obrazky, nedojde ani k requestu, nezdrziava load stranky -- generovanie obrazku sa robi v inom requeste). A ako vystup vies pouzit bud nejaky binarny format alebo aj SVG, musis len setnut spravny content-type.

To by vyzeralo cca takto:

HTML:
Kód: [Vybrat]
<img src="obrazok.php?id=123" />
Kod na strane servra:
Kód: [Vybrat]
<?php
Header
("Content-Type: image/svg+xml");

$id=$_GET['id'];

if (
$id == 1) {
// nejako vytvorime obsah, pravdepodobne pouzijeme nejaku libku, v tomto priklade to dame natvrdo. data vytiahneme odnekial podla idcka, pripadne tam mozme mat rovno string s datami
$svg "<svg width='100' height='100'><circle cx='50' cy='50' r='40' stroke='green' stroke-width='4' fill='yellow' /></svg>";
}
else {
$svg "<svg width='100' height='100'><circle cx='50' cy='50' r='40' stroke='green' stroke-width='4' fill='blue' /></svg>";
}

// vratime SVG.
echo $svg;
?>


2. pouzit zdrojove XMLko + xslt na jeho transformaciu na SVG. Idealne ak mas jednoduchu sablonovitu logiku na vygenerovanie obrazku a vies mu dat zdrojove data v xml. Prikald: http://edutechwiki.unige.ch/en/XSLT_to_generate_SVG_tutorial

3. Vlozit priamo vygenerovany obrazok v base64, napr takto: http://danielmclaren.com/2008/03/embedding-base64-image-data-into-a-webpage. Vhodne len pre male veci, ktore nechces cachovat. Takisto zdrzuje load stranky, na rozdiel od prvych dvoch rieseni. Mozes narazit na problem pri niektorych browseroch.
Název: Re:Src v <img> pomocí PHP proměnné
Přispěvatel: ZAJDAN 27. 10. 2015, 10:53:24
proč použávám v tomto případě (mPDF) apostrofy?
protože jsem zvolic cestu html zápisu
standardni funkcni zapis, kde telo promene je obaleno do apostrofu je takto:
$html = ' <div id="pieces">  pieces:  </div> ';
$mpdf -> WriteHTML($html);
$mpdf -> Output('pdf/test.pdf', 'I');


problem nastane pokud do html vsadim php promenou (do PDF se nevyrenderuje hodnota promene):
$html = ' <div id="pieces">  pieces: $pieces </div> ';

pokud zapis provedu jinak a to nahradou apostrofu za uvozovky (hodnota promene se vyrenderuje spravne):
$html = " <div id=\"pieces\">  pieces: $pieces </div> ";
ale vsimnete si ze musim escapovat vnitrni uvozovky

a to je duvod proc pouzivam uvnitr apostrofy....nemusim pak escapovat:
$html = " <div id='pieces'>  pieces: $pieces </div> ";
Název: Re:Src v <img> pomocí PHP proměnné
Přispěvatel: Kit 27. 10. 2015, 11:12:55
a to je duvod proc pouzivam uvnitr apostrofy....nemusim pak escapovat:

Tak používej uvozovky bez escapování:
Kód: [Vybrat]
$pieces = 20;
$html = <<<EOT
<body>
<div id="pieces">pieces: $pieces</div>
</body>
EOT;
Název: Re:Src v <img> pomocí PHP proměnné
Přispěvatel: Roman 27. 10. 2015, 11:38:02
proč použávám v tomto případě (mPDF) apostrofy?
protože jsem zvolic cestu html zápisu
standardni funkcni zapis, kde telo promene je obaleno do apostrofu je takto:
$html = ' <div id="pieces">  pieces:  </div> ';
$mpdf -> WriteHTML($html);
$mpdf -> Output('pdf/test.pdf', 'I');


problem nastane pokud do html vsadim php promenou (do PDF se nevyrenderuje hodnota promene):
$html = ' <div id="pieces">  pieces: $pieces </div> ';

....................

Je ještě čtvrtá varianta, jak to napsat, a nemusí se nic eskejpovat:
Kód: [Vybrat]
$html = ' <div id="pieces">  pieces:' . $pieces . '</div> ';
Název: Re:Src v <img> pomocí PHP proměnné
Přispěvatel: ZAJDAN 27. 10. 2015, 11:52:13
hoši moc díky!
ad progman)
zkouším tu variantu 1.) kde do src uvedu url na php scrip...pokud to svg v tom scriptu necham natvrdo zapsane, tak jak jsi to demonstroval Ty
...funguje to,

ale nedaří se mi to pokud to svg tam předám takto:
Kód: [Vybrat]
<?php
Header
("Content-Type: image/svg+xml");

$id $_POST['id'];
$post_data $_POST['structureSVG'];

echo 
$post_data;
?>

když se podívám na response co vrací server, tak je tam očekávaný svg/xml string, který jsem získal ajaxem z původní stránky
Název: Re:Src v <img> pomocí PHP proměnné
Přispěvatel: to_je_jedno 27. 10. 2015, 12:09:20
hlavicky u toho svg neresis?
Název: Re:Src v <img> pomocí PHP proměnné
Přispěvatel: ZAJDAN 27. 10. 2015, 12:28:43
hlavicky u toho svg neresis?

abych pravdu řekl, tak jak to leží na webu, tak v takovém stavu to vemu->odešlu ajaxem a v php scriptu zachytím pro další zpracování,
když se na konci tohoto procesu podívám na vnitřní struktutu toho SVG, je stejná jako na začátku (zobrazitelný svg obrázek), proto v průběhu toho procesu hlavičky neupravuji
Název: Re:Src v <img> pomocí PHP proměnné
Přispěvatel: ZAJDAN 27. 10. 2015, 15:20:53
když se nad tím co se děje zamyslím, obávám se, že v bodě kdy si PHP script generující PDF říká o zdroj <img>, tak ho nedostane,
nejlépe to půjde vidět na přiloženém schématu:
http://picpaste.com/pics/pass_svg_process-01-01-71Hug0tD.1445955633.png

1) submit vyvolá dvě akce
   a) na onclick zavolá js/ajax funkci (tam se získá SVG string a pošle na url s PHP scriptem)
   b) odešle form na php script generující PDF

2) php script generující PDF si pro daný <img> se src odkáže na php script předávající data obrázku

a tady v tom bodě 2 pravděpodobně proměná ty data mít nebude
Název: Re:Src v <img> pomocí PHP proměnné
Přispěvatel: mareolan 27. 10. 2015, 22:16:31
V manuálu mPDF (http://mpdf1.com/manual/index.php?tid=245) je přímo ukázka:
Kód: [Vybrat]
$mpdf->myvariable = file_get_contents('alpha.png');
$html = '<img src="var:myvariable" />';
$mpdf->WriteHTML($html);

Možná by bylo dobré jasně napsat už v 1. příspěvku, co přesně řešíš. Já si musel přečíst celou diskuzi a přesto si nejsem jistý, že jsem to pochopil správně (třeba si jen stojím na kabelu):

Nebo je to celé ještě jinak?
Název: Re:Src v <img> pomocí PHP proměnné
Přispěvatel: ZAJDAN 29. 10. 2015, 17:53:48
Diky za reakci....
Cela ta komplikovanost je v tom, ze to svg je interaktivni a je potrebuju odeslat jeho aktualni stav( tak jak ho zmenil uzivatel), proto to posilam ajaxem....poslu DOM strukturu svg, ktera je v pameti.....pres php by me to vzalo fyzickej stav/vychozi co je ulozen na disku....nebo se mylim?