PHP HTML класс рендеринга таблицы в стиле div: неправильный отступ

Я пишу класс, который отображает div стилизованные таблицы. Структура отображаемой таблицы выглядит следующим образом:

<div class = "table">
    <!-- title, column headers -->
    <div class = "table-body">
        <div class = "table-row">
            <div class = "table-row-cell">data11</div>
            <div class = "table-row-cell">data12</div>
            <div class = "table-row-cell">data13</div></div> <!-- this -->
        <div class = "table-row">
            <div class = "table-row-cell">data21</div>
            <div class = "table-row-cell">data22</div>
            <div class = "table-row-cell">data23</div></div> <!-- and this -->
    </div>
    <!-- footer -->
</div>

Если вы посмотрите, <div> закрывающие теги для строк таблицы должны быть в новой строке с правильным отступом, но этого не происходит.

Вот как я строю div:

public function get(): string
{
    // some code and loops

    $row_build .= $this->getHtmlDiv(
                            $html_cell_class,
                            $cell_data ?? "",
                            $this->html_attributes['cell'],
                            3
                        );
    // more code
}

private function getHtmlDiv(
    string $class,
    string $content = "",
    array $attrs = [],
    int $tabcount = 0
): string {
    $output = "\n" . str_repeat("    ", $this->tabs + $tabcount) . "<div";

    $output .= " class='$class'";

    foreach ($attrs as $attr => $value) {
        $output .= " $attr='$value'";
    }

    $output .= ">";
    $output .= $content;
    $output .= "</div>"; // <- here something should be done: what? IDK
    return $output;
}

Я пробовал несколько альтернатив, и самое близкое, что я мог получить, это этот код прямо перед return $output;:

if (substr($output, -2) !== "\n") {
    $output .= "\n" . str_repeat("    ", $this->tabs + $tabcount - 1);
}

что делает:

<div class='table-row'>
                
    <div class='table-row-cell'>data21</div>
                
    <div class='table-row-cell'>data22</div>
                
    <div class='table-row-cell'>data23</div>

</div>

Любые идеи или предложения о том, как это сделать, будут приветствоваться.

Спасибо заранее за ваше время.

PS: если нужен дополнительный код/объяснение, дайте мне знать и добавит его к исходному вопросу.

Я должен спросить, почему вы просто не используете <table>

Rob 14.05.2023 03:04

Будет ли работать, если поставить последние </div> в каждой строке на отдельной строке?

Rob 14.05.2023 03:05

@Rob Я использую div, потому что это соответствует моим потребностям, потому что я могу это сделать и потому что мне не нравится <table>. Извините: я не получил ваш второй комментарий. Как бы это было?

julio 14.05.2023 04:46

Я думаю, вам просто нужно поставить \n перед закрывающим тегом $output .= "\n</div>";

Tim R 14.05.2023 06:58

@TimR попробовал это, и стало еще хуже. </div> переход на следующую строку без отступа

julio 14.05.2023 07:16

Я внимательно изучил ваш код и подозреваю, что $content содержит <div class='table-row-cell'>, и ваш вопрос заключается в том, как сделать отступ только для закрывающего тега для <div class = "table-row">. Если да, то приведет ли это к желаемому результату? $output .= "\n </div>";

Tim R 14.05.2023 08:15
<table> здесь семантически правильное использование. Я надеюсь, вы не избегаете этого, потому что вы читали, что это плохо, потому что это не для всего.
Rob 14.05.2023 12:09

Вы сказали, что у вас есть </div></div> в двух местах. Я хочу, чтобы вы попробовали поставить второй </div> на отдельную строку и попробовать это.

Rob 14.05.2023 12:10

Количество вкладок @TimR не жестко закодировано

julio 14.05.2023 15:53

@Rob div генерируются в getHtmlDiv(), и есть только один закрывающий тег, поэтому я до сих пор не понимаю, куда вы предлагаете поместить второй </div>. И, как я уже сказал, я делаю это так, потому что я могу и удовлетворяю свои потребности (я знаю, что <table> — допустимый тег).

julio 14.05.2023 15:55

и самое близкое, что я мог получить, это код прямо перед возвратом $output;" - который даже не содержит закрывающего тега </div>, все, что вам нужно сделать, это вывести дополнительную строку, содержащую только пробелы. $output .= "</div>"; // <- here something should be done: what? IDK - как насчет того же самого, что вы сделали для открывающего тега? Вы хотите, чтобы оба они находились на одном уровне отступа, поэтому выводите одинаковое количество пробелов перед ними обоими?

CBroe 15.05.2023 08:44

Если $output = "\n" . str_repeat(" ", $this->tabs + $tabcount) . "<div"; дал вам открывающий тег с правильным отступом, то $output = "\n" . str_repeat(" ", $this->tabs + $tabcount) . "</div>"; должен дать вам соответствующий закрывающий тег, не так ли?

CBroe 15.05.2023 08:45

@CBroe, если я делаю то же самое, я получаю все </div> в новой строке, хотя и с правильным отступом.

julio 15.05.2023 11:50

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

CBroe 15.05.2023 12:04

@CBroe Я думал об этом подходе, но отклонил его, потому что $class может быть определяемым пользователем значением, и для этого я должен превратить 10 переменных метода в свойства класса или изменить константу класса (одномерный массив) в многомассив). Я как раз думал добавить новый параметр в getHtmlDiv()

julio 15.05.2023 12:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
15
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я решил это, добавив новый параметр в getHtmlDiv(). Этот новый параметр $add_newline (по умолчанию false) представляет собой флаг, который сообщает, когда добавлять новую строку и вкладки.

Функция:

private function getHtmlDiv(
    string $class,
    string $content = "",
    array $attrs = [],
    int $tabcount = 0,
    bool $add_newline = false
): string {
    $output = "\n" . str_repeat("    ", $this->tabs + $tabcount) . "<div";

    $output .= " class='$class'";

    foreach ($attrs as $attr => $value) {
        $output .= " $attr='$value'";
    }

    $output .= ">";
    $output .= $content;

    if ($add_newline) {
        $output .= "\n" . str_repeat("    ", $this->tabs + $tabcount);
    }

    $output .= "</div>";

    return $output;
}

Вызов:

// this output is correct
$row_build .= $this->getHtmlDiv(
                        $html_cell_class,
                        $cell_data ?? "",
                        $this->html_attributes['cell'],
                        3
                    );

// and when I need a newline
$body_build .= $this->getHtmlDiv(
                $html_row_class,
                $row_build,
                $this->html_attributes['row'],
                2,
                true
            );

Другие вопросы по теме