Я знаю, это звучит немного запутанно, но позвольте мне объяснить дальше.
У меня есть функция php, которая печатает верхнюю часть таблицы, включая теги html, как показано здесь:
function print_table_head (){
echo "<table>
<thead>
<tr>
<th>URL Link</th>
<th>Date Start</th>
<th>Date End</th>
<th>Total Budget</th>
<th>Daily Budget</th>
<th>Model Price</th>
<th>Unit Rate</th>
<th>Target Info</th>
<th>Product</th>
<th>Status</th>
<th>Total Units</th>
</tr>
</thead>
<tbody>";
}
У меня также есть функция, которая закрывает таблицу с тегами окончания таблицы html, как показано ниже:
function print_table_bottom(){
echo "</tbody>
</table>";
}
Теперь, таблица печатает отлично и dandy до здесь. Я получаю правильные заголовки таблиц и все. Но у меня проблемы с печатью тела и содержимого. Вот как выглядит моя основная функция для печати всей таблицы, включая ее тело и содержимое:
function print_table ( $status, $model, $bid, $url, $target, $tBudget,$dBudget, $tUnits, $sMonth, $sDay, $sYear, $eMonth, $eDay, $eYear ){
print_table_head();
echo "<tr>
<td><?php $url[0]; ?></td>
<td><?php $sMonth[0] / $sDay[0] / $sYear[0]; ?></td>
<td><?php $eMonth[0]; / $eDay[0]; / $eYear[0]; ?></td>
<td><?php $tBudget[0]; ?></td>
<td><?php $dBudget[0]; ?></td>
<td><?php $model[0]; ?></td>
<td><?php $targeting[0]; ?></td>
<td><?php $product[0]; ?></td>
<td><?php $status[0]; ?></td>
<td><?php $tUnits[0]; ?></td>
</tr>";
print_table_bottom();
}
Каждый раз, когда я вызываю функцию print_table, она печатает верхнюю часть таблицы с заголовками. Но он не печатает строки/ячейки таблицы. Я не уверен, что я делаю неправильно. Может ли кто-нибудь объяснить это мне и сказать, что я делаю неправильно?
ПРИМЕЧАНИЕ = Я использую основу-5. Не уверен, если это имеет значение.
Кроме того, каждая из используемых переменных - это массив (все они имеют один элемент в них... Да, я знаю, я бы не использовал массив для каждой переменной, но я хочу.)
РЕДАКТИРОВАТЬ:
В качестве запроса комментатора я предоставлю код, который вызывает print_table:
<?php
//if the length of the array "status" is 1.
if (count($status)==1){
print_table ( $status, $model, $bid, $url, $target, $tBudget,$dBudget, $tUnits,$sMonth,$sDay,$sYear,$eMonth, $eDay, $eYear );
}
// please ignore this function.
else
print_table_with_multiple_rows ( $status, $model, $bid, $url, $target, $tBudget,$dBudget, $tUnits,$sMonth,$sDay,$sYear,$eMonth, $eDay, $eYear );
?>
Самый простой вариант - просто переформатировать структуру данных и использовать этот код:
$data = // Structure: array([0] => array('url' => '', 'sMonth' => '', 'eMonth' => '', ...), [1] => array(...));
include 'templates/table.php';
<table>
<thead>
<tr>
<th>URL Link</th>
<th>Date Start</th>
<th>Date End</th>
<th>Total Budget</th>
<th>Daily Budget</th>
<th>Model Price</th>
<th>Unit Rate</th>
<th>Target Info</th>
<th>Product</th>
<th>Status</th>
<th>Total Units</th>
</tr>
</thead>
<tbody>
<?php foreach($data as $row) : ?>
<td><?php echo $row->url ?></td>
<td><?php echo $row->sMonth . "/" . $row->sDay . "/" . $row->sYear; ?></td>
<td><?php echo $row->eMonth . "/" . $eDay . "/" . $eYear; ?></td>
<td><?php echo $row->tBudget; ?></td>
<td><?php echo $row->dBudget; ?></td>
<td><?php echo $row->model; ?></td>
<td><?php echo $row->targeting; ?></td>
<td><?php echo $row->product; ?></td>
<td><?php echo $row->status; ?></td>
<td><?php echo $row->tUnits; ?></td>
<?php endforeach; ?>
</tbody>
</table>
Это может быть немного более продвинутым, чем остальная часть вашего кода, но это более подходящий способ писать (OO) PHP в целом. Однако это, вероятно, потребует реструктуризации всего вашего кода.
Структура каталога:
--models
--informationmodel.php
--controllers
--abstractcontroller.php
--informationcontroller.php
--templates
--information
--table.php
Во-первых, модельный класс. Эта модель отражает определенный тип данных - в этом случае любую информацию, отображаемую в вашей таблице. Этот класс не должен манипулировать данными - это просто класс, который хранит нужные вам данные.
class InformationModel { //Where "Information" is changed to describe this data type
private $data;
public function __construct($data = array()) { //pass the things as an associative array
$this->data = $data;
}
public function __set($key, $value) {
$this->data[$key] = $value;
}
public function setData($data) {
$this->data = $data;
}
}
Это абстрактный контроллер. Контроллер находится там, где хранится ваша логика приложения. Это должно включать в себя манипулирование данными, поиск модели и т.д. Абстрактный класс используется каждым контроллером, чтобы предоставить ему доступ к определенным функциям, которые являются общими для всех контроллеров.
abstract class AbstractController {
// add more functions for all controllers here
public function renderTemplate($template, $data) {
include $template;
}
}
Вот фактический контроллер. Внутри этого контроллера мы можем определить действия - в этом случае мы будем определять действие таблицы. Это означает, что мы можем вызвать это действие, чтобы отобразить таблицу с данными, которые мы ее даем. Это полезно, потому что, если мы хотим изменить способ представления данных, это легко сделать. Мы могли бы даже сделать так, чтобы данные были представлены в другом формате, чем HTML, если мы его настроим, чтобы вы могли указать это. Прямо сейчас у нас простое действие: загрузить данные и передать их в шаблон.
require_once 'models/informationmodel.php'; // note: autoloading would be preferable
class InformationController extends AbstractController {
public function tableAction($rawData) {
$data = new InformationModel($rawData);
$this->renderTemplate('templates/information/table.php', $data);
}
}
Это шаблон. Здесь вы определяете способ отображения кода. Если вы хотите пойти дальше, загляните в шаблонный движок, такой как Twig (мои личные рекомендации). Это чисто для представления данных. как вы увидите, я поместил шаблон в папку для отображения определенного типа информации: таблицу информации типа данных (или что бы вы ни изменили ее). Это поможет вам организовать ваши шаблоны.
<table>
<thead>
<tr>
<th>URL Link</th>
<th>Date Start</th>
<th>Date End</th>
<th>Total Budget</th>
<th>Daily Budget</th>
<th>Model Price</th>
<th>Unit Rate</th>
<th>Target Info</th>
<th>Product</th>
<th>Status</th>
<th>Total Units</th>
</tr>
</thead>
<tbody>
<?php foreach($data as $row) : ?>
<td><?php echo $row->url ?></td>
<td><?php echo $row->sMonth . "/" . $row->sDay . "/" . $row->sYear; ?></td>
<td><?php echo $row->eMonth . "/" . $eDay . "/" . $eYear; ?></td>
<td><?php echo $row->tBudget; ?></td>
<td><?php echo $row->dBudget; ?></td>
<td><?php echo $row->model; ?></td>
<td><?php echo $row->targeting; ?></td>
<td><?php echo $row->product; ?></td>
<td><?php echo $row->status; ?></td>
<td><?php echo $row->tUnits; ?></td>
<?php endforeach; ?>
</tbody>
</table>
Как вы можете видеть, я изменил структуру данных: данные обрабатываются в строках, и эти строки содержат только один элемент. Использование шаблонизатора приведет к уменьшению уродства структуры <?php echo $row->status?>
- в Twig это выглядит так: {{ row.status }}
.
Затем, чтобы фактически использовать этот код:
require_once "controllers/informationcontroller.php"; //even better: use autoloading
// $data = get your data in here somewhere.
$info = new InformationController();
$info->tableAction($data); // prints out a table;
Очевидно, что это много новой информации, но это полезно. Если вы потратите время на изучение объектно-ориентированного PHP (OOPHP), MVC, шаблонов и т.д., Вы станете лучшим программистом, и ваш код будет легче писать и поддерживать. Дополнительные темы: Twig, Autoloading, Injection of Injection/Inversion of Control, Namespacing, Routing
Прямо сейчас класс модели на самом деле ничего не делает, и я не использовал инъекцию зависимостей (существует прямая зависимость от класса модели внутри контроллера, на который неодобрительно), но основные понятия здесь. Пока вы можете просто передать данные непосредственно контроллеру или даже непосредственно в шаблон.
Отказ от ответственности: я не тестировал этот код. Однако в любом случае это потребует некоторой модификации. Если вы действительно хотите продолжить писать веб-сайт на PHP, вам следует рассмотреть его структурирование таким образом.
ehm.. you mess php и html..
function print_table ( $status, $model, $bid, $url, $target, $tBudget,$dBudget, $tUnits, $sMonth, $sDay, $sYear, $eMonth, $eDay, $eYear ){
print_table_head();
echo "<tr>
<td>{$url[0]}</td>
<td>{$sMonth[0]} / {$sDay[0]} / {$sYear[0]}</td>
<td>{$eMonth[0]} / {$eDay[0]} / {$eYear[0]}</td>
<td>{$tBudget[0]}</td>
<td>{$dBudget[0]}</td>
<td>{$model[0]}</td>
<td>{$targeting[0]}</td>
<td>{$product[0]}</td>
<td>{$status[0]}</td>
<td>{$tUnits[0]}</td>
</tr>";
print_table_bottom();
}
Я считаю это более читаемым лично:
function print_table ( $status, $model, $bid, $url, $target, $tBudget,$dBudget, $tUnits, $sMonth, $sDay, $sYear, $eMonth, $eDay, $eYear ){
print_table_head();
?>
<tr>
<td><?= array_shift($url); ?></td>
<td><?= array_shift($sMonth), "/", array_shift($sDay), "/", array_shift($sYear); ?></td>
<td><?= array_shift($eMonth), "/", array_shift($eDay), "/", array_shift($eYear); ?></td>
<td><?= array_shift($tBudget); ?></td>
<td><?= array_shift($dBudget); ?></td>
<td><?= array_shift($model); ?></td>
<td><?= array_shift($targeting); ?></td>
<td><?= array_shift($product); ?></td>
<td><?= array_shift($status); ?></td>
<td><?= array_shift($tUnits); ?></td>
</tr>
<?php
print_table_bottom();
}
Примечание. Если это не работает, возможно, это связано с тем, что ваш PHP не принимает <?=
. В этом случае вместо этого используется значение <?=
<?php echo
.