【问题标题】:How should I split my php files so that html forms don't break my code?我应该如何拆分我的 php 文件,以便 html 表单不会破坏我的代码?
【发布时间】:2017-06-29 00:23:50
【问题描述】:

在我当前的网站项目中,我有大量在整个项目中重复的 php 和 html 代码。例如,每个页面都具有与所有其他页面相同的页眉和页脚。所以,为了模块化我的代码,我为这些东西创建了单独的 php 文件。这是我的 header.php 文件的示例。

//header.php
<?php

    if(isset($_POST['submittext'])) {
        echo $_POST['sometext'];
    }

?>
<div id="header">
    <form action="header.php" method="post">
        <input type="text" name="sometext">
        <input type="submit" name="submittext">
    </form>

    <div id="somediv">
        <?php
            //Some more php
        ?>
    </div>
</div>

下面是一个文件示例,其中包含页面独有的代码,与页眉或页脚不同。将此文件称为 home.php。

//home.php
<?php
    //Some php 
?>

<!DOCTYPE HTML>
<html>
    <head>
        <!-- Style sheets, etc. -->
    </head>
    <body>
        <?php include('header.php'); ?> //Here I include the above file

        <div id="main">
            <!-- Html for everything below the header -->
        </div>
    </body>
</html>

现在的问题是我在 header.php 文件中有一个表单。所以当我提交表单时,action 属性说要重新加载 header.php。但如果它这样做了,那么 home.php 中的其他代码就不会加载,例如“main”div。所以我的问题是,我如何模块化我的代码以防止非常长且难以阅读的 php 文件,同时还能够加载我的所有内容?我的第一个想法是在我处理完 header.php 文件中的表单后将header('Location: home.php'); 放入,但是如果我在另一个页面中包含 header.php 文件,比如 home2.php,它会将我重定向回 home.php而不是 home2.php。

【问题讨论】:

  • the action attribute says to reload header.php 但不是吗?它说post.php
  • 对不起,我是说header.php
  • 好吧...如果这不是您想要的,请不要将header.php 放在那里。
  • header.php 是我想要的操作属性。 post.php 在那里,因为它是一个错字,我在你的第二条评论之前已经修复了。我想要 header.php 作为操作的原因是因为我想模块化我的代码,以便处理 header.php 中处理表单的 php 代码保留在 header.php 文件中。
  • 我完全不知道您遇到了什么问题。也许其他人会弄清楚。

标签: php html


【解决方案1】:

通过使用简单的纯 php 路由器,您可以通过简单地调用站点上的路由来以模块化方式加载多个视图,您可能正在寻找这些视图。所以example.com 将属于null 路由,你可以在那里渲染你的视图,然后你可以有一个example.com/home2 路由,它将显示你对该特定路由的所有视图。

在执行此操作时,您可以告诉您的 post.php 页面重定向到不同的路由并呈现该页面可能需要的所有模块化组件视图。此方法还清理 URL 并显示 /home 而不是 @ 987654326@.

将此代码放入您的 index.php 文件中。

$site_url = 'www.example.com';

function getCurrentUri()
{
    $basepath = implode('/', array_slice(explode('/', 
    $_SERVER['SCRIPT_NAME']), 0, -1)) . '/';
    $uri = substr($_SERVER['REQUEST_URI'], strlen($basepath));
    if (strstr($uri, '?')) $uri = substr($uri, 0, strpos($uri, '?'));
    $uri = '/' . trim($uri, '/');
    return $uri;
}

$base_url = getCurrentUri();
$routes = array();
$routes = explode('/', $base_url);
foreach($routes as $route)
{
    if(trim($route) != '')
        array_push($routes, $route);
}
switch($routes[1]) {
    case('home2'):
      $page = 'home2';
      include('header.php');
      include('home2.php');
      include('footer.php');
    break;       
    case(null):
      $page = 'home';
      include('header.php');
      include('home.php');        
      include('footer.php');
    break;
    default:
        header('Location: http://'. $site_url .'/404');
    break;
}

您可能还需要在基本目录中创建一个 .htaccess 文件以允许重写,所以试试这个

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

但不要引用我的话说 ^^ htaccess 语法令人困惑。

另外附注,最好将完整的&lt;html&gt;&lt;head&gt;&lt;body&gt; 标记的开头放在header.php 文件中,而不是在您可以只包含完整的html 时再次为您的其他页面重写该代码头。

所以基本上这将成为你的header.php

  <!DOCTYPE HTML>
  <html>
  <head>
      <!-- Style sheets, etc. -->
  </head>
  <body>
     <?php include('header.php'); ?> //Here I include the above file

如果您随后重定向到home.php 并在您的主页代码之前的顶部包含header.php,这可以很好地解决您的问题

【讨论】:

  • 对于路由部分,我是否应该将 header('Location: index.php'); 放在 header.php 中第一个 php 块的末尾?然后 index.php 中的代码会将我重定向回 home.php?对于您回复的 html 部分,如果我按照您所说的那样做,我的 home.php 中不会有两个 doctypes 和两个 html 标签吗?我这么说是因为我会将它们包含在已经包含它们的文件中?我认为这会破坏它或者是不合逻辑的,因为 header.php 不应该是一个独立的页面。
  • .htaccess 将通过 index.php 发送所有流量。 index.php 然后将分解 url 的各个部分并确定要包含的内容。您不想在您的视图中放置任何 header('Location: ...) 命令,因为 1) 标头在输出后不起作用,以及 2) 此时您无论如何都不想重定向。
  • 使用switch语句在表头中传递表单中action属性的值。
  • 为了让您的 php 文件随心所欲地模块化,home.php 应该只包含 &lt;div id="main"&gt; 中的代码。然后在此之上,您将包含 header.php 文件,该文件应具有完整的 &lt;doctype html&gt;&lt;html&gt;&lt;head&gt; 标签。然后,在您的主页内容之后,您将包含 footer.php ,该标签将具有结束 &lt;body&gt;&lt;html&gt; 标记。
  • index.php 文件中的 router 和 switch 语句然后只需重定向到 /home/whatever 即可工作,您想要返回的视图将显示出来
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-03
  • 2011-08-19
  • 1970-01-01
相关资源
最近更新 更多