Я пишу класс, который отображает 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: если нужен дополнительный код/объяснение, дайте мне знать и добавит его к исходному вопросу.
Будет ли работать, если поставить последние </div> в каждой строке на отдельной строке?
@Rob Я использую div, потому что это соответствует моим потребностям, потому что я могу это сделать и потому что мне не нравится <table>. Извините: я не получил ваш второй комментарий. Как бы это было?
Я думаю, вам просто нужно поставить \n перед закрывающим тегом $output .= "\n</div>";
@TimR попробовал это, и стало еще хуже. </div> переход на следующую строку без отступа
Я внимательно изучил ваш код и подозреваю, что $content содержит <div class='table-row-cell'>, и ваш вопрос заключается в том, как сделать отступ только для закрывающего тега для <div class = "table-row">. Если да, то приведет ли это к желаемому результату? $output .= "\n </div>";
<table> здесь семантически правильное использование. Я надеюсь, вы не избегаете этого, потому что вы читали, что это плохо, потому что это не для всего.
Вы сказали, что у вас есть </div></div> в двух местах. Я хочу, чтобы вы попробовали поставить второй </div> на отдельную строку и попробовать это.
Количество вкладок @TimR не жестко закодировано
@Rob div генерируются в getHtmlDiv(), и есть только один закрывающий тег, поэтому я до сих пор не понимаю, куда вы предлагаете поместить второй </div>. И, как я уже сказал, я делаю это так, потому что я могу и удовлетворяю свои потребности (я знаю, что <table> — допустимый тег).
и самое близкое, что я мог получить, это код прямо перед возвратом $output;" - который даже не содержит закрывающего тега </div>, все, что вам нужно сделать, это вывести дополнительную строку, содержащую только пробелы. $output .= "</div>"; // <- here something should be done: what? IDK - как насчет того же самого, что вы сделали для открывающего тега? Вы хотите, чтобы оба они находились на одном уровне отступа, поэтому выводите одинаковое количество пробелов перед ними обоими?
Если $output = "\n" . str_repeat(" ", $this->tabs + $tabcount) . "<div"; дал вам открывающий тег с правильным отступом, то $output = "\n" . str_repeat(" ", $this->tabs + $tabcount) . "</div>"; должен дать вам соответствующий закрывающий тег, не так ли?
@CBroe, если я делаю то же самое, я получаю все </div> в новой строке, хотя и с правильным отступом.
Если вам нужны только некоторые закрывающие теги div в новой строке, но не все из них, вам нужно найти способ сообщить вашему сценарию, какие из них на самом деле являются «некоторыми». Например, вы могли бы основывать это на значении $class здесь.
@CBroe Я думал об этом подходе, но отклонил его, потому что $class может быть определяемым пользователем значением, и для этого я должен превратить 10 переменных метода в свойства класса или изменить константу класса (одномерный массив) в многомассив). Я как раз думал добавить новый параметр в getHtmlDiv()






Я решил это, добавив новый параметр в 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
);
Я должен спросить, почему вы просто не используете
<table>