2012-01-06 3 views
1

私は配列とビルディングテーブルをループしています。 HTMLはDOMPDFに送られます。ただし、HTMLがフォーマットされていない場合、DOMPDFはPDFを作成しません。私はそれが私の場合に起こっていると仮定します。ここに私のループは次のとおりです。PHPループからフォーマットされたHTMLが無効

<?php foreach($credits as $credit) : ?> 
     <?php if($credit['credit_type'] == "short") : ?> 
      <table width="100%" cellpadding="0" cellspacing="0" border="0" style="margin:0px 0px 15px 0px;"> 
       <tr> 
        <td><strong><?php echo $credit['category_title']; ?></strong></td> 
       </tr> 
       <tr> 
        <td><?php echo $credit['credit_heading']; ?></td> 
       </tr> 
      </table> 
     <?php endif; ?> 

     <?php if($credit['credit_type'] == "long") : ?> 
      <?php if($credit['category_title'] != $oldvalue) : ?> 
       <table width="100%" cellpadding="0" cellspacing="0" border="0" style="margin:0px 0px 15px 0px;"> 
       <tbody> 
      <?php endif; ?> 
       <tr> 
        <?php if($credit['category_title'] != $oldvalue) : ?> 
          <td width="25%"><strong><?php echo trim($credit['category_title']); ?></strong></td>     
          <td width="25%"><strong>Title</strong></td> 
          <td width="25%"><strong>Role</strong></td> 
          <td width="25%"><strong>Director</strong></td> 
        <?php endif; ?> 
       </tr> 
       <tr> 
        <td width="25%"><?php echo $credit['credit_heading'];?></td> 
        <td width="25%"><?php echo $credit['credit_title']; ?></td> 
        <td width="25%"><?php echo $credit['credit_role']; ?></td> 
        <td width="25%"><?php echo $credit['credit_director']; ?></td> 
       </tr> 
       <?php if($credit['category_title'] != $oldvalue) : ?> 
        </tbody> 
        </table> 
       <?php endif; ?> 
       <?php $oldvalue = $credit['category_title']; ?> 
     <?php endif; ?> 
    <?php endforeach; ?> 

私は私の人生のために私は閉じていない午前どのタグアウト動作することはできません。誰かがある程度の洞察力を与えることができれば、それはファブになるだろう!

具体的には、ループはいくつかの見出しを示す行を作成していて、カテゴリタイトルが変更されるたびにさらに次の行を吐き出します。

+0

最も簡単なのは 'ob_start()'と 'ob_end()'でHTML全体を取得するだけですが、なぜあなたのPDFライブラリは動作しません「フォーマットされていないHTML」...? – evotopid

+0

それはどうしますか?どのように使用するのですか? – Udders

+0

あなたはどのバージョンのdompdfを使用していますか? dompdfは整形されていないHTMLを扱うことができますが、レンダリングを殺す書式設定の問題があります。さらに、HTMLが構造的に正しくない場合、レンダリングは期待どおりではない可能性があります。 – BrianS

答えて

0

これは簡単な解決策はなく、おそらくない最高のことがあります

私は
Here is the link for the Tidy class Manual(最終的にはあなたが最初にそれをインストールする必要があります...)PHPのTidyのクラスを使用することをお勧めいたします。最初のラインで

ob_start(); 

このコマンドは、あなたのfollwingスクリプトによってoutputedされているものすべてをバッファします。
以下のコードは、ファイルの最後に追加するか、出力を表示する場所に追加する必要があります。
まず、ob_get_contents()でバッファを取得し、コードをクリーンアップします。
最終的には、必要に応じて設定パラメータを変更する必要があることに注意してください。

$raw_output = ob_get_clean(); 

$config = array('indent' => true, 'output-xhtml' => true, 'wrap' => 0); 
$tidy = new Tidy; 
$tidy->parseString($raw_output, $config, 'utf8'); 
$tidy->cleanRepair(); 

echo $tidy; 

このコード例はthe example on php.netの元のバージョンで変更されました。

希望はあなたを助けます。

0

あなたのデータについてよく知らないと解析するのは少し難しいです。たとえば、「短期間」の貸方の表が開いていて、レコードで閉じられているのはなぜですか?「長い」貸方の表は前のレコードの条件付きです。関連するデータが一連の連続した行として表示されるように、フラットなデータ構造を持っているからですか?そうした場合、データがもう少し標準化されれば、より簡単になるでしょう。私。それぞれのクレジット・レコードを繰り返し、次に個別に詳細を確認することができます。あなたのデータ構造を修正する可能性はありますか?

コードを分析すると、問題はコードの2番目のセクションのロジックにあるように見えます。ループの最後に変数$oldvalueの値を設定しています。これは、テーブルを閉じるロジックの後です。したがって、同じカテゴリのタイトルを持つ2つのレコードを解析すると、2番目のレコードはテーブル行の完全な外にテーブル行を出力します(まったく空の行があることに気付かないでください)。また、長いクレジットタイプの後には、決済が決済されません。言われていること

、あなたは私はあなたが以下のようなものが必要な場合があります推測して持っているものを扱う:

// build a dummy "previous" record for the first iteration so the conditionals don't break. 
<?php $previous_credit = array('credit_type'=>null,'category'=>null); ?> 
<?php foreach($credits as $credit) : ?> 
    <?php if($credit['credit_type'] == "short" || ($previous_credit['credit_type'] == "long" && $previous_credit['category'] != $credit['category'])) : ?> 
       </tbody> 
       </table> 
    <?php endif; ?> 

    <?php if($credit['credit_type'] == "short") : ?> 
     <table width="100%" cellpadding="0" cellspacing="0" border="0" style="margin:0px 0px 15px 0px;"> 
      <tr> 
       <td><strong><?php echo $credit['category_title']; ?></strong></td> 
      </tr> 
      <tr> 
       <td><?php echo $credit['credit_heading']; ?></td> 
      </tr> 
     </table> 
    <?php endif; ?> 

    <?php if($credit['credit_type'] == "long") : ?> 
     <?php if($credit['category_title'] != $previous_credit['category_title']) : ?> 
      <table width="100%" cellpadding="0" cellspacing="0" border="0" style="margin:0px 0px 15px 0px;"> 
      <tbody> 
      <tr> 
       <td width="25%"><strong><?php echo trim($credit['category_title']); ?></strong></td>     
       <td width="25%"><strong>Title</strong></td> 
       <td width="25%"><strong>Role</strong></td> 
       <td width="25%"><strong>Director</strong></td> 
      </tr> 
     <?php endif; ?> 
      <tr> 
       <td width="25%"><?php echo $credit['credit_heading'];?></td> 
       <td width="25%"><?php echo $credit['credit_title']; ?></td> 
       <td width="25%"><?php echo $credit['credit_role']; ?></td> 
       <td width="25%"><?php echo $credit['credit_director']; ?></td> 
      </tr> 
    <?php endif; ?> 
    <?php $previous_credit = $credit; ?> 
<?php endforeach; ?> 

<!-- one last table close for the last record --> 
</tbody></table> 

(それはいくつかの醜いコードだと私は、それを改訂維持する時間がありません...コミュニティのwikiで誰かがそれをきれいにしたい場合)

関連する問題