Как исключить HTML из PHP, и файл PHP все еще может связываться с файлом HTML?

#php #html #model-view-controller

#php #HTML #модель-представление-контроллер

Вопрос:

Просмотр таблицы <— это мой пример. И код тоже предоставляется. Мне нужно отделить HTML от PHP, переместив HTML в другой файл, но мой PHP-код все еще может связываться с ним. Есть ли какие-нибудь идеи? Я пытаюсь создать что-то вроде контроллера модели представления.

 <html>
<head>
<meta charset="utf-8">
<title>View Records</title>
<link rel="stylesheet" href="css/style.css" />
</head>
<body>
<div class="form">
<p>
    <a href="dashboard.php">Dashboard</a> 
|   <a href="view.php">View Records</a> 
|   <a href="insert.php">Add Admin</a>
|   <a href="logout.php" onclick="return confirm('Are you sure to Logout?');">Logout</a>

</p>

<table width="100%" border="1" style="border-collapse:collapse;">
    <thead>
        <tr>
            <th><strong>ID</strong></th>
            <th><strong>Username</strong></th>
            <th><strong>User Password</strong></th>
            <th><strong>Full Name</strong></th>
            <th><strong>Edit</strong></th>
            <th><strong>Delete</strong></th>
        </tr>
    </thead>
</body>


