2012-01-06 2 views
1

Я просматриваю массив и строю таблицы. Затем HTML отправляется в DOMPDF. Тем не менее, DOMPDF не будет создавать PDF-файл, если HTML-файл плохо форматирован. Я предполагаю, что это то, что происходит в моем случае. Вот моя петля:Отформатированный HTML-код из цикла PHP

<?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

Проще всего было бы просто получить весь HTML с 'ob_start()' и 'ob_end()', но почему ваша библиотека PDF не работает с «плохой форматированный HTML» ...? – evotopid

+0

что бы это сделало?и как я буду использовать его? – Udders

+0

Какую версию dompdf вы используете? dompdf может работать с плохо форматированным HTML, хотя есть некоторые проблемы с форматированием, которые убьют рендер. Кроме того, если HTML не является структурно правильным, рендеринг может быть не таким, каким вы ожидаете. – BrianS

ответ

0

Это может быть простое решение, но, возможно, не самое лучшее:

Я рекомендую вам использовать Tidy класс РНР (в конце концов, вам придется установить его первым ...)
Here is the link for the Tidy class Manual.

В первой строке:

ob_start(); 

Эта команда буферами все, что outputed вашим follwing сценарий.
Код внизу следует добавить в конец вашего файла или там, где вы хотите отобразить результат.
Сначала он получает буфер с 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

Немного сложно разобрать, не узнав больше о ваших данных. Например, почему таблица для «короткого» кредита открыта и закрыта записью, но таблица «длинного» кредита зависит от предыдущей записи? Это потому, что у вас плоская структура данных, поэтому связанные данные появляются в виде серии последовательных строк? Если это так, все будет проще, если данные будут немного более нормализованы. То есть вы можете перебирать каждую кредитную запись, а затем детализировать отдельно. Любая возможность фиксировать вашу структуру данных?

Анализ кода, который у вас есть, кажется, что ваша проблема связана с логикой для второго раздела кода. Вы устанавливаете значение переменной $oldvalue в конце цикла. Это после логики, которая закрывает таблицу. Поэтому, если вы проанализируете две записи, имеющие одинаковое название категории, вторая запись будет выводить строки таблицы за пределами таблицы (неважно, что она также будет иметь полностью пустую строку). Кроме того, если у вас короткий тип кредита после долгого времени, таблица никогда не будет закрыта.

Это, как говорится, работая с тем, что у вас есть я предполагаю, что вам может понадобиться что-то вроде следующего:

// 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> 

(Это какой-то уродливый код и у меня нет времени, чтобы держать его пересмотра, так ... community wiki в случае, если кто-то еще захочет его очистить.)