8768 sujets

Développement web côté serveur, CMS

Bonjour

Avant tout chose, je suis pas très bon en php, mais je me débrouille (en tout cas j'ai la logique, mais pas la pratique).
Je cherche une réponse à mon problème depuis maintenant quelques heures.
Mon site est sur WordPress, sur un serveur mutualisé (donc total accès).

J'utilise html2pdf pour créer un pdf par rapport à une page de mon site.
Voici le code (intégré à functions.php), qui permet de transformer le contenu de ma page en pdf

add_action('post_updated','save_post_callback', 10, 3 );
function save_post_callback($post_id,$post_after, $post_before){
	$css = " ";
	$content = " ";
	if($post_after->post_type == 'project'){
		$css .="<style>";
		$css .= "h1,h2,h3,h4,h5,h6{color:#333;font-weight:500;}h1{color:#019d9c;}p,page{text-align:justify;color: #666;line-height:25px;font-family:Arial,sans-serif;font-size:14px;font-weight:500;}a{color:#2ea3f2;text-decoration: none;}img{height:200px;text-align:center;margin-left:200px;}li{padding:5px 0;}span{display:none!important;color:#fff !important;}.header{text-align:right;padding:30px 0;}img{max-width:300px;}.block{clear:both !important; display:block !important;} ";
		$css .="</style>";
		$content .='<page backtop="7mm" backbottom="7mm" backleft="10mm" backright="10mm">';
		$content .= '<p class="header">Annexe 1 - Fiche formation</p>';
		
		$html = do_shortcode($post_after->post_content);
		
		$content .= $html;

		$current_url =  '<a href="' . get_permalink() . '"  class="toremove" rel="v:url" property="v:title">Page Web du Programme de Formation</a>';
		$content .= "<page_footer></page_footer>";
		$content .= '</page>';

		$content_pdf = $css.strip_tags($content,'<strong>,<b>,<i>,<img>,<page_footer>,<span>,<p>,<page>,<h1>,<a>,<h2>,<h3>,<h4>,<h5>,<h6>,<ul>,<li>');

		$dom = str_get_html($content_pdf);
		$dom->find('span[class=et-pb-icon]', 0)->innertext = ' ';
		$dom->find('span[class=et-pb-icon]', 1)->innertext = ' ';
		$dom->find('span[class=et-pb-icon]', 2)->innertext = ' ';
		$dom->find('span[class=et-pb-icon]', 3)->innertext = ' ';
		$dom->find('span[class=et-pb-icon]', 4)->innertext = ' ';
		$dom->find('a[class=et_pb_button]', 0)->innertext = '<br> ';
		$dom->find('span[class=block]', 0)->innertext .= '<br> ';
		$dom->save();
		$upload_dir = wp_upload_dir();
		$directory = $upload_dir["basedir"]."/pdf/Annexe-1-Fiche-descriptive-".$post_after->post_name.".pdf";
		require_once(dirname(__FILE__).'/html2pdf/vendor/autoload.php');
		$html2pdf = new HTML2PDF('P','A4','fr');
		$html2pdf->WriteHTML($dom);
		$html2pdf->Output($directory , 'F');
	}
	return ;
}


Actuellement, il me prend tout le contenu de la page (post) puis me le met sur le PDF, hors j'aimerais seulement quelque partie de la page.

C'est le code ci-dessous qui permet de récupérer le contenu de la page
$html = do_shortcode($post_after->post_content);


Comment je pourrais faire pour récupérer seulement les DIV qui ont pour attribut id="topdf"
J'ai beau chercher et tester différent bouts de code que j'ai trouvé, il me renvoie soit directement une erreur, soit aucun changement (comme si le code n'était pas interprété).

Merci d'avance,

Cordialement,
Hugo
Modifié par Kaesor (27 Feb 2018 - 17:40)
Salut

Pourquoi ne pas passer par javascript ou ajax pour "récupérer" ton contenu spécifique, puis l'envoyer à ta fonction php ?
Par exemple en jquery :
var data = $ ("#container"). html (); // ou #topdf
var filename = "Entry_Report.pdf";
$. Ajax ({
   type: "POST",
   url: "convert.php",
   data: {data: data, filename: filename}
   dataType: "json",
   success: function (data) {
   alert ('success');
   }
})


et en php :
if (isset ($ _POST ['data'])) {
  Urlcontents $ = $ _POST ['data'];
  $ Filename = $ _POST ['filename'];
  $ Date = $ _POST ['date'];
  convert ($ urlcontents, $ filename, $ date);
}

function convert ($ contents, $ name, $ currdate) {
  $ Pdf = new HTML2FPDF ();
  $ Pdf-> AddPage ();
  $ Pdf-> SetFont ('Arial', 'B', 16);
  $ Pdf-> Cell (40.10, "Report Entry");
  $ Pdf-> SetFont ('Arial','', 12);
  $ Pdf-> Cell (90.12, '-'. $ Currdate);
  $ Content = strip_tags ($ contents, '<html> <body> <meta> <img> <h2> <h4> <div> <ul>   <li> <span>');
  $ Pdf-> Sety (20);
  $ Pdf-> WriteHTML ($ contents);
  $ Content = $ pdf-> Output ('', true);
  $ File = fopen ($ filename, "D");
etc....

Modifié par JENCAL (27 Feb 2018 - 10:21)
Salut !

Merci pour ta réponse.
J'avais déjà trouver ta solution quelque part, mais ça ne me convenait pas.
Je ne voulais pas utiliser de jquery, et utiliser le moins de code possible.

Du coup j'ai trouvé une solution (en trifouillant le code pour savoir ce qu'était chaque élément).
Donc, au lieu du simple :
$html = do_shortcode($post_after->post_content);

J'ai rajouté deux petit foreach() qui m'enlève ce que je veux.

$html = do_shortcode($post_after->post_content);
$contenthtml = str_get_html($html);
foreach ($contenthtml->find('div[class=pdf]') as $emtdiv) {
	$emtdiv->innertext='';
	echo $emtdiv;
}
foreach ($contenthtml->find('ul[class=et_pb_tabs_controls]') as $emtul) {
	$emtul->innertext='';
	echo $emtul;
}
$contenthtml->save();


J'ai du mettre une classe au lieu d'un id car un élément avait déjà un id.
J'avais essayé le find() dans ce format :
find('div[class!=pdf]')
pour que ce soit plus rapide, mais il ne prend pas en compte le "!", qui est pourtant bien indiquer comme utilisable (très déçu)

Sujet résolu ^^

Cordialement,
Hugo
Meilleure solution