Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: ZAJDAN 09. 08. 2013, 10:13:48

Název: PhantomJS a web s formulářem
Přispěvatel: ZAJDAN 09. 08. 2013, 10:13:48
Ahojte,
experimentuju s phantomJs  a základní věci se už zadařili, nyní ale řeším tento problém:
mám webpage a ta obsahuje formulář s mnoha checkboxy a poslední záložka formuláře obsahuje submit pro odeslání po kterém se načte stránka zobrazující uživatelův výběr z předchozího formuláře a tento výběr bych rád umožnil exportovat do pdf. napadlo mě že bych na stránku s výběrem bych si vytvořil proměnou a do ní zachytil aktuální url:
  $request_url = apache_getenv("HTTP_HOST") . apache_getenv("REQUEST_URI");

dálel button, který by volal něco jako php exec:
exec("phantomjs /templates/new/js/pdf.js "request_url"  ");

ale někde dělám něco špatně...
nemáte někdo zkušenost prosím?...děkuji
Název: Re:PhantomJS a web s formulářem
Přispěvatel: ZAJDAN 12. 08. 2013, 13:12:12
hoši tak tady jsem si pěkně naběhl...teď si uvědomuju že v momentě kdy formulář odešlu, tak se vyrenderuje na straně klienta, tudíž phantomjs vůbec neví co se tam zobrazilo
nenapadá nikoho nic?,  jak vyrenderovat pdf v takovémto případě...
Název: Re:PhantomJS a web s formulářem
Přispěvatel: bydga 13. 08. 2013, 18:39:31
prostě to html co máš ( jakkoliv clientside upravený) pošleš na server kde je ten phantom?

zjednodušená ukázka:

$('#export-to-pdf').click( function() { $.post('http://phantomserver.com/phantom.php', $('html').html(), function() { ....  }); });

a phantom.php
$html = $_POST['html'];
file_put_contents("tmp.html", $html);
exec("phantomjs tmp.html tmp.pdf");
$pdf = file_get_contents("tmp.pdf");
header("content-type: application/pdf");
echo $pdf;
exit;

Název: Re:PhantomJS a web s formulářem
Přispěvatel: ZAJDAN 14. 08. 2013, 09:38:56
Ahoj.....
to zní velmi rozumně a funkčně.....
hned jak tady dodělám grafiku která je právě z velké části obsah zmiňovaných exportů, vyzkouším
moooc děkuji za typ/radu
Název: Re:PhantomJS a web s formulářem
Přispěvatel: ZAJDAN 14. 08. 2013, 10:45:42
inspiroval jsi mne k něčemu co mi lítalo v hlavě, ale nedaří se mi to .....
na page která se vyrenderuje na straně klienta umístém input submit:
<input type="submit" id="export-pdf" value="send" name="submit">
dále pak script zajišťující odeslání celé page na server kde naslouchá phantom:
<script>
$('input#export-pdf').click(function(){
 
    var html = $("body").html();
    var data = { html: html };
    $.post("http://server_IP/create-pdf.php", data);
});                        
</script>

kde ještě dělám chybu?  :(
Název: Re:PhantomJS a web s formulářem
Přispěvatel: ZAJDAN 14. 08. 2013, 11:36:41
tcpdumpem jsem teď poslochal odchozí provoz s filtrem na destination IP kam směřuje $.post v js scriptu a když zkusím prokliknout na input(submit) #export-pdf, tak jde vidět že na odchozím trafiku letí pakety na uvedenou IP....vipadá to tedy, že k odeslání dojde, ale proč se neděje nic na straně serveru netuším.
Název: Re:PhantomJS a web s formulářem
Přispěvatel: ZAJDAN 15. 08. 2013, 16:23:03
zatím se mi to nepodařilo rozchodit a tak jsem si řekl, že je namístě začít analyzovat korektnost každého zápisu už samotného začátku a první věc, kterou si nejsem vůbec jist je definovaní proměné "html":
var html = $("body").html();
$(selector).html()  ....nikde se nemohu dočíst kam až nahoru v DOM struktuře dokáže sáhnout selektor a vážně se obávám, že dosáhne na body a vrcholové html
po konzultaci s pár lidmi to spíše vypadá na:
var html = document.documentElement.outerHTML;

právě s tím experimentuju a zatím nemám hmatatelný výsledek, ale jsestli jsou z praxe jiné nápady prosím sem s nimi
děkuji
Název: Re:PhantomJS a web s formulářem
Přispěvatel: bydga 19. 08. 2013, 13:20:53
http://prntscr.com/1m4umg tohle určitě funguje..

pozor, ajaxem nejde zpracovat příchozí content-attachment. pouze response body. nestačí $.post (i když jsem ti ho pro zjednodušení napsal), ale musíš udělat standartní http request. dělá se to fíglem, že vytvoříš form, submittneš a odebereš ho:

Kód: [Vybrat]
download = function ( url, data, method ) {
  data = typeof data == 'string' ? data : $.param( data );
  var inputs = '';
  $.each( data.split( '&' ), function () {
    var pair = this.split( '=' );
    inputs += '<input type="hidden" name="' + pair[0] + '" value="' + pair[1] + '" />';
  });
  $( '<form action="' + url + '" method="' + (method || 'post') + '">' + inputs + '</form>' ).appendTo( 'body' ).submit().remove();
};

Název: Re:PhantomJS a web s formulářem
Přispěvatel: ZAJDAN 02. 09. 2013, 11:10:46
Ahoj,
moc díky...
dneska jsem se vrátil z dovolené a právě to zkouším aplikovat - zatím bez výsledku, ale nejspíš to nechápu dobře...
do url jsem si dosadil adresu kde naslouchá phantom script a funkci pak volám přes button:
Kód: [Vybrat]
<script>
download = function ( 'http://.../create-pdf.php', 'data', 'method' ) {
  data = typeof data == 'string' ? data : $.param( data );
  var inputs = '';
  $.each( data.split( '&' ), function () {
    var pair = this.split( '=' );
    inputs += '<input type="hidden" name="' + pair[0] + '" value="' + pair[1] + '" />';
  });
  $( '<form action="' + url + '" method="' + (method || 'post') + '">' + inputs + '</form>' ).appendTo( 'body' ).submit().remove();
};
</script>
<input id="click" type="button" value="create PDF" onclick="download()">
Název: Re:PhantomJS a web s formulářem
Přispěvatel: ZAJDAN 02. 09. 2013, 11:34:48
beru zpět:
přepsal jsem se a napsal jsem link přímo jako argument!
ten musím zapsat až kdyý funkci volám......
Název: Re:PhantomJS a web s formulářem
Přispěvatel: ZAJDAN 02. 09. 2013, 12:30:29
tak po kliknutí na button se naserveru v příslušném adresáři skutečně vytvoří tmp.html
otevře se i prohlížeč PDF dokumentů ovšem s hláškou "Unable to open document..No such file or directory" a pdf soubor se na serveru nevytvoří......když se podívám na soubor tmp.html má 0 Kb a nic neobsahuje...je prázdný
Název: Re:PhantomJS a web s formulářem
Přispěvatel: bydga 02. 09. 2013, 13:17:07
z toho evidentne vyplyva, ze nejsi schopny ani prenyst data na server, to nema s phantomem nic spolecnyho...