0

我有一个个人网站,我想在其中展示我所做的一些下载。每个下载都有一个描述和下载链接,但是我不想为每个项目创建一个单独的页面(如“item1.php”、“item2.php”等),因为格式几乎是“标准的。 " 因此,我将所有文本放在一个 XML 文件中,然后使用 PHP 对其进行解析。

这是我的 XML 的样子:

<txtdb>
  <txt name="index">
    <str key="title">Index</key>
    <str key="metadescription">Personal site</key>

    <str key="navigation">Navigation</key>

    <str key="description"><!CDATA[[<h2>Description</h2>]]></key>
    <str key="download"><!CDATA[[<h2>Download</h2>]]></key>
  </txt>
  <txt name="item1">
    <str key="title">Item 1</key>
    <str key="metadescription">Item 1 is awesome, get it now!</key>

    <str key="description"><!CDATA[[<p>Item 1 is an incredible item that you must get right away!</p>]]></key>
    <str key="download"><!CDATA[[<a href="http://dropbox.com">Here</a>]]></key>
  </txt>
  <!-- ... -->
</txtdb>

这是我的 index.php:

<?php
$current = 'index';

class TextDatabase()
{
  private $_xdb;
  private $_name;

  public function __construct($xdt)
  {
    $this->_xdb = simplexml_load_file('./incl/txt.xml');
    $this->_name = $xdt;
  }

  public function getString($key, $name = null)
  {
    if (empty($name))
    {
      $name = $this->_name;
    }
    $str = $this->_xdb->xpath(sprintf("//txt[@name='%s']/str[@key='%s']", $name, $key));
    return empty($str[0]) ? null : (string) html_entity_decode($str[0]);
  }
}

session_start();
if (isSet($_GET['name']))
{
  $current = $_GET['name'];
  $_SESSION['name'] = $current;
}
else if (isSet($_SESSION['name']))
{
  $current = $_SESSION['name'];
}
else
{
  $current = 'index';
}

$TxtDb = new TextDatabase($current);

include_once('incl/header.php');
include_once('incl/sidebar.left.php');

if ($current == 'index'):?>
<h2><?php echo $TxtDb->getString('navigation'); ?></h2>
<ul>
  <li><a href="index.php?name=item1"><?php echo $TxtDb->getString('title','item1'); ?></a></li>
  <li><a href="index.php?name=item2"><?php echo $TxtDb->getString('title','item2'); ?></a></li>
  <!-- more items -->
</ul>
<?php else: ?>
<h2><?php echo $TxtDb->getString('description','index'); ?></h2>
<article><?php echo $TxtDb->getString('description'); ?></article>
<h2><?php echo $TxtDb->getString('download','index'); ?></h2>
<article><?php echo $TxtDb->getString('download'); ?></article>
<?php endif;

include_once('incl/sidebar.right.php');
include_once('incl/footer.php');
?>

目前,它有效。如果我转到“index.php”,我会看到我的项目列表。然后,当我单击其中一个时,我将被发送到 'index.php?name=item n '。但是,我在标题中有一个指向“index.php”的链接,当我单击它时,页面会重新加载,但我没有回到索引。为了返回索引,我必须将链接更改为指向“index.php?name=index”,但我不喜欢这样。有没有办法让“index.php”(不带参数)返回索引而不是当前项目(我相信它存储在 PHP 会话中)?

这是我第一次使用 PHP(我更喜欢 C#),如果这是一个愚蠢的问题,很抱歉。谢谢你的帮助。

4

1 回答 1

0

我认为这个问题会导致关于您的架构的多个子问题。例如,您为什么要在会话中存储名称参数?这样做的意义通常是在多个请求之间传输数据,而不必每次都再次提交。

据我了解,如果不作为参数提交,您希望名称不存在。另一方面,您的代码通过实现从会话中获取缺少的参数的回退来准确地捕捉到这种情况。

因此,我建议像这样更改 index.php:

...
session_start();
if (isSet($_GET['name']))
{
  $current = $_GET['name'];
}
else
{
  $current = 'index';
}
...

顺便提一句。unset($_SESSION['name'])从会话中删除项目可能会变得很方便,但如果根本不需要会话存储,我建议重新考虑 index.php 逻辑,而不是让它变得更复杂。;-)

于 2013-01-04T21:09:26.297 回答