【问题标题】:Include $_GET param in URL only if option "selected"Include $_GET param in URL only if option "selected"
【发布时间】:2013-06-17 22:43:05
【问题描述】:

我一直在寻找答案,但我没有任何运气。

我有一个包含四个 Select 的表单,并且只需要第一个 Select。这些选择具有由从我的数据库中提取的 JS 脚本填充的选项,以创建一个动态相关的下拉菜单。问题是我不希望“未选择”选择将它们的参数传递给 URL 并使查询字符串变得又长又复杂。另外,当“未选择”选择传递默认值时,它类似于“选择组”,在 URL 中显示为“选择+组”。我肯定想使用 GET 以便我可以复制/保存链接。如何有条件地添加 Select 值而不阻止 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) 中。上面链接中发生的情况是内容变量已经设置(产品),但是表单正在放置?在内容变量之后。这是一个简单的 RewriteRule,如果 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。首先,这是表格顶部:

<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 打开和关闭标签以简化上面的 JS 代码。标签在那里,只是没有显示。

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

mydomain.com/bn/products?Division=1

任何想法为什么这不能按预期工作?

已解决

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

感谢大家的帮助。

【问题讨论】:

  • 您可以执行 javascript 预提交功能,如果未启用该值,请删除 name 属性。 api.jquery.com/removeAttr
  • 我认为通常的做法是将第一个选项的值设置为"",以防它只是一个描述性选项。
  • 这是由 JS 脚本生成的,我无法控制。

标签: php .htaccess get


【解决方案1】:

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

要完全阻止这些发送,您可以创建一个onsubmit 函数,该函数将覆盖表单提交功能,并首先仅基于所选选项生成一个新 URL,然后才会重定向。您还可以从 DOM 中完全删除未选择的元素,然后再提交表单。无论您选择哪个,HTML 部分都应如下所示:&lt;form method="GET" action="your_url" onsubmit="my_submit_function(); return false;"&gt;

更新

根据您提供的其他信息,我可以说您可以根据需要构建友好的 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 不符合我的重写规则可以使用的模式。
  • 为了清楚起见,我将创建一个带有条件的函数,以附加到我的基本 URL。在构建合格部分后的函数结束时,我会发出window.location = url; 将浏览器发送到生成的URL,对吗?那么 onsubmit 会取代表单中的 submit 吗?另外,动作应该是什么,空白?
  • 没错。该函数不会从表单中获取任何内容,事实上,您甚至可能不需要表单元素;它只会从选定的值中删除数据,构建 URL 并重定向浏览器。
【解决方案2】:

如果您共享一些代码会更容易。

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

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

【讨论】:

  • 我在原始帖子中添加了更多信息,因为我无法在这些答案中添加详细信息。感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多