使特定 URL 使用模板文件并使用 PHP 和 .htaccess 从数组中获取特定数据

Posted

技术标签:

【中文标题】使特定 URL 使用模板文件并使用 PHP 和 .htaccess 从数组中获取特定数据【英文标题】:Make specific URLs use a template file and get specific data from array with PHP and .htaccess 【发布时间】:2021-12-09 17:07:08 【问题描述】:

目标:

我想创建一个产品数组,用于通过单个模板文件填充单个产品页面,URL 为/products/product-name


我目前拥有的:

这样的文件结构:

index.php products/product-a.php products/product-b.php products/product-c.php

这很麻烦,因为这意味着每次我有一个新产品时都要添加一个产品文件,并且随着时间的推移,文件之间的标记可能会变得不一致。


我还有一个像这样的根 .htaccess 文件,以使 URL 丢失 .php 并添加尾部斜杠:

RewriteEngine On
RewriteBase /

## Disable directory indexing

Options -Indexes

## hide .php extension snippet

# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %THE_REQUEST ^[A-Z]3,\s([^.]+)\.php [NC]
RewriteRule ^ %1/ [R,L]

# add a trailing slash    
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_URI !/$
RewriteRule . %REQUEST_URI/ [L,R=301]

# To internally forward /dir/foo to /dir/foo.php
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME.php -f
RewriteRule ^(.*?)/?$ $1.php [L]

.htaccess 使 domain.com/products/product-a.php 解析为 domain.com/products/product-a/

我不想为产品创建单独的文件(product-a.phpproduct-b.php 等),而是想将每个产品的数据放在这样的数组中:

function products() 
    $products = array();
    $products[a] = array(
        'heading' => 'Product A',
        'content' => '<p>Some text</p>',
    );
    $products[b] = array(
        'heading' => 'Product B',
        'content' => '<p>Some text</p>',
    );
    return $products;

然后有一个名为 product.php 的模板文件,如果 URL 是 /products/[any-product-title]/,它将保留 URL,但使用将从数组中获取数据的模板文件,如下所示:

<?php
$products = products();
$product = $products[a]; // Unsure on how to make this dynamically select the correct product
?>
<h1><?php echo $product['heading']; ?></h1>
<?php echo $product['content']; ?>

我在哪里挣扎:

我不知道如何制作,以便在解析产品 URL 时它将使用模板文件,然后在此之后如何获取模板文件以使用数组中的正确产品,我认为可以这样做通过以某种方式为产品数组键提供 URL?

【问题讨论】:

【参考方案1】:

看来您需要一个任何框架都提供的路由系统。

如果你在没有框架的情况下工作,你可以用这种简单的方法来管理它。

确保您的 .htaccess 文件中有这些条件:

RewriteEngine on
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^(.*)$ index.php [QSA,L]

然后,在您的 index.php(或其他地方,取决于您的结构,包括...)中声明您的产品:

// Here is your products data
$productsList = [
    "a" => [
        'heading' => 'Product A',
        'content' => '<p>Some text</p>'
    ],
    "b" => [
        'heading' => 'Product B',
        'content' => '<p>Some text</p>'
    ]
];

而这个简单的代码会将产品信息加载到单个“模板”中:

// This is the common URI to reach your products
$routePrefix = "/products/product-";

// This is the product key from URI
$productToDisplay = str_replace($routePrefix, "", $_SERVER['REQUEST_URI']);

// Display product data
if (array_key_exists($productToDisplay, $productsList)) 
    print_r($productsList[$productToDisplay]);
 else 
    echo "Sorry, we did not find this product.";

当然,它必须根据您的特定需求进行改进。另外,请记住您可能面临的安全问题。框架中的路由系统更好。

编辑:请注意,您不再需要“/product”文件夹,并且您的文件夹结构和使用的 URI 之间没有任何联系。在此示例中,通用 URI 可以是“/products-and-services/products/free-products/.../product-”,它会起作用。

【讨论】:

以上是关于使特定 URL 使用模板文件并使用 PHP 和 .htaccess 从数组中获取特定数据的主要内容,如果未能解决你的问题,请参考以下文章

使用标准 php 库使多个 memcache 键无效的最佳方法?

使 PHP url 具有独特的格式

PHP 中的路由 URL

在Woocommerce中为特定产品类别使用自定义单一产品模板

有没有办法用php检查url中的特定参数?

如何使在函数内创建的对象可在外部使用