仅在选项"selected"时在 URL 中包含 $_GET 参数



我一直在寻找这个问题的答案,但是我还是没有找到。

我有一个有四个Select的表单,只有第一个Select是必需的。这些选择有一个JS脚本填充的选项从我的数据库拉,使一个动态依赖的下拉菜单。问题是我不希望"未选择"选择传递他们的参数到URL,使查询字符串长而复杂。另外,当"未选中"选择传递默认值时,它类似于"选择组",在URL中显示为"选择+组"。我绝对想使用GET,所以我可以复制/保存链接。我怎样才能有条件地添加选择值,而不是阻止JS脚本填充选项?

例如,下面是一个典型的URL:

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

这是我想要的URL,用于我的。htaccess &RewriteRule:

mydomain.com/bn/products/1

因为没有选择Group, Segment和Category,它们的值对会造成不必要的URL混乱。

如有任何建议,不胜感激。

更多信息

我是第一次在这里发帖,我不知道在哪里添加冗长的后续文章。是:

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

mydomain.com/bn/products?Division=1
一点背景知识可能会有帮助。我使用内容变量从数据库检索页面内容。网站首页以外的所有内容都显示在内容目录(/bn)中。在上面的链接中发生的事情是,内容变量已经设置好了(产品),但是表单是放置的?在内容变量之后。下面是一个简单的rewriterrule,如果URL写对了,它就可以工作了:
RewriteRule ^bn/products/([0-9-]+)$ /bn/index.php?content=products&Division=$1

我可以使用以下URL访问我的选择:mydomain.com/bn/products/1,因为它符合重写规则。同样,我可以使用传统的:mydomain.com/bn/index.php?content=products&Division=$1到达那里。

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

许多谢谢。

我已经创建了一个函数,用我的JS条件生成的URL替换表单创建的URL。首先,这是表单top:

<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等)是默认值,如"Selectdivision"。我还应该提到,为了简化上面的JS代码,我省略了显示php的打开和关闭标记。标签在那里,只是没有显示。

当我使用下拉菜单从Division中选择时,我仍然得到与以前相同的URL:

mydomain.com/bn/products?Division=1

有任何想法为什么这不是预期的工作?

正如我在给Shomz的评论中所说的,我没有把PHP变量用引号括起来,这导致了问题,并导致控制台上出现错误消息。一旦我改变了,一切都像预期的那样。

感谢大家的帮助。

要删除那些"选择+组"从显示,只需分配这些选项的值为零或任何适合你。(但在完成以下段落后,您甚至不需要它)

为了完全阻止这些发送,你可以创建一个onsubmit函数,它将覆盖表单提交功能,并首先基于所选的选项生成一个新的URL,然后才会重定向。还可以从DOM中完全删除未选中的元素,然后提交表单。无论您选择哪一个,HTML部分应该看起来像这样:<form method="GET" action="your_url" onsubmit="my_submit_function(); return false;">

更新

基于你提供的额外信息,我可以说你可以建立你想要的友好的url,你不受任何方式的限制。您可以像在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

按照您想要的方式构建整个URL之后,您可以做一些像window.location = url;这样简单的事情来重定向您的浏览器。

如果你能分享一些你的代码会更容易。

我的想法是在改变表单的同时动态生成目标url。因此,如果您不需要的选择之一被取消选择,它们的url部分也被删除。

然后,在目标PHP页面上,使用isset($_GET['something'])检查这些元素是否被检查。

最新更新