仅当选项"选择"时,才在URL中包含$ _GET参数。

时间:2013-06-17 22:43:06

标签: php .htaccess get

我搜索并搜索了答案,但我没有任何运气。

我有一个包含四个选择的表单,只需要第一个选择。这些选择具有由JS脚本填充的选项,该脚本从我的数据库中拉出以创建动态相关的下拉菜单。问题是我不希望“未选中”选择将其参数传递给URL并使查询字符串变得冗长和复杂。另外,当“未选择的”选择通过默认值时,它就像“选择组”,在URL中显示为“选择+组”。我肯定想使用GET,所以我可以复制/保存链接。如何有条件地添加Select值,而不是阻止JS脚本填充选项?

例如,现在是一个典型的URL:

mydomain.com/bn/products?Division=1&Group=Select+Group&Segment=Select+Segment&Category=Select+Category

以下是我希望该网址与我的.htaccess&重写规则:

mydomain.com/bn/products/1

由于未选择“组”,“细分”和“类别”,因此它们的值对会使URL变得不必要。

任何建议都将不胜感激。

更多信息

我刚刚在这里发帖,我不明白在哪里添加冗长的跟进。这是:

我喜欢通过JS拦截和生成基于所做选择的新URL的想法。我遇到的一个问题是表单创建URL的方式:

mydomain.com/bn/products?Division=1

一些背景可能会有所帮助。我正在使用内容变量从数据库中检索页面内容。除站点主页之外的所有内容都显示在内容目录(/ bn)中。上面链接中发生的事情是内容变量已经设置(产品),但表单正在放置?在内容变量之后。这是一个简单的RewriteRule,如果URL写得正确,它将起作用:

RewriteRule ^bn/products/([0-9-]+)$ /bn/index.php?content=products&Division=$1

我可以使用以下网址访问我的选择:mydomain.com/bn/products/1因为它符合重写规则。同样,我可以使用传统的mydomain.com/bn/index.php?content=products&Division=$1来实现目标。

现在我必须承认我是一个非常有限的JS和jQuery经验的PHP人。 Shomz在my_submit_function中建议onsubmit="my_submit_function(); return false;"我可以检查select var divValue = $('#Division').val()的值并将其附加到URL。我不知道的是我如何发送生成的URL。显然,我希望URL处于“友好”形式mydomain.com/bn/products/1。有人可以在那里提供见解吗?

非常感谢。

更新

我创建了一个函数来将表单创建的URL替换为我的JS条件生成的URL。首先,这是表单顶部:

<form action="" onsubmit="my_submit_function()" method="get" name="DDm" id="DDm">

然后我的一个选择:

<select id="Division" name="Division" onchange="Division_reload(this)">
  <option selected><?php echo $division; ?></option>
</select>

动态下拉菜单脚本添加了onchange元素,这是否会导致我的问题?

我的功能:

function my_submit_function() {
  var DDmURL = $reqURL;
  var divVal = document.getElementById('Division').value;
  var grpVal = document.getElementById('Group').value;
  var segVal = document.getElementById('Segment').value;
  var catVal = document.getElementById('Category').value;

  if ((divVal != $division) || (divVal != -1)) {
      DDmURL += '/'+divVal; }
  if ((grpVal != $group) || (grpVal != -1)) {
      DDmURL += '/'+grpVal; }
  if ((segVal != $segment) || (segVal != -1)) {
      DDmURL += '/'+segVal; }
  if ((catVal != $category) || (catVal != -1)) {
      DDmURL += '/'+catVal; }
window.location = DDmURL;
};

我应该提到PHP变量($ division等)是默认值,如“Select Division”。我还要提一下,我省略了显示php open和close标签以简化上面的JS代码。标签在那里,只是没有显示。

当我使用下拉列表从Division I中选择时,仍然会获得与之前相同的URL:

mydomain.com/bn/products?Division=1

为什么这不符合预期的任何想法?

分辨

正如我对Shomz的评论所述,我没有将我的PHP变量括在引号中,这导致了问题并导致控制台中出现错误消息。一旦我改变了,一切都按预期工作。

感谢大家的帮助。

2 个答案:

答案 0 :(得分:0)

要从显示中删除这些“选择+组”,只需为这些选项指定零值或任何适合您的选项。 (但是在执行以下段落之后,您甚至不需要这样做)

要完全阻止发送,您可以创建一个覆盖表单提交功能的onsubmit功能,并且首先仅根据选定的选项生成新的URL,然后才会重定向。您也可以完全从DOM中删除未选中的元素,然后提交表单。无论您选择哪个,HTML部分应如下所示:<form method="GET" action="your_url" onsubmit="my_submit_function(); return false;">

更新

根据您提供的其他信息,我可以说您可以根据需要构建友好的网址,不受任何限制。您可以像在PHP中一样使用ifswitch语句。例如:

var url = siteRoot;

if (divValue == "someUglyProductsValue")
   url += '/products';
else if (divValue == "someUglyOtherValue")
   url += '/other';

if (groupValue == "someUglyWhateverValue")
   url += '/whatever';

等......这样就可以为您提供mydomain.com/bn/products/whatevermydomain.com/bn/othermydomain.com/bn/other/whatever ......

按照您希望的方式构建整个网址后,您可以执行简单的操作window.location = url;来重定向浏览器。

答案 1 :(得分:0)

如果您分享了一些代码,会更容易。

我的想法是在更改表单时动态生成目标网址。 因此,如果取消选择其中一个不需要的选择,则也会删除其部分网址。

然后,在目标PHP页面上,您需要检查isset($ _ GET [&#39; something&#39;])以查看是否检查了这些元素。