<?php
$count=1;
$sel_query="Select * from admin ORDER BY id ASC;";
$result = mysqli_query($con,$sel_query);
while($row = mysqli_fetch_assoc($result)) { ?>


<tr>
    <td align="center"><?php echo $row["ID"]; ?></td>
    <td align="center"><?php echo $row["username"]; ?></td>
    <td align="center"><?php echo $row["user_pass"]; ?></td>
    <td align="center"><?php echo $row["fullname"]; ?></td>
    <td align="center">
        <a href="edit.php?id=<?php echo $row["ID"];?>">Edit</a></td>
    <td align="center">
        <a href="delete.php?id=<?php echo $row["ID"]; ?>"onclick="return confirm('Data cannot be retrieved after deleted. Are you sure to delete?');">Delete</a></td>


</tr>
<?php $count  ; } ?>
</tbody>
</table>
</div>
</body>
</html>```
 

Комментарии:

1. MVC — это шаблон проектирования. Попробуйте реализовать его, а затем вернитесь, если у вас возникнут какие-либо проблемы.

2. Вы должны проверить Laravel, это PHP-фреймворк, который использует шаблон MVC.

3. Есть несколько вариантов в зависимости от того, чего вы хотите достичь и как это будет использоваться. Должен ли HTML быть, например, редактируемым пользователем шаблоном? Моей первой мыслью было бы, чтобы в вашем HTML было несколько заполнителей для данных, которые будут заполнены. Т.е. Был бы определен один <tr> с какой-то узнаваемой разметкой, которую вы могли бы заменить значениями. Затем в PHP вы читаете HTML, находите шаблон строки, перебираете свои данные, создавая копии строки, а затем выводите. кстати: у вас есть </body>, где у вас должен быть <tbody> .

4. @xtempore Да, поля должны быть заполнены пользователем. Есть ли какой-нибудь способ переместить HTML-файл в другой файл? Но функция php все еще может читать из этого файла? * извините за это <tbody>, моя ошибка.

5. Насколько вам комфортно с ООП? Хотя ООП не является обязательным требованием, оно, безусловно, идет рука об руку с MVC.

Ответ №1:

Разделение php и html — хорошее начало, оно поможет вам увидеть следующий шаг в преобразовании в ООП, а затем в MVC.

MVC на данный момент слишком широк для простого ответа здесь, но я бы рекомендовал это в качестве первого шага, поскольку он имеет основополагающие принципы:

  1. PHP всегда находится наверху; никогда ничего не выводите, пока вся ваша логика не будет завершена
  2. Загрузить конфигурацию
  3. Работайте с пользовательским вводом и перенаправляйте, если POST
  4. Выполнить бизнес-логику
  5. Выйдите из PHP и выведите HTML. Помните, что PHP по сути является языком шаблонов, с таким же успехом можно использовать его как таковой

Тогда ваш код будет выглядеть примерно так:

 
<?php

// load database connection, etc
$url = 'your url';

// deal with user input. Always use POST if data will be changed!
if($_POST['action'] == 'delete') {

  // delete from admin where id=?
  header('location: '.$url);
  die;
}

// end "controller" section
// begin "model" section

$sel_query="Select * from admin ORDER BY id ASC;";
$result = mysqli_query($con,$sel_query);

// end "model" section
// begin "view" section. 
// Note, you could simply put the html in a separate file and just include it here. 

?>
<html>
<head>
<meta charset="utf-8">
<title>View Records</title>
<link rel="stylesheet" href="css/style.css" />
</head>
<body>
<div class="form">
<p>
    <a href="dashboard.php">Dashboard</a> 
|   <a href="view.php">View Records</a> 
|   <a href="insert.php">Add Admin</a>
|   <a href="logout.php" onclick="return confirm('Are you sure to Logout?');">Logout</a>

</p>

<table width="100%" border="1" style="border-collapse:collapse;">
    <thead>
        <tr>
            <th><strong>ID</strong></th>
            <th><strong>Username</strong></th>
            <th><strong>User Password</strong></th>
            <th><strong>Full Name</strong></th>
            <th><strong>Edit</strong></th>
            <th><strong>Delete</strong></th>
        </tr>
    </thead>
    </tbody>
    <?php while($row = mysqli_fetch_assoc($result)): ?>

    <tr>
        <td align="center"><?= $row["ID"] ?></td>
        <td align="center"><?= $row["username"] ?></td>
        <td align="center"><?= $row["user_pass"] ?></td>
        <td align="center"><?= $row["fullname"] ?></td>
        <td align="center">
          <form method="post">
            <input type="hidden" name="action" value="delete" />
            <input type="hidden" name="id" value="<?= $row["ID"] ?>" />
            <input type="submit" value="Delete" />
          </form>
        </td>
      </tr>
      <?php endwhile; ?>
</tbody>
</table>
</div>
</body>
</html>
 

Обратите внимание, что следование этому шаблону закладывает основу для перехода на mvc. Но сначала начните работать над своими ооп-фрагментами и переместите всю бизнес-логику в объект модели.

После этого вы можете переместить шаблон в его собственный файл и ввести модель в представление, что позволяет представлению иметь доступ к необходимой информации, а затем отображать выходные данные.

Между тем, вам понадобится маршрутизатор (весь трафик перенаправляется на index.php ) и контроллер, и выясните, какую интерпретацию MVC вы будете использовать 😉

Ответ №2:

Вот очень простое решение.

Создайте HTML-файл в качестве шаблона. Например. «template.html «. Используйте HTML-комментарии в качестве заполнителей для данных. (Я пошел с комментариями, поскольку это означает, что HTML остается совместимым) Я опустил некоторые не относящиеся к делу биты, так что, надеюсь, вы поняли идею:

 <html>
...
<table width="100%" border="1" style="border-collapse:collapse;">
<thead>
<tr>
    <th><strong>ID</strong></th>
    <th><strong>Username</strong></th>
    <th><strong>User Password</strong></th>
    <th><strong>Full Name</strong></th>
    <th><strong>Edit</strong></th>
    <th><strong>Delete</strong></th>
</tr>
</thead>
<tbody>
<!--ROW-->
<tr>
    <td align="center"><!--ID--></td>
    <td align="center"><!--username--></td>
    <td align="center"><!--user_pass--></td>
    <td align="center"><!--fullname--></td>
    <td align="center">
        <a href="edit.php?id=<!--ID-->">Edit</a></td>
    <td align="center">
        <a href="delete.php?id=<!--ID-->"onclick="return confirm('Data cannot be retrieved after deleted. Are you sure to delete?');">Delete</a></td>
</tr>
<!--ENDROW-->
</tbody>
</table>
</div>
</body>
</html>
 

Затем в своем PHP-коде вы читаете html-код, находите шаблон строки и заменяете поля по мере необходимости:

 <?php
// Read the template
$html = file_get_contents('template.html');

// Find the row template
$regRowTemplate = '/<!--ROW-->(.*)<!--ENDROW-->/i';
preg_match($regRowTemplate, $html, $m);
$rowTemplate = $m[1];

// Start building our replacement rows
$htmlRows = '';

$count=1;
$sel_query="Select * from admin ORDER BY id ASC;";
$result = mysqli_query($con,$sel_query);
while ($row = mysqli_fetch_assoc($result)) {
    // Start with a fresh copy of the template
    $htmlRow = $rowTemplate;
    // Replace comment placeholders with values
    foreach ($row as $key => $value) {
        $htmlRow .= str_replace('<!--' . $key . '-->', $value, $htmlRow);
    }
    // Append to our rows
    $htmlRows .= $htmlRow;
    $count  ;
}
// Replace the row template with our expanded rows
$html = preg_replace(regRowTemplate, $htmlRows, $html);
// Do something with the html
 

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

Комментарии:

1. привет, у меня появилась эта ошибка: Обратите внимание: Неопределенное смещение: 1 дюйм /var/www/html/test/view2php.php в строке 14, как указано, это $rowTemplate = $m[1]; <- вызывает это.

2. Я внес некоторые изменения, ошибка исчезла, но страница отображается пустой….

3. Отладчик — ваш друг. Пройдитесь по коду. Убедитесь, что он создает строки. Самое главное: прочитайте последний комментарий в моем коде «Сделайте что-нибудь с html». Если ваша страница пуста, это, вероятно, потому, что вы этого не сделали.

4. привет, сэр, в этом проблема ~ я не уверен, что делать с html, не могли бы вы предоставить дополнительную помощь по этому вопросу? Я совсем новичок в этом.

5. Мне нужно что-то положить сюда внутрь? $regRowTemplate = ‘/<!—ROW—>(.*)<!—ENDROW—>/i’;