Неправильный формат HTML из цикла PHP - PullRequest
1 голос
/ 06 января 2012

Я перебираю массив и строю таблицы. Затем HTML отправляется в DOMPDF. Тем не менее, DOMPDF не будет создавать PDF, если 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; ?>

Я не могу на всю жизнь понять, какой тег я не закрываю. Если бы кто-нибудь мог дать некоторое представление, это было бы потрясающе!

В частности, цикл создает строки, которые показывают некоторые заголовки, а затем выплевывает дальнейшие строки при каждом изменении заголовка категории.

Ответы [ 2 ]

0 голосов
/ 06 января 2012

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

Анализируя ваш код, ваша проблема заключается в логике для второго раздела кода.Вы устанавливаете значение переменной $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>

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

0 голосов
/ 06 января 2012

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

Я рекомендую вам использовать класс PHP Tidy (в конце концов вам придется установить его первым ...)
Здесьссылка на класс Tidy Manual .

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

ob_start();

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

Этот пример кода был изменен по сравнению с исходной версией примера на php.net .

Надеюсь, это поможет вам.

...