Php Yii-在保留或删除GET参数时生成URL

Php Yii-在保留或删除GET参数时生成URL,php,yii,Php,Yii,我目前有一个视图manage,它列出了数据项。我没有在单独的视图中运行“编辑”和“添加”操作,而是在需要时在页面中内联显示适当的表单。表单上有一个“取消”按钮,可以将其隐藏 现在,我通过一个名为mode的GET参数来决定要内联显示的表单(如果有的话)。因此,/controller/manage将显示项目,而/controller/manage?mode=edit将显示项目并显示正确数据项目的编辑表单 该操作接受各种其他GET参数,例如日期间隔 为了激活表单,我正在生成一个指向当前操作的链接,其中

我目前有一个视图manage,它列出了数据项。我没有在单独的视图中运行“编辑”和“添加”操作,而是在需要时在页面中内联显示适当的表单。表单上有一个“取消”按钮,可以将其隐藏

现在,我通过一个名为
mode
的GET参数来决定要内联显示的表单(如果有的话)。因此,
/controller/manage
将显示项目,而
/controller/manage?mode=edit
将显示项目并显示正确数据项目的编辑表单

该操作接受各种其他GET参数,例如日期间隔

为了激活表单,我正在生成一个指向当前操作的链接,其中
模式
参数与
$\u GET
中的现有参数拼接在一起。我使用的是以下一行:

<?php echo CHtml::link('Edit', array_merge(array('/session/manage', 'mode' => 'edit', 'id' => 6), $_GET)); ?>

要实现“取消”链接,我将使用:

<?php echo CHtml::link('Cancel', array_diff(array_merge(array('/session/manage'), $_GET), array('edit'))); ?>


我的问题是:有没有更干净的方法?虽然这是可行的,但感觉像是一个黑客。我还没有找到任何关于生成包含现有GET参数的URL的文档。Yii是否提供了一个内置的方法来完成我想做的事情?我是否应该重新评估条件视图的一般方法,这反过来可能会产生一个更干净的解决方案?

一种方法是将所有最新的GET变量保持在会话状态。然后,控制器将对存储的数据执行操作,并使用新的_GET变量覆盖它。使用这种方法,您不需要将现有的GET变量合并回新请求中。权衡的结果是,您最终不得不管理该会话数据并处理可能的特殊情况(如以新状态重新开始)

另一种方法是使用Ajax调用一个操作,该操作使用呈现的编辑表单返回部分视图。然后,您的链接只需要调用一些javascript,这些javascript使用当前ID进行Ajax调用,并在页面上显示返回的表单。您的链接最终会显示如下内容:

由于使用Ajax不会导致页面重新加载,因此不必担心显示列表所需的任何_GET参数。您的Cancel链接将变成一个javascript调用,只需从DOM中删除编辑表单。使用jQuery:

$('#editform').remove()

另一种使它更简洁的方法是将所有的
数组\u merge()
内容封装到自定义组件或助手的方法中。然后,您的代码可能看起来像:

echochtml::link('Edit',URLHelper::mergeGet(数组('/session/manage','mode'=>'Edit','id'=>6));

甚至可以在您自己的CHtml类中对其进行封装:

echo MyCHtml::link('Edit',数组('/session/manage',mode'=>Edit',id'=>6));


其中
MyCHtml::link()
执行
CHtml::link()的所有操作
除了
array\u merge
功能外,它还可以扩展CHtml,使其拥有所有CHtml的方法。

我计划做一些类似的事情,但基于ajax,如果您在每个请求上加载页面,我认为将所有项目+表单放在一个视图中没有任何意义。我发现的唯一方法是提交一个返回rl param并将其解析为视图的链接。@Asgaroth我是从JavaScript/AJAX“很好拥有”的角度工作的,ie可能被禁用,核心功能永远不应该依赖它。只有在应用程序没有它的情况下才能完全正常运行时,我才尝试添加AJAX功能。@schmunk这实际上是一个有趣的方法。不过,我不确定它是否比我目前正在做的更易于管理。也许我只是在这里寻找一个灵丹妙药。我想nk可以创建一个自定义的CUrlManager或CUrlRule,它可以提供一个更好的createUrl()函数来自动化此过程。还可以进行一些验证。实际上,我非常喜欢最后一种方法(Yii有此功能吗?没有?自己编写,现在“有”)。请参阅我在上面对schmunk的评论,关于我为什么尽量避免使用AJAX。最终,我可以将AJAX应用到其中(它将产生最干净、最实用的结果),但我希望核心功能可以在没有它的情况下访问。编辑:我暂时保留此选项,以防有更多的建议,但这是一个很好的答案,有3个非常合理的方法。谢谢。我在答案中添加了关于最后一个选项的更多细节。我接受了此答案,但我没有足够的代表给你请注意,对不起。我再次找到了此问题/答案,并为您投票,请欣赏;)